/* ==========================================================================
   select.css  -  the senshi select screen
   ==========================================================================
   ONE stylesheet, ELEVEN palettes, same contract as senshi.css: every colour
   below is a var() set per-CARD by build_select.py. Nothing here is hardcoded
   to a character.

   THE ONE DELIBERATE DEPARTURE FROM senshi.css
   --------------------------------------------
   The card FIELD paints from --wash, not --root. Root is the 1999 bgcolor and
   for four characters it is very dark: Saturn is #00008b, Mars #8b0000,
   Jupiter #006400. Their busts are dark-haired in dark uniforms, so on a root
   field they disappear. Root still owns the frame - it paints the card border
   and the group rule - which is where the eye-melt rule always said it
   belonged. The bust needs a surface, and wash is the surface.

   NO LAYOUT SHIFT
   ---------------
   All eleven panels are in the DOM at once, stacked absolutely inside a
   fixed-height stage, toggled by opacity and visibility. Two things fall out
   of that: changing selection cannot move a single pixel of the grid, and
   every panel's text is real DOM text that Google reads without running any
   script. A panel swapped in by JS would have neither property.
   ========================================================================== */

*{ box-sizing:border-box; }

body.select{ font-family:Raleway,system-ui,sans-serif; line-height:1.7; }

/* ==========================================================================
   THE SCROLLING BACKGROUND, same as the homepage
   ==========================================================================
   Lifted from body.--home in index.css, not reinvented, and reusing its
   @keyframes glyphslide rather than declaring a second copy - index.css is
   linked first, so the keyframes are already in scope and there is exactly one
   definition of the drift on the whole site.

   Two traps carried over from the note index.css leaves on this rule, both of
   which silently produce a background that does not move:

   LONGHANDS, never the `background` shorthand. The shorthand resets
   background-position to its initial value on every match, which overrides
   whatever the animation computed that frame - the keyframes run and nothing
   ever moves.

   background-attachment MUST be scroll, not fixed. `fixed` anchors the layer
   to the viewport, which pins background-position, which is the exact property
   the animation is animating.

   The tile is 250x249 and glyphslide travels -1250px/-996px: five tiles left,
   four tiles up. Whole multiples in both axes, so the loop never jumps. That
   maths belongs to the keyframes, which is another reason not to redeclare
   them here with different numbers. */
body.select{
  background-image:
    url("images/backgrounds/glyphtile.png"),
    linear-gradient(#cce4ff, rgba(250, 250, 250, 0));
  background-repeat: repeat, no-repeat;
  background-color: transparent;
  background-attachment: scroll, scroll;
  animation: glyphslide 200s linear infinite;
}
/* Same two exemptions the homepage makes. A drifting tiled background is
   expensive to composite on a phone and unkind to anyone who asked for less
   motion. */
@media (prefers-reduced-motion: reduce){
  body.select{ animation:none; }
}
@media (max-width:1249px){
  body.select{ animation:none; background-attachment:scroll, scroll; }
}

/* THE PANEL SPANS THE BANNER ROW.
   The banner is text, and text stops at about 60ch, so a full-width banner left
   a wide empty rectangle to the right of the title with nothing in it - and the
   panel started below all of that, so the artwork began a third of the way down
   the screen. Making .sel itself the two-column grid puts the panel in that
   space and lets it start at the top of the box, which is where the eye goes
   first on a select screen.
   The banner, the roster and the foot stay in column one; only the panel moves,
   and it moves by spanning two rows rather than by being repositioned. */
.sel{
  background:#FFFFFB; border:3px solid #5A3268;
  box-shadow:5px 5px 0 rgba(90,50,104,.35);
  margin:0 0 20px 0; overflow:hidden;
  /* 386 = the panel's 360 plus its 26 right margin. If the panel width changes
     this changes with it, and so does the card width downstream.
     THE PANEL TOOK 20px AND IT CAME OUT OF PAGE PADDING, NOT OUT OF THE CARDS.
     Ashley: "can we scale the character select boxes down a bit without messing
     with glyphs or solar system images? might give more room for the large
     profile panel." Measured before answering: the roster row is 553px and four
     132px cards with three 8px gaps use 552, so the grid has ONE pixel of slack.
     Every pixel a card gave up would have to come out of its name plate, and the
     plate is at its own ceiling already - CHIBI MOON is ten characters, Press
     Start 2P advances exactly one em, 10 x 11px is 110 inside 112 of usable
     plate. Narrowing the cards therefore means shrinking that type, and it would
     also deepen the side crop on the expanded busts, which is the actual reason
     they read as too big.
     The stage column was carrying 44px of its own horizontal padding. Cutting
     that to 24 hands the panel 20px with nothing else moving: same card width,
     same four per row, same glyphs and same discs. */
  display:grid; grid-template-columns:minmax(0,1fr) 386px;
  align-items:start;
}
/* FULL-WIDTH BANNER, and this reverses the arrangement two rounds ago on
   measurement rather than taste. Ashley: "any ideas on how to make this whole
   thing look more proportinate? feels visually weirdly weighted."
   Measured, the weighting was this: the roster and the panel are the SAME height
   - 703 and 713 - but they were 174px out of step vertically, because the banner
   covered only column one and the panel started above it. So the top right of
   the box was dark artwork while the top left was pale type, and neither column
   shared a top or a bottom edge with the other.
   Spanning the banner fixes the step and, unexpectedly, makes the banner
   SHORTER: at 989px wide the title fits on one line instead of two, so the whole
   header comes down from 190px to 134. The roster now starts 62px HIGHER than it
   did before the intro paragraph was added, the two columns start level and end
   within 10px of each other, and the dead space below the panel is gone. */
.sel-banner{ grid-column:1 / -1; grid-row:1; }
.sel-stage { grid-column:1;      grid-row:2; }
.sel-panels{ grid-column:2;      grid-row:2; }
.sm-plates { grid-column:1 / -1; grid-row:3; }
.sel-foot  { grid-column:1 / -1; grid-row:4; }

/* ---- banner -------------------------------------------------------------
   THE BANNER IS THE LOCKUP: logo in column one, title and intro stacked in
   column two. That stacking is what keeps it short. The text block comes to
   84px, the logo is 100, and the taller of the two sets the row - so the intro
   is carried for free inside the logo's own height. When the same words sat in
   a paragraph BELOW the lockup instead they added their 56px on top of the
   logo's 100 and the banner went to 190. Same logo, same sentence, 56px
   cheaper, purely from which box they live in.

   align-items:center so the logo's optical middle lines up with the type beside
   it. min-width:0 on the text column so the track can actually shrink; a grid
   item otherwise refuses to go narrower than its longest word.

   Both earlier arrangements are gone rather than commented: a stacked kicker,
   logo and title ran to 234px with two thirds of the width empty, and the
   half-width lockup ran to 190. */
/* ---- THE TITLE CARD TAKES THE SKY -----------------------------------------
   Ashley: "you can also consider background for the 'title card' or below the
   entire character select. don't use too much though so it's not visually
   disturbing."

   ONE surface, not four, and the banner is the one because it is the only band
   on the page with nothing in it - a logo and two lines of type - and because it
   is the first thing anybody sees. Below the select is already spoken for: the
   plate display took the frost tile last round.

   IT IS THE 1024x768 WALLPAPER, and the choice is a measurement rather than a
   preference. Of the six Ashley shortlisted, this one looks the busiest and
   measures the CALMEST: its value standard deviation is 3.7 out of 255, against
   8.5 for tile19 and 27 for both bg12 and tile24. All of its variation is hue -
   pink to lilac to blue, soft doilies, light blooms, almost no dark anywhere -
   and hue variation is what a background can afford. Value variation is what
   fights the type on top of it, and this has none. bg12 and tile24 are lovely
   and are the two that would have been "too much"; they are built and unused.

   THE WHITE SCRIM IS THE RESTRAINT. Straight cover would put a full-strength
   wallpaper behind a heading. At 58% white over it the sky reads as a tint that
   happens to have doilies in it, the Press Start 2P title keeps its contrast,
   and the band still says something the flat gradient did not. */
.sel-banner{
  padding:16px 26px 15px;
  display:grid; grid-template-columns:260px minmax(0,1fr);
  align-items:center; gap:24px;
  background-image:
    linear-gradient(180deg, rgba(255,255,251,.5), rgba(255,255,251,.72)),
    url("images/sailormoon/select/lace/sky.jpg");
  background-repeat:no-repeat, no-repeat;
  background-size:cover, cover;
  background-position:center, center 24%;
  border-bottom:3px solid #C7C4D9;
}
.sel-titles{ min-width:0; }

.sel-kicker{
  margin:0 0 8px; font-family:"Press Start 2P",monospace; font-size:11px;
  letter-spacing:1px; color:#7A6E96;
}
.sel-title{
  margin:0; font-family:"Press Start 2P",monospace;
  /* CAPPED AT 22, down from 24, and the ceiling is arithmetic rather than taste.
     "Choose Your Sailor Senshi" is 25 characters and Press Start 2P advances
     exactly one em each, so at 24px it wants 600px on one line. It has 287 beside
     the logo, so it must wrap, and the longest line it can wrap to is "Sailor
     Senshi" - 13 characters, 286px at 22 and 312 at 24. 22 fits with a pixel
     spare; 24 does not.
     Same trap as the SAGITTARIUS card, which is why it was worked out on paper:
     the real font is absent from the local mirror, the fallback measures much
     narrower, and this looks fine here while breaking on her screen. */
  font-size:clamp(16px,2.4vw,22px); line-height:1.35; color:#5A3268;
  text-shadow:2px 2px 0 #f6ebbe, 4px 4px 0 rgba(90,50,104,.25);
}
/* The intro. TWO LINES, and that is a hard budget rather than a preference:
   every line costs 23px and pushes the whole roster down by it, and Ashley asked
   for an introduction that does not do that. The banner's full width is 571px,
   which is about 79 characters of Raleway at 14.5px, so two lines is roughly 158
   characters and the copy was cut to fit rather than the box grown to hold it.
   Sized 14.5 rather than 16 for the same reason. */
.sel-lede{
  margin:0; font-size:14.5px; line-height:1.6; color:#524860;
}

/* ---- THE LOGO -------------------------------------------------------------
   The Japanese logo, 130x50, eleven frames of palette cycling with a twinkle on
   the final stroke. Ashley asked for a beautiful heading built around it.

   2x AND NOTHING ELSE. It is pixel art, so 260x100 is the only enlargement
   available under the integer-scale rule - 1x is too small to be a heading and
   1.5x would put half-pixels through every one of those diagonal strokes.
   image-rendering:pixelated keeps the doubling hard-edged instead of letting the
   browser smooth it into mush.

   width and height are ON the element as well as in CSS, so the 100px of banner
   it occupies is reserved before the gif arrives. A heading that reflows as its
   own logo loads is a heading that makes the whole page jump.

   The drop shadow is the site's plum at low alpha, offset like the other pixel
   furniture here rather than blurred - a soft glow under a hard-edged sprite
   reads as a mistake. It also does the work of separating the logo's magenta
   keyline from the banner's pale lavender, which are closer in value than they
   look. */
.sel-logo{
  display:block; width:260px; height:100px; flex:none;
  image-rendering:pixelated;
  filter:drop-shadow(3px 3px 0 rgba(90,50,104,.28));
}

/* ---- stage: grid left, one shared panel right ---------------------------- */
.sel-stage{ display:block; padding:8px 8px 22px 16px; }

/* ---- THE ROSTER CONTAINER -------------------------------------------------
   Ashley: "create a 'container' for the character select boxes and tighten them
   up. add a complementary background to this new box."

   One inset box holding all three groups, so the roster reads as a single unit
   sitting next to the preview rather than three loose rows floating on the page.
   Same border weight and offset shadow as the cabinet boxes elsewhere on the
   site, so it belongs to the furniture she already has, and a pale wash rather
   than a colour of its own - the cards are the colour here, and the box exists
   to hold them, not to compete.

   THE WASH IS TWO STOPS OF THE SAME HUE, not flat. Flat #f7f2f6 against the
   panel's #FFFFFB is so close that the border was doing all the work and the box
   read as an outline rather than a surface. A shallow gradient gives it a top
   edge that catches light, which is what makes it read as inset. */
/* ---- THE DOILY PLATE -----------------------------------------------------
   Ashley sent the player-select screen from Jougai Rantou, the Sailor Moon
   fighting game, and asked what I thought about putting it behind the cards. It
   is the right reference: this whole page is a character select quoting that
   genre, and the lace is what the genre's own Sailor Moon entry actually did.

   IT IS USED AS TWO BANDS, NOT AS ONE PICTURE, and the reason is arithmetic. The
   plate is 828 x 1792 and the roster is 579 x 685. Stretched, the doilies go
   oval and the pixel art resamples; cropped, the bottom border is thrown away
   entirely. But the plate is not one image - it is a lace band, a flat gradient
   and another lace band, and CSS already makes gradients for free. So
   build_lace.py cuts the two bands out and they sit top and bottom at their own
   pixel size over the container's own gradient, which is how the original works
   on a CRT: the bands are the frame and the middle is fill.

   VIOLET, NOT THE SOURCE PINK. Ashley: "we can color shift to fit the palette."
   Eleven cards sitting on this bring every hue the section can carry, and a pink
   frame under pink, orange, green and teal cards is one more. The band is
   hue-shifted to the wing's own chrome; the pink build is still in the lace
   folder and swapping back is one word. */
.sel-roster{
  background-image:
    url("images/sailormoon/select/lace/lace-top.png"),
    url("images/sailormoon/select/lace/lace-bottom.png"),
    url("images/sailormoon/select/lace/cloud-bold.png"),
    linear-gradient(180deg,#ece4f0 0%,#f7f2f8 52%,#eee7f2 100%);
  background-position:left top, left bottom, center center, left top;
  background-repeat:repeat-x, repeat-x, repeat, no-repeat;
  /* ---- tile24, MADE TO WORK -----------------------------------------------
     Ashley: "try creating a new resized tile24.gif to your liking and see if
     that works better?"

     THE SIZE WAS NEVER THE VARIABLE. I built it at 1x, 1/2 and 1/3 first, and
     every one striped worse than the last - the motif is a horizontal cloud
     band, so shrinking it only fits more bands into the same height. What ruled
     tile24 out was value spread, 27.5 out of 255 against the frost tile's 2.7,
     and the fix for that is flattening, not resizing. Same tile, pulled in
     around its own mean: 27.5 down to 4.2, saturation to 45%, brightness up.

     IT TILES BOTH WAYS AT NATIVE SIZE, FROM THE CENTRE. It did not, for one
     round: I stretched it to 100% height to stop the horizontal banding, which
     meant a 224px tile blown up over a 685px box - a 3x vertical smear. Ashley:
     "it's way too zoomed into the top left corner. can't even tell its suposted
     ot be lace." Exactly right, and the diagnosis is in the word LACE. tile24 is
     not a cloud, which is what I had been treating it as; it is fine doily work
     that only reads at its own scale, and stretching it 3x destroyed the only
     thing worth having. The banding I was avoiding is the pattern.
     background-position:center is the second half of her fix and it matters more
     than it sounds: a tile anchored top-left puts its arbitrary starting phase
     in the corner and lets the roster's height decide where the motif lands.
     Centred, the pattern is composed around the middle of the box and grows out
     symmetrically, so it looks placed rather than left over.

     BOLD, AND THE FIRST PICK WAS WRONG. I chose the gentlest version that still
     measured as a texture, and Ashley: "I don't see the different background at
     all." She was right and it was checkable - diffed against a render with no
     tile, that version moved the roster by a mean of 1.44 levels out of 255.
     Not subtle. Nothing.

     Two reasons it disappeared. The flattening went too far, and THE SURFACE IS
     SMALL: eleven cards cover most of the roster and the lace bands own the top
     and bottom, so the tile only shows in the gutters between cards and the
     margins around them. A texture reading through that little area has to be
     stronger than one filling a page - which is not something you can judge by
     looking at the tile on its own, only by diffing the rendered box.
     Four builds now, measured the same way: ghost 1.09, soft 2.41, full 3.67,
     bold 4.91. Bold is the one you can see. Swapping down is one word. */
  background-size:auto, auto, auto, 100% 100%;
  /* LONGHANDS, NOT THE SHORTHAND. The shorthand version of this was invalid and
     the browser threw the whole declaration away silently, which looked exactly
     like the images failing to load - the network showed two 200s and the
     computed style showed only the gradient. Three layers with three different
     repeat and size values is past the point where the shorthand is easier to
     read than it is to get wrong. */
  border:2px solid #BDB6D2;
  /* The bands are pixel art at 1x, so nothing is being resampled, but the
     property costs nothing and guards against anyone scaling them later. */
  image-rendering:pixelated;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9), 3px 3px 0 rgba(90,50,104,.13);
  /* 11px, and this number is load-bearing. See the note on .sel-row: the stage
     hands the roster exactly 579px, the border spends 4 of it and this padding
     spends 22, leaving 553 - which is four 132px cards and three 8px gaps to the
     pixel. Change this and the grid drops a track without telling you. */
  padding:11px;
}

/* ---- the grid ------------------------------------------------------------ */
/* 14, down from 20. Tightening the roster is mostly this and the gap: three
   groups at 20px plus three description lines was about 150px of vertical air
   inside a box 900px tall. */
.sel-group{ margin:0 0 10px; }
.sel-group:last-child{ margin-bottom:0; }
.sel-h{
  margin:0 0 6px; font-family:"Press Start 2P",monospace; font-size:12px;
  color:#5A3268; padding-bottom:5px; border-bottom:2px dashed #C7C4D9;
}
/* .sel-note is no longer emitted - build_select.py drops the sentence under each
   heading. The rule stays for the roster page, which may still want it. */
.sel-note{ margin:0 0 12px; font-size:13px; font-style:italic; color:#6E6278; }

.sel-row{
  list-style:none; margin:0; padding:0;
  display:grid; gap:8px; justify-content:start;
  /* A grid item will not shrink below its own min-content width, so a long word
     inside a card can push that card WIDER THAN ITS TRACK and out through the
     side of the container. That is exactly what happened, and it is worth
     recording how it hid: the two cards that broke were Jupiter and Saturn, the
     two longest sign names, SAGITTARIUS and CAPRICORN. It could not be
     reproduced here because Press Start 2P loads from Google Fonts and is absent
     from the local mirror, so the fallback font measured narrower and every card
     sat obediently at 110. It only appeared on Ashley's screen, with the real
     font, where the plate needed about 131px.
     min-width:0 on the item plus overflow:hidden on the PLATE is the guard. Not
     on the card: the RPG cursor is a ::before sitting 17px outside the card's
     left edge and clipping the card would delete it. With the guard in place a
     font surprise costs a clipped letter instead of a broken grid, which is the
     right way round. The arithmetic below is still sized to fit properly. */
  /* Capped rather than 1fr. With 1fr a three-card group stretched its cards
     half again as wide as a four-card group, so Luminaries and Inner senshi
     rendered at visibly different sizes and the roster stopped reading as one
     grid. A select screen's cards are all the same size; that is most of what
     makes it read as a roster. */
  /* 132, and it is ARITHMETIC, not taste. Full chain, because it has silently
     broken five times now:
         .sel is 989 inside its border
         the panel column takes            366
         the stage pads 26 left, 18 right   44   -> roster gets 579
         the container border takes          4
         the container padding takes        22   -> cards get 553
         three 8px gaps take                24   -> four cards share 528
         528 / 4 =                         132
     One pixel over and auto-fill drops a track with NO error: the four-card
     groups wrap 3 + 1 and the page grows about 300px. This is downstream of the
     panel width, the stage padding, the container padding AND the gap, so if any
     of those four move, recompute it.
     AND IT HAS TO CLEAR THE LONGEST SIGN NAME. Press Start 2P advances exactly
     one em per character, so at 7.5px "SAGITTARIUS" is 11 x 7.5 = 82.5px. The
     plate spends 15px on padding and the sign row spends 24 on the glyph plus 4
     on the gap, so the text gets 132 - 43 = 89px. 82.5 fits with 6.5px to spare,
     which is why letter-spacing came off that one line - at 0.3px it was eating
     3.3 of those 6.5 for nothing. */
  grid-template-columns:repeat(auto-fill,minmax(104px,132px));
}
/* Every card in a row is exactly as tall as the tallest. "Setsuna Meiou"
   wraps to two lines and "Rei Hino" does not, and without this the grid gets
   a 20px step in it that reads as a broken layout rather than as a longer
   name. The field stays fixed so the busts keep their shared baseline; the
   plate absorbs the difference. */
.sel-row > li{ display:flex; min-width:0; }

/* ---- the card ------------------------------------------------------------
   Field, then plate. Same three-layer logic as the profile page, shrunk, so
   the card is a genuine preview of the room it opens. */
.sel-card{
  position:relative; display:flex; flex-direction:column; flex:1;
  text-align:left; text-decoration:none; cursor:pointer; font:inherit;
  /* The card no longer paints the wash itself. It used to, and with a
     translucent field on top of it the two stacked to something almost solid -
     the lace showed through the field and then hit the card's own wash and
     stopped. The plate below still paints, so the card is only transparent
     where the field is. */
  background:transparent; color:var(--ink);
  border:2px solid var(--skirt);
  box-shadow:3px 3px 0 rgba(0,0,0,.26);
  transition:transform .07s, box-shadow .07s;
}
.sel-card:focus{ outline:none; }
.sel-card:focus-visible{ outline:3px solid #5A3268; outline-offset:2px; }

/* ---- 100, DOWN FROM 118, AND THE 18px WAS EMPTY SKY -----------------------
   Ashley: "can we make the character cards not so tall? maybe that's what's
   bugging my eye."

   Measured before changing anything, because "too tall" could have been the
   field, the name plate or the row. It was the field, and specifically the part
   of it with nothing in it: the resting bust is an 80px box sitting on the
   field's foot, its drawn content starts about 11px into that box, and the field
   was 116px of content - so 47px, forty percent of the field, was blank sky
   above her head. The plate underneath is 64px carrying two lines of type, which
   is already tight.

   At 100 the sky is 29px, her head comes up near the planet symbol and the disc,
   and where she touches them she paints in front - which is the arrangement
   Ashley asked for two rounds ago ("if the senshi bust overlaps the glyph or the
   planet, that is totally okay. please stop trying to keep everything from
   touching"). Every card loses 18px and nothing inside one moves relative to
   anything else. */
.sel-field{
  position:relative; display:block; flex:none; height:80px;
  /* TRANSLUCENT, so the doily reads through it. Ashley: "the character select
     cards, the lighter color behind the busts... can we add a slight
     transparancy to that?" --washa is the same wash with an alpha, derived in
     palettes.py rather than applied here, so the solid version stays available
     for every surface that is a reading surface. */
  background:var(--washa, var(--wash)); border-bottom:2px solid var(--skirt);
  overflow:hidden;
}
/* Bottom-flush and centred. Every bust was cropped onto the same 80x80
   canvas by the asset pass, so a single rule lands every head at the same
   height with no per-character nudging. */
/* The bust paints ABOVE the planet - it is second in the markup for exactly
   this reason. That is what lets Saturn keep his rings at 2x: 108px wide would
   otherwise cross the bust and cover her face, and instead she stands in front
   of her planet, which is the composition the panel already uses. */
/* BOTTOM LEFT, not bottom centre. The two marks sit in the top corners now, and
   a centred bust put her head directly under the gap between them; anchored left
   she sits under the symbol with the planet clear over her right shoulder, which
   is the arrangement Ashley described.

   STILL 80px, AND THAT IS A CEILING RATHER THAN A CHOICE. These sprites are 80px
   of source art, so 80 IS 1x - there is no 1.25 available under the integer-scale
   rule, and 2x is 160, which in a 128px field crops to her face alone and buries
   the planet behind her head. Tightening the crop does not help either: it would
   remove margin, and the figure is the same count of pixels afterwards. Making
   her genuinely bigger needs different source art, not different CSS. */
.sel-bust{
  position:absolute; left:2px; bottom:0;
  width:80px; height:80px; image-rendering:pixelated; z-index:2;
}

/* Her planet's astrological symbol, top left, opposite the pixel planet. Same
   1px dark keyline the orb wears and for the same reason: these glyphs are flat
   bright colours and the eleven fields they sit on are all pale, so several of
   them would otherwise wash straight out.

   20px, DOWN FROM 40, on Ashley's "glyphs inside the character cards are too
   big". 20 and 40 are the only sizes available: the sprite is 20px of source art
   so those are 1x and 2x, and anything between them is a fractional zoom on
   pixel art. 40 was 2x and dominated the field; 20 is the mark it should have
   been, and it now reads as a small stamp rather than as a second planet. */
.sel-glyphmark{
  position:absolute; top:6px; left:6px; z-index:3;
  width:20px; height:20px; image-rendering:pixelated;
  filter:drop-shadow(1px 0 0 rgba(0,0,0,.35)) drop-shadow(-1px 0 0 rgba(0,0,0,.35))
         drop-shadow(0 1px 0 rgba(0,0,0,.35)) drop-shadow(0 -1px 0 rgba(0,0,0,.35));
}
/* The card's planet: the pixel solar-system disc at 2x, in the corner. The
   sprite-sheet glyph used to live here at 32px and read as a symbol; at 52px
   this reads as a planet, which is what the card wants. The sprite glyph is
   still on the page - it sits beside the planet name in the panel head - so
   each surface carries exactly one planet mark. */
/* ---- THE EXPANDED BUST ----------------------------------------------------
   Ashley: "add a slight bust expansion when a character is highlighted... i want
   the lighter pink to also expand down, filling the box down until the end of the
   larger bust... it's basically an expanded icon showing which character is
   selected... like a fighting game. their 'stats' show up in the panel box."

   So the FIELD ITSELF GROWS. The expanded bust lives inside it, and the field's
   height animates from 118px to --fieldlg, which is that character's bust height
   plus 8px of air. It has to be per-card and written by the build: the busts run
   from 126px tall to 144, so one number in this stylesheet would either clip the
   tall ones or leave a gap under the short ones.

   The bust is a DIFFERENT FILE at double the resolution, not a zoom - the icon
   set's own 2x, from the sprite rip Ashley added, with Uranus and Tuxedo Mask
   built here to match. That is the only way to grow pixel art without resampling
   it.

   SIDE CROP IS ACCEPTED, vertical is not. Eight of the eleven busts are wider
   than the 126px the card has inside its border, so something has to give;
   Ashley chose the crop over wider cards. Centring the bust splits it evenly, so
   the worst case is Pluto and Chibi Moon losing about 16px a side - the outer
   edge of hair and bows, never a face.

   NO LAYOUT SHIFT, and this is the part that had to be checked rather than
   assumed. The card is a flex column of field plus plate; the plate is flex:1
   with min-height:0, so when the field takes 152px the plate gives up 152px and
   the CARD's height never changes. The tallest expanded field is 152 against a
   186px card, so the plate always has room to absorb it. */
/* THE EXPANSION IS OUT OF FLOW, and that correction is the whole reason this
   works. The first version simply grew .sel-field's height, which looked right
   and quietly broke the grid: the plate is in the flow underneath, so the card's
   natural height grew with the field, the row grew to the tallest card, and
   hovering across the roster moved everything. Measured, the Luminaries row went
   214 to 209 and the Outers 209 to 220 as the selection travelled, and the page
   moved 6px with it.
   So the field keeps its 118px in the layout FOREVER, and the expansion is a
   pseudo-element painted over the top of the plate. Nothing in the flow changes,
   so the card, the row and the document are the same height selected or not -
   which the shift harness checks on every run. */
/* ---- THE SELECTED CARD ----------------------------------------------------
   Ashley, with a picture: "see how the darker red bar is so tall? it should
   only begin at the bottom of the sprite bust. in fact, the sprite bust should
   also be pushed down, and the darker red band only a thin bottom boarder."

   THE BAND IS GONE AND THE PLATE IS RECOLOURED INSTEAD, which is the whole fix
   and it removes code rather than adding it. Two rounds were spent painting a
   pale rectangle over the top of the dark name plate and arguing about how far
   down it should reach. But the dark thing on a selected card IS the name plate,
   sitting in the flow with its own height, and the plate is already exactly as
   tall as the card needs it to be. So do not cover it - repaint it. On a
   selected card the plate takes the wash, and an inset shadow leaves --bustfoot
   of skirt showing along its bottom edge as a rule. One declaration, no
   geometry, and it cannot drift out of step with the card's real height the way
   a hardcoded band did twice.

   --bustfoot is that rule's thickness and also the ledge the sprite stands on,
   so the two cannot disagree by construction. */
.sel{ --bustfoot:16px; }

.sel-card[data-active] .sel-plate{
  min-height:0;
  background:var(--washa, var(--wash));
  box-shadow:inset 0 calc(0px - var(--bustfoot)) 0 var(--skirt);
}

/* ---- ICON -> BUST reveal, HISTORY ----------------------------------------
   This slot has been three things. First a plain 1x->2x snap. Then a six-frame
   steps(6,jump-none) "Mode 7" ratchet that walked the scale through .5,.6,.7,.8,
   .9,1 to mimic a SNES affine resample - Ashley: "something closer to old school
   SNES mode 7 shit." That was a deliberate exception to the 1x/2x integer rule,
   because the fractional frames only existed for the 200ms in between.

   Now it is a CROSS-FADE, because Ashley asked to drop the zoom: "Replace it with
   a quick cross-fade, around 120ms. Nothing dynamic." So the integer-scale
   exception is retired with it - the sprite is only ever drawn at 1x (icon) or 2x
   (bust), never in between - and the busts still being an exact 2x NEAREST of the
   icons is what makes the dissolve read as one character stepping forward rather
   than two pictures swapping. The resting geometry (centred, standing on the
   --bustfoot ledge, expressed from the card bottom) is unchanged. */
/* ---- ICON -> BUST is a 120ms CROSS-FADE now, not a Mode 7 zoom -------------
   Ashley: "Replace it with a quick cross-fade, around 120ms. Nothing dynamic."
   The six-step steps(6,jump-none) affine zoom is gone. The large bust simply
   sits at its final resting place (centred, standing on the --bustfoot ledge)
   and fades in over the small icon, which fades out under it. No transform, no
   movement, no per-frame scaling - so --busttop/--bustx are no longer read here
   (they stay emitted, harmless, in case the zoom is ever wanted back).
   Because the two sprites are the SAME art at 1x and 2x, the dissolve reads as
   the character stepping forward rather than one picture becoming another. */
.sel-bust-lg{
  position:absolute; z-index:4;
  top:calc(100% - var(--bustfoot) - var(--busth,138px));
  left:50%; margin-left:calc(var(--bustw,128px) / -2);
  image-rendering:pixelated; pointer-events:none;
  opacity:0; visibility:hidden;
  transition:opacity .12s ease, visibility 0s linear .12s;
}
.sel-card[data-active] .sel-bust-lg{
  opacity:1; visibility:visible;
  transition:opacity .12s ease;
}
/* The resting icon fades out on the same 120ms clock as the big one fades in. */
.sel-bust{ transition:opacity .12s ease; }
.sel-card[data-active] .sel-bust{ opacity:0; }
/* The field's own foot rule goes: on a selected card the field and the plate are
   one continuous wash, and the only rule left is the one at the very bottom. */
.sel-card[data-active] .sel-field{ overflow:visible; border-bottom-color:transparent; }

/* THE TYPE LEAVES ENTIRELY. Ashley: "the text moves out of the way, but not
   enough." It was sliding 20px and still showing under the bust. A selected card
   is a portrait and nothing else - her name, sign and guardian title are all on
   the panel by then, which is what the panel is for. 64px clears the plate, and
   the plate clips what is past its edge. */
.sel-plate{ transition:none; }
.sel-card[data-active] .sel-name,
.sel-card[data-active] .sel-civ{
  transform:translateY(64px); opacity:0;
}
.sel-name, .sel-civ{ transition:transform .22s ease-out, opacity .18s ease-out; }
.sel-card{ overflow:hidden; }
/* The cursor moves to the list item, since the card now clips its own overflow
   and the cursor lives outside the card by design. */
.sel-row > li{ position:relative; }

@media (prefers-reduced-motion:reduce){
  .sel-bust-lg, .sel-name, .sel-civ{ transition:none; }
}

.sel-orb{
  position:absolute; top:6px; right:6px;
  image-rendering:pixelated;
  /* A one-pixel dark outline, built from four drop-shadows rather than a
     border so it follows the disc and not its bounding box.
     Necessary, not decorative: every disc in the set has a pure WHITE outline
     ring, which reads beautifully on the dark panel and disappears completely
     on Venus's #ffeecd wash and Moon's #ffe7ee. The dark keyline is what lets
     one planet set sit on eleven different pale fields. */
  filter:drop-shadow(1px 0 0 rgba(0,0,0,.34)) drop-shadow(-1px 0 0 rgba(0,0,0,.34))
         drop-shadow(0 1px 0 rgba(0,0,0,.34)) drop-shadow(0 -1px 0 rgba(0,0,0,.34));
}
.sel-glyph{
  position:absolute; top:2px; right:2px; width:32px; height:32px;
  image-rendering:pixelated; opacity:.95;
}
.sel-plate{
  display:block; flex:1; padding:4px 7px 5px;
  background:var(--skirt); color:var(--onskirt);
  /* The clipping half of the min-width guard. See the long note on .sel-row. */
  min-width:0; overflow:hidden;
}
/* THE PLATE FILLS DOWNWARD. Ashley: "Please adjust the size of the character
   name text to fill downward." With the symbol line gone the plate holds two
   things instead of three, so both grew rather than the plate shrinking: the
   planet name 10 to 11, the civilian name 11.5 to 13.5.
   11 IS THE CEILING and it is arithmetic, not taste. Press Start 2P advances one
   em per character, the plate's inner width is 132 - 16 = 116, and CHIBI MOON is
   the longest at 10 characters: 11px needs 110 and fits, 12px needs 120 and
   wraps. It was set to 12 first and looked fine here, because the real font is
   missing from this mirror and the fallback measures narrower - the same trap
   that hid the SAGITTARIUS overflow. Checked on paper rather than on screen. */
.sel-name{
  display:block; font-family:"Press Start 2P",monospace; font-size:11px;
  line-height:1.2; text-shadow:1px 1px 0 rgba(0,0,0,.35);
  overflow-wrap:anywhere;
}
.sel-civ{ display:block; margin-top:7px; font-size:13.5px; font-weight:600; opacity:.94; }

/* Her sun sign, on the card. It used to live only in the detail panel, which
   was fine until the panels started hiding with display:none - at which point
   the eleven signs left the strongly-weighted markup on the one page that is
   supposed to rank for them. Here it is always in the DOM, always visible, and
   it makes the card say the whole thing: planet, person, sign. */
/* THE CARD'S BOTTOM LINE IS THE PLANET SYMBOL NOW, not the sun sign. Ashley:
   "remove the zodiac sign from the character select boxes and replace it with
   their proper planet glyph."
   The sign is not lost - it moved to the panel strip, and it is still in the
   served HTML for every one of the eleven, which is what mattered when it was
   put on the card in the first place. Worth knowing that it did have a job here:
   the card is the most heavily weighted part of the page, so the astrology
   signal is a little quieter on the grid than it was.
   The mark is the 20x20 senshiglyph at 1x. Not 2x: at 40px it competes with the
   pixel planet in the field above it, and one surface should carry one planet
   mark at one size. */
.sel-signline{
  display:flex; align-items:center; margin-top:6px; min-width:0;
}
.sel-signline img{ width:20px; height:20px; image-rendering:pixelated; flex:none; }

.sel-card:hover{ transform:translate(-2px,-2px); box-shadow:5px 5px 0 rgba(0,0,0,.3); }

/* ---- the RPG cursor ------------------------------------------------------
   One cursor, on the active card only. That is the entire point of a cursor:
   a marker that appears on everything marks nothing. Drawn as a chunky pixel
   arrow rather than a border glow so it reads as a game and not as a focus
   ring, and sat OUTSIDE the card so it cannot reflow anything inside it. */
.sel-card[data-active]{
  transform:translate(-2px,-2px); box-shadow:5px 5px 0 rgba(0,0,0,.34);
}
.sel-row > li:has(.sel-card[data-active])::before{
  content:""; position:absolute; left:-17px; top:34px;
  width:14px; height:20px; image-rendering:pixelated;
  background:no-repeat center/contain
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='7' height='10' shape-rendering='crispEdges'%3E%3Cpath d='M0 0h2v10H0z' fill='%235A3268'/%3E%3Cpath d='M2 1h2v8H2z' fill='%235A3268'/%3E%3Cpath d='M4 2h2v6H4z' fill='%235A3268'/%3E%3Cpath d='M6 4h1v2H6z' fill='%235A3268'/%3E%3Cpath d='M0 1h1v8H0z' fill='%23f6ebbe'/%3E%3C/svg%3E");
  animation:sel-nudge .7s steps(2) infinite;
}
@keyframes sel-nudge{ 0%{margin-left:0} 50%{margin-left:3px} 100%{margin-left:0} }

/* ---- THE PLANET SHEEN -----------------------------------------------------
   Ashley: "the planet effect, make it not sparkles, use a light sheen." Fifth
   version of the selection effect and the quietest of the lot. A band of light
   passes across the disc once, then waits. Nothing else on the card moves.

   MASKED TO THE SPRITE, which is the part that makes it a sheen rather than a
   rectangle of light sitting on top of a planet. The pseudo-element is a moving
   diagonal gradient, and mask-image clips it to the orb's own silhouette - so
   the light travels across the DISC, runs off its curved edge, and never touches
   the field behind it. Saturn's rings get lit too, because the mask is his whole
   sprite and the rings are part of it.

   The sprite and its size arrive as --orb, --orbw and --orbh, written onto each
   card by build_select.py. That is deliberate: the orbs are three different
   sizes and eleven different files, and hardcoding any of that here would put
   character names in a stylesheet whose whole contract is that it contains none.

   115deg, not 90: a vertical wipe reads as a shutter, an angled one reads as
   light. And the keyframes hold the band OFF the disc for two thirds of the
   cycle, so it passes about once every two seconds instead of strobing - a sheen
   that never stops is a barber's pole. */
.sel-card[data-active] .sel-field::after{
  content:""; position:absolute; top:3px; right:3px;
  width:var(--orbw,52px); height:var(--orbh,52px);
  pointer-events:none;
  /* z-index 1: ABOVE the planet, BELOW the character. Ashley: "the planet light
     sheen goes over the character sprite bust. make sure the light sits behind
     the character's head." It was on 3 and the bust is on 2, so the light was
     crossing her face. The orb sits at auto, which paints at 0, so 1 is the only
     value that gets the sheen onto the disc without lifting it over her - and it
     matters because she OVERLAPS the planet by design: the bust was deliberately
     put in front of the disc so Saturn could keep her rings at 2x without them
     crossing her face. Light behind the subject is also simply what a sheen on a
     distant planet should do. */
  z-index:1;
  /* HARD STOPS, NOT A RAMP. Ashley: "can the sheen be a bit more pixelated".
     A smooth gradient is the one thing in this grid that is not made of discrete
     values, and at this size it reads as an airbrush over pixel art. Four flat
     bands with no blend between them is the same light in the vocabulary of the
     rest of the page - each stop repeats its colour to the next boundary, so
     every band is one solid value and the edges between them are hard. */
  background:linear-gradient(115deg,
    rgba(255,255,255,0)   0 41%,
    rgba(255,255,255,.22) 41% 46%,
    rgba(255,255,255,.55) 46% 50%,
    rgba(255,255,255,.88) 50% 54%,
    rgba(255,255,255,.42) 54% 59%,
    rgba(255,255,255,0)   59% 100%);
  background-size:260% 100%;
  -webkit-mask:var(--orb) no-repeat center / contain;
          mask:var(--orb) no-repeat center / contain;
  animation:sel-sheen 3.1s linear infinite;
}
@keyframes sel-sheen{
  0%   { background-position:180% 0; }
  32%  { background-position:-80% 0; }
  100% { background-position:-80% 0; }
}

/* The press is a different event from the selection and keeps its own signal:
   a touch darker, no colour, no script. */
.sel-card:active{ filter:brightness(.94); }

@media (prefers-reduced-motion:reduce){
  .sel-row > li:has(.sel-card[data-active])::before{ animation:none; }
  .sel-card[data-active] .sel-field::after{ display:none; }
}

/* ---- Tuxedo Mask, deliberately not a senshi card -------------------------
   Double border and more air. He is the only one on the roster who is not a
   senshi and the card should say so before you read the name. */
.sel-card--wide{ outline:2px solid var(--skirt); outline-offset:3px; }
/* SEATED FLUSH like the rest. The 8px lift was for his OLD icon, cut shorter
   than the senshi (63px content) so it needed air to match. His recut game icon
   is 68x69, the same as the others, so the lift now just makes him float above
   the field. Ashley: "tuxedo mask sprite is floating too high in his character
   box." bottom:0 seats him on the same line as everyone else. */
.sel-card--wide .sel-bust{ bottom:0; }

/* ---- under construction --------------------------------------------------
   Real cards, dashed, muted, inert. They are on the roster because the roster
   is the truth; an empty seat is information. */
.sel-card--soon{
  background:#f4f2f7; border:2px dashed #B9B3C9; box-shadow:none;
  color:#6E6278; cursor:default;
}
.sel-card--soon .sel-field{ background:#f4f2f7; border-bottom:2px dashed #B9B3C9; height:96px; }
.sel-card--soon .sel-plate{ background:#E7E3EE; color:#5B5470; }
.sel-card--soon:hover{ transform:none; box-shadow:none; }
.sel-soon-mark{
  position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  font-family:"Press Start 2P",monospace; font-size:9px; color:#9A93AC;
  letter-spacing:1px; text-align:center; line-height:1.8; white-space:nowrap;
}

/* ---- the panel -----------------------------------------------------------
   Sticky so it stays with you as the grid scrolls. Fixed height so a
   selection change cannot move anything. */
.sel-panels{
  /* 340 x 713. Ashley: "this image panel box. It really is lovely, but fuck its
     big." Down from 429 x 900, keeping the plates' 429:900 aspect exactly so the
     backdrop still fits with no letterbox at all - the ratio is what makes that
     true, not the size, so it scales freely as long as both numbers move
     together. 340/0.47667 = 713.
     The 89px this frees does NOT become white space: it goes to the roster
     column, which is what lets the cards grow to 130 and is what stopped
     Jupiter and Saturn bursting their boxes.
     Inset 24 from the top and 26 from the right, the same 26 the stage uses on
     its left, so the two columns sit optically the same distance from the
     border. */
  /* margin-top 8, matching .sel-stage's own 8px of top padding, so the panel and
     the roster container start on exactly the same line. */
  /* 360 x 690, and the two numbers are no longer tied by the plates' ratio.
     They were: 429:900 exactly, so a contained backdrop filled the panel with no
     letterbox at all. That held while the roster was 751 tall and the matching
     panel height was 755. Shortening the cards took the roster to 685, and
     keeping the ratio would have meant either a panel 70px longer than the
     column beside it or giving back the width Ashley asked for.
     Breaking the tie costs nothing, because the thing the ratio was protecting is
     already protected twice over: .sel-fill is the same artwork again, blurred
     and covering, sitting behind the sharp copy precisely so that any bar contain
     leaves is filled with the picture itself. At 360 x 690 the bars are 16px at
     each side and they are invisible for exactly that reason. */
  position:sticky; top:24px; height:690px;
  width:360px; margin:8px 26px 0 0;
}
/* display:none, not visibility:hidden, and this is a WEIGHT fix not a style
   one. loading="lazy" defers an image that is out of the viewport - but all
   eleven panels are absolutely positioned inside a VISIBLE container, so the
   browser counted every one of them as in-viewport and fetched the lot. The
   page measured 4.05MB over 72 requests: you downloaded eleven characters'
   artwork to look at one.

   display:none is the one hiding mechanism that actually suppresses a lazy
   fetch. Cost: it also weakens how Google weights the hidden text, which is
   why the sun sign moved onto the CARD - the signs are the thing this page is
   meant to rank for, and they now sit in markup that is never hidden.

   No fade, because you cannot transition display. Worth losing: 120ms of
   opacity was never the point of this page. */
.sel-panel{
  position:absolute; inset:0; display:none;
  border:3px solid var(--skirt); background:#0e0c14; color:#fff;
  overflow:hidden;
}
.sel-panel[data-active]{ display:block; }

/* CONTAIN, not cover, and this is the whole reason the panel got taller.
   These scans run as narrow as 1 wide by 2.9 tall (Saturn), so cover was
   throwing away up to half the height: you were seeing 49% of Saturn and 54%
   of Uranus, which is why the figures looked beheaded.

   Contain normally means visible letterbox bars. Not here. The crop pass
   normalised every plate to one black, #0e0c14, and that is exactly the
   panel's own background, so the bars are the same colour as the thing they
   sit next to and simply cannot be seen. Full figure, full planet, every
   character, no cropping, for free. */
.sel-back{
  position:absolute; inset:0; z-index:1; width:100%; height:100%;
  object-fit:contain; object-position:center;
}

/* THE LETTERBOX FILL, and the reason the panel does not need a matching
   black at all.

   Contain leaves a bar wherever the scan's aspect misses the panel's - 144px
   top and bottom on Pluto. The plan was to make that bar invisible by putting
   every plate on one black, and it very nearly worked, but these scans
   vignette: after normalising, Saturn's corner sits at 12 and its mid-edge at
   26, so no single background value can match a plate that does not match
   itself. Chasing it further meant flattening a gradient that is part of the
   photograph.

   So do not match the black - remove the bar. The same image again,
   object-fit COVER this time, blurred and dimmed, fills the whole panel
   behind the sharp copy. There is no seam to see because there is no edge:
   the margin is the same artwork, out of focus. The browser has the file
   cached from the sharp copy, so it costs one decode and no extra bytes. */
.sel-fill{
  position:absolute; inset:0; z-index:0; width:100%; height:100%;
  object-fit:cover; object-position:center;
  /* Barely dimmed. brightness(.5) left the fill DARKER than the sharp
     scan's own background, which put the seam back exactly where removing it
     was the point - just inverted. At .92 the two blacks sit on top of each
     other and the join disappears. */
  filter:blur(30px) brightness(.92) saturate(1.1);
  transform:scale(1.18);
}

/* Behind the figure: Takeuchi's own planet, cut off the black plate and left
   on its black.

   mix-blend-mode:screen is what cuts it. Screen keeps the brighter of the two
   layers per channel, so the black contributes nothing and the disc composites
   with no alpha channel, no keying pass and no chance of a fringe. It sits
   ABOVE the scan, because below it only showed in the letterbox sliver contain
   leaves at the sides. Screen can only ADD light, so it blooms across the empty
   black around every one of these figures and barely touches the figure, who is
   already the brightest thing in frame.

   The pixel disc was tried in this slot and moved to the card. The division is
   the point: the panel is where the illustration lives and the grid is where
   the pixel art lives, and mixing them in one 340px box made both look like
   accidents. */
.sel-sphere{
  position:absolute; left:50%; top:34%; z-index:2;
  width:135%; transform:translate(-50%,-50%);
  mix-blend-mode:screen; opacity:.34; pointer-events:none;
  /* These discs come off the plates at wildly different sizes - Chibi Moon's
     is 130px across, Pluto's is 27 - and blown up the small ones show the
     scan's halftone rosette as visible dots. Four pixels of blur kills the
     rosette and still leaves Saturn's rings legible. */
  filter:blur(4px);
}
/* A wash in the character's own skirt, just enough that the type has
   something to sit on and that the panel reads as hers even before the name
   is legible. */
.sel-panel::after{
  content:""; position:absolute; inset:0; pointer-events:none; z-index:3;
  background:linear-gradient(180deg, rgba(14,12,20,.9) 0%, rgba(14,12,20,.8) 11%,
             rgba(14,12,20,0) 36%,
             rgba(14,12,20,.15) 60%, rgba(14,12,20,.88) 100%);
}
/* ---- THE HEAD -------------------------------------------------------------
   Ashley, twice: "please also fix the font at the top. still to small and still
   too dark."

   BIGGER: 16px, up from 13. That is affordable because the planet symbol beside
   it came down from 40 to 32 and gave the line 8px back. Press Start 2P advances
   exactly one em per character, so the longest name on the roster - SAILOR CHIBI
   MOON, seventeen characters - needs 272px against the 273 the line now has.
   That is one pixel of margin, which is not margin, so the head is allowed to
   WRAP: it is anchored to the top of the panel and nothing sits under it, so a
   second line costs nothing and the alternative is a name clipped mid-word on
   one card in eleven. The shadow layer wraps with it, or the two would desync.

   LIGHTER: the letters were being painted by the sheen gradient, whose base was
   white but whose middle stops are pink, and at 13px on a photograph the pink
   read as grey. The gradient keeps its shimmer but every stop is now white or
   nearly, and the drop shadow underneath went from one soft offset to a hard
   black outline on all four sides - so the name is white against the artwork
   whatever the artwork happens to be doing behind it. */
.sel-head{
  position:absolute; top:0; left:0; right:0; z-index:4;
  display:flex; align-items:center; gap:9px; padding:11px 12px;
}
.sel-head img{ width:32px; height:32px; image-rendering:pixelated; flex:none; }
.sel-planet{
  /* 18px, Ashley's call for more of a nameplate. 16 was the one size that kept
     every name on one line; at 18 the two or three longest (SAILOR CHIBI MOON,
     SAILOR MERCURY) wrap to a second line, which the head allows since it is
     anchored to the top with nothing under it. The shadow and the shimmer overlay
     both wrap with it because all three are the same string at the same width. */
  font-family:"Press Start 2P",monospace; font-size:18px; line-height:1.45;
  color:#fff;
  text-shadow:2px 2px 0 rgba(0,0,0,.92), -2px 2px 0 rgba(0,0,0,.92),
              2px -2px 0 rgba(0,0,0,.92), -2px -2px 0 rgba(0,0,0,.92);
}

/* ---- THE NAME, AND WHY IT IS NOT CLIPPED TYPE ANY MORE --------------------
   Ashley, third time: "the \"sailor ....\" font in the large character panel is
   still fucked."

   It was background-clip:text. The letters were painted BY a moving gradient,
   which meant `color` was transparent and the only thing making the name visible
   was paint arriving from the background. That has now failed in three different
   ways on her machine and been patched twice - a white base colour, then a
   whiter gradient - and both patches were treatments for a technique whose
   failure mode is an invisible name. A decoration that can delete the content it
   decorates is the wrong technique, however well it is patched.

   So the name is ORDINARY SOLID WHITE TEXT with a hard four-way outline. It
   cannot vanish, cannot go grey, does not depend on background-clip being
   supported or on the gradient's paint position, and renders identically
   everywhere.

   The light still crosses it, in sync with the planet, because the sheen moved
   OFF the letterforms and onto the head strip: ::after is a translucent white
   band swept across the whole block on the same 3.1s clock. Same effect to look
   at, and the worst thing it can do on any browser is nothing. */
.sel-panel[data-active] .sel-planet{ position:relative; color:#fff; }
/* ---- THE SHIMMER, NOW ON THE TEXT ONLY -----------------------------------
   Ashley: "there is a shimmer effect, but it should only shimmer over the text.
   right now it looks like a huge left to right swipe... match the shimmer to a
   light pretty version of the senshi colour."

   The old sheen swept the whole head strip, which is why it read as a big swipe.
   This puts it back on the letterforms - but NOT by painting the name with a
   gradient, which is the background-clip:text technique that made the name vanish
   on her machine three times (see the long note below). The base name stays
   ORDINARY SOLID WHITE. The shimmer is a SEPARATE overlay: a copy of the name in
   a light tint of the senshi's own --trim, revealed only through a diagonal band
   that sweeps across via mask-position. If the mask is ever unsupported the copy
   simply shows in full - a readable coloured name - so the worst case is still a
   visible name, never an invisible one. */
.sel-panel[data-active] .sel-planet::after{
  content:attr(data-name); position:absolute; left:0; top:0; width:100%;
  font:inherit; letter-spacing:inherit; line-height:inherit; pointer-events:none;
  color:color-mix(in srgb, var(--trim) 58%, #fff);
  text-shadow:0 0 7px color-mix(in srgb, var(--trim) 65%, #fff);
  -webkit-mask-image:linear-gradient(105deg, transparent 41%, #000 50%, transparent 59%);
          mask-image:linear-gradient(105deg, transparent 41%, #000 50%, transparent 59%);
  -webkit-mask-size:240% 100%;  mask-size:240% 100%;
  -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat;
  animation:sel-nameshimmer 3.4s linear infinite;
}
@keyframes sel-nameshimmer{
  0%   { -webkit-mask-position:175% 0; mask-position:175% 0; }
  58%  { -webkit-mask-position:-75% 0; mask-position:-75% 0; }
  100% { -webkit-mask-position:-75% 0; mask-position:-75% 0; }
}
@media (prefers-reduced-motion:reduce){
  .sel-panel[data-active] .sel-planet::after{ animation:none; opacity:0; }
}

/* The large bust in its bordered window, bottom-left. This is the reveal:
   the card shows an 80px icon, the panel shows the fighting-game portrait. */
/* PADDED OFF EVERY EDGE. Ashley: "the pixel bust from moon fighter is touching
   the bottom of the box where the text begins. please create padding around each
   of the pixel busts in the large panel."
   It was worse than touching - the window's foot sat 26px INSIDE the name strip.
   Nothing moved the window; the strip grew. It went from two lines to four when
   the guardian title and the Japanese name were added, 46px to 84, and the
   window's bottom:58 had been measured against the old height. Anchoring one
   element to another's size by hand is exactly the kind of number that goes
   stale the moment the other element changes.
   98 = the strip's 84 plus 14 of air, which matches the 14 it already sits in
   from the left. There was a SECOND, identical copy of this rule further down the
   file; it is deleted rather than edited, since two rules with one job means the
   loser is decided by source order rather than by intent. */
/* ---- 1x, AND THE ROUND AT 2x IS WHY THE NOTE IS THIS LONG -----------------
   It went to 256x400 for one round on a real argument: a selected card was
   showing 144x138 of pixel art against the panel's 128x200, so the card held the
   larger sprite and the eye went there, and Ashley had said she wanted the panel
   to be the thing that catches attention.

   The argument was right about the ratio and wrong about which number to move.
   At 2x the portrait covered most of the Takeuchi plate it is supposed to be
   standing in front of, so the panel won the eye by deleting the thing that made
   it worth looking at. Ashley: "the pixel bust is way to big now in the full
   character panel. please make back to normal size it was."
   The ratio is fixed from the other end instead - the card's expansion comes
   down and its sprite is cropped harder by the card, which costs nothing. */
.sel-window{
  position:absolute; left:14px; bottom:98px; z-index:4;
  width:128px; height:200px; border:2px solid var(--trim);
  box-shadow:0 0 0 2px rgba(0,0,0,.55), 4px 4px 0 rgba(0,0,0,.4);
  background:#0e0c14;
}
.sel-window img{ display:block; width:128px; height:200px; image-rendering:pixelated; }
.sel-window--bust{ width:140px; height:142px; bottom:96px; }
.sel-window--bust img{ display:block; width:136px; height:138px; image-rendering:pixelated; }
.sel-window--none{
  display:flex; align-items:center; justify-content:center; text-align:center;
  border-style:dashed; padding:10px;
  font-family:"Press Start 2P",monospace; font-size:8px; line-height:2;
  color:var(--trim);
}

/* ---- THE BLANK PANEL ------------------------------------------------------
   Ashley: "when the page loads, don't start with moon expanded. let's have a
   'blank'."

   It borrows the character panel's whole treatment - blurred cover fill behind,
   contained sharp copy in front, dark wash over the top - because Takeuchi's
   ten-up spread is on the same black as the character plates and needs no
   special handling. What it does NOT borrow is the palette: there is no
   character yet, so it takes the wing's own violet rather than borrowing
   somebody's, which would be the same mistake as starting on Moon.

   The plate sits centred rather than at the foot. A character panel's strip is
   at the bottom because the figure stands above it; here the artwork is a
   letterboxed band across the middle and the type belongs under it. */
/* NO BLACK ON THE BLANK PANEL. Ashley: "i don't like the black border around the
   blank image."
   It was inheriting the character panel's whole treatment, and that treatment is
   built for a scanned plate on #0e0c14: a near-black background so contain leaves
   no visible letterbox, and a heavy dark scrim at the top so a white name holds
   over the artwork. Neither applies here. This plate is on Takeuchi's own pale
   rainbow wash and there is no name to hold, so all the black was doing was
   drawing a frame nobody asked for around a picture that is already the right
   shape for the box. Pale background, pale border, no scrim, and the type at the
   foot goes dark-on-light instead of the reverse. */
/* DARK TREATMENT (redo of the uncommitted edit). The blank slot now carries the
   SNES cast portrait (roster-cast.png) on near-black, the same way the character
   panels treat their scanned plates, with the green keyline sampled off the
   plate and handed in as --blank-edge by build_select.py. */
.sel-panel--blank{ border-color:var(--blank-edge,#569868); background:#0e120f; }
.sel-panel--blank::after{ display:none; }
/* THE ART GOES UP, THE TYPE TAKES THE REST, and this is the arithmetic that
   decided it. The spread is 1.17 wide to 1 tall and the panel is 0.48, so no
   amount of cropping short of losing half the roster makes this image fill this
   box: contained, it is 340 by 292 inside 340 by 713, and 421px of the panel is
   never artwork. Centring it left that 421 split as two vague blurred margins,
   which reads as an image that failed to load properly.
   So stop trying to fill the panel with the picture. The picture takes the top,
   the type takes the bottom, and the blur between them is a gradient rather than
   a gap. That is also the shape a character panel already has - art above, plate
   below - so the two swap without the eye having to re-learn the box. */
/* ART ON TOP, TYPE UNDER IT, AND THE NUMBERS COME FROM THE PICTURE. The plate is
   0.71 wide to 1 tall and the panel is 0.48, so contained it is 340 by 481 inside
   340 by 713 and 232px is not artwork. Pushed to 18% of that slack the art sits
   42px from the top and finishes at 523; the type block starts just under it at
   76% and runs to the foot. The gradient does the joining, so the boundary
   between painting and prompt is a fade rather than an edge.
   This artwork is not on the character plates' black, it is on Takeuchi's own
   pale rainbow wash, so the blurred fill behind it is pale too - which is why the
   plate's gradient has to be this heavy at the bottom for white type to hold. */
.sel-panel--blank .sel-back{ object-position:center 42%; }
.sel-blank-plate{
  position:absolute; left:0; right:0; top:66%; bottom:0; z-index:5;
  display:flex; flex-direction:column; align-items:center; justify-content:flex-end;
  padding:24px 16px 26px; text-align:center;
  background:linear-gradient(180deg, rgba(14,18,15,0) 0%,
             rgba(14,18,15,.72) 30%, rgba(14,18,15,.94) 62%,
             rgba(14,18,15,1) 100%);
}
.sel-blank-title{
  margin:0; font-family:"Press Start 2P",monospace;
  /* 18 characters at one em each. The plate is 334 wide inside the border and
     318 inside its own padding, so 15px fits at 270 with room to spare and 16
     would be 288 - still fitting, but with nothing left if the string is ever
     edited. Press Start 2P advances exactly one em per character and does not
     wrap gracefully, so the ceiling gets the margin. */
  font-size:17px; line-height:1.5; letter-spacing:1px;
  color:#fff; text-shadow:0 2px 0 #000, 0 0 10px rgba(86,152,104,.55);
  /* IT BOUNCES. Ashley: "the 'select your senshi' animate it in some way
     (bounce?) to indicate interaction."
     steps(1,end), so each keyframe segment HOLDS its own value and the type
     teleports between four positions instead of easing through them. A smooth
     bob would read as a web page; three hard frames read as a sprite, which is
     the only register this page is written in. It rests for most of the cycle
     and hops once, so it says "waiting for you" rather than "look at me".
     The sheen that used to be here is gone with the one on the panel name, and
     for the same reason - see the long note there. */
  animation:sel-bob 1.5s steps(1,end) infinite;
}
@keyframes sel-bob{
  0%, 62%  { transform:translateY(0); }
  70%      { transform:translateY(-3px); }
  78%      { transform:translateY(-6px); }
  88%      { transform:translateY(-3px); }
  100%     { transform:translateY(0); }
}
.sel-blank-note{
  margin:9px 0 0; font-size:13px; line-height:1.45;
  color:#cfe0d2;
}
@media (prefers-reduced-motion:reduce){
  .sel-blank-title{ animation:none; }
}

/* Bottom strip: civilian name and HER OWN SUN SIGN. Carries the palette. */
/* ---- THE NAME STRIP -------------------------------------------------------
   Four pieces now: guardian title, roman name, Japanese name, sun sign.

   THE TITLE MOVED ABOVE THE NAME, and that is what let it get bigger. Ashley
   asked for it larger, and beside the sign it could not go past 8px - "Guardian
   of the Deep Sea" is 24 characters, Press Start 2P advances one em each, and
   the space left over after the sign block is 216px. On its own line it has the
   strip's full 316, so 11px fits with 52px to spare. It also reads better there:
   a role above a name is a nameplate, a role beside a name is a caption.

   The Japanese name sits under the roman one, per Ashley, with the sun sign
   moved down beside it - the sign is the smallest of the four and pairs
   naturally with the second-line type rather than competing with the title. */
/* ONE COPY OF THIS BLOCK. There were two, forty lines apart, and between them
   they set padding, civ size, sign size and sign image size twice with different
   numbers - so what the strip actually looked like was decided by source order
   rather than by intent, and reading either block told you something false. The
   values below are the ones that were winning, so nothing moves; the loser is
   deleted rather than commented out. Second time this file has grown a twin (see
   the note on .sel-window), so: if a rule here needs changing, change it here. */
.sel-strip{
  position:absolute; left:0; right:0; bottom:0; z-index:5;
  padding:8px 12px 9px; background:var(--skirt); color:var(--onskirt);
  border-top:2px solid var(--trim);
}
.sel-strip-power{
  display:block; font-family:"Press Start 2P",monospace;
  font-size:11px; letter-spacing:.5px; line-height:1.3;
  color:var(--onskirt); opacity:.94; margin-bottom:6px;
}
.sel-strip-civ{
  display:block; font-size:14px; font-weight:700; letter-spacing:.2px;
  line-height:1.25;
}
.sel-strip-meta{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  margin-top:3px;
}
/* The Japanese name takes the system's own CJK stack, not Raleway. Raleway has
   no kanji, so every glyph would fall back one at a time and the line would be
   set in whatever each character found first. */
.sel-strip-jp{
  font-family:"Hiragino Kaku Gothic ProN","Yu Gothic","Meiryo","MS PGothic",
              "Noto Sans JP",sans-serif;
  font-size:14px; letter-spacing:1px; opacity:.9; line-height:1.3;
}
.sel-strip-sign{
  display:flex; align-items:center; gap:6px; flex:none;
  font-family:"Press Start 2P",monospace; font-size:9px; letter-spacing:.5px;
  white-space:nowrap; opacity:.9;
}
.sel-strip-sign img{ width:24px; height:24px; image-rendering:pixelated; }


/* Bottom strip: civilian name and HER OWN SUN SIGN. Carries the palette. */
/* ---- THE NAME STRIP -------------------------------------------------------
   Ashley: "styalize the panel at the bottom with the character name and their
   sign, their and their power." Three pieces now instead of two, so it becomes
   TWO ROWS rather than one crowded line: the civilian name on top, then the sun
   sign and the guardian title beneath it.

   Two rows and not three, because the strip sits ON the artwork - every pixel it
   grows covers more of the Takeuchi figure. Two rows costs 30px; three would
   cost 55 and start eating her skirt.

   The sign sits left and the title right, on the same rule the row above uses,
   so the strip reads as a small table rather than as a sentence. The title is
   the only text on the panel that is not a name, so it is set in the pale trim
   at reduced weight - present, clearly secondary, and it cannot be mistaken for
   part of the character's name.

   THE RULES THAT USED TO SIT UNDER THIS NOTE ARE DELETED, not moved. They were a
   second copy of the strip block that lives forty lines above, and between them
   the two set padding, civilian size, sign size and sign image size twice with
   different numbers - so the strip's real appearance was decided by source order
   instead of by intent, and reading either block told you something untrue. The
   winning values are folded into the one above. The writing stays because it
   explains why the strip has the shape it has. */
/* .sel-enter is gone with the button. Ashley: "remove the enter button from the
   character panel." Both the rule and the markup are deleted rather than hidden -
   a styled control that no longer exists is the sort of thing that reappears by
   accident. See build_select.py for what still commits without it. */

/* ---- foot ---------------------------------------------------------------- */
.sel-foot{
  padding:16px 26px 22px; border-top:3px solid #C7C4D9; background:#f7f2f6;
}
.sel-foot .codex-strip-label{ color:#5A3268; }
.sel-foot .codex-link{ color:#2e2838; background:#FFFFFB; border-color:#5A3268; }
.sel-foot .codex-link:hover{ background:#f6ebbe; }
/* The nine unfinished seats, said once in words instead of nine dashed cards.
   Still said - just not said on the front door twenty times. */
.sel-coming{
  margin:12px 0 0; font-size:13.5px; color:#524860;
}
.sel-coming-door{
  font-family:"Press Start 2P",monospace; font-size:10px;
  color:#5A3268; text-decoration:none; border-bottom:2px solid #C7A8B8;
}
.sel-coming-door:hover{ background:#f6ebbe; }

/* The roster page has no panel, so its grid gets the whole width. */
/* ONE COLUMN, because this page has no preview panel.
   .sel is a two-column grid so the panel can span the banner row on the select
   screen. The roster page shares the stylesheet and does not build a panel, so
   it was inheriting that grid and holding 455px of the page open for an element
   that does not exist. The visible symptom was not an empty column - it was the
   four-card groups wrapping 3 + 1, because the roster only had 534px to lay out
   in. Caught by looking at the page; the card-count check passed the whole time,
   since wrapping loses no cards. */
.select--roster .sel{ display:block; }
.select--roster .sel-stage{ display:block; }
.select--roster .sel-roster{ padding:14px; }
.select--roster .sel-row{ grid-template-columns:repeat(auto-fill,minmax(104px,140px)); }

.sel-foot-note{ margin:12px 0 0; font-size:13px; font-style:italic; opacity:.72; }

/* ---- the art credit ------------------------------------------------------
   Quieter than the body copy and still readable, which is the whole balance a
   rights notice has to strike: it is not the content of the page, and it is not
   decoration either. 12px at .78 opacity on the site's ink measures about 5.5:1
   against #FFFFFB, so it clears AA comfortably rather than hiding behind a
   technicality. Ruled off above so it reads as a separate register from the
   editorial note it follows. */
.sel-credit{
  margin:14px 0 0; padding-top:12px; border-top:1px dotted #C7C4D9;
  font-size:12px; line-height:1.6; color:#4b4256; opacity:.78; max-width:88ch;
}

/* ==========================================================================
   MOBILE
   ==========================================================================
   The panel pins to the TOP of the screen in a short wide layout and the grid
   scrolls underneath it. Tap selects, the ENTER button commits. That two-step
   is not a compromise for small screens: on a phone there is no hover, so a
   tap that navigated immediately would mean you could never preview anything,
   which is the entire feature.
   ========================================================================== */
@media (max-width:900px){
  /* The .sel grid collapses to one column, and the panel goes back to being a
     band pinned above the roster. */
  .sel{ display:block; }
  .sel-panels{
    width:auto; margin:0 -14px 16px; height:280px;
  }
  .sel-stage{ padding:14px 14px 18px; }

  /* THE BACKDROP HAS TO WIN A SPECIFICITY FIGHT IT WAS LOSING SILENTLY.

     index.css owns the mobile stack and its global hygiene block contains
     `.cabinet img{ max-width:100%; height:auto }`. That selector scores
     (0,1,1); `.sel-back{ height:100% }` scores (0,1,0), so on a phone, and
     ONLY on a phone, both backdrop layers lost their height and fell back to
     `auto`. The width/height attributes then supplied the aspect ratio, so a
     392px-wide panel rendered its 429x900 plate 822px TALL inside a 280px
     box, absolutely positioned at top:0. object-fit had nothing to do: the
     box was already the wrong shape. What you saw was the top 280px of the
     plate, which on a bottom-weighted reframe is the empty sky above her
     head. The figure was below the panel, not missing.

     Two classes beats one class plus one type, so this is the minimum needed
     and it stays local to select.css. index.css is shared and is not touched. */
  .sel-panel .sel-back,
  .sel-panel .sel-fill{ height:100%; }

  /* align-items:stretch, explicitly. The desktop rule sets align-items:start,
     which on a GRID controls the block axis and is what keeps the sticky
     panel from stretching to the height of the whole roster. Re-declaring
     display as flex here flips that same keyword onto the INLINE axis, and
     since every child of .sel-panels is absolutely positioned its content
     width is zero - so the panel collapsed to a 0px sliver and rendered as a
     blank gap. Same keyword, different axis, silent failure. */
  .sel-stage{
    display:flex; flex-direction:column; align-items:stretch;
    padding:14px 14px 18px;
  }
  /* The grid leads in the DOM because it is the page's real content and
     should come first for a reader with no CSS. On a phone the panel has to
     pin above it, so it is reordered here rather than in the markup. */
  /* ONE rule for the phone panel. There were briefly two - an early one at
     152px and a later one at 280 - and because they were both in this same
     media query the loser was decided by source order rather than by intent.
     The panel silently stayed short. */
  .sel-panels{
    order:-1; position:sticky; top:0; z-index:30;
    width:auto; height:280px; margin:0 -14px 16px; padding:0;
  }
  .sel-panel{ border-width:0 0 3px 0; }

  /* PORTRAIT PLATE, LANDSCAPE BAND: contain is the wrong answer here even
     though it is the right answer on desktop.

     The desktop panel is 429x900, which IS the plate's aspect, so contain fits
     it exactly and leaves no letterbox for .sel-fill to hide. The phone band is
     392x277. Contain there gives a 132px-wide vertical strip of artwork with
     two thirds of the band left over, and .sel-fill has to cover a 0.48 plate
     into a 1.4 box, which blows it up so far that the "out of focus margin"
     stops being a margin and becomes a bright grey slab beside her. The
     technique that removes a 144px bar cannot remove 260px of it.

     So on a phone, crop instead. Cover at 30% down the plate: cover scales to
     the width, so the band shows the top 34% of the image, and 30% centring
     puts that window at roughly 13% to 47% of the plate height. Every figure
     now displays at 665-666px inside its 900px window and is bottom-weighted,
     which puts every head between 22% and 26% - inside the window, with the
     upper body under it. This is the crop an arcade banner uses. Cover was
     rejected for the desktop panel because centred cover beheaded people, at
     49% of Saturn visible; the fix is where the window sits, not the fit.

     .sel-fill is switched off rather than left underneath, because with cover
     there is no bar to fill and it would only tint the edges. */
  .sel-back{ object-fit:cover; object-position:center var(--focus,36%); }
  .sel-fill{ display:none; }

  .sel-panel::after{
    background:linear-gradient(180deg, rgba(14,12,20,.78) 0%, rgba(14,12,20,0) 26%,
               rgba(14,12,20,.1) 55%, rgba(14,12,20,.9) 100%);
  }
  .sel-head{ left:0; padding:9px 12px; }
  .sel-planet{ font-size:13px; }
  .sel-head img{ width:28px; height:28px; }
  /* HALF SCALE on the phone, via transform rather than a new width. 8x of a
     26px disc is 208px, which on a 280px panel stopped being a planet behind
     her and became a planet in front of her. scale(.5) lands it at exactly 4x,
     so the integer-scale rule survives and the pixels stay square - setting a
     CSS width instead would have given Saturn a fractional zoom. */
  .sel-sphere{ width:210%; opacity:.34; }

  /* At 280px the phone panel is the desktop one, scaled: full figure via
     contain, portrait window bottom-left at 1x so the integer scale rule
     holds, strip across the foot. The old 152px band could only ever be a
     name plate. */
  /* Same stale-number problem as the desktop window, same fix. The phone strip
     is 78px tall now that it carries four lines, and bottom:46 put the portrait
     32px inside it. 92 = 78 plus 14 of air, the same 14 the desktop uses.
     The window shrinks to keep its head clear of the panel top: the phone panel
     is only 280 tall and the strip takes 78 of it.
     64x100, NOT 56x88, and the note that used to sit here was wrong about why it
     did not matter. It claimed the img kept its own size inside a smaller
     container; the very next line set the img to 56x88 as well. 56/128 is .4375
     and 88/200 is .44, so every phone was getting these portraits at a fractional
     scale AND at a slightly wrong aspect - squashed by half a percent on top of
     being resampled. 64x100 is exactly half of the source in both axes, which is
     the same integer-scale rule the sphere above it already follows, and it is
     8px wider and 12px taller than what it replaces. */
  .sel-window{ left:10px; bottom:92px; width:64px; height:100px; }
  .sel-window img{ width:64px; height:100px; }
  .sel-window--none{ font-size:6px; line-height:1.9; }

  /* THE BLANK PANEL IS THE ONE THAT WANTS THE PHONE'S SHAPE. Everything else in
     this media query crops the artwork, because a 429x900 portrait plate in a
     366x280 band has to lose something. The spread is the opposite problem: it
     is 1.16 wide to 1 tall against a band that is 1.3, so CONTAIN very nearly
     fills it - 326 of 366 - and cover, which the rule above sets for characters,
     was throwing away three of the ten senshi to no purpose.
     So it opts back out of cover, and the type goes to the foot where the name
     strip sits on a character panel, so the two swap without anything jumping
     under your thumb. */
  .sel-panel--blank .sel-back{ object-fit:contain; object-position:center center; }
  .sel-blank-plate{
    top:auto; padding:10px 12px 11px;
    background:linear-gradient(180deg, rgba(246,241,248,0) 0%,
               rgba(246,241,248,.9) 40%, rgba(246,241,248,1) 100%);
  }
  .sel-blank-title{ font-size:11px; letter-spacing:.5px; }
  .sel-blank-note{ font-size:12px; margin-top:6px; }

  /* The strip carries four things now and the phone panel is 280px tall, so the
     type comes down a step across the board rather than the strip growing into
     the artwork. The title still leads at 9px, which is bigger than the 7px it
     was on desktop before this round. */
  .sel-strip{ padding:7px 12px 8px; }
  .sel-strip-power{ font-size:9px; margin-bottom:4px; }
  .sel-strip-civ{ font-size:15px; }
  .sel-strip-jp{ font-size:12.5px; }
  .sel-strip-sign{ font-size:8px; }

  /* STACK IT. The desktop banner is a 260px logo column plus the rest, and on a
     390px phone "the rest" is 52px - which crushed the title and the intro into
     a 52px ribbon 597px tall. The logo cannot shrink, because 2x is the only
     scale a pixel sprite may use, so the column has to go. One column, logo on
     top, type under it. */
  .sel-banner{
    padding:16px 14px 14px;
    grid-template-columns:minmax(0,1fr);
    justify-items:start; gap:12px;
  }
  /* The plate box loses the stage's side margins on a phone - 26px each side out
     of 390 is a tenth of the screen spent on nothing. */
  .sm-plates{ margin:0 14px 16px; }
  .sel-foot{ padding:14px; }
  /* 11px is the floor for a pixel face. Nothing below it on a phone. */
  .sel-kicker{ font-size:11px; }
  .sel-h{ font-size:12px; }
  .sel-name{ font-size:11px; }
  .sel-soon-mark{ font-size:9px; }
  .sel-row{ grid-template-columns:repeat(auto-fill,minmax(98px,1fr)); justify-content:stretch; }
}

/* ---- mobile stack order -------------------------------------------------
   index.css owns the mobile stack: menu order 2, about card order 3. .sel is
   a new block, so it only needs its slot in that existing scale. Same slot
   wing.css takes. */
@media (max-width:1249px){
  .sel{ order:4; width:100%; max-width:100%; margin:12px 0 20px 0; }
}

/* ---- shared column keeps SITE type, not select type ----------------------
   Identical reason to the note in wing.css: body.select sets Raleway and
   line-height 1.7 for its own content, the shared right column lives inside
   that body and inherits it, and the menu grows from 333px. This has to live
   here rather than in index.css because index.css is linked first and would
   lose on source order at equal specificity. */
body.select .rightsidebox--home,
body.select .rightsidebox--home *{ line-height:normal; }
body.select #mainmenu .sidelinks li a{ line-height:1.2; }
body.select #mainmenu .menu-title{ line-height:1.1; }

/* ---- no JS ---------------------------------------------------------------
   Without script the first panel is the one marked active in the HTML and
   every live card is an ordinary link straight to its profile. The page is
   fully usable; it just does not preview. */

/* ==========================================================================
   THE PLATE DISPLAY
   ==========================================================================
   Ashley: "Below the entire the choose your senshi section, create a display a
   nice display of this artwork and the planetary spheres. ... no extra text or
   anything, just a beautiful display."

   So: no captions, no headings, no frame furniture beyond what the pictures need
   to sit properly. Two plates, side by side, in the site's own box.

   MATCHED ON HEIGHT, NOT WIDTH, and that is the whole trick. One plate is
   landscape (the engraving, about 1.15:1) and the other is portrait (Takeuchi's
   illustration, about 0.70:1). Matched on width they would finish at wildly
   different heights and read as two unrelated things dumped in a row. Matched on
   height they read as two prints hung on the same wall, which is what they are.
   At 500px tall the pair comes to about 950px, inside the 989 the box has.

   A CREAM MAT, NOT THE PANEL BLACK. The detail panel above is black because those
   plates were photographed on black. These two are on paper - one a hand-coloured
   engraving on cream, one a watercolour on pale blue wash - so a black mount would
   fight both of them. Cream is what a gallery would use, and it means the paper of
   each picture continues into the mount rather than stopping at a hard edge.

   The thin inner keyline on each figure is doing a real job rather than
   decorating: both plates run to a pale edge, so without it the artwork would
   dissolve into the mat and lose its shape. */
/* INSIDE the box now, above the goes-deeper strip, per Ashley. It was below the
   whole cabinet; it is now another compartment of it, so it takes the roster
   container's treatment rather than the outer box's - 2px lilac border and a 3px
   offset shadow, not the 3px plum and 5px the cabinet itself uses. A box inside
   a box should not have the heavier frame of the two. Margins match the stage's
   so it lines up with the roster above it. */
/* ---- THE PLATE DISPLAY ----------------------------------------------------
   Ashley opened her sprite-background library with "you're welcome to look at
   and use any of these on the landing page." Most of it is SCENE art - the Crown
   arcade, Hikawa shrine, Crystal Tokyo at sunset - which is lovely and is not
   background material: a drawing of a place behind a grid of cards competes with
   the cards, and behind Takeuchi's own artwork it would be two illustrations
   arguing.

   Three files in there are TILES, and one of them is exactly right. tile25 is
   256x190 frost lace and its opposite edges match to ZERO on both axes, so it
   repeats with no seam anywhere - measured, not assumed, which is the only way
   to know with a hand-drawn tile. It is hue-shifted to the same violet as the
   doily bands, so the page carries one chrome colour instead of two.

   It sits UNDER the radial, not instead of it. The radial is what keeps the
   middle of this box bright enough for scanned artwork to sit on; the tile is
   what stops the edges being flat. Two layers, the frost showing through where
   the radial has faded out. */
.sm-plates{
  display:flex; gap:24px; align-items:center; justify-content:center;
  margin:0 26px 22px; padding:26px 22px;
  background-image:
    radial-gradient(120% 90% at 50% 0%, #fffdf6 0%, rgba(247,241,234,.94) 62%,
                    rgba(239,231,224,.86) 100%),
    url("images/sailormoon/select/lace/frost.png");
  background-repeat:no-repeat, repeat;
  border:2px solid #BDB6D2;
  image-rendering:pixelated;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9), 3px 3px 0 rgba(90,50,104,.13);
}
.sm-plate{ margin:0; display:block; line-height:0; }
.sm-plate img{
  display:block; height:500px; width:auto; max-width:100%;
  border:1px solid rgba(90,50,104,.35);
  box-shadow:0 2px 10px rgba(60,40,70,.18);
  background:#fffdf6;
}

/* One plate on its own gets centred rather than stretched. This happens on
   purpose whenever a plate file is not on disk yet - build_select.py skips a
   missing path instead of emitting a broken image, so the section has to look
   deliberate with either one picture or two. */
.sm-plates:has(.sm-plate:only-child) .sm-plate img{ height:560px; }

/* Stack on anything narrow, and stop matching heights - a 500px-tall portrait
   next to a 500px-tall landscape needs 950px of width and a phone has 390. Width
   governs instead, which is the right constraint once they are one per row. */
@media (max-width:900px){
  .sm-plates{
    flex-direction:column; gap:18px; padding:16px 14px; margin:0 0 18px;
  }
  .sm-plate img, .sm-plates:has(.sm-plate:only-child) .sm-plate img{
    height:auto; width:100%;
  }
}

/* ==========================================================================
   THE TITLE SCREEN  v2 -- persistent castle, menu floats over it
   ==========================================================================
   Ashley: "I want the castle to not disappear, and the character boxes and
   senshi panel remain above it." So the castle is no longer a hero that
   collapses on open - it is the PERSISTENT backdrop of the whole select box, and
   the frosted menu (banner + 4-wide roster + detail panel) floats on top of it,
   inset far enough that the castle frames it: the moon and palace show in the
   band above, the reflection in the band below, the sky in the side gutters.

   PROGRESSIVE ENHANCEMENT is unchanged: with no script or reduced-motion the
   page IS the menu over the static castle, roster in the served HTML and never
   display:none. The intro (crisp video + logo + PRESS START) is a JS overlay on
   load, and when it ends it fades away to leave the persistent castle behind the
   menu - the castle never resizes and never disappears. */
.sel--title{ display:block; position:relative; }
.sm-stage{ position:relative; padding:16px 22px 40px; overflow:hidden; }

/* the persistent castle backdrop (the 114kb poster, cover, lightly darkened for
   legibility - visible, not blurred into atmosphere) */
.sel--title .sm-bg{
  position:absolute; inset:0; z-index:0;
  background:#0a1130 url("images/sailormoon/video/castle-poster.png") center 34% / cover no-repeat;
  filter:brightness(.86) saturate(1.08);
}
.sel--title .sm-bg::after{
  content:""; position:absolute; inset:0;
  background:linear-gradient(180deg, rgba(10,17,48,.06) 0%, rgba(10,17,48,.20) 46%, rgba(8,10,28,.42) 100%);
}
.sm-stage > .frost-win{ position:relative; z-index:1; }

/* ---- the frosted select window (the menu, floating over the castle) -------- */
.frost-win{
  border:3px solid rgba(255,255,255,.62);
  box-shadow:0 20px 60px rgba(0,0,0,.55), inset 0 0 0 1px rgba(255,255,255,.16);
  background:linear-gradient(rgba(247,242,250,.80), rgba(238,232,246,.82));
  backdrop-filter:blur(5px); -webkit-backdrop-filter:blur(5px);
  transition:opacity .5s ease .05s, transform .5s ease .05s;
}
.sel--title .frost-win{ display:grid; grid-template-columns:minmax(0,1fr) 360px; align-items:start; }
.sel--title.is-intro .frost-win{ opacity:0; transform:translateY(16px); }
/* First-paint guard: JS sets is-intro + no-anim synchronously so the menu is
   hidden instantly (no fade-out flash); no-anim is dropped a frame later so the
   auto-open still animates. */
.sel--title.no-anim .frost-win, .sel--title.no-anim .sm-intro{ transition:none !important; }
/* the banner keeps its sky wallpaper but lets a little castle glow through */
/* Banner unified with the castle: its own pink sky wallpaper is gone, so the one
   sky at the top is the castle's, softened by the frost veil. A light gradient
   keeps the plum Press Start title legible over it. */
.sel--title .frost-win .sel-banner{
  background-image:linear-gradient(rgba(255,255,251,.30), rgba(247,242,250,.52));
  background-color:transparent;
  border-bottom-color:rgba(199,196,217,.55);
}

/* ---- FOUR ACROSS, always, and uniform ------------------------------------
   Ashley: "shrink the character select boxes so you can fit 4 across in a row."
   auto-fill dropped a track whenever the frosted window was a hair narrow, which
   is what wrapped Jupiter and Saturn onto a second line. A fixed four-column grid
   makes it impossible: every row is four equal columns and the cards size to the
   window, so a three-card group (Luminaries) reads at exactly the same card size
   as a four-card group instead of stretching. The card is ~124 here instead of
   132, so the name plate drops to 10px - CHIBI MOON is ten characters and clears
   at one em each. */
.sel--title .sel-row{ grid-template-columns:repeat(4, minmax(0,1fr)); justify-content:stretch; }
.sel--title .sel-name{ font-size:10px; }

/* ---- GROUP HEADINGS as a bracket rule ------------------------------------
   Ashley picked this over a chip or a banner. A gold reticle bracket sits before
   the label and a gold rule fades off after it, so the group dividers echo the
   player-select reticle on the blank panel and the whole screen shares one motif.
   Select screen only; the roster page keeps its plain dashed heads. */
.sel--title .sel-h{
  display:flex; align-items:center; gap:10px;
  margin:0 0 9px; padding:0; border-bottom:0;
  font-family:"Press Start 2P",monospace; font-size:12px; letter-spacing:1px;
  text-transform:uppercase; color:#5A3268; white-space:nowrap;
}
.sel--title .sel-h::before{
  content:""; flex:none; width:11px; height:17px;
  border:3px solid #b98a2b; border-right:0;               /* [ bracket, gold */
  box-shadow:-1px 1px 0 rgba(90,50,104,.22);
}
.sel--title .sel-h::after{
  content:""; flex:1; height:3px; background:#b98a2b;
  -webkit-mask:linear-gradient(90deg,#000 0,#000 44%,transparent 100%);
          mask:linear-gradient(90deg,#000 0,#000 44%,transparent 100%);
}

/* ---- SCROLLING TILE BACKGROUND behind the cards --------------------------
   Ashley: "change it to tile24.gif and scroll it horizontally. this is what the
   game it's from does. maybe cycle between tile24.gif and tile25.gif."
   The Jougai Rantou select screen runs its doily background sideways, so ours
   does too: tile24 (lavender) and tile25 (blue, with stars) are two seamless
   lace tiles that both repeat on a 256px step, so a single -256px scroll loops
   cleanly for either. They ride on two layers that crossfade, so the field
   drifts sideways and shifts lavender<->blue the way the arcade one cycles. The
   cards sit above on z-index 1; the tile shows through their translucent fields
   and in the gutters, which is the whole point. */
.sel--title .sel-roster{
  position:relative; overflow:hidden;
  background:linear-gradient(180deg,#ece4f0 0%,#f2ecf6 52%,#eae3f0 100%);
}
.sel--title .sel-roster > *{ position:relative; z-index:1; }
.sel--title .sel-roster::before,
.sel--title .sel-roster::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  image-rendering:pixelated; background-repeat:repeat;
}
.sel--title .sel-roster::before{
  background-image:url("images/sailormoon/select/lace/tile24.gif");
  animation:sel-tilescroll 26s linear infinite, sel-tilefadeA 20s ease-in-out infinite;
}
.sel--title .sel-roster::after{
  background-image:url("images/sailormoon/select/lace/tile25.gif");
  animation:sel-tilescroll 26s linear infinite, sel-tilefadeB 20s ease-in-out infinite;
  opacity:0;
}
@keyframes sel-tilescroll{ from{ background-position:0 0; } to{ background-position:-256px 0; } }
@keyframes sel-tilefadeA{ 0%,38%{opacity:.9} 50%,88%{opacity:0} 100%{opacity:.9} }
@keyframes sel-tilefadeB{ 0%,38%{opacity:0} 50%,88%{opacity:.9} 100%{opacity:0} }
@media (prefers-reduced-motion:reduce){
  .sel--title .sel-roster::before{ animation:none; opacity:.85; }
  .sel--title .sel-roster::after{ animation:none; opacity:0; }
}

/* ---- the blank panel, dressed as a fighting-game player select ------------
   Ashley: "it just feels like an empty box... add something fighting menu-like."
   Gold reticle brackets frame the cast portrait, a PLAYER SELECT kicker sits over
   CHOOSE YOUR SENSHI, and a block cursor blinks after the prompt. */
/* The reticle hugs the cast portrait's ACTUAL painted rect. roster-cast is
   1000x888 drawn object-fit:contain into the 360x690 panel, so it lands full
   width at top:156 and runs 320px tall (to 476). The frame sits just outside
   that: 150 down to 480, a hair inside the side edges since the art is
   full-bleed. Tied to the fixed panel height; hidden on the mobile bottom-sheet. */
.sel-blank-frame{ position:absolute; left:3px; right:3px; top:154px; bottom:214px; z-index:6; pointer-events:none; }
.sel-blank-frame .c{ position:absolute; width:18px; height:18px; border:3px solid #f6ebbe;
  filter:drop-shadow(0 1px 0 rgba(0,0,0,.6)); }
.sel-blank-frame .tl{ left:0; top:0; border-right:0; border-bottom:0; }
.sel-blank-frame .tr{ right:0; top:0; border-left:0; border-bottom:0; }
.sel-blank-frame .bl{ left:0; bottom:0; border-right:0; border-top:0; }
.sel-blank-frame .br{ right:0; bottom:0; border-left:0; border-top:0; }
.sel-blank-kicker{ margin:0 0 8px; font-family:"Press Start 2P",monospace; font-size:9px;
  letter-spacing:3px; text-transform:uppercase; color:#f6ebbe; text-shadow:0 2px 0 #000; }
.sel-blank-cur{ display:inline-block; width:.62em; height:1.05em; margin-left:4px;
  background:#f6ebbe; vertical-align:-2px; animation:sel-blink 1.06s steps(1) infinite; }
@keyframes sel-blink{ 0%,50%{opacity:1} 51%,100%{opacity:0} }
@media (prefers-reduced-motion:reduce){ .sel-blank-cur{ animation:none; } }
@media (max-width:900px){ .sel-blank-frame{ display:none; } }

/* ---- the intro overlay (crisp castle + pulsing logo + PRESS START) --------- */
.sm-intro{
  position:absolute; inset:0; z-index:3; overflow:hidden;
  display:flex; align-items:flex-start; justify-content:center;
  opacity:1; transition:opacity .5s ease;
  background:#000;   /* start BLACK: hides the persistent finished-castle backdrop until the cut plays from frame 0 */
}
.sel--title:not(.is-intro) .sm-intro{ opacity:0; pointer-events:none; }
.sm-intro .sm-castle{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; image-rendering:pixelated; background:#000;
}
.sm-title{
  position:static; z-index:2; pointer-events:none;
  display:flex; flex-direction:column; align-items:center; width:100%;
}
.sm-logo{
  image-rendering:pixelated; width:260px; height:100px; margin-top:min(16vh,150px);
  filter:drop-shadow(0 3px 10px rgba(0,0,0,.7)) drop-shadow(0 0 2px #000);
  animation:sm-pulse 1.6s ease-in-out infinite;
}
@keyframes sm-pulse{ 0%,100%{ transform:scale(1); } 50%{ transform:scale(1.05); } }
.sm-prompt{
  position:absolute; top:64%; left:0; right:0; margin:0; text-align:center;
  font-family:"Press Start 2P",monospace; font-size:18px; letter-spacing:2px; color:#fff;
  text-shadow:0 0 12px #e56aa6, 0 2px 0 #7a2450, 0 3px 6px #000;
  animation:sm-bounce 1.5s cubic-bezier(.5,-0.3,.5,1.3) infinite;
}
.sm-prompt span{ display:block; font-size:11px; margin-top:12px; color:#ffe9a8; letter-spacing:1px; }
@keyframes sm-bounce{ 0%,100%{ transform:translateY(0); } 45%{ transform:translateY(-7px); } 60%{ transform:translateY(-3px); } }

@media (prefers-reduced-motion:reduce){
  .sm-logo, .sm-prompt{ animation:none; }
  .frost-win, .sm-intro{ transition:none; }
}

/* ---- MOBILE LITE ----------------------------------------------------------
   No video on a phone: the persistent castle poster IS the backdrop, the menu
   stacks to one column, and the intro overlay just shows the logo. */
@media (max-width:900px){
  .sm-stage{ padding:92px 8px 18px; }
  .sel--title .frost-win{ display:block; }
  .sel--title .sel-row{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  .sel--title .sm-intro .sm-castle{ display:none; }   /* poster backdrop is enough */
  .sm-logo{ width:220px; height:85px; margin-top:20px; animation:none; }
  .sm-prompt{ top:auto; bottom:14px; font-size:13px; }
  .sm-prompt span{ display:none; }
}

/* ==========================================================================
   THE LOCKED / UNLOCKABLE SEAT  (Helios, the Sun)
   ==========================================================================
   Ashley: a fourth Luminaries slot, "grayed out unlockable... think og smash 64."
   A grey silhouette bust and the gold Sun glyph, no name. It PREVIEWS on hover
   (its panel is the reveal) but is a <div> with no href, so it can never be
   entered. Kept out of the active-card machinery: no bust-lg swap, no sheen; the
   plate and silhouette stay put on hover. Appended last so these win the cascade. */
.sel-card--locked{ cursor:default; border-color:#8b8698; }
.sel-card--locked .sel-field{ background:#d9d5e0; }
.sel-card--locked .sel-plate{ background:#6b6675; color:#efeef3; }
.sel-card--locked .sel-name{ letter-spacing:3px; }
.sel-card--locked .sel-civ{ margin-top:6px; text-transform:uppercase; font-size:10px;
  letter-spacing:2px; opacity:.85; }
/* the gold Sun glyph stays in colour - it names the seat */
.sel-card--locked .sel-glyphmark{ opacity:1; }
/* a little padlock where the planet disc would sit */
.sel-lock{ position:absolute; top:7px; right:7px; width:18px; height:18px; z-index:3; opacity:.9;
  background:no-repeat center/contain url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='M4 7.5V5a4 4 0 0 1 8 0v2.5' fill='none' stroke='%235e5a68' stroke-width='2'/%3E%3Crect x='2.5' y='7' width='11' height='8' rx='1.4' fill='%235e5a68'/%3E%3Ccircle cx='8' cy='10.4' r='1.4' fill='%23d9d5e0'/%3E%3C/svg%3E"); }
/* stays inert-looking when previewed (data-active): silhouette and plate hold */
.sel-card--locked[data-active] .sel-bust{ opacity:1; visibility:visible; }
.sel-card--locked[data-active] .sel-name,
.sel-card--locked[data-active] .sel-civ{ transform:none; opacity:1; }
.sel-card--locked[data-active] .sel-field::after{ display:none; }
.sel-card--locked:hover{ transform:translate(-2px,-2px); box-shadow:5px 5px 0 rgba(0,0,0,.26); }

/* the locked panel: grayed Helios beneath a true-colour sun (baked into the
   backdrop). No name, no shimmer, a dark locked strip with one gold word. */
.sel-panel--locked .sel-planet{ letter-spacing:9px; }
.sel-panel--locked .sel-planet::after{ display:none; }
.sel-panel--locked .sel-strip{ background:#191521; color:#cbc5d6; border-top-color:#3a3350; }
.sel-panel--locked .sel-strip-power{ color:#e4cb7e; letter-spacing:2px; text-transform:uppercase; }

/* Helios locked panel: the sun rendered as the same enlarged glowing-disc layer
   the other planets use (.sel-sphere), but brighter and high in the sky above him. */
.sel-panel--locked .sel-sphere--sun{
  top:19%; width:74%; opacity:.96; mix-blend-mode:screen; filter:blur(1px);
}

/* The blank-panel reticle now PULSES like a live selection cursor. */
.sel-blank-frame .c{ animation:sel-reticle 1.15s ease-in-out infinite; }
@keyframes sel-reticle{ 0%,100%{ opacity:.5; } 50%{ opacity:1; } }
@media (prefers-reduced-motion:reduce){ .sel-blank-frame .c{ animation:none; opacity:.92; } }

/* ============================================================================
   FIVE-ROW RESTRUCTURE (August 2 2026)
   Ashley un-locked Helios and added the Asteroid senshi and Starlights rows,
   so the roster is 20 seats in five rows. Two consequences handled here.
   ============================================================================ */

/* FIXED CENTERED PANEL. Ashley: the tall panel "feels really skinny and tall...
   needs to feel more centralized." Pinned to the grid's height it only got
   worse with every row. It stops stretching now and centres vertically beside
   the roster, so it stays a comfortable portrait card no matter how tall the
   grid grows. */
.sel--title .sel-panels{ align-self:center; }

/* The new seats are game-sprite-less, so their cards carry no 2x zoom bust.
   Without this the resting bust vanished on select (the CSS was hiding it to
   reveal a zoom sprite that is not there). Cards with no .sel-bust-lg keep
   their resting bust lit instead. */
.sel--title .sel-card:not(:has(.sel-bust-lg))[data-active] .sel-bust{
  opacity:1; transform:none; filter:none;
}

/* Ashley: "starlights character select background color needs to be darker."
   The three leather Starlights get a dark field behind the bust instead of the
   pale wash - reads as rock/leather, and the star-twinkle orb pops on it. The
   field carries no text, so this sidesteps the wash's contrast guard; Kakyuu
   keeps her warm red-royal field. */
.sel--title .sel-card[data-key="fighter"] .sel-field{ background:#20233a; }
.sel--title .sel-card[data-key="maker"]   .sel-field{ background:#241f38; }
.sel--title .sel-card[data-key="healer"]  .sel-field{ background:#182a24; }
.sel--title .sel-card[data-key="fighter"] .sel-name,
.sel--title .sel-card[data-key="maker"]   .sel-name,
.sel--title .sel-card[data-key="healer"]  .sel-name{ text-shadow:1px 1px 0 rgba(0,0,0,.6); }

/* ============================================================================
   THE EXTENDED ROSTER (August 2 2026)
   Ashley: the twenty seats read as one wall of equal importance and the
   starlights spilled below the fold. The Asteroid senshi and the Starlights -
   a later, B-tier cast - fold into a native <details>, collapsed by default, so
   the front door is the classic lineup and the extra cast is one click away.
   Native <details> keeps every card in the DOM (search, no-JS) and is keyboard
   accessible; no script involved.
   ============================================================================ */
.sel--title .sel-extended{ margin-top:8px; }
.sel--title .sel-extended-toggle{
  list-style:none; cursor:pointer; user-select:none;
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  margin:0; padding:9px 12px; border:2px dashed #b98a2b; border-radius:3px;
  background:linear-gradient(rgba(255,255,251,.55), rgba(244,239,250,.42));
}
.sel--title .sel-extended-toggle::-webkit-details-marker{ display:none; }
.sel--title .sel-extended-toggle::before{
  content:"\25B8"; flex:none; color:#b98a2b; font-size:13px; line-height:1;
  transition:transform .2s ease;
}
.sel--title .sel-extended[open] > .sel-extended-toggle::before{ transform:rotate(90deg); }
.sel--title .sel-extended-label{
  font-family:"Press Start 2P",monospace; font-size:12px; letter-spacing:1px;
  text-transform:uppercase; color:#5A3268;
}
.sel--title .sel-extended-hint{
  font-family:"Raleway",sans-serif; font-size:12.5px; font-weight:600;
  color:#8a7fa0; letter-spacing:0;
}
.sel--title .sel-extended-toggle:hover{ border-color:#8a5f1e; }
.sel--title .sel-extended-toggle:focus-visible{ outline:3px solid #b98a2b; outline-offset:2px; }
/* the two groups inside get their normal spacing back once revealed */
.sel--title .sel-extended[open] .sel-group:first-of-type{ margin-top:12px; }
@media (prefers-reduced-motion:reduce){
  .sel--title .sel-extended-toggle::before{ transition:none; }
}

/* ---- ZOOM FITS THE SHORTER CARD (August 2 2026) --------------------------
   Ashley: "the 2x zoom on the sprite busts... they are way too big now." The
   cards shrank but the 2x bust did not, so it overflowed and cropped the face.
   Scale the highlighted bust down from its foot so it sits inside the card. */
.sel--title .sel-card[data-active] .sel-bust-lg{
  transform:scale(.7); transform-origin:bottom center;
}

/* ---- PRETTIER EXTENDED TOGGLE (not graph paper) --------------------------
   Ashley: "the drop down, can you stylize more pretty? not the grid paper."
   The dashed border read as graph paper; this is a soft pearl-gold-lilac jewel
   bar with a solid gold edge and a little gold star that turns when it opens. */
.sel--title .sel-extended{ margin-top:10px; }
.sel--title .sel-extended-toggle{
  gap:12px; padding:12px 18px; border-radius:10px;
  border:1.5px solid #d9b45c;
  background:linear-gradient(135deg, rgba(246,233,201,.92) 0%, rgba(243,225,241,.88) 50%, rgba(225,213,243,.92) 100%);
  box-shadow:0 1px 0 rgba(255,255,255,.85) inset, 0 3px 10px rgba(90,50,104,.14);
  transition:box-shadow .2s ease, transform .12s ease, background .2s ease;
}
.sel--title .sel-extended-toggle::before{
  content:"\2726"; color:#c99a2e; font-size:15px; line-height:1;
  text-shadow:0 1px 0 rgba(255,255,255,.7); transition:transform .25s ease;
}
.sel--title .sel-extended[open] > .sel-extended-toggle::before{ transform:rotate(180deg); }
.sel--title .sel-extended-label{ color:#6a3f78; }
.sel--title .sel-extended-hint{
  font-style:italic; font-size:13px; color:#9a7fa8;
}
.sel--title .sel-extended-toggle:hover{
  transform:translateY(-1px);
  box-shadow:0 1px 0 rgba(255,255,255,.95) inset, 0 5px 15px rgba(90,50,104,.2);
}
.sel--title .sel-extended[open] > .sel-extended-toggle{ border-radius:10px 10px 0 0; }

/* ---- MOODY OUTER SENSHI (August 2 2026) ----------------------------------
   Ashley: "a darker moodier tone for the outer senshi cards. inners pop fun,
   outers more dramatic." Their card field takes a deep tone behind the bust so
   the outer row reads dramatic against the bright inners; field carries no text
   so this sidesteps the wash guard, same as the leather Starlights. */
.sel--title .sel-card[data-key="uranus"]  .sel-field{ background:#182038; }
.sel--title .sel-card[data-key="neptune"] .sel-field{ background:#123c34; }
.sel--title .sel-card[data-key="pluto"]   .sel-field{ background:#100e18; }
.sel--title .sel-card[data-key="saturn"]  .sel-field{ background:#2a1638; }
.sel--title .sel-card[data-key="uranus"]  .sel-name,
.sel--title .sel-card[data-key="neptune"] .sel-name,
.sel--title .sel-card[data-key="pluto"]   .sel-name,
.sel--title .sel-card[data-key="saturn"]  .sel-name{ text-shadow:1px 1px 0 rgba(0,0,0,.55); }

/* ---- ZOOM: back to a CLEAN integer 2x that pops up (August 2 2026) --------
   Ashley: the scaled-down zoom looked "totally crushed... small and smashed" -
   correct, scale(.7) is non-integer and breaks the pixel grid. Revert to the
   crisp 2x and, since the card is short, let the selected bust rise OUT of the
   card (overflow visible, lifted above its neighbours) - a clean fighting-game
   pop rather than a squashed sprite. "rather too big and clean than small and
   smashed." */
.sel--title .sel-card[data-active] .sel-bust-lg{ transform:none; }
.sel--title .sel-card[data-active]{ overflow:hidden; }

/* ---- SPRITE SITS FLUSH ON THE CARD FLOOR (August 2 2026) -----------------
   Ashley: "each bust was sitting with a large bar from where the [n]ame text
   was. push the 2x sprite down to the bottom of the character box so that area
   that contains the name text doesn't look like a fat bottom border."
   That "fat bottom border" is the --bustfoot ledge: 16px did double duty as the
   shelf the sprite stood on AND, via the plate's inset shadow, a 16px band of
   skirt colour along the nameplate's bottom edge. Zero the ledge on the title
   screen and both go at once - the 2x bust drops to the very bottom of the card
   (its foot at 100%), and the skirt band collapses to nothing, so the plate
   under the sprite is one clean wash with no border stripe. Integer 2x is
   untouched; only the resting Y moves. */
.sel--title.sel{ --bustfoot:0px; }

/* ==========================================================================
   THE "A MANGA BUILT ON THE PLANETS" INTRO HERO
   ==========================================================================
   A beautiful lead-in above the teaching panel, built on Takeuchi's 1994
   Pretty Soldiers frontispiece. Beat 1: the poster drifts behind a frosted,
   gold-bordered card with gold-star sparkles. Beat 2: on scroll it zooms into
   the celestial-spheres chart at the centre of the guardians. Namespaced
   .lore-hero* so it never collides with the castle intro (.sm-intro). The
   poster path is set once as --lore-poster. Motion is fully reduced-gated. */
.lore-hero-wrap{ --lore-poster:url("images/sailormoon/plates/pretty-soldiers.jpg");
  --lh-ink:#f4eefb; --lh-gold:#e6c15a; --lh-gold-deep:#b9862b;
  --lh-space1:#0a0616; --lh-space2:#1b1030;
  margin:26px 0 0; }

.lore-hero{
  position:relative; min-height:100svh; overflow:hidden; display:flex; align-items:center;
  background:
    radial-gradient(1200px 700px at 78% 38%, rgba(120,70,160,.35), transparent 60%),
    linear-gradient(160deg, var(--lh-space2) 0%, var(--lh-space1) 55%, #120a24 100%);
}
.lore-hero::before{
  content:""; position:absolute; inset:0; pointer-events:none; opacity:.5;
  background-image:
    radial-gradient(1.4px 1.4px at 12% 22%,#fff 50%,transparent 51%),
    radial-gradient(1.2px 1.2px at 26% 74%,#fff 50%,transparent 51%),
    radial-gradient(1.3px 1.3px at 62% 14%,#fff 50%,transparent 51%),
    radial-gradient(1.1px 1.1px at 88% 62%,#fff 50%,transparent 51%),
    radial-gradient(1.5px 1.5px at 45% 88%,#fff 50%,transparent 51%),
    radial-gradient(1.2px 1.2px at 8% 54%,#fff 50%,transparent 51%),
    radial-gradient(1.3px 1.3px at 72% 44%,#fff 50%,transparent 51%);
}
.lore-hero-art{
  position:absolute; inset:0; z-index:0;
  background-image:var(--lore-poster); background-repeat:no-repeat;
  background-size:cover; background-position:66% 42%;
  transform:scale(1.06); transform-origin:70% 46%;
  animation:lh-kenburns 26s ease-in-out infinite alternate; will-change:transform;
}
@keyframes lh-kenburns{ from{transform:scale(1.05) translate(0,0);} to{transform:scale(1.12) translate(-1.5%,-1.2%);} }
.lore-hero-scrim{
  position:absolute; inset:0; z-index:1; pointer-events:none;
  background:
    linear-gradient(90deg, rgba(10,6,22,.92) 0%, rgba(10,6,22,.72) 26%, rgba(10,6,22,.20) 48%, rgba(10,6,22,0) 66%),
    radial-gradient(120% 90% at 50% 50%, transparent 62%, rgba(8,4,18,.7) 100%),
    linear-gradient(0deg, rgba(10,6,22,.85) 0%, transparent 26%);
}
.lore-sparkles{ position:absolute; inset:0; z-index:2; pointer-events:none; }
.lore-sparkle{
  position:absolute; width:10px; height:10px; opacity:0;
  background:radial-gradient(circle,#fff 0 12%, rgba(255,240,200,.85) 22%, transparent 60%);
  filter:drop-shadow(0 0 6px rgba(255,225,150,.9)); animation:lh-twinkle 3.6s ease-in-out infinite;
}
.lore-sparkle::before,.lore-sparkle::after{
  content:""; position:absolute; inset:0; color:rgba(255,240,205,.95);
  background:linear-gradient(currentColor,currentColor) center/2px 100% no-repeat,
             linear-gradient(currentColor,currentColor) center/100% 2px no-repeat;
}
.lore-sparkle::after{ transform:rotate(45deg); opacity:.6; }
@keyframes lh-twinkle{ 0%,100%{opacity:0; transform:scale(.4) rotate(0);} 50%{opacity:1; transform:scale(1) rotate(20deg);} }
.lore-sparkle.s1{left:56%;top:30%;animation-delay:0s;}
.lore-sparkle.s2{left:70%;top:52%;animation-delay:.7s;width:14px;height:14px;}
.lore-sparkle.s3{left:82%;top:24%;animation-delay:1.3s;}
.lore-sparkle.s4{left:63%;top:70%;animation-delay:2s;}
.lore-sparkle.s5{left:88%;top:66%;animation-delay:1s;width:8px;height:8px;}
.lore-sparkle.s6{left:52%;top:58%;animation-delay:2.6s;}
.lore-sparkle.s7{left:76%;top:38%;animation-delay:1.8s;width:12px;height:12px;}
.lore-hero-card{
  position:relative; z-index:3; width:min(560px,46vw); margin-left:clamp(20px,6vw,110px);
  padding:34px 34px 30px; border:2px solid rgba(230,193,90,.55); border-radius:2px;
  background:linear-gradient(180deg, rgba(26,16,44,.72), rgba(14,8,26,.78));
  box-shadow:0 24px 60px rgba(0,0,0,.55), inset 0 0 0 1px rgba(255,255,255,.04), 6px 6px 0 rgba(0,0,0,.35);
  backdrop-filter:blur(3px) saturate(1.1);
}
.lore-hero-card .lh-kicker{ font-family:"Press Start 2P",monospace; font-size:10px; letter-spacing:1px; color:var(--lh-gold); margin-bottom:16px; text-shadow:1px 1px 0 rgba(0,0,0,.5); }
.lore-hero-card h2{ font-family:"Press Start 2P",monospace; font-size:clamp(15px,2.1vw,22px); line-height:1.5; color:#fff; margin-bottom:20px; text-shadow:2px 2px 0 var(--lh-gold-deep), 4px 4px 0 rgba(0,0,0,.45); }
.lore-hero-card p{ font-size:16px; line-height:1.72; margin-bottom:14px; color:rgba(244,238,251,.92); }
.lore-hero-card p:last-child{ margin-bottom:0; }
.lore-hero-card b{ color:#fff; }
.lore-hero-card .lh-sig{ color:var(--lh-gold); font-style:italic; }
.lore-scroll-hint{ position:absolute; z-index:3; left:50%; bottom:22px; transform:translateX(-50%); font-family:"Press Start 2P",monospace; font-size:8px; letter-spacing:1px; color:rgba(244,238,251,.7); text-align:center; animation:lh-bob 2s ease-in-out infinite; }
.lore-scroll-hint span{ display:block; font-size:15px; margin-top:6px; }
@keyframes lh-bob{ 0%,100%{transform:translate(-50%,0);} 50%{transform:translate(-50%,6px);} }

.lore-chart{ position:relative; height:190vh; }
.lore-chart-pin{ position:sticky; top:0; height:100svh; overflow:hidden; display:flex; align-items:center; justify-content:flex-end; background:var(--lh-space1); }
.lore-chart-art{ position:absolute; inset:0; background-image:var(--lore-poster); background-repeat:no-repeat; background-size:cover; background-position:82% 50%; transform:scale(1.1); transform-origin:82% 50%; will-change:transform; }
.lore-chart-veil{ position:absolute; inset:0; background:radial-gradient(60% 60% at 80% 50%, transparent 30%, rgba(8,4,18,.55) 78%), linear-gradient(90deg, rgba(8,4,18,.9) 0%, rgba(8,4,18,.35) 40%, transparent 62%); }
.lore-chart-copy{ position:relative; z-index:2; width:min(520px,44vw); margin-left:clamp(20px,6vw,90px); margin-right:auto; }
.lore-chart-copy .lh-kicker{ font-family:"Press Start 2P",monospace; font-size:10px; color:var(--lh-gold); letter-spacing:1px; margin-bottom:16px; }
.lore-chart-copy h3{ font-family:"Press Start 2P",monospace; font-size:clamp(13px,1.7vw,18px); line-height:1.55; color:#fff; margin-bottom:18px; text-shadow:2px 2px 0 var(--lh-gold-deep); }
.lore-chart-copy p{ font-size:16px; line-height:1.72; color:rgba(244,238,251,.92); }
.lore-chart-copy .lh-cap{ margin-top:18px; font-size:12.5px; font-style:italic; color:rgba(244,238,251,.6); border-left:2px solid rgba(230,193,90,.5); padding-left:12px; }

@media (max-width:820px){
  .lore-hero-card{ width:min(92vw,560px); margin:0 auto; }
  .lore-hero{ align-items:flex-end; padding-bottom:64px; }
  .lore-chart-copy{ width:88vw; margin:0 auto; }
  .lore-chart-pin{ justify-content:center; }
}
@media (prefers-reduced-motion:reduce){
  .lore-hero-art{ animation:none; transform:scale(1.04); }
  .lore-sparkle{ animation:none; opacity:.85; }
  .lore-scroll-hint{ animation:none; }
}

/* ==========================================================================
   THE LORE CHAPTER BREAK   (9 Sep 2026)
   ==========================================================================
   Replaces the two-beat .lore-hero / .lore-chart scrollytelling above. That
   was 2900px and it worked while the lore was the END of this page; with the
   arc console below it, it stood between the reader and 30,757px of what they
   came for. One band now: the frontispiece, the kicker, one sentence, the
   caption. About 480px at desktop.

   The .lore-hero* and .lore-chart* rules above are left where they are rather
   than cut out of the middle of this file - house rule - so they now match
   nothing. They are the first thing to delete if this file is ever swept.

   Palette, poster path and the sparkles all come from .lore-hero-wrap and the
   .lore-sparkle rules above, so the band is the same object in a smaller box
   rather than a new look. */
.lore-band{
  position:relative; overflow:hidden;
  min-height:clamp(360px,40vw,500px);
  display:flex; align-items:center;
  border-top:3px solid var(--lh-gold-deep);
  border-bottom:3px solid var(--lh-gold-deep);
  background:
    radial-gradient(900px 520px at 80% 46%, rgba(120,70,160,.35), transparent 60%),
    linear-gradient(160deg, var(--lh-space2) 0%, var(--lh-space1) 58%, #120a24 100%);
}
/* 82% 50% is the crop the pinned beat used to zoom TO: the celestial-spheres
   diagram at the centre of the guardians, not the figures around it. The whole
   point of keeping the image is that particular part of it. */
.lore-band-art{
  position:absolute; inset:0; z-index:0;
  background-image:var(--lore-poster); background-repeat:no-repeat;
  background-size:cover; background-position:82% 50%;
}
.lore-band-veil{
  position:absolute; inset:0; z-index:1; pointer-events:none;
  background:
    linear-gradient(90deg, rgba(10,6,22,.95) 0%, rgba(10,6,22,.88) 28%, rgba(10,6,22,.34) 54%, rgba(10,6,22,0) 70%),
    radial-gradient(120% 100% at 50% 50%, transparent 58%, rgba(8,4,18,.62) 100%);
}
.lore-band-copy{
  position:relative; z-index:3;
  width:min(520px,46%);
  margin-left:clamp(20px,5vw,64px);
  padding:34px 0;
}
.lore-band-copy .lh-kicker{
  font-family:"Press Start 2P",monospace; font-size:10px; letter-spacing:1px;
  color:var(--lh-gold); margin:0 0 16px; text-shadow:1px 1px 0 rgba(0,0,0,.5);
}
.lore-band-copy h2{
  font-family:"Press Start 2P",monospace; font-size:clamp(14px,1.9vw,20px);
  line-height:1.5; color:#fff; margin:0 0 18px;
  text-shadow:2px 2px 0 var(--lh-gold-deep), 4px 4px 0 rgba(0,0,0,.45);
}
.lore-band-copy p{ font-size:16px; line-height:1.72; color:rgba(244,238,251,.92); margin:0; }
.lore-band-copy .lh-cap{
  margin-top:18px; font-size:12.5px; font-style:italic;
  color:rgba(244,238,251,.62);
  border-left:2px solid rgba(230,193,90,.5); padding-left:12px;
}

/* Phone: the art becomes a header strip and the copy sits under it, because a
   46% column of 16px prose at 380px is four words a line. */
@media (max-width:820px){
  .lore-band{ display:block; min-height:0; }
  /* 210, not 190: the poster is wide, so a phone-width box is cropped by its
     HEIGHT and the celestial-spheres diagram only clears the fold at 210.
     Tested four horizontal positions at this height and they are visually
     identical for the same reason - cover has no horizontal slack left. */
  .lore-band-art{ position:relative; height:210px; }
  .lore-band-veil{ inset:0 0 auto 0; height:210px;
    background:linear-gradient(180deg, rgba(10,6,22,.15) 0%, rgba(10,6,22,.55) 58%, rgba(10,6,22,.92) 100%); }
  .lore-band-copy{ width:auto; margin:0; padding:22px 18px 26px; }
  .lore-sparkles{ height:210px; bottom:auto; }
}

/* ==========================================================================
   BEYOND THE SOLAR SYSTEM, LOCKED OUT OF SIGHT   (9 Sep 2026)
   ==========================================================================
   The extended roster - guardian cats, asteroid senshi, starlights - is every
   seat under construction, so the drop-down opened onto nothing built. Hidden
   rather than cut: the seats stay in the served HTML, which is the whole
   reason this page renders them statically (see the note at the top of
   build_select.py about Google and the front door). Deleting this rule is the
   entire revert. */
body.wing.select .sel-extended{ display:none; }

/* ==========================================================================
   THE SELECT PANEL COMES DOWN   (9 Sep 2026)
   ==========================================================================
   Ashley: shrink the console so the content below it shows at the bottom of
   the screen. Measured, the height was never padding - .sel-panels is a fixed
   690px and the framed plate inside is object-fit:contain, so the BOX was
   setting the art. 570 scales the art down with it; the whole figure stays and
   nothing crops.

   Console 894 -> 774, and the lore band's top moves from 923 to 803, so about
   100px of it shows on a 900px screen.

   The contained bars go from 16px a side to 44 as the box squares up. That
   costs nothing: .sel-fill is the same artwork blurred and covering behind the
   sharp copy, which is what those bars have always been filled with - see the
   long note at .sel-panels above. */
body.wing.select .sel-panels{ height:570px; }

/* ==========================================================================
   THE ASTROLOGY BAND, TIGHTENED   (9 Sep 2026)
   ==========================================================================
   Two changes, and the first one is the reason the second is possible.

   THE CLAIM WAS ALREADY MADE. The console's own intro says "one guardian per
   planet, named for its god. That is why this site has a wing for it." The
   band was headed "A manga built on the planets" and said it again 500px
   later. The heading is now the thing only this section says - Ashley's line
   from the pinned beat that got cut - and the restatement is gone.

   NOTHING IS CROPPED. The old band used background-size:cover, which crops by
   definition; figures ran off both edges. This is a real <img> holding the
   whole plate, sized by its column, so every face is in frame and so is the
   celestial-spheres diagram they are ringed around.

   Contain across the full width would have made it TALLER: the plate is
   2134x1710, so at 989px it wants 792px of height. A 330px column brings it to
   264 and the copy sits beside it. */
.senshi-art{}
.lore-band{
  display:flex; align-items:center; gap:26px;
  min-height:0; padding:22px 26px;
  border-top:3px solid var(--lh-gold-deep); border-bottom:3px solid var(--lh-gold-deep);
  background:
    radial-gradient(700px 380px at 76% 40%, rgba(120,70,160,.32), transparent 62%),
    linear-gradient(160deg, var(--lh-space2) 0%, var(--lh-space1) 58%, #120a24 100%);
}
.lore-plate{ margin:0; flex:0 0 330px; line-height:0; }
.lore-plate img{
  display:block; width:100%; height:auto;
  border:2px solid rgba(230,193,90,.55);
  box-shadow:0 6px 18px rgba(0,0,0,.45);
}
.lore-band-copy{ flex:1 1 auto; width:auto; margin:0; padding:0; }
.lore-band-copy h2{ margin:0 0 14px; font-size:clamp(13px,1.6vw,17px); }
.lore-band-copy .lh-kicker{ margin:0 0 12px; }
.lore-band-copy p{ font-size:15px; line-height:1.68; }
.lore-band-copy .lh-cap{ margin-top:14px; }

@media (max-width:820px){
  .lore-band{ display:block; padding:18px 16px 20px; }
  .lore-plate{ margin:0 0 16px; }
  .lore-band-copy p{ font-size:15px; }
}

/* ==========================================================================
   THE ASTROLOGY BLOCK, MERGED   (9 Sep 2026)
   ==========================================================================
   Was two blocks - a 315px purple band and a 409px cream prose box. Now one:
   a bigger plate, the claim beside it, and the three paragraphs of background
   behind a CSS-only toggle, so they cost nothing until somebody asks. All of
   it to get "through the arcs" higher up the page.

   The plate grows by widening its column, which is the only lever there is:
   contained across the full width it would want 792px of height, so a wider
   column is how it gets bigger without getting taller than the copy beside it.

   Toggle is a hidden checkbox with the label as a sibling - same idiom as the
   chapters and .arc-powers, no script. */
.lore-band{ display:block; padding:24px 26px; }
.lore-more-in{ position:absolute; opacity:0; width:0; height:0; pointer-events:none; }
.lore-band-main{ display:flex; align-items:center; gap:30px; }
.lore-plate{ margin:0; flex:0 0 var(--plate); line-height:0; }
.lore-plate img{
  display:block; width:100%; height:auto;
  border:2px solid rgba(230,193,90,.55); box-shadow:0 6px 18px rgba(0,0,0,.45);
}
.lore-band-copy{ flex:1 1 auto; width:auto; margin:0; padding:0; }
.lore-band-copy h2{ margin:0 0 14px; font-size:clamp(13px,1.6vw,17px); }
.lore-band-copy .lh-kicker{ margin:0 0 12px; }
.lore-band-copy p{ font-size:15px; line-height:1.68; }
.lore-band-copy .lh-cap{ margin-top:14px; }

.lore-more{
  display:inline-block; margin-top:16px; cursor:pointer; user-select:none;
  font-family:"Press Start 2P",monospace; font-size:9px; letter-spacing:.5px;
  color:var(--lh-gold); border:1.5px solid rgba(230,193,90,.55);
  border-radius:999px; padding:8px 14px;
}
.lore-more:hover{ background:rgba(230,193,90,.16); }
.lore-more-mark{ margin-right:4px; }
.lore-more-in:checked ~ .lore-band-main .lore-more .lore-more-mark{ transform:rotate(180deg); display:inline-block; }
.lore-more-body{ display:none; }
.lore-more-in:checked ~ .lore-more-body{ display:block; }

@media (max-width:820px){
  .lore-band{ padding:18px 16px 20px; }
  .lore-band-main{ display:block; }
  .lore-plate{ margin:0 0 16px; }
}

/* A - the background reads light on the purple, one unified box. */
.lore-band{ --plate:44%; }

/* ==========================================================================
   THE SAILOR MOON DOSSIER   (9 Sep 2026)
   ==========================================================================
   Every senshi page carries a stat block; the work they all come from had
   three paragraphs instead. This is the same component one level up, and it
   replaces those paragraphs rather than joining them.

   Two tiers, because Ashley picked the never-heard-of-it reader: what it is,
   then why it is on an astrology site. The toggle asks the stranger's own
   question rather than saying "the background", which only means something to
   someone who already knows.

   LITERAL COLOURS, NOT --paper/--ink. Those live on .senshi-art and this band
   sits outside it; using them here painted a panel transparent earlier today.
   Anything in this band takes explicit values. */
.lore-more-body{ margin-top:20px; padding-top:18px;
  border-top:1px solid rgba(230,193,90,.3); }
.lore-stats-h{
  margin:0 0 10px; font-family:"Press Start 2P",monospace; font-size:9px;
  letter-spacing:.5px; color:var(--lh-gold);
}
.lore-stats-h + .lore-stats{ margin-bottom:22px; }
.lore-stats{ margin:0; columns:3; column-gap:30px; }
.lore-stat{ break-inside:avoid; margin:0 0 12px; }
.lore-stat dt{
  font-family:rainyhearts, monospace; font-size:9px; letter-spacing:.4px;
  color:rgba(230,193,90,.85); margin-bottom:3px;
}
.lore-stat dd{ margin:0; font-size:14px; line-height:1.45; color:rgba(244,238,251,.94); }
/* the bridge tier is the argument, so it gets the wider measure and a rule of
   its own rather than reading as more of the same list */
.lore-stats--bridge{ columns:2; column-gap:34px; }
.lore-stats--bridge dd{ color:#fff; }

@media (max-width:820px){
  .lore-stats, .lore-stats--bridge{ columns:1; }
  .lore-stat dt{ font-size:11px; }
  .lore-stat dd{ font-size:15px; }
}

/* ==========================================================================
   THE DOSSIER TAKES THE COPY'S PLACE   (9 Sep 2026)
   ==========================================================================
   Three notes from Ashley, in order: the box is huge; lay it over the manga
   image if needed; this image really needs to be highlighted, it is the
   astrology connection.

   The third rules out the second. The frontispiece is the only thing on this
   page that proves the claim rather than asserting it, so it does not get
   covered to save height. The COPY gets covered instead - by the time anyone
   opens the dossier they have read it.

   Opening swaps the kicker, headline, sentence and caption for the card, in
   the same column, with the plate untouched beside it. The band goes 385 to
   420 rather than 385 to 760, because the card is ~376 against the plate's
   331 and the taller column sets the row.

   Light, not reverse type: it is a card on its own ground now, so it takes the
   site's off-white and body ink, which is what the big-font rule wants. */
.lore-more-in:checked ~ .lore-band-main .lore-band-copy > *:not(.lore-more-body){ display:none; }
.lore-band-copy{ position:relative; }

.lore-more-body{
  display:none; margin:0;
  background:#FFFFFB; border:2px solid rgba(230,193,90,.55); border-radius:9px;
  box-shadow:0 8px 22px rgba(8,4,18,.4);
  padding:15px 18px 13px; position:relative;
}
.lore-more-in:checked ~ .lore-band-main .lore-more-body{ display:block; }

.lore-stats-h{
  margin:0 0 7px; font-family:"Press Start 2P",monospace; font-size:8.5px;
  letter-spacing:.5px; color:#8b7137;
}
.lore-stats-h + .lore-stats{ margin-bottom:13px; }
.lore-stats, .lore-stats--bridge{ columns:2; column-gap:22px; }
.lore-stat{ break-inside:avoid; margin:0 0 7px; }
.lore-stat dt{
  font-family:rainyhearts, monospace; font-size:9px; letter-spacing:.4px;
  color:#8b7137; margin-bottom:1px;
}
.lore-stat dd{ margin:0; font-size:13px; line-height:1.38; color:#33323e; }
.lore-stats--bridge dd{ color:#33323e; }

.lore-close{
  position:absolute; top:7px; right:9px; z-index:5;
  cursor:pointer; user-select:none; line-height:1;
  font-size:18px; color:#8b7137; padding:1px 7px 3px;
  border:1.5px solid rgba(139,113,55,.35); border-radius:999px; background:#fff;
}
.lore-close:hover{ background:#f6ebbe; }

@media (max-width:820px){
  .lore-stats, .lore-stats--bridge{ columns:1; }
  .lore-stat dd{ font-size:15px; }
}

/* ==========================================================================
   THE FRONTISPIECE AS THE SECTION   (9 Sep 2026)
   ==========================================================================
   Ashley: larger, more visually important, text may cover it.

   THE PICTURE DECIDED WHERE THE TEXT GOES. Gridded at quarters: the Cosmos
   figure holds the left half with her face in the upper part; the celestial-
   spheres diagram sits about 60-85% across and 30-75% down with the ten
   guardians ringed around it; and the bottom strip is NOT free - Saturn is
   bottom centre, Venus and Mars bottom right, so a full-width caption band
   would cover three faces. The bottom-LEFT quarter is soft painted background
   with nothing in it to lose. That is the only place copy can sit, so that is
   where it sits.

   The plate now runs the full width of the band, and the diagram carries a
   marker: "more visually important" is not only bigger, it is pointed at. A
   reader is told which part of the picture is the astrology connection instead
   of being left to find it.

   The dossier opens over the LEFT half - the figure, never the chart. */
.lore-band--poster{ padding:0; border-radius:0; }
.lore-poster{ position:relative; margin:0; line-height:0; }
.lore-poster-img{ display:block; width:100%; height:auto; }

/* the marker on the diagram. Percentages, so it holds at every width. */
.lore-mark{
  position:absolute; left:60.1%; top:29.4%; width:28.1%; height:45.8%;
  border:2px solid rgba(230,193,90,.9); border-radius:50%;
  box-shadow:0 0 0 3px rgba(10,6,22,.35), 0 0 22px rgba(230,193,90,.35);
  pointer-events:none;
}
.lore-mark-tag{
  position:absolute; left:60.1%; top:calc(25.7% - 26px);
  font-family:rainyhearts, monospace; font-size:11px; letter-spacing:.5px;
  color:#0a0616; background:rgba(230,193,90,.94);
  padding:3px 9px; border-radius:999px; line-height:1.2; pointer-events:none;
}

/* the copy, in the empty bottom-left quarter, on its own scrim */
.lore-poster-copy{
  position:absolute; left:2.5%; top:45.8%; bottom:3%; width:49%;
  padding:20px 22px; line-height:1.58; overflow:auto;
  border:1px solid rgba(230,193,90,.34); border-radius:10px;
  background:rgba(11,7,24,.60);
  -webkit-backdrop-filter:blur(7px) saturate(.92);
          backdrop-filter:blur(7px) saturate(.92);
  box-shadow:0 10px 30px rgba(6,3,14,.34);
  text-shadow:0 1px 3px rgba(6,3,14,.75);
}
.lore-poster-copy .lh-kicker{ margin:0 0 10px; }
.lore-poster-copy h2{ margin:0 0 12px; font-size:clamp(13px,1.6vw,18px); }
.lore-poster-copy .lore-claim{ font-size:14.5px; line-height:1.62; margin:0; color:rgba(244,238,251,.94); }
.lore-poster-copy .lh-cap{ margin-top:12px; font-size:12px; }
.lore-poster-copy .lore-more{ margin-top:14px; }

/* the dossier, over the figure only */
/* Opens where the closed copy already was, growing upward, so the panel a
   reader clicked is the panel that expands and the Cosmos figure's face is
   never under a card. */
.lore-band--poster .lore-more-body{
  position:absolute; left:2.5%; top:41.4%; bottom:3%; width:49%; overflow:auto;
  display:none; z-index:6;
}
.lore-more-in:checked ~ .lore-poster .lore-more-body{ display:block; }
.lore-more-in:checked ~ .lore-poster .lore-poster-copy{ display:none; }
.lore-band--poster .lore-stats, .lore-band--poster .lore-stats--bridge{ columns:1; }

@media (max-width:1010px){
  /* Below this the picture is too short to hold the card in its lower half,
     so the copy goes back under the picture and the marker stays on it. */
  .lore-poster-copy{ position:static; width:auto;
    background:linear-gradient(180deg, rgba(10,6,22,.9), rgba(10,6,22,.98)); padding:16px; }
  .lore-band--poster .lore-more-body{ position:static; width:auto; max-height:none; margin:0 16px 16px; }
  .lore-mark-tag{ font-size:10px; }
}

/* ==========================================================================
   36. THE SEAM, THE GLASS, THE DRIFT, THE FADE   (9 Sep 2026)
   ==========================================================================

   THE SEAM. The frontispiece is a two-page spread and the gutter is not in
   the middle of the file: sampling column brightness and then dropping guides
   on the plate at 40/45/50/55/60% puts it at about 55.5% across. So the seam
   has been sitting right of centre this whole time, which is what read as
   "not quite positioned correctly". Cropping c off the left moves it to
   (0.555 - c) / (1 - c); that equals 0.5 at c = 0.11. Eleven per cent off the
   left is page edge and soft background, no face and no chart.

   It is done with a frame at the CROPPED aspect ratio - 2134 x 0.89 = 1899
   over 1710 - plus object-fit:cover and object-position:100%, so the browser
   does the crop and the original file is never cut. Every percentage in the
   marker rules above was remapped through the same transform,
   new = (old - 0.11) / 0.89, or the gold ring would have drifted off the
   chart it is pointing at.

   THE GLASS. The copy was a near-solid scrim in the bottom corner. It is now
   a translucent card raised to just under Usagi's chin. Readability is not
   left to luck: rgba(11,7,24,.60) over the brightest paint on this plate
   composites to about L*=95, and white on that is roughly 6.5:1, comfortably
   past the 4.5:1 the small text needs; over the dark lower half it is nearer
   19:1. The blur is a second belt - it kills the high-frequency detail that
   makes type swim - and the text-shadow is the third. Any one of them alone
   would do; all three mean the box can be genuinely see-through.

   THE DRIFT. A very slow scale on the plate and a star layer creeping across
   it. Small enough that it reads as the picture breathing rather than as an
   animation, and both are switched off entirely under prefers-reduced-motion.

   THE FADE. The band used to end on a 3px gold rule, which is why the join to
   "through the arcs" landed like a door closing. The bottom of the plate now
   dissolves into #fefeff, the exact ground the arc console sits on, so the
   picture hands over to the section instead of stopping at it. */

.lore-poster{ overflow:hidden; }
.lore-poster-frame{
  position:relative; width:100%; aspect-ratio:1899 / 1380; overflow:hidden;
}
.lore-poster-img{
  display:block; position:absolute;
  width:112.36%; height:123.916%; left:-12.36%; top:-9.665%;
  transform-origin:55.5% 48.2%;
  animation:lore-breathe 34s ease-in-out infinite alternate;
  will-change:transform;
}
@keyframes lore-breathe{ from{ transform:scale(1); } to{ transform:scale(1.04); } }

/* the star layer, drifting across the paint */
.lore-drift{
  position:absolute; inset:-8% -8% -8% -8%; pointer-events:none; z-index:2;
  opacity:.42;
  background-image:
    radial-gradient(1.6px 1.6px at 12% 22%,#fff 50%,transparent 51%),
    radial-gradient(1.3px 1.3px at 26% 74%,#fff 50%,transparent 51%),
    radial-gradient(1.5px 1.5px at 62% 14%,#fff 50%,transparent 51%),
    radial-gradient(1.2px 1.2px at 88% 62%,#fff 50%,transparent 51%),
    radial-gradient(1.7px 1.7px at 45% 88%,#fff 50%,transparent 51%),
    radial-gradient(1.3px 1.3px at 8% 54%,#fff 50%,transparent 51%),
    radial-gradient(1.4px 1.4px at 72% 44%,#fff 50%,transparent 51%),
    radial-gradient(1.2px 1.2px at 36% 36%,#fff 50%,transparent 51%);
  animation:lore-drift 42s linear infinite alternate;
}
@keyframes lore-drift{
  from{ transform:translate3d(0,0,0); opacity:.30; }
  50% { opacity:.52; }
  to  { transform:translate3d(2.2%,-1.6%,0); opacity:.30; }
}

/* the hand-over to the arc console */
.lore-fade{
  position:absolute; left:0; right:0; bottom:-1px; height:12%; z-index:3;
  pointer-events:none;
  background:linear-gradient(180deg,
    rgba(254,254,255,0) 0%,
    rgba(254,254,255,.10) 30%,
    rgba(254,254,255,.44) 58%,
    rgba(254,254,255,.86) 82%,
    #fefeff 96%,
    #fefeff 100%);
}
.lore-band--poster{ border-bottom:0; }

.lore-poster-copy .lore-desc{
  margin:11px 0 0; font-size:13.5px; line-height:1.6;
  color:rgba(238,231,248,.88);
}
.lore-poster-copy .lore-desc b{ color:#f0d98c; font-weight:600; }
.lore-poster-copy .lore-desc i{ font-style:italic; color:rgba(244,238,251,.95); }
.lore-poster-copy .lh-cap{ margin-top:11px; font-size:11.5px; }
.lore-poster-copy .lore-more{ margin-top:12px; }

@media (prefers-reduced-motion:reduce){
  .lore-poster-img{ animation:none; transform:none; }
  .lore-drift{ animation:none; opacity:.34; }
}
@media (max-width:1010px){
  .lore-poster-copy{ position:static; width:auto; inset:auto; border-radius:0;
    border:0; border-top:1px solid rgba(230,193,90,.34); padding:16px;
    background:rgba(11,7,24,.9); }
  .lore-band--poster .lore-more-body{ position:static; width:auto; inset:auto;
    margin:0 16px 16px; }
  .lore-fade{ display:none; }
}

/* ---- the card, tightened. Same words, about 30px less box, so the fit at
   1024 stops being exact and starts being comfortable. ---- */
.lore-poster-copy{ padding:16px 20px; line-height:1.52; }
.lore-poster-copy h2{ margin:0 0 9px; }
.lore-poster-copy .lore-claim{ font-size:14px; line-height:1.55; }
.lore-poster-copy .lore-desc{ margin-top:9px; font-size:13px; line-height:1.54; }
.lore-poster-copy .lh-kicker{ margin:0 0 8px; }
.lore-poster-copy .lh-cap{ margin-top:9px; }
.lore-poster-copy .lore-more{ margin-top:10px; }


/* ---- 39. the picture sits up against the console (9 Sep 2026) ---- */
body.wing.select .lore-hero-wrap{ margin-top:6px; }

/* ---- 40. the label comes off the painting (9 Sep 2026) ----
   The ring alone points at the chart, and the copy card already names it. The
   rules stay in the file rather than being cut out mid-stylesheet, per the
   house rule that nothing is edited above the end of the file. */
.lore-mark-tag{ display:none; }


/* ---- 41. the copy card hugs its content (9 Sep 2026) ---- */
.lore-band--poster .lore-poster-copy{ top:auto; bottom:3%; max-height:51%; }
.lore-band--poster .lore-more-body{ top:auto; bottom:3%; max-height:56%; }
@media (max-width:1010px){
  .lore-band--poster .lore-poster-copy,
  .lore-band--poster .lore-more-body{ max-height:none; }
}

/* ==========================================================================
   42. THE CARD BECOMES PAPER   (9 Sep 2026)
   ==========================================================================
   Ashley: the text is hard to read. Three separate causes, all real:

   1. Glass over a painting. The contrast NUMBER was fine - white on
      rgba(11,7,24,.60) computes to about 6.5:1 over the brightest paint - but
      a number assumes a flat backdrop. Behind this card is Takeuchi's
      brushwork, and the blur softens it without stopping its edges reading as
      strokes running through the letterforms.
   2. The text-shadow meant to rescue that was thickening every stem.
   3. .lore-fade is z-index 3 and the card had no z-index, so the white bottom
      fade painted OVER the last lines of the card. That is why the bottom of
      the box looked washed out, and no amount of colour tuning would have
      fixed it.

   So it stops being glass: warm paper at 96%, ink at #33323e, no shadow, and
   z-index 4 so nothing paints over it again. That is 11.9:1, and it holds
   whatever is underneath it. It still reads as laid ON the picture - the 4%
   and the gold edge keep it from looking like a hole cut in the plate.

   And it is top-anchored now. Bottom-anchoring meant the top edge climbed
   towards her face every time the text grew; a fixed 58% keeps it a set
   distance under her chin, which sits at about 45%. */
.lore-band--poster .lore-poster-copy{
  top:58%; bottom:auto; max-height:40.5%; z-index:4;
  background:rgba(255,253,247,.96);
  border:1px solid var(--lh-gold-deep);
  box-shadow:0 8px 26px rgba(6,3,14,.30);
  text-shadow:none;
  color:#33323e;
  -webkit-backdrop-filter:none; backdrop-filter:none;
}
.lore-poster-copy .lh-kicker{ color:#8b7137; }
.lore-poster-copy h2{ color:#5A3268; font-size:17px; margin:0 0 8px; }
.lore-poster-copy .lore-claim{ color:#33323e; font-size:14.5px; line-height:1.6; }
.lore-poster-copy .lore-desc{ color:#4a4657; font-size:13.5px; line-height:1.58; }
.lore-poster-copy .lore-desc b{ color:#7a5f2c; }
.lore-poster-copy .lore-desc i{ color:#4a4657; }
.lore-poster-copy .lh-kicker{
  display:flex; align-items:baseline; justify-content:space-between; gap:12px;
  margin:0 0 7px;
}
.lore-poster-copy .lh-src{ font-size:11.5px; color:#6b6577; white-space:nowrap; }
.lore-band--poster .lore-poster-copy{ padding:14px 20px 15px; }
.lore-poster-copy h2{ margin-bottom:6px; }
.lore-poster-copy .lore-more{
  color:#5A3268; border-color:rgba(90,50,104,.45); background:rgba(90,50,104,.06);
}
.lore-poster-copy .lore-more-mark{ color:#8b7137; }

@media (max-width:1010px){
  .lore-band--poster .lore-poster-copy{
    top:auto; max-height:none; border:0;
    border-top:1px solid var(--lh-gold-deep);
    background:#fffdf7;
  }
}

/* ==========================================================================
   44. THE PHONE   (9 Sep 2026)
   ==========================================================================
   Three faults that existed only below the breakpoint, which is exactly why
   they survived every desktop check.

   THE RING. .lore-mark, .lore-drift and .lore-fade were siblings of the frame,
   so their percentages resolved against <figure>. At desktop the figure and
   the frame are the same box and it looked correct. On a phone the copy card
   goes static and lands inside the figure, the figure doubles in height, and
   the marker stretched into a gold ellipse running down over the paragraphs.
   They are children of the frame now - which also puts them inside its
   overflow:hidden, so the ring is clipped to the picture at every width.

   THE PLATE. A phone breakpoint sets img{max-width:100%}, and max-width is not
   a specificity fight - it clamps whatever width is declared. The 112.36% that
   performs the left crop was being capped to 100%, so on a phone the plate
   lost its crop, sat 364x292 inside a 364x302 frame, and left a strip of the
   band's dark ground showing beneath it. Declared max-width:none.

   THE KICKER. One flex line for the kicker and the plate credit reads well at
   989px and folds badly at 364. It stacks below the breakpoint. */
.lore-band--poster .lore-poster-img{ max-width:none; }
.lore-band--poster .lore-poster-frame{ background:#e9e4f2; }

@media (max-width:1010px){
  .lore-poster-copy .lh-kicker{ display:block; }
  .lore-poster-copy .lh-src{ display:block; margin-top:3px; white-space:normal; }
}

/* ==========================================================================
   45. THE DOSSIER OPENS ON THE RIGHT   (9 Sep 2026)
   ==========================================================================
   Ashley: pop it out to the right of the image, semi-transparent, over the
   guardians and the circle - and put back what was cut for space.

   DARK, NOT PAPER, AND ON PURPOSE. She was right that the old glass was hard
   to read, but the lesson there was contrast against BUSY rather than contrast
   in the abstract. The right half of this plate is mostly light paint: pale
   washes, white floral borders, the cream zodiac ring. A light panel over that
   has almost nothing to separate itself from. A dark one at 82% puts cream on
   a composite around L*=50 even where the paint is brightest - 10.9:1, better
   than the paper card on the left manages - and the ring and the guardians
   still read straight through it. So: smoked glass, light type, blur to stop
   the paint's own edges running through the letterforms.

   BOTH PANELS AT ONCE. The old rule hid the copy card whenever the dossier
   opened, which made sense when they shared the left half and would have been
   silly now they are side by side. The claim you clicked from stays on screen
   while you read the long version.

   It is top-anchored with a height cap rather than pinned top AND bottom: the
   panel is 120px shorter than the picture, and pinning both edges would have
   left that as dead space under the last paragraph - the same fault the copy
   card had. The cap only comes into play if the text ever outgrows the plate.

   The 93% cap replaces section 41's 56% one, which
   would hug its content in the bottom corner, and without the reset the new
   top/bottom would be silently clipped to just over half the picture.

   It stays a child of <figure> rather than moving into the frame, unlike the
   marker: the frame's overflow:hidden would clip it, which is right while it
   is absolute but would erase it on a phone, where it goes static and stacks
   below the picture. At the widths where it IS absolute the figure and the
   frame are the same box, so it is clipped to the picture in practice. */
.lore-band--poster .lore-more-body{
  left:50.5%; right:2.5%; width:auto; top:3.5%; bottom:auto; max-height:93%;
  overflow:auto; z-index:5;
  padding:16px 18px;
  border:1px solid rgba(230,193,90,.42); border-radius:10px;
  background:rgba(10,6,22,.82);
  -webkit-backdrop-filter:blur(6px) saturate(.9);
          backdrop-filter:blur(6px) saturate(.9);
  box-shadow:0 12px 34px rgba(4,2,10,.44);
  color:#f4eefb;
}
/* the copy card no longer disappears when the dossier opens */
.lore-more-in:checked ~ .lore-poster .lore-poster-copy{ display:block; }

/* The stat labels were tuned for a small light card: 8.5px Press Start 2P for
   the group headings and 9px for each dt. On a dark panel this size they are
   decoration rather than text, and the second heading had no top margin at all
   so it crashed straight into the paragraph above it. Both go up, the heading
   gets air, and the row gap comes down to pay for it. */
.lore-band--poster .lore-more-body .lore-stats-h{
  color:#e6c15a; font-size:11px; margin:18px 0 7px; line-height:1.5;
}
.lore-band--poster .lore-more-body .lore-stats-h:first-of-type{ margin-top:0; }
.lore-band--poster .lore-more-body dt{ color:rgba(230,193,90,.86); font-size:11px; }
.lore-band--poster .lore-more-body .lore-stat{ margin-bottom:5px; }
.lore-band--poster .lore-more-body dd{ color:#f4eefb; }
.lore-band--poster .lore-more-p{
  margin:10px 0 0; font-size:13px; line-height:1.62; color:rgba(240,234,250,.92);
}
.lore-band--poster .lore-close{
  position:sticky; top:0; float:right; z-index:2;
  color:#f4eefb; background:rgba(10,6,22,.9);
  border:1px solid rgba(230,193,90,.4); border-radius:50%;
  width:26px; height:26px; line-height:24px; text-align:center;
}

@media (max-width:1010px){
  .lore-band--poster .lore-more-body{
    left:auto; right:auto; top:auto; bottom:auto; width:auto;
    border-radius:0; border:0; border-top:1px solid rgba(230,193,90,.42);
    margin:0; padding:16px;
  }
  .lore-band--poster .lore-close{ position:static; }
}

/* ==========================================================================
   46. CUT AT SATURN'S SKIRT   (9 Sep 2026)
   ==========================================================================
   Ashley: crop the bottom up to the top of Saturn's skirt bow. Read off a 1%
   ruling of the bottom right quadrant: her chest bow is at 0.835-0.865 and the
   waist, where the bodice meets the purple skirt, is at 0.885. So b = 0.115,
   the visible band becomes y in [0.078, 0.885], and the frame goes to
   1899 / 1380. The plate is 989x719 instead of 989x821.

   WHAT IT COSTS, stated because it is not free. Every vertical percentage
   remaps through (y - 0.078) / 0.807, Usagi's chin included: it moves from 45%
   of the frame to 51%. The copy card is 319px and the plate is now 719, so the
   card cannot start lower than 53% and still clear the bottom edge - 14px
   below her chin, where there were 107. That gap is the thing Ashley asked for
   two rounds ago, and it and this crop are not both available while the card
   holds this much text.

   The fade drops 28% -> 12% for the same arithmetic: 28% of 719px reaches up
   to y=0.66 of the painting and would wash out Saturn's and Mars's faces. At
   12% it begins just under Saturn's chin. */
.lore-band--poster .lore-poster-copy{ top:53%; max-height:45.5%; }

/* ==========================================================================
   47. THE GAP UNDER HER CHIN, PROPERLY   (9 Sep 2026)
   ==========================================================================
   Ashley, again: the card is too close to Usagi's chin.

   Section 46 explained why and then left it there, which was not good enough.
   The arithmetic: her chin is at 51% of a 719px plate, the card was 319px
   (44%), so 53% was the lowest it could start and still clear the bottom -
   28px of air. The two obvious levers are both closed. Widening past 50%
   crosses the book seam and collides with the dossier; shrinking the type
   re-opens the readability complaint from two rounds ago.

   The third lever was content, and it turned out to be free. The dossier now
   opens with manga by / serialised / grew from / length / sold / anime - the
   same six facts the description paragraph was carrying in prose - and then
   gives the long version underneath. So the paragraph was saying the same
   thing twice on one screen. Out it comes, the card drops to about 205px, and
   it starts at 64%: roughly 93px under her chin instead of 28. */
.lore-band--poster .lore-poster-copy{ top:64%; max-height:33%; }

/* ==========================================================================
   48. THE TWO DEAD ZONES IN THE CONSOLE   (9 Sep 2026)
   ==========================================================================
   Ashley circled two areas. Different faults, different fixes.

   THE BAND UNDER THE ROSTER. The frosted window fits the taller of its two
   columns. .sel-stage is 489px of actual content; .sel-panels was pinned to
   570px earlier in this session. So 89px of frosted panel hung below the last
   row of cards with nothing in it.

   THE STRIP ABOVE THE ART. Letterbox, not padding. .sel-back is
   object-fit:contain and the artwork is 1000x888, which in a 360px-wide panel
   is 320px tall - so a 570px panel has 250px of slack, and
   object-position:center 42% puts 105 of it above the picture. What shows
   there is .sel-fill, the same artwork blurred, which is why it reads as a
   smear rather than as a margin.

   Shrinking the panel does not fix the strip on its own: .sel-blank-frame is
   pinned at top:154px, so the reticle absorbs the shrink and the letterbox
   survives. Both had to move.

   So the artwork goes to the TOP of the panel and every pixel of slack falls
   to the bottom, where .sel-blank-plate is already lying over it - the plate
   runs from 66% to the foot, so the slack ends up under type instead of
   showing as blur. Then the columns are squared up: the roster's group margins
   go 10px -> 4px and the preview panel is set to the roster's height.

   471px is inside a window with two hard edges and both were checked:
     floor    the plate gets 0.34H and needs 128px - three lines plus 50px of
              padding - which puts the floor at 377.
     ceiling  the plate's gradient must START over the artwork or there is a
              bare strip between picture and type. The art ends at 320 and the
              plate starts at 0.66H, so H <= 485.

   Console 774 -> ~675, and the whole page below it comes up by the same
   amount. */
body.wing.select .sel-group{ margin-bottom:4px; }

/* AND A BUG THIS TURNED UP. The phone block at max-width:900px sets
   .sel-panels{height:280px} - the panel is a sticky band above the roster
   there, not a column beside it. The height I appended earlier in this session
   was written as body.wing.select .sel-panels, which is both more specific and
   later, so it has been overriding that 280 on every phone: a 570px sticky
   band eating most of the viewport. It was never meant to apply below the
   breakpoint. Everything that is about the two-column console is inside
   min-width:901px now, and the phone gets its own rules back. */
@media (min-width:901px){
  body.wing.select .sel-panels{ height:471px; }

  /* the artwork sits at the top; the slack goes under the type plate */
  body.wing.select .sel-panel--blank .sel-back{ object-position:center top; }

  /* the reticle follows the artwork rather than the panel. Fixed pixels are
     right here and only here: the console is a fixed-width stage, so the panel
     is 360 wide at every desktop size, and below 900px the reticle is already
     switched off. */
  body.wing.select .sel-blank-frame{ top:9px; bottom:161px; }
}

/* Scoping the new rules is not enough on its own - the 570px I appended
   earlier is still in the file above, still more specific than the phone
   block, and still wins below 901px. So the phone's designed height is stated
   here explicitly to take it back. 280 is the number the mobile block was
   written around: a sticky banner-shaped band with a cover crop, not a
   half-viewport column. */
@media (max-width:900px){
  body.wing.select .sel-panels{ height:280px; }
}

/* ==========================================================================
   49. THE SEAM STRIP   (9 Sep 2026)
   ==========================================================================
   Ashley: at the fold you get the console, then a strip of painting, and
   nothing says a section starts there or that anything follows.

   The diagnosis was not "needs a scroll arrow". This band's title lives inside
   the copy card at 64% of the plate - about 460px below the fold on a 1080p
   screen - so what a reader meets is an unnamed decorative strip, which reads
   as trim on the console. An arrow answers "is there more"; it does not answer
   "more of what", and that is the question that was stopping her.

   Type, not a container. The page already has the console, the band, the
   credit plate and the arc console, and a fifth box would be the wrong answer
   to "it looks like nothing is here". So one 36px line on the seam: the name
   on the left, three counts in the middle - five arcs, 135 beats, 67
   galleries, all counted out of the file - and a link on the right that tells
   the reader there is a SECOND section after this one.

   The chevron hops on the same three-frame steps() rhythm as "choose your
   senshi" in the console above it, because that is the only motion register
   this page uses. Reduced-motion gets a static arrow. */
body.wing.select .lore-seam{
  display:flex; align-items:baseline; gap:14px; flex-wrap:wrap;
  margin:0 0 6px; padding:8px 14px 9px;
  border-left:4px solid var(--lh-gold-deep);
  background:linear-gradient(90deg,#f4f0fa 0%,#fdfcff 78%);
  font-size:13px; line-height:1.5;
}
body.wing.select .lore-seam-k{
  font-family:rainyhearts, monospace; font-size:14px; letter-spacing:.04em;
  color:#8b7137;
}
body.wing.select .lore-seam-n{
  color:#6b6577; font-size:12.5px; letter-spacing:.02em;
}
body.wing.select .lore-seam-go{
  margin-left:auto; color:#5A3268; text-decoration:none; font-weight:600;
  border-bottom:2px solid var(--lh-gold-deep); white-space:nowrap;
}
body.wing.select .lore-seam-go:hover{ background:rgba(90,50,104,.07); }
body.wing.select .lore-seam-v{
  display:inline-block; margin-left:4px; color:#8b7137;
  animation:seam-bob 1.5s steps(1,end) infinite;
}
@keyframes seam-bob{
  0%, 62%  { transform:translateY(0); }
  70%      { transform:translateY(2px); }
  78%      { transform:translateY(4px); }
  86%,100% { transform:translateY(0); }
}
@media (prefers-reduced-motion:reduce){
  body.wing.select .lore-seam-v{ animation:none; }
}
@media (max-width:700px){
  body.wing.select .lore-seam{ gap:4px 12px; }
  body.wing.select .lore-seam-go{ margin-left:0; }
}

/* the card keeps the plate credit and gives up the name, which the seam now
   carries; left-aligned, since it is no longer sharing the row */
body.wing.select .lore-poster-copy .lh-kicker{ display:block; }
body.wing.select .lore-poster-copy .lh-src{ white-space:normal; }

/* ==========================================================================
   51. THE ARC RAIL   (10 Sep 2026)
   ==========================================================================
   Ashley, twice: the band is not doing enough to make anyone scroll.

   She was right, and section 49 was the wrong SIZE of answer rather than the
   wrong idea. A line of type saying "five arcs" is an assertion; five colour
   lockups in a row is evidence. Nobody looks at that and concludes the page
   ends at the console.

   It is not new content either - these are the same five logos the season
   cards use, lifted to where they do the most work. And the full-size files
   are deliberate: small copies would be about 12KB each against 55, but then
   the same logo is fetched twice, once at 34px here and again at 82px in the
   card. One set means the cards are already cached before anyone opens an arc.

   WHAT NOW CLEARS THE FOLD. On a 1080p window the console ends around 810 and
   the fold is near 960 - 150px. The strip is 39 and this is about 78, so both
   fit with the top of the plate still showing underneath: the band's name,
   five season logos, and a sliver of the painting.

   THE FOUR LOCKED ARCS ARE SPANS, NOT LINKS. Their radios are disabled, so a
   link would carry someone to a console that then refuses to open the thing
   they clicked. Greyscale and "not yet" say the true thing, and it is the same
   promise the arc index and the season cards already make. */
body.wing.select .arc-rail{ margin:0 0 6px; }
body.wing.select .arc-rail ul{
  display:grid; grid-template-columns:repeat(5, minmax(0,1fr));
  gap:10px; margin:0; padding:0; list-style:none;
}
body.wing.select .arc-rail-i{
  display:flex; flex-direction:column; align-items:center; gap:3px;
  padding:7px 6px 8px; border-radius:8px; text-decoration:none;
  background:linear-gradient(180deg,#f6f2fc 0%,#fdfcff 100%);
  border:1px solid #e7e2f0;
}
body.wing.select .arc-rail-i img{
  display:block; height:34px; width:auto; max-width:100%; object-fit:contain;
}
body.wing.select .arc-rail-n{
  font-family:rainyhearts, monospace; font-size:13px; letter-spacing:.03em;
  color:#5A3268; line-height:1.2;
}
body.wing.select .arc-rail-s{
  font-size:10.5px; color:#8b7137; letter-spacing:.02em;
}
a.arc-rail-i:hover{
  border-color:var(--lh-gold-deep);
  background:linear-gradient(180deg,#f3ecff 0%,#fffdf7 100%);
}
a.arc-rail-i:hover .arc-rail-n{ color:#3f2350; }

body.wing.select .arc-rail-i.is-soon{ cursor:default; }
body.wing.select .arc-rail-i.is-soon img{ filter:grayscale(1); opacity:.42; }
body.wing.select .arc-rail-i.is-soon .arc-rail-n{ color:#8d8898; }
body.wing.select .arc-rail-i.is-soon .arc-rail-s{ color:#a5a0b0; }

@media (max-width:820px){
  body.wing.select .arc-rail ul{ grid-template-columns:repeat(3, minmax(0,1fr)); }
  body.wing.select .arc-rail-i img{ height:28px; }
  body.wing.select .arc-rail-s{ display:none; }
}
@media (max-width:460px){
  body.wing.select .arc-rail ul{ grid-template-columns:repeat(2, minmax(0,1fr)); }
}

/* ==========================================================================
   56. THE CARD STOPS CROSSING THE SEAM   (10 Sep 2026)
   ==========================================================================
   Ashley: the right edge of the copy box hangs too far over the edge of the
   image.

   She is right, and the number says why. The card is left:2.5% width:49%, so
   its right edge is at 51.5% of the plate - and the book seam is at 50%,
   because the entire left crop in section 46 exists to put it there. The box
   has been sitting 1.5% onto the right-hand page since it was built. It is not
   overhanging the picture; it is overhanging the PAGE inside the picture,
   which is why it looked wrong in a way that was hard to name.

   44% puts the right edge at 46.5% with 3.5% of left page still showing before
   the gutter. The card gains a line doing it - 203px to 227 - and the cap is
   33% of 719, which is 237. Measured, because a narrower box is a taller box,
   and this card has overflowed twice already. */
@media (min-width:1011px){
  /* Scoped, and it has to be. Without the query this rule sits later in the
     file than the phone block that sets width:auto, and source order settles a
     specificity tie - so a phone got a 44%-wide column of text stacked under
     the picture. Above the breakpoint the card is positioned over the plate,
     which is the only place a percentage of the plate means anything. */
  .lore-band--poster .lore-poster-copy{ width:44%; }
}

/* ==========================================================================
   58. THE NAOKO STICKER   (10 Sep 2026)
   ==========================================================================
   Asked for a long way back: Naoko in a tilted heart frame, sitting in the
   corner of the box like a sticker. It waited because I would not take a
   photograph of a living person off the web for this site; Ashley supplied the
   interview scan herself, so it can be built.

   IT IS A SIBLING OF THE COPY CARD, NOT A CHILD. The card is overflow:auto, so
   anything inside it that reaches past the edge is clipped or turns into a
   scrollbar - and hanging over the corner is the entire point of a sticker. It
   sits in the figure alongside the card, positioned against the plate at
   39.5% / 55.5%, which is where the card's top-right corner is.

   THE HEART IS A REFERENCED SVG clipPath in objectBoundingBox units, not
   clip-path:path(). Both work in current browsers; this one scales with the
   element and has years more support behind it. The white rim is the wrapper's
   padding showing through the same clip. The shadow is a drop-shadow FILTER,
   because box-shadow would draw the rectangle that was clipped away rather
   than the heart.

   BELOW THE BREAKPOINT it stops being absolute, because the card stops being
   absolute - a percentage of the plate means nothing once the copy is stacked
   underneath it. It becomes a right-aligned block with a negative bottom
   margin so it still overlaps the top of the card. */
.sm-heart-def{ position:absolute; width:0; height:0; overflow:hidden; }

.lore-band--poster .lore-naoko{
  margin:0; z-index:6; width:104px;
  transform:rotate(-8deg);
  filter:drop-shadow(0 5px 10px rgba(20,10,40,.42));
}
.lore-band--poster .lore-naoko-frame{
  display:block; padding:5px; background:#fffdf7;
  -webkit-clip-path:url(#sm-heart); clip-path:url(#sm-heart);
}
.lore-band--poster .lore-naoko-frame img{
  display:block; width:100%; height:auto; aspect-ratio:1/1; object-fit:cover;
  -webkit-clip-path:url(#sm-heart); clip-path:url(#sm-heart);
}
/* NO CAPTION. I added one and it was wrong twice: pulled up, it ran through
   the heart's point as an illegible sliver; pushed down, it landed on the
   copy card's headline. Any vertical position collides with something,
   because the sticker is deliberately sitting on a corner where two things
   already meet. The name is in the alt text, the card beside it is credited,
   and the dossier behind the button names her in its first row - so the
   picture can just be a picture. */

@media (min-width:1011px){
  /* 37.4%, not 39.5%. The rotation makes the bounding box 118px rather than
     104, which pushed the right edge to 50.7% - across the book seam, the exact
     thing the copy card was just pulled back from. It now stops at 49.4%. */
  .lore-band--poster .lore-naoko{ position:absolute; left:37.4%; top:55.5%; }
}
@media (max-width:1010px){
  .lore-band--poster .lore-naoko{
    width:84px; margin:10px 16px -26px auto; position:relative;
  }
}

/* ==========================================================================
   62. THE HEART STAMP, LARGER   (10 Sep 2026)
   ==========================================================================
   Ashley: bigger.

   The limit is the book gutter, not taste. The stamp straddles the copy card's
   top-right corner at 46.5% of the plate and the gutter is at 50%; anything
   centred on that corner grows straight across it. So it grows and moves left
   together - 104 -> 132px, left 37.4% -> 34.6% - which lands the right edge at
   49.3%.

   That makes it sit more on the card than across its corner, about three
   quarters over rather than half. At this size that is the better reading
   anyway: a large shape hanging half in space looks unmoored, a large one
   pressed onto the card looks stuck there on purpose.

   Rotation is why the sums are not 132/989: at -8 degrees the bounding box is
   132*cos8 + 132*sin8, about 149px. */
/* display:block, and this is a real bug, not tidiness. The sticker became an
   <a> when it turned into a link to #naoko, and an anchor is inline by
   default - width does not apply to inline boxes. On desktop position:absolute
   blockifies it so nobody noticed; on a phone it is position:relative, stayed
   inline, ignored its width and let the img inside run to 100% of the column.
   Measured at 390: 364px wide instead of 104. */
.lore-band--poster .lore-naoko{ display:block; width:132px; }
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ left:34.6%; top:53.6%; }
}
@media (max-width:1010px){
  .lore-band--poster .lore-naoko{ width:104px; margin:10px 16px -30px auto; }
}

/* ==========================================================================
   66. THE HEART BEATS ON HOVER   (10 Sep 2026)
   ==========================================================================
   Ashley: a little animation on hover. It is a heart, so it beats - twice,
   fast, then settles.

   THE KEYFRAMES CARRY THE ROTATION. The resting state is rotate(-8deg), and an
   animation that only scaled would replace that transform and snap the heart
   upright the moment the hover started. Every frame states its own rotation and
   the last returns to -8deg exactly, so it lands where it began.

   It straightens as it lifts, -8 to -5, because a sticker being pressed tilts
   less; holding the full tilt through a scale reads as a zoom instead of a
   press.

   GUARDED TWICE: (hover:hover) so a phone never starts a motion it cannot end,
   and reduced-motion keeps the shadow and drops the movement. Focus gets the
   same lift - a link you can only identify by hovering is not much of a link. */
.lore-band--poster a.lore-naoko{
  cursor:pointer;
  transition:filter .25s ease;
}
@keyframes naoko-beat{
  0%       { transform:rotate(-8deg) scale(1); }
  16%      { transform:rotate(-5deg) scale(1.09); }
  30%      { transform:rotate(-6deg) scale(1.01); }
  46%      { transform:rotate(-5deg) scale(1.07); }
  68%, 100%{ transform:rotate(-8deg) scale(1); }
}
@media (hover:hover){
  .lore-band--poster a.lore-naoko:hover{
    filter:drop-shadow(0 8px 16px rgba(20,10,40,.52));
    animation:naoko-beat 900ms ease-in-out both;
  }
  .lore-band--poster a.lore-naoko:hover .lore-naoko-frame{ background:#fffefb; }
}
.lore-band--poster a.lore-naoko:focus-visible{
  outline:none;
  filter:drop-shadow(0 8px 16px rgba(20,10,40,.52));
  animation:naoko-beat 900ms ease-in-out both;
}
@media (prefers-reduced-motion:reduce){
  .lore-band--poster a.lore-naoko:hover,
  .lore-band--poster a.lore-naoko:focus-visible{ animation:none; }
}

/* ==========================================================================
   67. THE ASTROLOGY CONNECTION   (10 Sep 2026)
   ==========================================================================
   Ashley: rename it, and no bullets - one paragraph that makes the connection
   obvious.

   The five rows it replaces were a chain, not a list: planet, then the god the
   planet is named for, then the character written from that god, then the chart
   she drew at the centre of the plate. A definition list presents four links as
   four separate facts, which is the one shape that hides the argument. Prose
   runs the chain and finishes on why any of it belongs on a site about charts -
   which none of the rows ever said out loud.

   The canon note stays separate because it is not a connection. It is the rule
   for which text wins when the manga and the anime disagree, and burying that
   in a paragraph about mythology would lose the one line a reader might hold
   this wing to. */
/* The prose runs 673px where the cap allowed 666, so the panel had picked up a
   seven-pixel scrollbar - the sort of thing that reads as broken rather than as
   long. The cap goes 93% to 95%, which the panel has room for: it starts at
   3.5% from the top, so 95 still lands inside the plate at 98.5%. */
.lore-band--poster .lore-more-body{ max-height:95%; }

.lore-band--poster .lore-canon{
  margin:11px 0 0; padding-top:9px;
  border-top:1px dashed rgba(230,193,90,.34);
  font-size:12px; line-height:1.55; color:rgba(230,193,90,.9);
}

/* ==========================================================================
   69. THE HEART STAMP, LARGER AGAIN   (10 Sep 2026)
   ==========================================================================
   Ashley: larger.

   Second growth. 132 -> 160px, and as before it has to move left as it grows,
   because the book seam down the middle of the plate is the hard limit and a
   shape centred near it grows straight across it.

   THE ARITHMETIC. Rotation makes the box bigger than the width: at -8 degrees a
   160px square occupies 160*cos8 + 160*sin8 = 181px in both axes. The frame is
   1014px wide, so that is 17.8%. Holding the right edge at 49.3% - the line the
   132px version stopped on, just short of the 50% gutter - puts the left edge
   at 31.5%.

   AND IT MOVES UP, WHICH IS THE PART THAT IS EASY TO MISS. The sticker straddles
   the copy card's top edge at 64%, and at 132px it hung 51.5% above that line.
   Growing a top-anchored box only adds height downward, so the same top would
   have dropped it onto the card and eaten the overhang. Top goes 53.6% -> 51.4%
   to keep the straddle where it was.

   PHONE: 104 -> 124px, and the negative bottom margin deepens -30 -> -36px so
   the overlap stays proportional rather than shrinking to a touch. */
.lore-band--poster .lore-naoko{ width:160px; }
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ left:31.5%; top:51.4%; }
}
@media (max-width:1010px){
  .lore-band--poster .lore-naoko{ width:124px; margin:10px 16px -36px auto; }
}
/* ---- Naoko's sticker, third growth ----
   160 -> 184px. Same arithmetic as the last two: at -8 degrees a 184px square
   occupies 184*cos8 + 184*sin8 = 208px, the plate is 989 wide and the book
   seam runs down the middle of it, so the shape has to move left as it grows
   or it walks across the gutter. Left 31.5% -> 29.5%, and top 51.4% -> 50.6%
   so it keeps straddling the copy card's top edge instead of sliding onto it. */
.lore-band--poster .lore-naoko{ width:184px; }
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ left:29.5%; top:50.6%; }
}
@media (max-width:1010px){
  .lore-band--poster .lore-naoko{ width:140px; margin:10px 16px -40px auto; }
}

/* ==========================================================================
   92. THE HEART STAMP, FOURTH GROWTH   (10 Sep 2026)
   ==========================================================================
   Ashley: larger still.

   184 -> 210px. Same sum as the last three: the book gutter runs down the
   middle of the plate at 50% and the shape must not cross it, and rotation
   makes it wider than its width - at -8 degrees a 210px square occupies
   210*cos8 + 210*sin8 = 237px, or 24.0% of the 989px frame. Holding the right
   edge at 49.3%, where the last three sizes all stopped, puts left at 26.7%
   once the 13.5px the rotation adds each side is counted. Vertically 237px is
   33.0% of 719, so top goes to 48.7% to keep about half the shape above the
   copy card's top edge.

   AND THIS IS NEARLY THE END OF THE ROAD, worth saying before the next
   request rather than after it. The gutter is the binding constraint, so every
   further growth has to move left by more than it gains in width - the shape
   walks further onto the copy card each time. At 210 it covers most of the
   card's top-right corner rather than straddling it. One more step this size
   would put its left edge past the card's midpoint, where it stops being a
   sticker on a corner and becomes a portrait with a card behind it. That may
   be the right object; it is not the same one. */
.lore-band--poster .lore-naoko{ width:210px; }
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ left:26.7%; top:48.7%; }
}
@media (max-width:1010px){
  .lore-band--poster .lore-naoko{ width:160px; margin:10px 16px -46px auto; }
}

/* ---- the heart lifts clear of the headline   (10 Sep 2026) ----
   At 210px its point had come down over "She drew the sky they were named
   for". The headline occupies 70.4% to 74.0% of the plate; the heart's bottom
   was at 79.8%. Top moves 48.7% -> 38.7%, which finishes it at 69.8% - just
   above the headline, still crossing the card's top edge at 64%, and still
   clear of the credit line, which ends at 19.6% across where the heart starts
   at 25.3%. */
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ top:38.7%; }
}

/* ---- the heart settles   (10 Sep 2026) ----
   Ashley: good size, sitting slightly too high. Measured on the plate: the
   copy card starts at 64.00%, the headline's box at 70.44% and its ink at
   70.72%, and the heart's bottom was at 69.81% - about seven pixels of clear
   air. It comes down 1.3% to finish at 71.1%, which puts the point into the
   headline's leading rather than onto its letters (a text range's top is the
   em box; the cap height of that line sits lower again).

   THERE IS NO MORE ROOM BELOW THIS. Any further and the point lands on the
   word "She". Past here the only moves are shifting the card, shrinking the
   heart, or letting it cover type - which is where this started. */
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ top:40.0%; }
}

/* ---- the heart sits on the corner   (10 Sep 2026) ----
   In band coordinates the copy card's top-right corner is (458, 463). The heart
   was 250..487 by 277..514 - its right edge two pixels shy of that corner and
   only its tip below the card's top edge, which is why it read as hovering next
   to the box instead of resting on it. It now straddles the corner at 430..667
   by 316..553.

   IT CANNOT GO FURTHER LEFT. The headline's INK - not its box, which runs the
   full column - ends at x=418. 430 leaves twelve pixels of daylight. Anything
   less and the heart is back over "named for", which is what it was moved off
   two rounds ago. The kicker ends at 270 and the claim's longest line at 426,
   so those are clear by a wider margin. */
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ left:44.9%; top:45.4%; }
}

/* ---- the heart sits on the corner, in pink, with a sparkle   (10 Sep 2026) ----
   POSITION PICKED BY EYE. Three candidates were rendered against the real card
   and compared. At 40.5%/44.6% the card's top-right corner falls inside the
   heart's lower-left lobe, which is what "sitting on the corner" looks like;
   further right and it floats beside the box instead. The headline's ink ends
   well clear of it either way.

   PINK IS THE FRAME. The sticker is a photograph clipped to a heart inside a
   slightly larger solid heart - so the heart you actually see is that border.
   It takes a candy gradient, lighter at the top-left, so the shape catches a
   highlight the way a vinyl sticker does.

   THE SPARKLE IS ONE INLINE SVG of eight four-point stars in a layer 26% wider
   than the heart, so they burst OUTSIDE its edge. No file to load, no script,
   and it fires on focus as well as hover so a keyboard gets it too. */
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ width:130px; left:43.4%; top:56.4%; }
}
.lore-band--poster .lore-naoko-frame{
  position:relative; z-index:1;
  background:linear-gradient(148deg,#ffe6f1 0%,#ffc2dc 46%,#ff9dc4 100%);
}
.lore-band--poster a.lore-naoko:hover .lore-naoko-frame,
.lore-band--poster a.lore-naoko:focus-visible .lore-naoko-frame{
  background:linear-gradient(148deg,#fff2f7 0%,#ffd3e6 46%,#ffabce 100%);
}

.lore-band--poster a.lore-naoko{ position:absolute; }
.lore-band--poster a.lore-naoko::after{
  content:"";
  position:absolute; inset:-14%;
  z-index:0;
  pointer-events:none;
  background-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g fill='%23ffffff'><path d='M19.0 19.5 C19.5 22.6 20.4 23.5 23.5 24.0 C20.4 24.5 19.5 25.4 19.0 28.5 C18.5 25.4 17.6 24.5 14.5 24.0 C17.6 23.5 18.5 22.6 19.0 19.5 Z'/><path d='M33.0 5.0 C33.4 7.1 33.9 7.6 36.0 8.0 C33.9 8.4 33.4 8.9 33.0 11.0 C32.6 8.9 32.1 8.4 30.0 8.0 C32.1 7.6 32.6 7.1 33.0 5.0 Z'/><path d='M73.0 5.0 C73.6 8.5 74.5 9.4 78.0 10.0 C74.5 10.6 73.6 11.5 73.0 15.0 C72.4 11.5 71.5 10.6 68.0 10.0 C71.5 9.4 72.4 8.5 73.0 5.0 Z'/><path d='M92.0 27.4 C92.4 29.9 93.1 30.6 95.6 31.0 C93.1 31.4 92.4 32.1 92.0 34.6 C91.6 32.1 90.9 31.4 88.4 31.0 C90.9 30.6 91.6 29.9 92.0 27.4 Z'/><path d='M88.0 59.8 C88.5 62.7 89.3 63.5 92.2 64.0 C89.3 64.5 88.5 65.3 88.0 68.2 C87.5 65.3 86.7 64.5 83.8 64.0 C86.7 63.5 87.5 62.7 88.0 59.8 Z'/><path d='M56.0 0.4 C56.3 2.2 56.8 2.7 58.6 3.0 C56.8 3.3 56.3 3.8 56.0 5.6 C55.7 3.8 55.2 3.3 53.4 3.0 C55.2 2.7 55.7 2.2 56.0 0.4 Z'/><path d='M11.0 42.8 C11.4 45.0 12.0 45.6 14.2 46.0 C12.0 46.4 11.4 47.0 11.0 49.2 C10.6 47.0 10.0 46.4 7.8 46.0 C10.0 45.6 10.6 45.0 11.0 42.8 Z'/><path d='M66.0 85.0 C66.4 87.1 66.9 87.6 69.0 88.0 C66.9 88.4 66.4 88.9 66.0 91.0 C65.6 88.9 65.1 88.4 63.0 88.0 C65.1 87.6 65.6 87.1 66.0 85.0 Z'/></g></svg>");
  background-repeat:no-repeat;
  background-position:center;
  background-size:100% 100%;
  opacity:0;
  transform:scale(.66) rotate(-8deg);
  transition:opacity .18s ease, transform .18s ease;
}
.lore-band--poster a.lore-naoko:hover::after,
.lore-band--poster a.lore-naoko:focus-visible::after{
  animation:naoko-sparkle 900ms ease-out 1 both;
}
/* IT SPARKLES AND GOES, per Ashley - the burst is an event, not a state. The
   keyframes end back at zero, so hovering fires it once and the glints fade
   out rather than sitting there for as long as the pointer stays. */
@keyframes naoko-sparkle{
  0%  { opacity:0; transform:scale(.55) rotate(-10deg); }
  22% { opacity:1; transform:scale(1.10) rotate(2deg); }
  55% { opacity:.85; transform:scale(1.00) rotate(0deg); }
  100%{ opacity:0; transform:scale(1.14) rotate(4deg); }
}
@media (prefers-reduced-motion:reduce){
  .lore-band--poster a.lore-naoko::after{ transition:none; }
  .lore-band--poster a.lore-naoko:hover::after,
  .lore-band--poster a.lore-naoko:focus-visible::after{ animation:none; }
}

/* ---- the chart: degrees, a gold Sun, and the notes inside the box  (10 Sep 2026) ----
   THE SUN was the only body without a pixel glyph - the favicons library has
   nine, Moon through Pluto, and no Sun - so it was the Unicode character
   inheriting the chart's ink, a dark purple sitting in a row of pink sprites.
   Gold, deepened only as far as each size needs: #b6891f in the wheel where 46px is
   large text, #906c19 in the placements where 20px is not. */
.nk-signbox .nk-g--sun{ color:#906c19; }

/* ---- the notes now live inside the chart box ---- */
.nk-chart--wheel .nk-notes-col{
  margin:16px 0 0; padding:14px 0 0;
  border-top:1px dashed rgba(90,50,104,.28);
}
.nk-chart--wheel .nk-notes-col .nk-col-h--chart{ margin-top:0; }

/* ---- and the rising row says what it does not know ---- */
.nk-signbox .nk-chip--none .nk-sign,
.nk-signbox .nk-chip--none .nk-deg{ font-style:italic; opacity:.82; }


/* ==========================================================================
   93. THE HEART MOVES LEFT   (10 Sep 2026)
   ==========================================================================
   Ashley: "move the naoko sticker left. almost perfect."

   Four positions rendered against the real plate and compared: 43.4 (where it
   was), 42.4, 41.6 and 40.8. At 43.4 the heart's right lobe lands on Mercury's
   cheek. At 40.8 it has climbed so far onto the copy card that it stops
   reading as sitting ON the corner and starts reading as stuck TO the card.

   41.6% is the one: the right edge stops at her hair instead of her face, and
   the card's top-right corner still tucks under the lower-left lobe. That is
   18px left of where it was, in a window about 35px wide - the headline's ink
   ends at band x=418 on one side and her face begins at about 495 on the
   other, and the heart is 147px across. */
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ left:41.6%; }
}

/* ==========================================================================
   94. THE CARD LEADS WITH THE QUESTION   (10 Sep 2026)
   ==========================================================================
   Ashley: start the box with a bigger header of "what is sailor moon?", then
   follow with the "she drew the sky they were named for" bit.

   So the reading order inverts. The question was a 9px pill at the foot of the
   card - the last thing you found, after two paragraphs explaining a claim you
   had not asked about yet. It is now the first line, in Press Start 2P at
   14px, and it is still the toggle: the <h2> wraps the <label>, so the
   document keeps one heading for this section rather than gaining a heading
   and losing its control.

   THE CARET IS A DISC now, not a bare glyph. At 9px a lone triangle beside
   pixel type reads as punctuation; at this size it needs to look like a
   control, so it gets a gold chip that rotates when the panel opens.

   THE CREDIT GOES TO THE FOOT. It was the kicker line above the old headline,
   which meant the first thing in the card was a picture credit. It is the last
   thing now, in the same small caps, sitting above the card's bottom edge
   where a caption belongs.

   THE CARD GROWS to 62%/35%. Adding a 22px pixel line and keeping everything
   else costs about 14px, and the old 64%/33% left 237px for 243px of content -
   which would have silently turned the card into a scroller. 62% starts it
   445px down a 719px plate: 79px under Usagi's chin at 51%, which is the gap
   section 47 went to some trouble to win, and the bottom still clears the
   plate edge by the same 3%. */
.lore-band--poster .lore-poster-copy{ top:62%; max-height:35%; }

.lore-poster-copy .lore-poster-q{ margin:0 0 7px; }
.lore-poster-copy .lore-poster-q .lore-more{
  display:inline-flex; align-items:center; gap:9px;
  margin:0; padding:0; border:0; border-radius:0; background:none;
  font-family:"Press Start 2P",monospace; font-size:14px; letter-spacing:.4px;
  line-height:1.5; color:#5A3268; cursor:pointer;
}
.lore-poster-copy .lore-poster-q .lore-more:hover{ background:none; color:#472555; }
.lore-poster-copy .lore-poster-q .lore-more-t{
  border-bottom:2px solid rgba(230,193,90,.7); padding-bottom:2px;
  transition:border-color .2s ease;
}
.lore-poster-copy .lore-poster-q .lore-more:hover .lore-more-t{ border-bottom-color:#c8a13a; }
.lore-poster-copy .lore-poster-q .lore-more-mark{
  flex:0 0 auto; margin:0;
  width:20px; height:20px; line-height:19px; text-align:center;
  font-size:11px; color:#5A3268;
  background:rgba(230,193,90,.34);
  border:1px solid rgba(200,161,58,.6); border-radius:50%;
  transition:transform .32s cubic-bezier(.3,.9,.3,1.2), background-color .2s ease;
}
.lore-poster-copy .lore-poster-q .lore-more:hover .lore-more-mark{ background:rgba(230,193,90,.55); }
.lore-more-in:checked ~ .lore-poster .lore-poster-q .lore-more-mark{ transform:rotate(180deg); }

/* the old headline, demoted and set apart from the claim under it */
.lore-poster-copy .lore-sub{
  margin:0 0 8px; font-family:Raleway,system-ui,sans-serif; font-weight:600;
  font-style:italic; font-size:15px; line-height:1.4; color:#7a5f2c;
}
/* and the credit, now the last line rather than the first */
.lore-poster-copy .lh-kicker--foot{
  margin:11px 0 0; padding-top:9px;
  border-top:1px dashed rgba(139,113,55,.38);
}

@media (max-width:1010px){
  .lore-band--poster .lore-poster-copy{ top:auto; max-height:none; }
  .lore-poster-copy .lore-poster-q .lore-more{ font-size:11px; gap:7px; }
}

/* ==========================================================================
   95. THE DOSSIER OPENS, IN A COLOUR TAKEN OFF THE PAINTING   (10 Sep 2026)
   ==========================================================================
   Ashley: a beautiful animation when the box opens, and recolour it to a
   complementary colour to the image it sits on top of.

   WHERE THE COLOUR CAME FROM. The panel covers the right half of the plate, so
   that region was photographed with the panel hidden and every pixel in it
   binned by hue, weighted by saturation. It is not one colour - it is bimodal:
   about 23% of the chroma sits at 30-60 degrees (the gold of the zodiac ring
   and Venus's skirt) and about 24% at 210-240 (Mercury's hair, the washes).
   Median luminance 167, so the ground is LIGHT and busy.

   A straight complement of the blue pole would land back in the gold, which is
   the loudest thing on the plate. The complement of the GOLD pole is the one
   that is not already shouting: violet-indigo, around 258 degrees - which also
   happens to be four degrees off the wing's own #5A3268. So it is a colour the
   painting asks for and the site already owns.

   IT STAYS DARK, for the reason section 45 gave: over light, busy paint a
   light panel has nothing to separate itself from. What changes is that the
   dark now has a hue. rgba(10,6,22,.82) was a hole cut in the plate; a
   #3A2070-to-#140C32 gradient at 88-92% is a piece of coloured glass laid on
   it. Measured against the worst case - the panel over pure white paint -
   #f4eefb reads 9.6:1 and the gold headings 6.3:1.

   THE ANIMATION. display:none cannot be animated, so below the desktop
   breakpoint - where the panel is static and in flow - it keeps display:none,
   because a visibility:hidden block would leave its full height as a hole in
   the page. At 1011px and up the panel is absolutely positioned and out of
   flow, so it can sit there hidden for free, and visibility carries the
   a11y-tree hiding that display used to.

   It unfolds from its own bottom-left corner, which is the corner nearest the
   question you clicked, on a curve that overshoots by 2%. The children then
   cascade up 14px in sequence, 50ms apart, so the panel arrives before its
   contents and the eye is led down the stats. A violet bloom widens behind it
   and settles. Total 0.9s.

   Everything moving is opacity and transform - both composited, so the whole
   thing is one paint. Reduced motion gets the end state instantly. */
.lore-band--poster .lore-more-body{
  border:1px solid rgba(233,199,120,.46);
  background:
    linear-gradient(158deg,
      rgba(58,32,112,.88)  0%,
      rgba(34,20,74,.90)  46%,
      rgba(20,12,50,.92) 100%);
  box-shadow:0 14px 40px rgba(6,3,18,.46);
}
.lore-band--poster .lore-more-body a{ color:#e6c15a; }
.lore-band--poster .lore-more-body a:hover{ color:#f2d885; }

@media (min-width:1011px){
  .lore-band--poster .lore-more-body{
    display:block;
    visibility:hidden; opacity:0;
    transform:translate3d(-14px,18px,0) scale(.945);
    transform-origin:6% 96%;
    transition:opacity .24s ease,
               transform .34s cubic-bezier(.24,.9,.32,1),
               box-shadow .34s ease,
               visibility 0s linear .34s;
  }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body{
    visibility:visible; opacity:1;
    transform:translate3d(0,0,0) scale(1);
    transition:opacity .30s ease-out .03s,
               transform .52s cubic-bezier(.16,.86,.28,1.02),
               visibility 0s;
    animation:lore-bloom .9s ease-out both;
  }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *{
    animation:lore-unfold .44s cubic-bezier(.2,.86,.3,1) both;
  }
  .lore-band--poster .lore-more-body > .lore-close{ animation:none !important; }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *:nth-child(2){ animation-delay:.10s; }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *:nth-child(3){ animation-delay:.15s; }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *:nth-child(4){ animation-delay:.20s; }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *:nth-child(5){ animation-delay:.25s; }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *:nth-child(6){ animation-delay:.30s; }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *:nth-child(7){ animation-delay:.35s; }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *:nth-child(n+8){ animation-delay:.40s; }
}
@keyframes lore-unfold{
  from{ opacity:0; transform:translate3d(0,14px,0); }
  to  { opacity:1; transform:translate3d(0,0,0); }
}
@keyframes lore-bloom{
  0%  { box-shadow:0 6px 14px rgba(6,3,18,.30), 0 0 0 0 rgba(150,110,225,0); }
  45% { box-shadow:0 16px 46px rgba(6,3,18,.50), 0 0 46px 8px rgba(150,110,225,.34); }
  100%{ box-shadow:0 14px 40px rgba(6,3,18,.46), 0 0 26px 0 rgba(150,110,225,.14); }
}
@media (prefers-reduced-motion:reduce){
  .lore-band--poster .lore-more-body,
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body{
    transition:none; animation:none;
  }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster .lore-more-body > *{ animation:none; }
  .lore-poster-copy .lore-poster-q .lore-more-mark{ transition:none; }
}

/* ==========================================================================
   96. THE ANGLES ARE READABLE   (10 Sep 2026)
   ==========================================================================
   Ashley: ASC, DSC, MC and IC are too small to read.

   They were. The wheel is an 848-unit viewBox drawn at 533px, so it renders at
   0.6285 - and the labels were set at 15 units, which is 9.4px on the screen.
   Measured: "ASC" was 17px wide and 9px tall.

   28 units is 17.6px, which is exactly what the box's own header
   ("chart cast for noon") is set at, and that line reads. Same font, so the
   chart keeps one voice; the four labels are just no longer whispering.

   The room was checked before the size was: "DSC" at 28 units is about 47
   units wide, its centre is at x=777.9 in an 848 viewBox, so it ends at 801 -
   and MC's centre is 23.3 units down, half an em from the top edge. Both fit.

   A dark halo goes underneath via paint-order, because the starfield behind
   them is not flat: it has stars in it, and a pale lavender stroke crossing a
   white star loses that letter. 8.1:1 before, and the halo only helps. Below
   700px the wheel is drawn smaller, so the units go up to hold the same size
   on the glass. */
.nkw-svg .nkw-angles text{
  font-size:28px;
  fill:#dcc6f5;
  paint-order:stroke fill;
  stroke:rgba(18,9,32,.62);
  stroke-width:3.5px;
  stroke-linejoin:round;
}
@media (max-width:700px){
  .nkw-svg .nkw-angles text{ font-size:36px; stroke-width:4.5px; }
}


/* ---- and the dossier gets the height for it   (10 Sep 2026) ----
   Adding the rabbit put the panel 107px over its own box, which overflow:auto
   would have turned into a silent scroller. Most of those pixels came back as
   content - the sentence about the frontispiece was being said twice on one
   screen, once in the card and once here, and the rabbit did not need four
   lines - and the rest come from the panel: 3.5%/93% -> 2.5%/96%, and the
   spacing between the stat groups and the paragraphs comes down a notch. */
.lore-band--poster .lore-more-body{ top:2.5%; max-height:96%; left:48.5%; }
.lore-band--poster .lore-more-body .lore-stat{ margin-bottom:3px; }
.lore-band--poster .lore-more-body .lore-stats-h{ margin:14px 0 6px; }
.lore-band--poster .lore-more-p{ margin-top:9px; }


/* ---- and the heart steps out of the way   (10 Sep 2026) ----
   Widening the panel to 48.5% put its left edge at band x=480, and the heart
   runs 403 to 550 - so with the dossier open the sticker's right lobe was
   sitting on top of two lines of the astrology paragraph.

   Painting the panel over it would have left a heart bitten in half, which
   reads as a bug rather than a layer. So the sticker withdraws instead: it
   fades and shrinks away over the same third of a second the panel takes to
   arrive, and comes back when the panel closes. Nothing is lost while it is
   gone - the panel that replaced it is the one about Takeuchi. */
@media (min-width:1011px){
  .lore-band--poster a.lore-naoko{
    transition:opacity .26s ease, transform .34s cubic-bezier(.24,.9,.32,1);
  }
  .lore-band--poster .lore-more-in:checked ~ .lore-poster a.lore-naoko{
    opacity:0; transform:scale(.82) translate3d(-10px,0,0); pointer-events:none;
  }
}
/* the caret needs one more pixel to read as a caret and not a dot */
.lore-poster-copy .lore-poster-q .lore-more-mark{ font-size:12px; }
@media (prefers-reduced-motion:reduce){
  .lore-band--poster a.lore-naoko{ transition:none; }
}


/* ==========================================================================
   97. THE PHONE, RESTATED LAST   (10 Sep 2026)
   ==========================================================================
   Two faults that exist only below 1011px, and one of them was mine.

   THE TRAP, AGAIN. Sections 94-96 are top-level rules appended at the end of
   the file. Media queries add no specificity, so a later top-level rule of
   equal weight beats an earlier one inside @media - which means top:2.5%,
   left:48.5% and max-height:96% were landing on the phone layout too, where
   section 45's breakpoint had deliberately set every one of them to auto. The
   panel is static there, so top and left were inert; max-height:96% was not,
   and only escaped clipping the dossier because its parent has no definite
   height for the percentage to resolve against. That is luck, not design. All
   four are restated here, after mine.

   THE STICKER WAS EATING THE TOGGLE. Moving the question to the top of the
   card put it directly under the heart: the sticker is position:absolute at
   left:0 at every width, and below the breakpoint it lands at the card's top
   left corner. elementFromPoint on the middle of the label returned the
   sticker's <img>, so "what is sailor moon?" could not be tapped on any phone
   or tablet. It was only harmless before because the thing underneath it was
   an <h2>.

   It is hidden below the breakpoint rather than moved. The sticker's whole
   idea - a heart sitting on the corner of the copy card - is a fact about the
   desktop composition, where the card is laid ON the picture. Below 1011px
   the card goes static and stacks underneath, there is no corner to sit on,
   and nothing is lost by its absence: it links to #naoko, which has its own
   heading a screen further down. */
@media (max-width:1010px){
  .lore-band--poster .lore-more-body{
    top:auto; left:auto; right:auto; bottom:auto; max-height:none;
  }
  .lore-band--poster a.lore-naoko{ display:none; }
}


/* ==========================================================================
   107. THE HEART, FURTHER LEFT AGAIN, AND A BUTTON THAT LOOKS LIKE ONE
   ==========================================================================
   THE HEART. Fourth pass, and the earlier three were all solving the wrong
   thing. 43.4 -> 41.6 -> 39.2 were each asking "how far from Mercury's face
   is it", and every one of them left the heart floating in the gap BESIDE the
   card's corner rather than on it. Ashley: "much closer to the text. It's a
   corner sticker for the box."

   32.6% is where the card's rounded top-right corner lands inside the
   heart's lower-left lobe - the corner is under the sticker, not next to it,
   which is what a sticker stuck on a box looks like. The heart is 147px and
   the card's right edge is at band x=460, so its span is 314-461: it sits
   almost entirely over the card, with only its right tip past the edge.

   It clears everything that matters. The heart's box starts at y=397 and the
   card at y=446, so the only card content underneath it is the top 98px, and
   the button ends at x=280 while the subhead's ink stops short of the lobe.

   THE BUTTON. Ashley: "'what is sailor moon' doesn't look like a clickable
   element to me. make it more."

   She is right, and the reason is that section 94 took the affordance away
   without replacing it. As a 9px pill at the foot of the card it had a
   border, a background and a radius - it looked like a control and read like
   a footnote. Promoting it to the headline fixed the reading order and left
   it as bare text with an underline, which on a page this decorated is just
   a heading with a line under it.

   So it gets the chrome back at the new size, in the idiom this site already
   uses for anything raised: a 2px border with a hard offset shadow, no blur -
   the same 3px 3px 0 the profile-shot frames use. Hover lifts it a pixel and
   deepens the shadow; :active presses it fully into the shadow, which is the
   one interaction cue nothing else on the page does. That is a button.

   7.8:1 for the ink against the darkest band of the button's own gradient. */
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ left:32.6%; }
}

.lore-poster-copy .lore-poster-q{ margin:0 0 11px; }
.lore-poster-copy .lore-poster-q .lore-more{
  padding:9px 15px 9px 11px;
  background:linear-gradient(180deg,#fffaea 0%,#f6e2ad 100%);
  border:2px solid #8b7137;
  border-radius:9px;
  box-shadow:3px 3px 0 rgba(122,95,44,.55);
  transition:transform .12s ease, box-shadow .12s ease, background-color .18s ease;
}
.lore-poster-copy .lore-poster-q .lore-more:hover{
  background:linear-gradient(180deg,#fffdf6 0%,#fbeec6 100%);
  transform:translate(-1px,-1px);
  box-shadow:4px 4px 0 rgba(122,95,44,.62);
}
.lore-poster-copy .lore-poster-q .lore-more:active{
  transform:translate(3px,3px);
  box-shadow:0 0 0 rgba(122,95,44,0);
}
.lore-poster-copy .lore-poster-q .lore-more:focus-visible{
  outline:3px solid rgba(90,50,104,.55); outline-offset:3px;
}
/* the underline was carrying the whole affordance; the chrome carries it now */
.lore-poster-copy .lore-poster-q .lore-more-t{ border-bottom:0; padding-bottom:0; }
.lore-poster-copy .lore-poster-q .lore-more-mark{
  background:#5A3268; border-color:#3f2350; color:#f6e2ad;
}
.lore-poster-copy .lore-poster-q .lore-more:hover .lore-more-mark{ background:#6d3d7f; }

@media (prefers-reduced-motion:reduce){
  .lore-poster-copy .lore-poster-q .lore-more{ transition:none; }
  .lore-poster-copy .lore-poster-q .lore-more:hover,
  .lore-poster-copy .lore-poster-q .lore-more:active{ transform:none; }
}


/* ==========================================================================
   108. THE CROP COMES OFF THE BOTTOM   (10 Sep 2026)
   ==========================================================================
   Section 46 cut the plate at Saturn's skirt bow and section 47 spent the
   whole budget it freed on getting the copy card away from Usagi's chin.
   Ashley wants the picture back, with the bottom dissolving into the section
   under it instead of stopping at an edge.

   THE ARITHMETIC, because every vertical percentage on this band is a
   fraction of the frame and the frame is about to get 102px taller.

   The source is 2134x1710, so 1.2480. The image is drawn at 112.36% of the
   frame's width with a -12.36% left offset, which crops 11% off the LEFT and
   runs to the right edge - that stays. At a 989px frame the image is
   1111.2 x 890.4. The old window was y 0.078 to 0.885 of it: 0.807, giving
   718.7px and the 1899/1380 ratio. Dropping the bottom cut makes the window
   0.078 to 1.0 - 0.922 - which is 820.8px, so the frame becomes 1899/1576 and
   the image is 108.48% of it, offset -8.461%.

   NOTHING ABOVE THE OLD BOTTOM EDGE MOVES. The visible top is unchanged, so
   the same painted pixel keeps the same pixel offset; only its percentage
   changes, by a factor of 718.7/820.8 = 0.8756. Usagi's chin goes from 51% to
   44.65% and stays exactly where it was on screen. Every fixed element is
   restated through that factor rather than re-eyeballed:

     copy card   top 62%   -> 54.3%    max-height 35% -> 30.6%
     the heart   top 56.4% -> 49.4%
     the dossier top 2.5%  -> 2.2%     max-height 96% -> 88%

   THE FADE was 12% of 718.7, which is 86px - built to sit under a hard crop,
   not to dissolve one. It is 22% now, 181px of the taller frame, which starts
   just under Saturn's skirt and reaches solid #fefeff before the frame ends.
   That is the same colour as .senshi-art, the section "the whole story" sits
   in, so the picture does not end anywhere in particular: it just becomes the
   page. */
.lore-band--poster .lore-poster-frame{ aspect-ratio:1899 / 1576; }
.lore-band--poster .lore-poster-img{
  width:112.36%; height:108.48%; left:-12.36%; top:-8.461%;
}
.lore-band--poster .lore-fade{
  height:22%;
  background:linear-gradient(180deg,
    rgba(254,254,255,0)    0%,
    rgba(254,254,255,.06) 22%,
    rgba(254,254,255,.22) 44%,
    rgba(254,254,255,.52) 64%,
    rgba(254,254,255,.82) 80%,
    #fefeff               93%,
    #fefeff              100%);
}
.lore-band--poster .lore-poster-copy{ top:54.3%; max-height:31.6%; }
/* 30.6% is the exact remap of the old 35%, and it left the card scrolling by
   1-2px: section 107's button chrome - 2px border, 9px padding, the hard
   shadow - is about 3px taller than the bare text it replaced. The taller
   plate has 117px of room under the card, so this costs nothing. */
.lore-band--poster .lore-more-body{ top:2.2%; max-height:88%; }
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ top:49.4%; left:37.7%; }
}
/* THE HEART, FIFTH AND LAST. Ashley called 32.6% too far left and asked for
   "about 50px right". The band is 989px, so 50px is 5.06% - 32.6 -> 37.7,
   taken as read rather than re-litigated by eye. Its lower-left lobe still
   covers the card's top-right corner; it simply sits less far over the card.
   This restates section 107's left, and must stay after it. */

/* and the phone, restated after all of it - the same trap as section 97 */
@media (max-width:1010px){
  .lore-band--poster .lore-poster-copy{ top:auto; max-height:none; }
  .lore-band--poster .lore-more-body{
    top:auto; left:auto; right:auto; bottom:auto; max-height:none;
  }
}


/* ==========================================================================
   110. THE CARD DROPS INTO THE TALLER PLATE   (10 Sep 2026)
   ==========================================================================
   Ashley: lower the text box a little more now the image is taller.

   Section 108 restated every vertical position through 718.7/820.8 so that
   nothing MOVED when the crop came off. That was the right call for the
   un-crop itself - it proved the arithmetic and kept the composition intact -
   but it also means the card is still sitting where it sat on a plate that
   was 102px shorter. On the full picture it reads high.

   61%, picked by rendering 54.3 / 58 / 61 / 64 against the plate and looking.
   At 64 the card's bottom is 43px off the frame edge and its lower corners
   start dissolving into the fade, which is a white card going white. At 61 it
   clears by 68px, and Usagi's chest bow and brooch - buried behind the card
   at 54.3 - are fully visible above it, which is most of what the extra
   height was for.

   THE HEART MOVES WITH IT. It is a sticker on the card's top-right corner, so
   its top is not an independent number: it is the card's top less 4.9 points,
   the offset set when it was placed. 61 - 4.9 = 56.1.

   The height cap is unchanged. 61 + 31.6 = 92.6%, which is 760px of an 820.8
   frame, so the card still cannot reach the bottom edge even if the text
   grows. */
.lore-band--poster .lore-poster-copy{ top:61%; }
@media (min-width:1011px){
  .lore-band--poster .lore-naoko{ top:56.1%; }
}
@media (max-width:1010px){
  .lore-band--poster .lore-poster-copy{ top:auto; }
}


/* ==========================================================================
   111. THE DOSSIER TAKES THE ROOM, AND THE TYPE GOES UP   (10 Sep 2026)
   ==========================================================================
   Ashley: it has room to be taller now, and some of the text is too small to
   read.

   Both are the same fault as the card, and the same cause: section 108
   restated every vertical percentage so that nothing moved when the crop came
   off, which was right for proving the arithmetic and wrong to leave. The
   panel ended at 705 of an 821px frame with 116px of plate doing nothing
   under it, and its type was sized for a panel that had no room to spare.

   THE SIZES, worst first. The stat labels were 11px rainyhearts - and
   rainyhearts is the small pixel face, so 11px there is nearer 7px of actual
   ink. That is the "hard to read in some spots". 13px. The values under them
   go 13 to 15, the two long paragraphs 13 to 14.5 with a touch more leading,
   the gold group headings 11 to 12, and the canon note 12 to 13.

   THE ROOM. 2.2%/88% becomes 1.6%/95%: the panel now runs 13 to 793 of the
   821, which leaves 28px at the foot - the same margin the copy card keeps.
   That is 97px more than it had.

   IT DOES NOT GET WIDER, and it is worth saying why, because widening is the
   cheaper way to buy height. The panel's left edge is at band x=480 and the
   copy card's right edge is at 460. They overlap vertically from 501 down, so
   there are 20px between them and no more. The height had to come from the
   bottom.

   THE STATS GO TWO ACROSS, and this is what actually paid for the larger
   type. Bigger text needed about 100px and the taller box only found 97, so
   something had to give. Six facts stacked as label-over-value is 216px of a
   485px-wide panel using half its width; the same six in two columns of
   three are 135px. Each stat is already wrapped in its own .lore-stat, so a
   two-column grid can never split a label from its value the way CSS columns
   would. It reads better as a grid too - it is a specification block, and it
   now matches the placements list in the chart beside it.

   Measured after: no scroll at any desktop width. */
.lore-band--poster .lore-more-body{
  top:1.6%; max-height:97%;
  /* the last four pixels: the foot padding, which the canon note's own top
     rule already stands in for */
  padding:15px 18px 11px;
}
.lore-band--poster .lore-more-body .lore-stats-h{ font-size:12px; }
/* dt HAD line-height:0, inherited from the dl. A zero line-height contributes
   nothing to layout, so the glyphs simply overflowed downward - at 11px that
   read as tight, and at 14px "manga by" sits on top of "Naoko Takeuchi". The
   label needs a real line box, and 1.0 is the smallest that separates them,
   which costs 42px across the three grid rows.

   That 42px is paid for, not borrowed: the two long paragraphs come from 1.66
   leading to 1.58 (still 22.9px on 14.5px text), the group headings give up
   4px of margin each, and the panel takes another 13px of the plate. */
.lore-band--poster .lore-more-body dt{ font-size:14px; line-height:1; }
.lore-band--poster .lore-more-body .lore-stats-h{ margin:10px 0 5px; }
.lore-band--poster .lore-more-body .lore-stats-h:first-of-type{ margin-top:0; }
.lore-band--poster .lore-more-p{ margin-top:7px; }
.lore-band--poster .lore-more-body dd{ font-size:15px; line-height:1.42; }
.lore-band--poster .lore-more-p{ font-size:14.5px; line-height:1.58; }
.lore-band--poster .lore-more-body .lore-canon{ font-size:13px; line-height:1.6; }
.lore-band--poster .lore-more-body .lore-stats{
  display:grid; grid-template-columns:1fr 1fr; column-gap:20px; row-gap:0;
  columns:auto;
}
.lore-band--poster .lore-more-body .lore-stat{ margin-bottom:0; }
@container (max-width:340px){
  .lore-band--poster .lore-more-body .lore-stats{ grid-template-columns:1fr; }
}

/* the phone, restated after - same trap as sections 97 and 108 */
@media (max-width:1010px){
  .lore-band--poster .lore-more-body{ top:auto; max-height:none; }
}


/* ==========================================================================
   112. THE "WATCH IT HERE" STICKER   (13 Sep 2026)
   ==========================================================================
   Sits in the head of #arcs beside the Sailor Soapbox credit, because that
   corner of the page is already about where the material comes from.

   Floated, so the lede wraps around it rather than being pushed down - a
   sticker that costs a whole row is a banner, and a banner is the thing that
   was not wanted.

   The little television is spans and pseudo-elements: a generic set with
   rabbit-ear antennae, drawn rather than fetched. No request, crisp at any
   zoom, and nothing from the show is depicted - the sticker is type and shape.

   The tilt is on the link and it straightens on hover. Stickers go on
   crooked, and straightening says "this is a control" more cheaply than a
   colour change would. */
.arcframe .watch-sticker{
  float:right;
  display:flex; align-items:center; gap:11px;
  margin:0 0 12px 20px;
  padding:11px 15px 11px 12px;
  text-decoration:none;
  background:#fffdf6;
  border:3px solid #2b2340;
  border-radius:4px;
  box-shadow:5px 5px 0 #f2a2c0;
  transform:rotate(-2.4deg);
  transition:transform .18s ease, box-shadow .18s ease;
  max-width:270px;
}
.arcframe .watch-sticker:hover,
.arcframe .watch-sticker:focus-visible{
  transform:rotate(0deg) translateY(-2px);
  box-shadow:7px 7px 0 #f2a2c0;
}
.arcframe .ws-tv{
  position:relative; flex:0 0 auto;
  width:40px; height:33px;
  border:3px solid #2b2340; border-radius:5px;
  background:#8fd6c8;
  display:flex; align-items:center; justify-content:center;
}
.arcframe .ws-screen{
  width:22px; height:16px;
  border:2px solid #2b2340; border-radius:2px; background:#fffdf6;
}
.arcframe .ws-tv::before,
.arcframe .ws-tv::after{
  content:""; position:absolute; top:-13px;
  width:3px; height:13px; background:#2b2340; border-radius:2px;
}
.arcframe .ws-tv::before{ left:7px;  transform:rotate(-26deg); transform-origin:bottom; }
.arcframe .ws-tv::after { right:7px; transform:rotate( 26deg); transform-origin:bottom; }
.arcframe .ws-copy{ display:block; min-width:0; }
.arcframe .ws-line{
  display:block; font-family:"rainyhearts", monospace;
  font-size:14px; line-height:1.25; color:#2b2340;
}
.arcframe .ws-sub{
  display:block; margin-top:2px; font-family:"rainyhearts", monospace;
  font-size:10.5px; line-height:1.3; color:#2b2340; opacity:.72;
}
@media (max-width: 700px){
  .arcframe .watch-sticker{
    float:none; max-width:none; margin:0 0 14px; transform:rotate(-1.2deg);
  }
}
@media (prefers-reduced-motion: reduce){
  .arcframe .watch-sticker{ transition:none; }
}


/* ==========================================================================
   113. TWO PLACES TO WATCH, SIDE BY SIDE   (18 Sep 2026)
   ==========================================================================
   Ashley: "link to this playlist on youtube from viz media. all 200 eps. in
   japanese... give the view the choice between the two sites to watch", and
   an hour later: "put the youtube link fist."

   Section 112 built one floated sticker. A second float beside it is not a
   pair, and the first build showed why: floats stack right to left, so the
   sticker that came first in the source came out on the RIGHT and the row
   read backwards. The two boxes also measured 71px and 86px, because one
   sub-line wraps to two lines and the other does not.

   So the PAIR floats, once, as a flex row, and the stickers inside it stop
   floating. Source order is reading order again, and align-items:stretch
   makes them the same height whatever their words do.

   TOLD APART BY THE STICKER, NOT BY A LOGO. The second keeps section 112's
   drawn television and its type, and takes a mint drop shadow and the
   opposite tilt - the first leans left, the second leans right, the way two
   stickers actually land on a notebook. Neither carries a Tubi, YouTube or
   Viz mark; 112 drew its own television rather than fetching one for exactly
   that reason, and this follows it.

   AND THE SECOND ONE IS FOUND BY POSITION, NOT BY A NAME. The first build
   hung the tilt and the mint on a .watch-sticker--jp class. Then the YouTube
   link went first, at which point a class called "jp" meant "the Tubi one",
   which is how a stylesheet starts lying about itself. :nth-child(2) is what
   the rule actually means - the pair looks like a pair whichever service sits
   in which slot, and swapping them again costs nothing.
   ========================================================================== */
.arcframe .watch-pair{
  float:right;
  display:flex; align-items:stretch; gap:14px;
  margin:0 0 12px 20px;
}
.arcframe .watch-pair .watch-sticker{
  float:none; margin:0;
  flex:1 1 0; max-width:270px;
}
/* stretch reaches the <a>; the copy inside has to be told to fill it too, or
   the shorter sticker keeps its words pinned to the top of a taller box */
.arcframe .watch-pair .ws-copy{
  display:flex; flex-direction:column; justify-content:center;
}
.arcframe .watch-pair .watch-sticker:nth-child(2){
  transform:rotate(2.1deg);
  box-shadow:5px 5px 0 #8fd6c8;
}
.arcframe .watch-pair .watch-sticker:nth-child(2):hover,
.arcframe .watch-pair .watch-sticker:nth-child(2):focus-visible{
  transform:rotate(0deg) translateY(-2px);
  box-shadow:7px 7px 0 #8fd6c8;
}
.arcframe .watch-pair .watch-sticker:nth-child(2) .ws-tv{ background:#f2a2c0; }


/* THE CONSOLE CLEARS THE PAIR, and this is a bug the swap exposed rather than
   caused. With section 112's single sticker the float was 71px tall and the
   lede and the Sailor Soapbox credit beside it always ran taller, so the arc
   console cleared it by accident and nobody noticed it was never told to.
   The pair is 84px, and shortening one sub-line by four words was enough to
   let the credit wrap one line shorter - which pulled the console up 24px, to
   3px ABOVE the float's bottom edge. It was then squeezed into the 426px
   channel beside the stickers and ran 6,125px tall instead of 3,143.
   Measured, both ways. Stated now, so it cannot depend on the length of a
   sentence again. */
.arcframe .arc-console{ clear:right; }

@media (max-width: 700px){
  /* 112's phone rule unfloats the sticker. The wrapper is what floats now, so
     it needs the same treatment - and the two stack rather than splitting a
     320px screen between them. */
  .arcframe .watch-pair{
    float:none; display:block; margin:0 0 14px;
  }
  .arcframe .watch-pair .watch-sticker{ max-width:none; }
  .arcframe .watch-pair .watch-sticker + .watch-sticker{ margin-top:12px; }
}
@media (prefers-reduced-motion: reduce){
  .arcframe .watch-pair .watch-sticker{ transition:none; }
}


/* ==========================================================================
   117. THE TITLE GOES INTO THE MIDDLE BOX                       (2 Oct 2026)
   ==========================================================================
   Replaces section 116 (c122, never deployed). Ash: "the top above the
   luminaries that says choose your senshi.... let move that text and the
   logo to the black box below the group shot in the middle. that will give
   you back that tall room and move the rest of the page up", "can we include
   their japanese script names below their written english name", "the
   planet gifs and the senshi glyphs. wanna make them a little bigger inside
   the boxes?", and "when hovering over the outer senshi, we get two colors
   showing in the box. please fix so its like the other ones with a single
   color."

   THE TITLE BAR IS GONE. The logo (1x, 130 x 50) and CHOOSE YOUR SAILOR
   SENSHI sit in the dark strip under the cast
   picture in the middle box, with "hover a senshi to preview, click to
   enter" under them. They show while nobody is picked, like the cast. The
   select screen is 56px shorter than c122's, and the page under it comes up
   by that.

   THE TITLE CARD lands there now: the intro script measures the logo where
   it sits, so the flying copy steps down into the middle box. Afterwards the
   menu opens on the cast picture (nobody picked) instead of on Sailor Moon,
   so the logo it has just landed on stays in view.

   THE CARDS. Under her own name, her name in Japanese (a <span class="sel-jp">
   in each card, copied from the same character's display). The name plate is
   74px to hold it, and the busts stay a crisp 80.
   The planet goes from 2x to 3x (26px art, now 78), and the planet symbol
   from 1x to 2x (20px art, now 40): the next sizes up that keep every pixel
   square.

   ONE COLOUR ON HOVER. A picked card turns its field and name plate into one
   wash. The outers' fields are their own dark colours (Saturn #2a1638,
   Uranus #182038, Neptune #123c34, Pluto #100e18), but the picked plate still
   took the light wash, so those four showed two colours. Their picked plates
   now take their field colour.

   Desktop only, apart from the one-colour fix, which a tap on a phone needs
   too. Below 901px the screen keeps its phone layout, and the names on the
   cards are hidden there.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .frost-win{
    display:grid; box-sizing:border-box; height:auto;
    grid-template-columns:minmax(0,1fr) 2px repeat(4, 170px) 2px minmax(0,1fr);
    grid-template-rows:14px 22px 170px 22px 400px 22px 170px 14px;
    column-gap:14px; row-gap:0;
    padding:0; border:0; box-shadow:none;
    background:none; -webkit-backdrop-filter:none; backdrop-filter:none;
    align-items:stretch;
  }
  /* the menu fades in on its own and no longer rises, so the logo's place can
     be measured while it is still hidden */
  .sel--title.is-intro .frost-win{ transform:none; }

  /* ---- the card box ---- */
  .sel--title .frost-win > .sel-stage,
  .sel--title .frost-win > .sel-banner,
  .sel--title .sel-banner > .sel-titles,
  .sel--title .sel-roster,
  .sel--title .sel-roster > .sel-group,
  .sel--title .sel-roster > .sel-group > .sel-row{ display:contents; }
  .sel--title .frost-win > .sel-stage::before{
    content:""; position:absolute; z-index:0; pointer-events:none;
    grid-column:2 / 8; grid-row:1 / -1; inset:0;
    border:3px solid rgba(255,255,255,.62);
    box-shadow:0 20px 60px rgba(0,0,0,.55), inset 0 0 0 1px rgba(255,255,255,.16);
    background:linear-gradient(180deg, #ece4f0 0%, #f2ecf6 52%, #eae3f0 100%);
  }
  .sel--title .sel-roster::before,
  .sel--title .sel-roster::after{ grid-column:2 / 8; grid-row:1 / -1; inset:3px; }

  /* ---- headings: a bracket rule across the box ---- */
  .sel--title .sel-roster > .sel-group > .sel-h{
    grid-column:3 / 7; align-self:center; margin:0; position:relative; z-index:1;
  }
  .sel--title .sel-group[data-group="luminaries"] > .sel-h{ grid-row:2; }
  .sel--title .sel-group[data-group="inner"] > .sel-h{ grid-row:4; }
  .sel--title .sel-group[data-group="outer"] > .sel-h{ grid-row:6; }

  /* ---- the cards: 170 square ---- */
  .sel--title .sel-roster > .sel-group > .sel-row > li{ position:relative; z-index:1; min-width:0; }
  .sel--title .sel-group[data-group="luminaries"] > .sel-row > li{ grid-row:3; }
  .sel--title .sel-group[data-group="outer"] > .sel-row > li{ grid-row:7; }
  .sel--title .sel-group > .sel-row > li:nth-child(1){ grid-column:3; }
  .sel--title .sel-group > .sel-row > li:nth-child(2){ grid-column:4; }
  .sel--title .sel-group > .sel-row > li:nth-child(3){ grid-column:5; }
  .sel--title .sel-group > .sel-row > li:nth-child(4){ grid-column:6; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li{ grid-row:5; height:170px; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="mercury"]){ grid-column:3; align-self:start; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="venus"]){   grid-column:6; align-self:start; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="mars"]){    grid-column:3; align-self:end; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="jupiter"]){ grid-column:6; align-self:end; }

  .sel--title .sel-card .sel-field{ flex:1 1 auto; height:auto; }
  .sel--title .sel-card .sel-plate{
    flex:none; height:74px; box-sizing:border-box;
    display:flex; flex-direction:column; padding:5px 8px 6px;
  }
  .sel--title .sel-name{ font-size:10px; line-height:1.3; }
  .sel--title .sel-card .sel-civ{
    margin-top:auto; font-size:13px; line-height:1.25; font-weight:600;
  }
  .sel--title .sel-card .sel-jp{
    display:block; margin-top:2px;
    font-family:"Hiragino Kaku Gothic ProN","Yu Gothic","Meiryo","MS PGothic","Noto Sans JP",sans-serif;
    font-size:12px; line-height:1.25; letter-spacing:.5px; opacity:.9;
    white-space:nowrap; overflow:hidden; text-overflow:clip;
  }
  .sel--title .sel-card--cats .sel-jp{ letter-spacing:0; font-size:11px; }
  /* a picked card is a portrait only: the Japanese name leaves with the others */
  .sel--title .sel-card .sel-jp{ transition:transform .22s ease-out, opacity .18s ease-out; }
  .sel--title .sel-card[data-active] .sel-jp{ transform:translateY(64px); opacity:0; }
  @media (prefers-reduced-motion:reduce){ .sel--title .sel-card .sel-jp{ transition:none; } }
  /* the Moon Cats' card keeps its type when picked (senshi.css), so both its names stay too */
  .sel--title .sel-card--cats[data-active] .sel-civ{ transform:none; opacity:.94; }
  .sel--title .sel-card--cats[data-active] .sel-jp{ transform:none; opacity:.9; }

  /* the planet at 3x, the symbol at 2x */
  .sel--title .sel-card .sel-orb{
    width:calc(var(--orbw) * 1.5); height:calc(var(--orbh) * 1.5);
  }
  .sel--title .sel-card .sel-glyphmark{ width:40px; height:40px; z-index:1; }
  /* she stands a little in from the left, so the bigger symbol sits beside
     her head rather than on it, and she is in front of her planet */
  .sel--title .sel-card .sel-bust{ left:34px; }

  /* ---- the middle box ---- */
  body.wing.select .sel--title .frost-win > .sel-panels{
    grid-column:4 / 6; grid-row:5; align-self:stretch;
    position:relative; top:auto; width:auto; height:auto; margin:0; z-index:1;
  }
  .sel--title .sel-panel .sel-fill{ display:none; }

  /* a senshi: a column on the left, the painting on the right */
  .sel--title .sel-panel:not(.sel-panel--blank) .sel-back{
    left:156px; width:auto; right:0; top:0; height:100%; max-width:none;
    object-fit:contain; object-position:center;
    -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 22px);
            mask-image:linear-gradient(90deg, transparent 0, #000 22px);
  }
  .sel--title .sel-panel .sel-sphere{ left:72%; top:32%; width:110%; }
  .sel--title .sel-panel:not(.sel-panel--blank)::after{
    background:linear-gradient(90deg, rgba(14,12,20,.35) 0%, rgba(14,12,20,0) 50%);
  }
  .sel--title .sel-panel .sel-head{
    left:10px; right:auto; width:136px; top:12px; padding:0; display:block;
  }
  .sel--title .sel-panel .sel-head img{ display:none; }
  .sel--title .sel-panel .sel-planet{ font-size:12px; line-height:1.4; }
  .sel--title .sel-panel .sel-window{ left:10px; top:50%; bottom:auto; transform:translateY(-50%); }
  .sel--title .sel-panel .sel-window img{ max-width:none; }
  .sel--title .sel-panel .sel-strip{
    left:10px; right:auto; width:136px; bottom:12px;
    padding:0; background:none; border:0; box-shadow:none; color:#fff;
  }
  .sel--title .sel-panel .sel-strip-power,
  .sel--title .sel-panel .sel-strip-civ{ display:none; }
  .sel--title .sel-panel .sel-strip-meta{
    display:flex; flex-direction:column; align-items:flex-start; gap:3px; margin:0;
  }
  .sel--title .sel-panel .sel-strip-jp{ font-size:13px; letter-spacing:.5px; opacity:1; }
  .sel--title .sel-panel .sel-strip-sign{ font-size:8px; gap:5px; opacity:1; color:#f6ebbe; }
  .sel--title .sel-panel .sel-strip-sign img{ width:20px; height:20px; }

  /* the Moon Cats: their picture in the middle at 2x */
  .sel--title .sel-panel--cats .sel-cats-art{ left:50%; top:50%; transform:translate(-50%,-50%); }
  .sel--title .sel-panel--cats .sel-cats-art img{ width:200px; height:198px; }
  .sel--title .sel-panel--cats .sel-head{ width:auto; right:10px; }
  .sel--title .sel-panel--cats .sel-strip{ width:auto; right:10px; }
  .sel--title .sel-panel--cats .sel-strip-jp{ font-size:12px; letter-spacing:0; }

  /* ---- nobody picked: the cast picture, then the logo and the title, then
     the prompt ---- */
  .sel--title .sel-panel--blank .sel-back{
    height:296px; max-width:none; object-fit:contain; object-position:center top;
  }
  .sel--title .sel-blank-kicker,
  .sel--title .sel-blank-title{ display:none; }
  .sel--title .sel-blank-plate{ top:auto; bottom:0; padding:0 10px 9px; background:none; }
  .sel--title .sel-blank-note{ margin:0; font-size:12.5px; }
  body.wing.select .sel--title .sel-blank-frame{ top:3px; left:10px; right:10px; bottom:auto; height:290px; }

  .sel--title .sel-banner .sel-logo{
    grid-column:4 / 6; grid-row:5; align-self:end; justify-self:start;
    width:130px; height:50px; margin:0 0 34px 22px; position:relative; z-index:2;
    filter:drop-shadow(0 2px 0 rgba(0,0,0,.6));
  }
  .sel--title .sel-banner .sel-title{
    grid-column:4 / 6; grid-row:5; align-self:end; justify-self:start;
    width:180px; margin:0 0 41px 164px; position:relative; z-index:2;
    font-size:12px; line-height:1.4; letter-spacing:.5px; text-transform:uppercase;
    color:#fff; text-shadow:0 2px 0 #000, 0 0 10px rgba(86,152,104,.55);
  }
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-logo,
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-title{ opacity:0; pointer-events:none; }
}

/* ---- one colour on a picked outer card (every width: a tap picks on a phone) ---- */
.sel--title .sel-card[data-key="saturn"][data-active] .sel-plate{  background:#2a1638; }
.sel--title .sel-card[data-key="uranus"][data-active] .sel-plate{  background:#182038; }
.sel--title .sel-card[data-key="neptune"][data-active] .sel-plate{ background:#123c34; }
.sel--title .sel-card[data-key="pluto"][data-active] .sel-plate{   background:#100e18; }

/* ---- the title card's flying logo (made by the intro script) ---- */
.sm-fly{
  position:absolute; left:50%; top:42%; z-index:4; pointer-events:none;
  width:130px; height:50px; margin:-25px 0 0 -65px;
  image-rendering:pixelated;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.65)) drop-shadow(0 0 6px rgba(0,0,0,.5));
  animation:sm-fly-in .6s steps(1, end) both;
}
@keyframes sm-fly-in{
  0%   { opacity:0; transform:scale(1); }
  20%  { opacity:1; transform:scale(1); }
  45%  { opacity:1; transform:scale(2); }
  70%, 100% { opacity:1; transform:scale(3); }
}
.sm-fly.is-landing{ animation:sm-fly-land .7s steps(1, end) both; }
@keyframes sm-fly-land{
  0%    { transform:translate(0, 0) scale(3); }
  14%   { transform:translate(calc(var(--tx) * .12), calc(var(--ty) * .12)) scale(3); }
  28%   { transform:translate(calc(var(--tx) * .28), calc(var(--ty) * .28)) scale(3); }
  42%   { transform:translate(calc(var(--tx) * .46), calc(var(--ty) * .46)) scale(2); }
  57%   { transform:translate(calc(var(--tx) * .64), calc(var(--ty) * .64)) scale(2); }
  71%   { transform:translate(calc(var(--tx) * .80), calc(var(--ty) * .80)) scale(2); }
  85%   { transform:translate(calc(var(--tx) * .93), calc(var(--ty) * .93)) scale(1); }
  100%  { transform:translate(var(--tx), var(--ty)) scale(1); }
}
@media (max-width:900px){
  .sel--title .sel-card .sel-civ,
  .sel--title .sel-card .sel-jp{ display:none; }
}

/* ---- the "what is sailor moon?" box takes the intro's facts (from c122) ----
   Its paragraph is longer, and at 31.6% of the frame (section 111) the box
   would scroll and hide its caption. 37.5% holds it. */
@media (min-width:1011px){
  .lore-band--poster .lore-poster-copy{ max-height:37.5%; }
}


/* ==========================================================================
   118. URANUS ON HER SIDE, AND THE SHEEN ON THE BIGGER PLANETS  (2 Oct 2026)
   ==========================================================================
   Ash: "tilt uranus' planet .gif slightly on its side... like the real
   planet." The sprite draws Uranus with her ring standing straight up; the
   real planet lies tipped over, so on her card the planet is turned 14
   degrees, the top of the ring leaning in towards her.

   And a fix to section 117 found doing it: a picked card runs a band of
   light across its planet (.sel-field::after, masked to the planet's own
   shape). That band was still sized and placed for the old 2x planet, so on
   the 3x planets it crossed only the top corner of the disc. It now matches
   the planet: same place, same size, and on Uranus the same tilt.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card[data-active] .sel-field::after{
    top:6px; right:6px;
    width:calc(var(--orbw, 52px) * 1.5); height:calc(var(--orbh, 52px) * 1.5);
  }
  .sel--title .sel-card[data-key="uranus"] .sel-orb,
  .sel--title .sel-card[data-key="uranus"][data-active] .sel-field::after{
    transform:rotate(-14deg);
  }
}


/* ==========================================================================
   119. A LOWER NAME PLATE, SO THE BUSTS STAND LOWER              (2 Oct 2026)
   ==========================================================================
   Ash: "the solid band at the bottom with the name and sailor senshi text..
   too tall inside the actual box. lower it and move the sprites down a bit.
   shrink the font or adjust the glyph or planet gif if needed. i'm mostly
   concerned about the character busts looking good."

   The plate goes from 74px to 54: the senshi name 10px -> 9px (every name
   now fits on one line, SAILOR CHIBI MOON included, so no plate needs a
   second line), her own name 13 -> 12.5, the Japanese 12 -> 11.5. The field
   above it grows from 90 to 110, and since each bust stands on the plate it
   comes down 20px with it, with clear sky over her head. The planet and the
   symbol stay where section 117 put them; with the bust lower they overlap
   her less, and Uranus's tall planet now fits the field instead of tucking
   under the plate.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card .sel-plate{ height:54px; padding:5px 6px 5px; }
  .sel--title .sel-name{ font-size:9px; line-height:1.35; letter-spacing:0; white-space:nowrap; }
  .sel--title .sel-card .sel-civ{ font-size:12.5px; line-height:1.2; }
  .sel--title .sel-card .sel-jp{ font-size:11.5px; line-height:1.2; margin-top:1px; }
  .sel--title .sel-card--cats .sel-jp{ font-size:11px; }
}


/* ==========================================================================
   120. THE PLANETS TO SCALE, ROUGHLY                             (2 Oct 2026)
   ==========================================================================
   Ash: "could you scale the planets to size. for example jupiter is nice and
   big, but pluto and mercury should be small.... don't shrink to the point we
   can't see what it is obviously."

   The planets are 26px pixel art, so the crisp sizes are whole multiples of
   26. Four of them, by real diameter:
     4x (104)  the Sun                                  Tuxedo Mask
     3x  (78)  Jupiter, Saturn                          as they were
     2x  (52)  Venus, Uranus, Neptune
     1x  (26)  the Moon, Mercury, Mars, Pluto           Sailor Moon, Chibi
                                                        Moon, the Moon Cats
   Not to true scale (the Sun would be ten Jupiters across, Pluto a speck);
   just big, middling and small, with 1x as the floor so every planet is still
   the drawing it is.

   Every planet is centred on the same point, 46px in from the card's top and
   right, so the difference in size reads at a glance: the small ones sit in
   the middle of where a big one would be rather than tucked in the corner.
   Saturn's rings are too wide for that and keep the corner; the Sun is
   bigger than the space and fills the corner, and the Moon Cats' Moon sits
   higher, clear of Artemis's ears. The band of light that crosses
   a picked card's planet (section 118) follows the same size and place.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card{ --pk:1.5; }
  .sel--title .sel-card[data-key="moon"],
  .sel--title .sel-card[data-key="chibimoon"],
  .sel--title .sel-card[data-key="mooncats"],
  .sel--title .sel-card[data-key="mercury"],
  .sel--title .sel-card[data-key="mars"],
  .sel--title .sel-card[data-key="pluto"]{ --pk:.5; }
  .sel--title .sel-card[data-key="venus"],
  .sel--title .sel-card[data-key="uranus"],
  .sel--title .sel-card[data-key="neptune"]{ --pk:1; }
  .sel--title .sel-card[data-key="jupiter"],
  .sel--title .sel-card[data-key="saturn"]{ --pk:1.5; }
  .sel--title .sel-card[data-key="tuxedomask"]{ --pk:2; }

  .sel--title .sel-card .sel-orb,
  .sel--title .sel-card[data-active] .sel-field::after{
    width:calc(var(--orbw, 52px) * var(--pk)); height:calc(var(--orbh, 52px) * var(--pk));
    top:calc(46px - var(--orbh, 52px) * var(--pk) / 2);
    right:calc(46px - var(--orbw, 52px) * var(--pk) / 2);
  }
  .sel--title .sel-card[data-key="saturn"] .sel-orb,
  .sel--title .sel-card[data-key="saturn"][data-active] .sel-field::after{ right:4px; }
  /* the cats are taller than a bust, so their Moon sits higher, clear of Artemis's ears */
  .sel--title .sel-card[data-key="mooncats"] .sel-orb,
  .sel--title .sel-card[data-key="mooncats"][data-active] .sel-field::after{ top:9px; }
  .sel--title .sel-card[data-key="tuxedomask"] .sel-orb,
  .sel--title .sel-card[data-key="tuxedomask"][data-active] .sel-field::after{ top:3px; right:3px; }
}


/* ==========================================================================
   121. SUN AND MOON ALIKE, SATURN SMALLER, LUNA FOR THE CATS     (2 Oct 2026)
   ==========================================================================
   Ash: "have the sun and the moon the same size... even though thats not
   accurate, they appear the same to us basically." Section 120 had the Sun
   biggest (4x) and the Moon small (1x). Both are now 2x (52px), the middle
   size, as they look in our sky: the Sun on Tuxedo Mask's card, the Moon on
   Sailor Moon's and Chibi Moon's. Both sit on the same centre as the other
   planets.

   "use this for the cats instead of a moon": the Moon Cats' card shows
   Luna's head (Ash's 32px icon, trimmed to its drawing, 26 x 31) where the
   Moon was, at 2x like the Moon beside it, up in the corner.

   And "shrink saturn down some": Saturn goes from 3x to 2x. With her rings
   she was 162px wide, nearly the whole card; now she is 108 x 52, her globe
   a little smaller than Jupiter's, as it is in the sky.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card[data-key="moon"],
  .sel--title .sel-card[data-key="chibimoon"],
  .sel--title .sel-card[data-key="mooncats"],
  .sel--title .sel-card[data-key="tuxedomask"],
  .sel--title .sel-card[data-key="saturn"]{ --pk:1; }
  .sel--title .sel-card[data-key="saturn"] .sel-orb,
  .sel--title .sel-card[data-key="saturn"][data-active] .sel-field::after{ right:8px; }
  .sel--title .sel-card[data-key="tuxedomask"] .sel-orb,
  .sel--title .sel-card[data-key="tuxedomask"][data-active] .sel-field::after{
    top:calc(46px - var(--orbh, 52px) * var(--pk) / 2);
    right:calc(46px - var(--orbw, 52px) * var(--pk) / 2);
  }
  .sel--title .sel-card[data-key="mooncats"] .sel-orb,
  .sel--title .sel-card[data-key="mooncats"][data-active] .sel-field::after{ top:4px; right:6px; }
  /* Luna is a face, not a lit globe: no dark keyline round her, no sheen across her */
  .sel--title .sel-card[data-key="mooncats"] .sel-orb{ filter:drop-shadow(1px 1px 0 rgba(0,0,0,.25)); }
  .sel--title .sel-card[data-key="mooncats"][data-active] .sel-field::after{ display:none; }
}


/* ==========================================================================
   122. THE PAINTINGS FRAMED ONE BY ONE, THE NAME IN COLOUR      (2 Oct 2026)
   ==========================================================================
   Ash: "once a character is highlighted, inside the middle box with the
   manga image. their name... is too small. make their name appear a bit
   bigger, and adjust their text. make their name shimmer gradient or
   something pretty when highlighted", "the manga images could be larger
   too. can you check each one? make sure the character, their planet and
   their item if they have one is showing", "shrink the size of the luna-p
   image inside the moon cats card. way too big", and "make the moon and the
   sun the same size as jupiter planet".

   THE PAINTINGS. Each was shown whole, which leaves her small: the box is
   400 tall and the paintings run from the planet at the top to her boots at
   the foot. Now each one is framed on its own: a window in Takeuchi's
   painting (in the 858 x 1800 file's pixels) from just above her planet, or
   above her item where it rises higher, down to about the knee, wide enough
   for the item. The window fills the box right of the portrait (from 140px
   in), and the painting fades out under the portrait column rather than
   stopping at a hard edge. Most show 25 to 50% bigger than before:
                window top-bottom, left    holds
     moon        90-1600, 0                the Moon, the Cutie Moon Rod
     tuxedomask  110-1600, 30              the Earth, all of him
     chibimoon   40-1660, 0                her moon, the Pink Moon Stick
     mercury     120-1330, 60              Mercury, her orb
     venus       110-1400, 100             Venus, the Love-Me Chain
     mars        90-1350, 170              Mars, her flame
     jupiter     40-1300, 70               Jupiter, the leaf and lightning
     uranus      0-1360, 30                Uranus, the Space Sword
     neptune     150-1350, 170             Neptune, the Deep Aqua Mirror
     pluto       110-1400, 170             Pluto, the Garnet Rod
     saturn      0-1420, 60                Saturn, the Silence Glaive
   The asteroid and Starlight panels (in the hidden extended roster) keep the
   whole painting.

   THE NAME. 15px instead of 12, one word to a line in the column above the
   portrait, filled with a gradient in her own colours that sways slowly
   from end to end and back, and
   outlined in black (a drop shadow, because a text shadow would paint over a
   gradient fill), with the white glint of section 26 still passing over it.
   Her Japanese name and her sign come up a size to match.

   THE CARDS. The Sun and the Moon go to Jupiter's size (3x); Saturn stays at
   2x. Luna's head on the Moon Cats' card goes back to 1x (26 x 31), up in
   the corner.
   ========================================================================== */
@media (min-width:901px){
  /* ---- the cards ---- */
  .sel--title .sel-card[data-key="moon"],
  .sel--title .sel-card[data-key="chibimoon"],
  .sel--title .sel-card[data-key="tuxedomask"]{ --pk:1.5; }
  .sel--title .sel-card[data-key="mooncats"]{ --pk:.5; }
  .sel--title .sel-card[data-key="mooncats"] .sel-orb,
  .sel--title .sel-card[data-key="mooncats"][data-active] .sel-field::after{ top:8px; right:12px; }

  /* ---- the paintings, framed one by one ---- */
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank) .sel-back{
    --s:calc(394 / var(--wh));
    left:calc(140px - var(--wx) * 1px * var(--s)); right:auto;
    top:calc(0px - var(--wy) * 1px * var(--s));
    width:calc(858px * var(--s)); height:calc(1800px * var(--s));
    max-width:none; object-fit:fill;
    -webkit-mask-image:linear-gradient(90deg, transparent calc(var(--wx) * 1px * var(--s) - 4px), #000 calc(var(--wx) * 1px * var(--s) + 20px));
            mask-image:linear-gradient(90deg, transparent calc(var(--wx) * 1px * var(--s) - 4px), #000 calc(var(--wx) * 1px * var(--s) + 20px));
  }
  /* the whole painting, as before, for any panel not framed below */
  .sel--title .sel-panel{ --wx:0; --wy:0; --wh:1800; }
  .sel--title .sel-panel[data-key="moon"]{       --wy:90;  --wh:1510; --wx:0; }
  .sel--title .sel-panel[data-key="tuxedomask"]{ --wy:110; --wh:1490; --wx:30; }
  .sel--title .sel-panel[data-key="chibimoon"]{  --wy:40;  --wh:1620; --wx:0; }
  .sel--title .sel-panel[data-key="mercury"]{    --wy:120; --wh:1210; --wx:60; }
  .sel--title .sel-panel[data-key="venus"]{      --wy:110; --wh:1290; --wx:100; }
  .sel--title .sel-panel[data-key="mars"]{       --wy:90;  --wh:1260; --wx:170; }
  .sel--title .sel-panel[data-key="jupiter"]{    --wy:40;  --wh:1260; --wx:70; }
  .sel--title .sel-panel[data-key="uranus"]{     --wy:0;   --wh:1360; --wx:30; }
  .sel--title .sel-panel[data-key="neptune"]{    --wy:150; --wh:1200; --wx:170; }
  .sel--title .sel-panel[data-key="pluto"]{      --wy:110; --wh:1290; --wx:170; }
  .sel--title .sel-panel[data-key="saturn"]{     --wy:0;   --wh:1420; --wx:60; }
  .sel--title .sel-panel:not(.sel-panel--blank)::after{
    background:linear-gradient(90deg, rgba(14,12,20,.55) 0%, rgba(14,12,20,.35) 140px, rgba(14,12,20,0) 190px);
  }

  /* ---- the name ---- */
  .sel--title .sel-panel .sel-head{ top:12px; width:132px; }
  .sel--title .sel-panel .sel-planet{
    font-size:15px; line-height:1.38; letter-spacing:.5px;
    word-spacing:200px;                      /* one word to a line */
    color:transparent; text-shadow:none;
    background-image:linear-gradient(100deg, var(--nm1), var(--nm2) 25%, var(--nm3) 50%, var(--nm2) 75%, var(--nm1));
    background-size:200% 100%;
    -webkit-background-clip:text; background-clip:text;
    filter:drop-shadow(2px 0 0 #000) drop-shadow(-2px 0 0 #000) drop-shadow(0 2px 0 #000) drop-shadow(0 -2px 0 #000);
    animation:sel-namegrad 5s ease-in-out infinite alternate;
  }
  .sel--title .sel-panel[data-active] .sel-planet::after{ word-spacing:inherit; color:#fff; text-shadow:0 0 6px #fff; }
  @keyframes sel-namegrad{ from{ background-position:0% 0; } to{ background-position:100% 0; } }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-panel .sel-planet{ animation:none; }
  }
  .sel--title .sel-panel{ --nm1:#ffe9a8; --nm2:#ffffff; --nm3:#c9b0ff; }
  .sel--title .sel-panel[data-key="moon"]{       --nm1:#ffc8e8; --nm2:#fff3a8; --nm3:#9fc4ff; }
  .sel--title .sel-panel[data-key="tuxedomask"]{ --nm1:#ffe39a; --nm2:#ffffff; --nm3:#ff7b8f; }
  .sel--title .sel-panel[data-key="chibimoon"]{  --nm1:#ff9fd0; --nm2:#ffe6f3; --nm3:#b9a2ff; }
  .sel--title .sel-panel[data-key="mooncats"]{   --nm1:#f6d77a; --nm2:#fff6dc; --nm3:#d4b8ff; }
  .sel--title .sel-panel[data-key="mercury"]{    --nm1:#8fe3ff; --nm2:#ffffff; --nm3:#63d6b4; }
  .sel--title .sel-panel[data-key="venus"]{      --nm1:#ffd04a; --nm2:#fff4c4; --nm3:#ff8a2a; }
  .sel--title .sel-panel[data-key="mars"]{       --nm1:#ff6a7a; --nm2:#ffd3da; --nm3:#c27bff; }
  .sel--title .sel-panel[data-key="jupiter"]{    --nm1:#6dff9b; --nm2:#e9ffd8; --nm3:#ff9bd2; }
  .sel--title .sel-panel[data-key="saturn"]{     --nm1:#c6a2ff; --nm2:#f3e9ff; --nm3:#9b6cff; }
  .sel--title .sel-panel[data-key="uranus"]{     --nm1:#ffe84a; --nm2:#fffbe0; --nm3:#7fb0ff; }
  .sel--title .sel-panel[data-key="neptune"]{    --nm1:#57f5cf; --nm2:#e6fffa; --nm3:#6fa0ff; }
  .sel--title .sel-panel[data-key="pluto"]{      --nm1:#ff7a98; --nm2:#ffe2ea; --nm3:#a8b4ff; }

  /* ---- her Japanese name and sign, a size up ---- */
  .sel--title .sel-panel .sel-strip-jp{ font-size:14px; }
  .sel--title .sel-panel .sel-strip-sign{ font-size:9px; }
  .sel--title .sel-panel .sel-strip-sign img{ width:24px; height:24px; }
}


/* ==========================================================================
   123. JUPITER HIGHER, THE PLANETS' LABELS, NO PROMPT            (2 Oct 2026)
   ==========================================================================
   Ash: "jupiter's manga image is slight too low, and looks like another
   planet is hanging above the jupiter", "remove the words hover a senshi to
   preview", and of the group labels "can we change it to planets from
   senshi? and i feel like the words are getting smushed between the
   cards... i don't want anything growing taller".

   - Jupiter's window (section 122) starts at 120 instead of 40. The "other
     planet" was a blurred half-ball at the very top of the web copy of her
     painting, a leftover of how the image was prepared, not Takeuchi's;
     the window now begins below it and her planet, and she sits higher.
   - "hover a senshi to preview, click to enter" is gone, at every width.
   - The labels read LUMINARIES, INNER PLANETS and OUTER PLANETS (the page
     text changes; this only sizes them). The type goes from 12px to 10px and
     the gold bracket from 17px tall to 12, so each label sits in its 22px gap
     with air above and below instead of touching the cards. Nothing grows.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-panel[data-key="jupiter"]{ --wy:120; --wh:1180; --wx:70; }

  .sel--title .sel-roster > .sel-group > .sel-h{ font-size:10px; letter-spacing:1px; gap:8px; }
  .sel--title .sel-roster > .sel-group > .sel-h::before{ width:8px; height:12px; border-width:2px; }
  .sel--title .sel-roster > .sel-group > .sel-h::after{ height:2px; }
}
.sel--title .sel-blank-note{ display:none; }


/* ==========================================================================
   124. THE LOGO BIG IN THE BOX, AND A FLY-IN IN 16-BIT FRAMES   (2 Oct 2026)
   ==========================================================================
   Ash: "the logo should stay large inside the black box. move the words
   choose your sailor senshi below" it, and of the title card's zoom: "kinda
   stuttery as it zooms tho. i'm not looking for super smooth, but more 16bit
   frames".

   THE BOX, WHILE NOBODY IS PICKED. The group shot at the top, now 250px tall
   (281 wide, centred, the gold brackets round it), then the logo at 2x (260 x
   100, the same size as the old banner's), then CHOOSE YOUR SAILOR SENSHI on
   one line under it.

   THE FLY-IN. It went 1x, 2x, 3x in three jumps, then flew to the box in
   seven, dropping 3x, 2x, 1x on the way. Now it grows from a quarter size to
   3x in 12 frames, holds, and travels to the box in 12 more, shrinking from
   3x to 2x as it goes, landing on the logo at its new size; the logo itself
   stays hidden until it does, so there is only ever one. Twelve frames in
   about three quarters of a second is roughly 16 a second: chunky, the way a
   Super Nintendo scaled a sprite, without the big jumps. In between frames the
   pixels are drawn at in-between sizes, which is what that hardware did too;
   at rest the logo is always a clean 2x.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-panel--blank .sel-back{ height:250px; }
  body.wing.select .sel--title .sel-blank-frame{ top:2px; left:30px; right:30px; bottom:auto; height:250px; }

  .sel--title .sel-banner .sel-logo{
    justify-self:center; width:260px; height:100px; margin:0 0 37px 0;
    filter:drop-shadow(0 3px 0 rgba(0,0,0,.6));
  }
  .sel--title .sel-banner .sel-title{
    justify-self:center; width:auto; margin:0 0 13px 0;
    font-size:12px; line-height:1.4; letter-spacing:.5px; white-space:nowrap; text-align:center;
  }
}

/* the title card's flying logo: 12 frames in, 12 frames to the box */
.sm-fly{ animation:sm-fly-in .7s steps(12, jump-end) both; }
@keyframes sm-fly-in{
  from{ opacity:1; transform:scale(.25); }
  to  { opacity:1; transform:scale(3); }
}
.sm-fly.is-landing{ animation:sm-fly-land .75s steps(12, jump-start) both; }
/* the real logo waits under the flying one until it has landed */
.sel--title.is-flying .sel-banner .sel-logo{ visibility:hidden; }
@keyframes sm-fly-land{
  from{ transform:translate(0, 0) scale(3); }
  to  { transform:translate(var(--tx), var(--ty)) scale(2); }
}


/* ==========================================================================
   125. STAINED GLASS: EACH CARD A PANE IN HER OWN COLOURS       (2 Oct 2026)
   ==========================================================================
   Ash chose "A", tinted glass, from four mock-ups: each card's background is
   a see-through gradient in her colours, so the scrolling lace behind the
   cards shows through it, tinted, like light through glass. She set the
   colours:
     Sailor Moon   "a princess serenity palette... pearly white": white into
                   the faintest lilac, blush and pearl gold
     Tuxedo Mask   "gold and fade to navyblack"
     Chibi Moon    her profile's blue, violet and pink
     Moon Cats     from the anime still she sent of Luna: peach, pink-violet
                   sky, violet
     Mercury       "a more vibrant teal/lightblue"
     Venus         "yellow then orange"
     Mars          "red to purple"
     Jupiter       "mostly green, then pink"
     Saturn        "darker purple... saturn should be deeper purple": a deep
                   violet pane, and her name plate a deeper purple to match
     Uranus, Neptune: their profile doilies' colours
     Pluto         the darkest, her profile's midnight navy
   Each pane has its own strength (--go): the pale and bright ones lighter so
   the lace reads through; the dark ones heavier so they stay deep.

   The gradient runs its course over the picture area (the top 70% of the
   card), so all three of her colours show above the name plate.

   HOW. The glass is the card's own ::before, covering the whole card, under
   everything in it. The picture area (.sel-field) is clear now, so the glass
   shows behind her and her planet. The name plate keeps its solid colour,
   painted above the glass (it is lifted to z-index 1). When a card is
   picked, the plate goes clear too, so the glass runs from top to bottom
   behind the big bust instead of stopping at her old flat colour; the thin
   foot rule along the bottom stays. The Moon Cats' card keeps its plate, as
   before, because it keeps its names when picked.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card[data-key]{ --ga:135deg; --go:.66; }
  .sel--title .sel-card[data-key="moon"]{       --g1:#ffffff; --g2:#f1eafc; --g3:#f7eccf; --ga:150deg; --go:.8; }
  .sel--title .sel-card[data-key="tuxedomask"]{ --g1:#e8c25a; --g2:#3a3a52; --g3:#0b0d1e; --ga:160deg; --go:.84; }
  .sel--title .sel-card[data-key="chibimoon"]{  --g1:#5fa4e0; --g2:#9b82ea; --g3:#e266c8; }
  .sel--title .sel-card[data-key="mooncats"]{   --g1:#f9c4b4; --g2:#e898dc; --g3:#9a7ae0; --ga:165deg; }
  .sel--title .sel-card[data-key="mercury"]{    --g1:#4fd8ff; --g2:#22b4e6; --g3:#2ee6cf; }
  .sel--title .sel-card[data-key="venus"]{      --g1:#ffe04a; --g2:#ffc12e; --g3:#f57f1f; --ga:160deg; --go:.7; }
  .sel--title .sel-card[data-key="mars"]{       --g1:#e3203f; --g2:#b01c55; --g3:#6d2aa8; }
  .sel--title .sel-card[data-key="jupiter"]{    --g1:#1fae55; --g2:#4cc874; --g3:#f49ccb; }
  .sel--title .sel-card[data-key="saturn"]{     --g1:#3d1286; --g2:#24095c; --g3:#140530; --go:.9; }
  .sel--title .sel-card[data-key="saturn"] .sel-plate{ background:#2b1466; }
  .sel--title .sel-card[data-key="uranus"]{     --g1:#121a3a; --g2:#1a0a20; --g3:#4a0306; --go:.8; }
  .sel--title .sel-card[data-key="neptune"]{    --g1:#063a36; --g2:#0a4f46; --g3:#14806e; --go:.78; }
  .sel--title .sel-card[data-key="pluto"]{      --g1:#02011c; --g2:#03083a; --g3:#08235c; --go:.9; }

  .sel--title .sel-card[data-key]::before{
    content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
    background:linear-gradient(var(--ga), var(--g1), var(--g2) 38%, var(--g3) 72%);
    opacity:var(--go);
    box-shadow:inset 0 2px 0 rgba(255,255,255,.45), inset 0 0 18px rgba(255,255,255,.22);
  }
  .sel--title .sel-card[data-key] .sel-field{ background:transparent; }
  .sel--title .sel-card[data-key] .sel-plate{ position:relative; z-index:1; }
  .sel--title .sel-card[data-key]:not(.sel-card--cats)[data-active] .sel-plate{ background:transparent; }
}


/* ==========================================================================
   126. CLEARER GLASS                                            (2 Oct 2026)
   ==========================================================================
   Ash: "can you make the transparency a little more pronounced?" Every pane
   of section 125 is thinner, so more of the scrolling lace shows through,
   each by about the same step, keeping the order: the pale and bright panes
   clearest, Saturn deep, Pluto the darkest.
                 was    now
     most        .66    .50
     Moon        .80    .62
     Mask        .84    .68
     Venus       .70    .54
     Saturn      .90    .76
     Uranus      .80    .64
     Neptune     .78    .62
     Pluto       .90    .80
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card[data-key]{ --go:.5; }
  .sel--title .sel-card[data-key="moon"]{       --go:.62; }
  .sel--title .sel-card[data-key="tuxedomask"]{ --go:.68; }
  .sel--title .sel-card[data-key="venus"]{      --go:.54; }
  .sel--title .sel-card[data-key="saturn"]{     --go:.76; }
  .sel--title .sel-card[data-key="uranus"]{     --go:.64; }
  .sel--title .sel-card[data-key="neptune"]{    --go:.62; }
  .sel--title .sel-card[data-key="pluto"]{      --go:.8; }
}


/* ==========================================================================
   127. THE INNERS BUBBLEGUM, THE OUTERS DEEP AND MOODY          (2 Oct 2026)
   ==========================================================================
   Ash: "can the contrast between the colors for the inner senshi be
   stronger. that schoolgirl bubblegum feel. the outers deep and moody."

   THE INNERS. Each pane now runs from a pale candy colour at the top to a
   strong saturated one at the foot, so the two ends are far apart, and every
   colour is pushed brighter. The pane runs straight down, pale at her head,
   strongest just above the name plate, and is a little thicker than section
   126's so the candy colours hold against the lace.
     Mercury   ice blue, sky blue, teal
     Venus     lemon, sunshine yellow, tangerine
     Mars      hot pink-red, cherry, violet
     Jupiter   mint, spring green, bubblegum pink
   A brighter top highlight makes them read as shiny candy glass.

   THE OUTERS. Darker, thicker glass, with a dark shadow inside each pane's
   rim in place of the white glow (which was what made them look hazy), so
   the lace only glimmers through:
     Saturn    deep violet into black-violet
     Uranus    midnight navy into black wine
     Neptune   deep sea green into the abyss
     Pluto     the darkest: black-navy into midnight
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card[data-key="mercury"]{ --g1:#d4fcff; --g2:#00b2ff; --g3:#00c49a; --ga:175deg; --go:.68; }
  .sel--title .sel-card[data-key="venus"]{   --g1:#fffbb0; --g2:#ffd000; --g3:#ff5a00; --ga:175deg; --go:.7; }
  .sel--title .sel-card[data-key="mars"]{    --g1:#ff9ab2; --g2:#ff0f52; --g3:#8a12e0; --ga:175deg; --go:.66; }
  .sel--title .sel-card[data-key="jupiter"]{ --g1:#c4ffd6; --g2:#14d460; --g3:#ff5cbc; --ga:175deg; --go:.66; }
  .sel--title .sel-card[data-key="mercury"]::before,
  .sel--title .sel-card[data-key="venus"]::before,
  .sel--title .sel-card[data-key="mars"]::before,
  .sel--title .sel-card[data-key="jupiter"]::before{
    background:linear-gradient(var(--ga), var(--g1) 4%, var(--g2) 40%, var(--g3) 70%);
  }
  .sel--title .sel-card[data-key="mercury"]::before,
  .sel--title .sel-card[data-key="venus"]::before,
  .sel--title .sel-card[data-key="mars"]::before,
  .sel--title .sel-card[data-key="jupiter"]::before{
    box-shadow:inset 0 3px 0 rgba(255,255,255,.7), inset 0 0 16px rgba(255,255,255,.35);
  }

  .sel--title .sel-card[data-key="saturn"]{  --g1:#2c0b66; --g2:#18063c; --g3:#090214; --ga:170deg; --go:.86; }
  .sel--title .sel-card[data-key="uranus"]{  --g1:#0c1640; --g2:#0e0620; --g3:#2a0208; --ga:170deg; --go:.84; }
  .sel--title .sel-card[data-key="neptune"]{ --g1:#04302c; --g2:#03211f; --g3:#010c0d; --ga:170deg; --go:.84; }
  .sel--title .sel-card[data-key="pluto"]{   --g1:#010010; --g2:#02052a; --g3:#040f30; --ga:170deg; --go:.9; }
  .sel--title .sel-card[data-key="saturn"]::before,
  .sel--title .sel-card[data-key="uranus"]::before,
  .sel--title .sel-card[data-key="neptune"]::before,
  .sel--title .sel-card[data-key="pluto"]::before{
    box-shadow:inset 0 1px 0 rgba(255,255,255,.18), inset 0 0 26px rgba(0,0,0,.55);
  }
}


/* ==========================================================================
   128. RICHER GLASS, AND THE BUST FIRST                         (2 Oct 2026)
   ==========================================================================
   Ash: "her purple at the bottom of the stained glass gradient, i want it to
   get deeper and more rich... I still don't feel like the colors pop enough
   on the cards. they still look kinda flat", and "the character bust is
   getting swallowed up inside of everything. the glyph, the names the
   planets. the bust should be the first thing we see... if you make the
   busts bigger, I don't want them getting distorted". From two mock-ups she
   chose the bust first, with the names sliding away on hover.

   RICHER GLASS. The panes were see-through by the same amount from top to
   bottom, over pale lavender lace, which pulls every colour toward pastel.
   Now each pane builds from clear at her head (the lace shows there) to full
   strength at the foot, so the end colours are deep and rich: Mars ends in a
   true deep violet, Jupiter in a hot pink. The colours themselves are
   stronger. A soft light glows through the glass behind her (on the dark
   panes it is a glow of her own colour rather than white), and a bevelled
   edge, light top-left and shadow bottom-right, makes each card read as a
   piece of glass.

   THE BUST FIRST. The busts are 80px pixel art, so the only crisp bigger size
   is double, 160: the picture that used to appear only on hover. It is now
   shown at rest, standing on the card's foot. Her senshi name and her own
   name sit on a band across her shoulders, fading up from her plate colour;
   her symbol is small (20px) in the corner, and her planet sits behind her
   head (the Moon Cats' symbol goes small too, to match). The Japanese names
   come off the cards (they stay in the middle box).
   On hover the band slides away so she is seen whole, the glass brightens,
   and the cursor arrow points at her. The Moon Cats' card keeps its layout:
   the cats are full figures at their own size, with their names below.
   ========================================================================== */
@media (min-width:901px){
  /* ---- richer glass ---- */
  .sel--title .sel-card[data-key="moon"]{       --g1:#ffffff; --g2:#efe6ff; --g3:#e6cf9a; }
  .sel--title .sel-card[data-key="tuxedomask"]{ --g1:#f2c94c; --g2:#3b2f5c; --g3:#06071a; }
  .sel--title .sel-card[data-key="chibimoon"]{  --g1:#7cc0ff; --g2:#a46bff; --g3:#e0189a; }
  .sel--title .sel-card[data-key="mooncats"]{   --g1:#ffc2a8; --g2:#e27ad8; --g3:#5c34c8; }
  .sel--title .sel-card[data-key="mercury"]{    --g1:#8ff4ff; --g2:#00a8ff; --g3:#0047c2; }
  .sel--title .sel-card[data-key="venus"]{      --g1:#fff36b; --g2:#ffb000; --g3:#e84800; }
  .sel--title .sel-card[data-key="mars"]{       --g1:#ff5a7a; --g2:#e0003c; --g3:#4a0896; }
  .sel--title .sel-card[data-key="jupiter"]{    --g1:#7dffa6; --g2:#00c853; --g3:#ff2fa0; }
  .sel--title .sel-card[data-key="saturn"]{     --g1:#5a1fc0; --g2:#2a0a6e; --g3:#0a0220; }
  .sel--title .sel-card[data-key="uranus"]{     --g1:#1d3a8a; --g2:#0c1440; --g3:#3a0010; }
  .sel--title .sel-card[data-key="neptune"]{    --g1:#0e7c70; --g2:#04403a; --g3:#011614; }
  .sel--title .sel-card[data-key="pluto"]{      --g1:#1a1460; --g2:#060630; --g3:#010008; }
  .sel--title .sel-card[data-key]::before{
    opacity:1;
    background:linear-gradient(175deg, var(--g1) 0%, var(--g2) 45%, var(--g3) 80%);
    -webkit-mask-image:linear-gradient(180deg, rgba(0,0,0,.42) 0%, rgba(0,0,0,.72) 40%, #000 78%);
            mask-image:linear-gradient(180deg, rgba(0,0,0,.42) 0%, rgba(0,0,0,.72) 40%, #000 78%);
    box-shadow:inset 2px 2px 0 rgba(255,255,255,.55), inset -2px -2px 0 rgba(0,0,0,.35);
    transition:filter .12s ease;
  }
  .sel--title .sel-card[data-key][data-active]::before{ filter:brightness(1.18) saturate(1.1); }
  /* light through the glass behind her */
  .sel--title .sel-card[data-key] .sel-field::before{
    content:""; position:absolute; z-index:0; pointer-events:none;
    left:50%; top:46%; width:150px; height:150px; margin:-75px 0 0 -75px;
    background:radial-gradient(closest-side, rgba(255,255,255,.75), rgba(255,255,255,.28) 55%, rgba(255,255,255,0));
  }
  .sel--title .sel-card[data-key="saturn"] .sel-field::before,
  .sel--title .sel-card[data-key="uranus"] .sel-field::before,
  .sel--title .sel-card[data-key="neptune"] .sel-field::before,
  .sel--title .sel-card[data-key="pluto"] .sel-field::before,
  .sel--title .sel-card[data-key="tuxedomask"] .sel-field::before{
    background:radial-gradient(closest-side, color-mix(in srgb, var(--g1) 60%, #fff) 0%, color-mix(in srgb, var(--g1) 50%, transparent) 50%, transparent);
    opacity:.8;
  }

  /* ---- the bust first ---- */
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-bust{ opacity:0; }
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-bust-lg{
    opacity:1; visibility:visible; top:auto; bottom:0; z-index:4; transition:none;
  }
  .sel--title .sel-card[data-key] .sel-glyphmark{ width:20px; height:20px; top:6px; left:6px; }
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-plate{
    position:absolute; left:0; right:0; bottom:0; z-index:5; height:50px;
    padding:12px 7px 4px;
    background:linear-gradient(180deg, color-mix(in srgb, var(--skirt) 0%, transparent) 0%,
               color-mix(in srgb, var(--skirt) 82%, transparent) 30%, color-mix(in srgb, var(--skirt) 92%, transparent) 100%);
    transition:transform .2s ease-out;
  }
  .sel--title .sel-card[data-key]:not(.sel-card--cats)[data-active] .sel-plate{
    transform:translateY(100%); box-shadow:none;
  }
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-name{ font-size:9px; }
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-civ{ font-size:12px; margin-top:2px; }
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-jp{ display:none; }
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-name,
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-civ{ text-shadow:0 1px 2px rgba(0,0,0,.6); }
  .sel--title .sel-card[data-key="moon"] .sel-name,
  .sel--title .sel-card[data-key="moon"] .sel-civ{ text-shadow:0 1px 1px rgba(255,255,255,.8); }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-card[data-key] .sel-plate,
    .sel--title .sel-card[data-key]::before{ transition:none; }
  }
}


/* ==========================================================================
   129. THE MOON CATS' CARD LIKE THE OTHERS                      (2 Oct 2026)
   ==========================================================================
   Ash: "the cats box was not updated like the other ones." Section 128 left
   the Moon Cats' card in its old layout. Now it matches: the cats at a crisp
   double size (their 100 x 80 picture at 200 x 160; the card is 170 wide,
   so 15px of empty edge each side falls outside it), MOON CATS and "Luna, Artemis and Diana" on the band across them, the
   Japanese name off the card, and on hover the band slides away.

   Diana sits in front and lower than the other two, so at rest the cats
   stand 20px up, which keeps her face clear of the band; on hover, as the
   band slides away, they settle down onto the card's foot.

   The cats' picture carries its 1x size and centring in an inline style
   (written by build_select_cats_c56.py), so the three values that replace it
   need !important; nothing else here does.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card--cats[data-key] .sel-bust{
    width:200px !important; height:160px; left:calc(50% - 100px) !important; bottom:20px;
    opacity:1; z-index:4; transition:bottom .2s ease-out;
  }
  .sel--title .sel-card--cats[data-key][data-active] .sel-bust{ bottom:0; }
  .sel--title .sel-card--cats[data-key] .sel-plate{
    position:absolute; left:0; right:0; bottom:0; z-index:5; height:50px;
    padding:12px 7px 4px;
    background:linear-gradient(180deg, color-mix(in srgb, var(--skirt) 0%, transparent) 0%,
               color-mix(in srgb, var(--skirt) 82%, transparent) 30%, color-mix(in srgb, var(--skirt) 92%, transparent) 100%);
    transition:transform .2s ease-out;
  }
  .sel--title .sel-card--cats[data-key][data-active] .sel-plate{
    background:linear-gradient(180deg, color-mix(in srgb, var(--skirt) 0%, transparent) 0%,
               color-mix(in srgb, var(--skirt) 82%, transparent) 30%, color-mix(in srgb, var(--skirt) 92%, transparent) 100%);
    transform:translateY(100%); box-shadow:none;
  }
  .sel--title .sel-card--cats[data-key] .sel-name{ font-size:9px; }
  .sel--title .sel-card--cats[data-key] .sel-civ{ font-size:12px; margin-top:2px; }
  .sel--title .sel-card--cats[data-key] .sel-jp{ display:none; }
  .sel--title .sel-card--cats[data-key] .sel-name,
  .sel--title .sel-card--cats[data-key] .sel-civ{ text-shadow:0 1px 2px rgba(0,0,0,.6); }
  .sel--title .sel-card--cats[data-key] .sel-field{ overflow:hidden; }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-card--cats[data-key] .sel-plate,
    .sel--title .sel-card--cats[data-key] .sel-bust{ transition:none; }
  }
}


/* ==========================================================================
   130. A WIDER BOX, NO GAPS, AND HER NAMES IN THE MIDDLE        (2 Oct 2026)
   ==========================================================================
   Ash: "the entire outside container which holds all the character select
   boxes. it's taller than it is wide... make it a little wider... what's up
   with the gap in between sailor mercury and mars, and the gap between venus
   and jupiter?", "the cards... could maybe be each widened slightly to give
   the planet and the head bust some breathing room. I still want the glyphs
   bigger too", "move the civilian name to inside the center manga box... this
   should leave only their sailor name left. move the sailor name to the
   bottom of the character select box and make sure the text is no higher
   placed than where the characters choker is", in the middle box "the pixel
   bust move each of them to the bottom left corner. move their name in
   japanese text and their sign below their name in the top left corner. The
   gradient looks good on their names, but it's not big enough. don't let the
   name text stretch out past the width of the pixel bust", "make sure to
   adjust those images to keep all the elements we want to see inside
   visible", and "the words luminaries, inner planets, and outer planets need
   to be larger and easier to see".

   THE BOX. The cards go from 170 x 170 to 200 x 180, so the box is 874 wide
   and 834 tall (it was 754 x 834): wider than it is tall. The gaps beside
   the middle box were there because the middle row was 400 tall and two
   cards only filled 354 of it. The row is now exactly two cards and one gap
   (180 + 14 + 180 = 374), so Mercury sits on Mars and Venus on Jupiter with
   the same 14px between them as everywhere else. In a window narrower than
   about 1000px the cards give up some width (never below 160) rather than
   the page scrolling sideways.

   THE CARDS. Only the senshi name is left, 10px, on a slim band at the foot
   of the card, below the choker; it still slides away on hover. Her symbol
   is back to 2x (40px, the only bigger size its 20px art allows), top left,
   in front of her. The extra width is all breathing room: her planet is in
   the top right corner, clear of her head. The Moon Cats stand on the card's
   foot now that their band is slim.

   THE MIDDLE BOX, 414 x 374. Down the left, in one column as wide as her
   pixel portrait (128): her name at 18px (the size at which the longest
   words, MERCURY, JUPITER and NEPTUNE, are 126 wide), then her own name, her
   name in Japanese and her sign; her portrait in the bottom left corner.
   SAILOR CHIBI MOON takes three lines, so hers are set a little closer. The
   painting fills the rest, from just above her planet to about her knee as
   in section 122, now shown its full width and centred (Mercury, Jupiter
   and Neptune are 3 to 10px wider than the space and fade at their edges).
   Every one still shows her, her planet and her item. The Moon Cats'
   picture sits in the bottom left too, with their names above it.

   NOBODY PICKED. The group shot at 250 x 222 (half the size of its true
   art), the logo at 2x under it, then CHOOSE YOUR SAILOR SENSHI.

   THE LABELS. LUMINARIES, INNER PLANETS and OUTER PLANETS go from 10px to
   13px, in a deeper plum with a white outline so they read over the lace,
   and their rows from 22px to 24px to hold them.
   ========================================================================== */
@media (min-width:901px){
  /* ---- the box ---- */
  .sel--title .frost-win{
    grid-template-columns:minmax(0,1fr) 2px repeat(4, minmax(160px, 200px)) 2px minmax(0,1fr);
    grid-template-rows:14px 24px 180px 24px 374px 24px 180px 14px;
  }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li{ height:180px; }

  /* ---- the labels ---- */
  .sel--title .sel-roster > .sel-group > .sel-h{
    font-size:13px; letter-spacing:1px; gap:9px; color:#4a1c5e;
    text-shadow:2px 0 0 #fff, -2px 0 0 #fff, 0 2px 0 #fff, 0 -2px 0 #fff,
                2px 2px 0 #fff, -2px 2px 0 #fff, 2px -2px 0 #fff, -2px -2px 0 #fff;
  }
  .sel--title .sel-roster > .sel-group > .sel-h::before{
    width:9px; height:16px; border-width:3px;
    box-shadow:-2px 0 0 #fff, 0 2px 0 #fff, 0 -2px 0 #fff;
  }
  .sel--title .sel-roster > .sel-group > .sel-h::after{ height:3px; }

  /* ---- the cards ---- */
  .sel--title .sel-roster .sel-card[data-key] .sel-civ{ display:none; }
  .sel--title .sel-roster .sel-card[data-key] .sel-plate{
    height:28px; padding:0 8px 7px; justify-content:flex-end;
    background:linear-gradient(180deg, color-mix(in srgb, var(--skirt) 0%, transparent) 0%,
               color-mix(in srgb, var(--skirt) 80%, transparent) 45%, color-mix(in srgb, var(--skirt) 92%, transparent) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-plate{
    background:linear-gradient(180deg, color-mix(in srgb, var(--skirt) 0%, transparent) 0%,
               color-mix(in srgb, var(--skirt) 80%, transparent) 45%, color-mix(in srgb, var(--skirt) 92%, transparent) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key] .sel-name{ font-size:10px; line-height:1; }
  .sel--title .sel-card[data-key] .sel-glyphmark{ width:40px; height:40px; top:6px; left:6px; z-index:6; }
  .sel--title .sel-card--cats[data-key] .sel-bust{ bottom:0; }

  /* ---- the middle box: the left column ---- */
  .sel--title .sel-panel .sel-head{ top:10px; left:10px; width:128px; }
  .sel--title .sel-panel .sel-planet{ font-size:18px; line-height:1.3; letter-spacing:0; }
  .sel--title .sel-panel .sel-strip{
    top:68px; bottom:auto; left:10px; right:auto; width:128px;
  }
  .sel--title .sel-panel[data-key="chibimoon"] .sel-planet{ line-height:1.2; }
  .sel--title .sel-panel[data-key="chibimoon"] .sel-strip{ top:83px; }
  .sel--title .sel-panel .sel-strip-civ{
    display:block; margin:0 0 4px; font-size:14px; font-weight:600; line-height:1.25; color:#fff;
    text-shadow:0 1px 2px rgba(0,0,0,.8);
  }
  .sel--title .sel-panel .sel-strip-sign{ letter-spacing:0; gap:5px; }
  .sel--title .sel-panel .sel-window{ left:10px; top:auto; bottom:10px; transform:none; }

  /* the Moon Cats: their picture bottom left, their names above it */
  .sel--title .sel-panel--cats .sel-cats-art{ left:10px; top:auto; bottom:10px; transform:none; }
  .sel--title .sel-panel--cats .sel-head{ width:200px; right:auto; }
  .sel--title .sel-panel--cats .sel-planet{ word-spacing:normal; }
  .sel--title .sel-panel--cats .sel-strip{ top:44px; width:200px; right:auto; }

  /* ---- the middle box: the painting, whole width, centred on the right ---- */
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank) .sel-back{
    --s:calc(368 / var(--wh));
    left:calc(150px + (100% - 150px - 858px * var(--s)) / 2);
    top:calc(0px - var(--wy) * 1px * var(--s));
    -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 14px, #000 calc(100% - 14px), transparent 100%);
            mask-image:linear-gradient(90deg, transparent 0, #000 14px, #000 calc(100% - 14px), transparent 100%);
  }
  .sel--title .sel-panel:not(.sel-panel--blank)::after{
    background:linear-gradient(90deg, rgba(14,12,20,.5) 0%, rgba(14,12,20,.3) 146px, rgba(14,12,20,0) 170px);
  }

  /* ---- nobody picked ---- */
  .sel--title .sel-panel--blank .sel-back{ top:4px; height:222px; }
  body.wing.select .sel--title .sel-blank-frame{
    top:1px; left:calc(50% - 129px); right:auto; width:258px; height:228px;
  }
  .sel--title .sel-banner .sel-logo{ margin:0 0 34px 0; }
  .sel--title .sel-banner .sel-title{ margin:0 0 11px 0; }
}


/* ==========================================================================
   131. THE WHOLE SELECT SCREEN AT ABOUT 82%                     (2 Oct 2026)
   ==========================================================================
   Ash: "I like the proportions of everything inside the entire container.
   Can we shrink everything down like.... somewhere around 80%-85%.... It's
   still too tall for the entire webpage. I want to see what's below it
   peaking up. When we reduce the size, please please please keep checking
   that no pixel art is getting ruined", "the group pixel shot in the
   center... too small... the logo... too big", "the padding around the
   words inner planets and outer planets is bad. the words look super
   squished", and "the pixel busts in the very center box... can we add very
   slight bounce to the image? just to keep things from looking too static".

   EVERYTHING ELSE AT ABOUT 82%, THE PIXEL ART AT ITS OWN SIZES. The cards go
   from 200 x 180 to 168 x 148, the gaps from 14 to 12, and the select screen
   from 890 tall to 744 (the stage's foot padding goes from 40 to 16 too),
   so on a desktop monitor the page below now shows under it. Pixel art can't shrink by 82% without going blurry, so
   every sprite keeps its size (the busts, planets, symbols, portraits and
   the cats at 2x, the logo at 1x) and only the space around it shrinks.
   Ash's choices, from the questions:
   - The busts are 138 to 146 tall and a card is now 144 inside, so each
     bust stands lower, by 6 to 14px, so that every head is 12px under the
     card's top edge and a strip of shoulder goes off the foot of the card.
     Her name (8px, the type's own crisp size) is still below the choker. Her
     symbol stays 40px and tucks behind her hair, so the bust comes first.
   - In the middle box her portrait stays whole, bottom left, with her name
     (16px) above it; her own name, her Japanese name and her sign move to
     the top right. In seven paintings her planet or her item rose into that
     corner, so those paintings move left, into the dark under her portrait
     column (Chibi Moon, Jupiter, Saturn, Neptune and Pluto 50px, Venus 20,
     Uranus 15), and Tuxedo Mask's, whose hair fills the top, moves down 50.
     Checked all eleven: her, her planet and her item are clear of the
     names.
   - With nobody picked, the logo goes back to 1x (130 x 50) with CHOOSE YOUR
     SAILOR SENSHI beside it, so the group shot gets the room: 266 x 236,
     bigger than before.

   THE LABELS get room to breathe: their rows go from 24 to 28px, so there is
   air above and below the words, at 12px.

   THE BOUNCE. Her portrait in the middle box bobs up one art pixel (2px) and
   back, about once a second, in two frames like a fighting game's idle pose,
   so the pixels never land between screen pixels. The cats do the same.
   ========================================================================== */
@media (min-width:901px){
  /* ---- the box ---- */
  .sel--title .sm-stage{ padding-bottom:16px; }
  .sel--title .frost-win{
    grid-template-columns:minmax(0,1fr) 2px repeat(4, minmax(150px, 168px)) 2px minmax(0,1fr);
    grid-template-rows:12px 28px 148px 28px 308px 28px 148px 12px;
    column-gap:12px;
  }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li{ height:148px; }

  /* ---- the labels ---- */
  .sel--title .sel-roster > .sel-group > .sel-h{ font-size:12px; gap:10px; }
  .sel--title .sel-roster > .sel-group > .sel-h::before{ height:14px; }

  /* ---- the cards ---- */
  /* each bust stands low enough that the top of her head is 12px under the
     card's top edge, whatever her height: 132 of her shows, the rest of her
     shoulders goes off the foot */
  .sel--title .sel-card[data-key]:not(.sel-card--cats) .sel-bust-lg{ bottom:calc(132px - var(--busth, 138px)); }
  .sel--title .sel-card--cats[data-key] .sel-bust,
  .sel--title .sel-card--cats[data-key][data-active] .sel-bust{ bottom:-16px; }
  .sel--title .sel-roster .sel-card[data-key] .sel-plate{ height:24px; padding:0 7px 6px; }
  .sel--title .sel-roster .sel-card[data-key] .sel-name{ font-size:8px; letter-spacing:.5px; }
  /* her symbol tucks behind her hair rather than over it: the bust comes first */
  .sel--title .sel-card[data-key] .sel-glyphmark{ top:5px; left:5px; z-index:3; }

  /* ---- the middle box: her name and portrait on the left ---- */
  .sel--title .sel-panel .sel-head{ top:8px; left:8px; }
  .sel--title .sel-panel .sel-planet{ font-size:16px; }
  .sel--title .sel-panel .sel-window{ left:8px; bottom:8px; }
  /* her other names and her sign, top right */
  .sel--title .sel-panel .sel-strip,
  .sel--title .sel-panel[data-key="chibimoon"] .sel-strip{
    top:8px; right:10px; left:auto; width:auto; max-width:170px; text-align:right;
  }
  .sel--title .sel-panel .sel-strip-civ{ margin:0 0 2px; font-size:13px; }
  .sel--title .sel-panel .sel-strip-meta{ align-items:flex-end; gap:2px; }
  .sel--title .sel-panel .sel-strip-jp{ font-size:12px; text-shadow:0 1px 2px rgba(0,0,0,.8); }
  .sel--title .sel-panel .sel-strip-sign{ text-shadow:0 1px 2px rgba(0,0,0,.8); }

  /* the Moon Cats keep their names on the left, above their picture */
  .sel--title .sel-panel--cats .sel-strip{ top:36px; left:8px; right:auto; width:200px; text-align:left; }
  .sel--title .sel-panel--cats .sel-strip-meta{ align-items:flex-start; }
  .sel--title .sel-panel--cats .sel-cats-art{ left:8px; bottom:8px; }

  /* ---- the painting ---- */
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank) .sel-back{
    --s:calc(302 / var(--wh));
    left:calc(144px + (100% - 144px - 858px * var(--s)) / 2 + var(--px, 0px));
    top:calc(var(--py, 0px) - var(--wy) * 1px * var(--s));
  }
  /* where her planet or her item rises into the top right corner, under her
     names, the painting moves left (into the dark under her portrait column)
     or, for Tuxedo Mask, whose hair fills the top, down */
  .sel--title .sel-panel[data-key="chibimoon"]{  --px:-50px; }
  .sel--title .sel-panel[data-key="venus"]{      --px:-20px; }
  .sel--title .sel-panel[data-key="jupiter"]{    --px:-50px; }
  .sel--title .sel-panel[data-key="saturn"]{     --px:-50px; }
  .sel--title .sel-panel[data-key="uranus"]{     --px:-15px; }
  .sel--title .sel-panel[data-key="neptune"]{    --px:-50px; }
  .sel--title .sel-panel[data-key="pluto"]{      --px:-50px; }
  .sel--title .sel-panel[data-key="tuxedomask"]{ --py:50px; }

  /* ---- the bounce ---- */
  .sel--title .sel-panel[data-active] .sel-window,
  .sel--title .sel-panel--cats[data-active] .sel-cats-art{ animation:sel-bob 1.2s steps(1, end) infinite; }
  @keyframes sel-bob{ 0%{ transform:translateY(0); } 50%{ transform:translateY(-2px); } }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-panel[data-active] .sel-window,
    .sel--title .sel-panel--cats[data-active] .sel-cats-art{ animation:none; }
  }

  /* ---- nobody picked: the group shot bigger, the logo 1x with the words beside it ---- */
  .sel--title .sel-panel--blank .sel-back{ top:5px; height:236px; }
  body.wing.select .sel--title .sel-blank-frame{
    top:2px; left:calc(50% - 137px); width:274px; height:242px;
  }
  .sel--title .sel-banner .sel-logo{
    justify-self:center; width:130px; height:50px; margin:0 146px 8px 0;
  }
  .sel--title .sel-banner .sel-title{
    justify-self:center; width:130px; margin:0 0 17px 146px;
    font-size:10px; line-height:1.6; letter-spacing:0; white-space:normal; text-align:left;
  }
}
/* the title card's flying logo lands at 1x now */
@keyframes sm-fly-land{
  from{ transform:translate(0, 0) scale(3); }
  to  { transform:translate(var(--tx), var(--ty)) scale(1); }
}


/* ==========================================================================
   132. SMALL BUSTS AGAIN, NEW GLASS, THE TITLE BACK ON TOP      (2 Oct 2026)
   ==========================================================================
   Ash: "the busts, return them to their original size... keep the doubled
   size for when the character is highlighted" (on hover: "grow to double on
   hover, but slide the name out of the way"), "moon cats pixel art in their
   character select box is way too big", "when not highlighted... make sure
   the character's bust isn't getting covered by anything... adjust the
   planets after the busts have been returned to normal size", new colours
   for nine of the cards, "the middle box with the group pic... I kinda want
   [the logo and the words] back on top and filling the space with the group
   pixel art", her names "under their sailor name, above the pixel bust",
   the paintings moved away from the portrait, the Moon Cats framed with
   their human forms beside them, a "stronger gradient flash/shimmer" on the
   name, and "I still want the words luminaries, inner planets and outer
   planets to be larger".

   THE CARDS AT REST. Her bust is back to 80px (1x), standing on the name
   band in the lower left, with nothing over her: her symbol (40px) above her
   head, her planet beside her on the right, her name on the band below. The
   planets keep their sizes (Jupiter, the Sun and the Moon 78, Venus, Uranus
   and Neptune 52, Mercury, Mars and Pluto 26), all centred on the same point
   to her right, except Saturn, whose rings at 2x (108 wide) would cross her
   face: she goes to 1x (54 x 26). The Moon Cats are back to 1x (100 x 80).
   ON HOVER the name band slides away and she steps up to double size, as
   before; the cats too. The band of light that crossed her planet on hover
   now crosses her symbol instead (Ash: "can we move the shimmer to the
   glyph in the top left corner, rather than the planet shimmer?").

   THE GLASS. Each pane now runs through a fourth colour at its foot, and the
   name band takes that colour, so every name is white:
     Moon      pearl white, lilac, pearl gold, a hint of navy
     Venus     yellow, amber, orange, a hint of navy
     Mars      blood red, purple, almost-black purple
     Jupiter   green, pink, purple
     Mercury   aqua, teal, blue (greener than before)
     Uranus    yellow, navy, red
     Neptune   aquamarine, deep sea green, navy
     Pluto     deep green, maroon, black
     Saturn    white, royal purple, black
   Tuxedo Mask, Chibi Moon and the Moon Cats keep theirs.

   THE TITLE. The logo (1x) and CHOOSE YOUR SAILOR SENSHI are back in a bar
   across the top of the box, above LUMINARIES, and stay there whoever is
   picked. The title card's logo lands there. With nobody picked, the group
   shot fills the middle box (340 x 302).

   THE MIDDLE BOX. Under her name: her own name, then her name in Japanese
   with her sign's symbol beside it (the sign's word is on her profile), then
   her portrait. SAILOR CHIBI MOON is 12px, so her three lines take the room
   of the others' two. The paintings of Moon, Chibi Moon, Venus, Jupiter,
   Saturn, Uranus, Neptune and Pluto sit hard against the right edge of the
   box, away from her portrait, so the blonde hair of Moon and Venus reaches
   the frame. The name's colour sweep is faster, with a white flash through
   it, and its glint is white.

   THE MOON CATS in the middle box: their pixel picture (1x) in a frame like
   the portraits, and Takeuchi's painting of the three in human form (the one
   on their profile) to the right, fading to black at every edge.

   THE LABELS are 16px (the type's crisp double size) in 32px rows.
   ========================================================================== */
@media (min-width:901px){
  /* ---- the box: a title row on top, bigger label rows ---- */
  .sel--title .frost-win{
    grid-template-rows:12px 56px 32px 148px 32px 308px 32px 148px 12px;
  }
  .sel--title .sel-group[data-group="luminaries"] > .sel-h{ grid-row:3; }
  .sel--title .sel-group[data-group="inner"] > .sel-h{ grid-row:5; }
  .sel--title .sel-group[data-group="outer"] > .sel-h{ grid-row:7; }
  .sel--title .sel-group[data-group="luminaries"] > .sel-row > li{ grid-row:4; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li{ grid-row:6; }
  .sel--title .sel-group[data-group="outer"] > .sel-row > li{ grid-row:8; }
  body.wing.select .sel--title .frost-win > .sel-panels{ grid-row:6; }

  /* ---- the title bar ---- */
  .sel--title .sel-banner .sel-logo{
    grid-column:3 / 7; grid-row:2; align-self:center; justify-self:center;
    width:130px; height:50px; margin:0 416px 0 0;
  }
  .sel--title .sel-banner .sel-title{
    grid-column:3 / 7; grid-row:2; align-self:center; justify-self:center;
    width:400px; margin:0 0 0 146px; white-space:nowrap; text-align:left;
    font-size:16px; line-height:1.2; letter-spacing:0; color:#4a1c5e;
    text-shadow:2px 0 0 #fff, -2px 0 0 #fff, 0 2px 0 #fff, 0 -2px 0 #fff,
                2px 2px 0 #fff, -2px 2px 0 #fff, 2px -2px 0 #fff, -2px -2px 0 #fff;
  }
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-banner .sel-logo,
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-banner .sel-title{ opacity:1; pointer-events:auto; }

  /* ---- the labels ---- */
  .sel--title .sel-roster > .sel-group > .sel-h{ font-size:16px; gap:12px; }
  .sel--title .sel-roster > .sel-group > .sel-h::before{ width:10px; height:18px; }

  /* ---- the cards at rest: the 80px bust, clear of everything ---- */
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats) .sel-bust{
    left:8px; bottom:24px; opacity:1; z-index:4;
  }
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats)[data-active] .sel-bust{ opacity:0; }
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats) .sel-bust-lg{ opacity:0; visibility:hidden; }
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats)[data-active] .sel-bust-lg{ opacity:1; visibility:visible; }
  .sel--title .sel-roster .sel-card--cats[data-key] .sel-bust{
    width:100px !important; height:80px; left:8px !important; bottom:24px; transition:none;
  }
  .sel--title .sel-roster .sel-card--cats[data-key][data-active] .sel-bust{
    width:200px !important; height:160px; left:calc(50% - 100px) !important; bottom:-16px;
  }
  /* her planet, to her right: every planet centred on one point */
  .sel--title .sel-roster .sel-card[data-key] .sel-orb{
    top:calc(44px - var(--orbh, 52px) * var(--pk) / 2);
    right:calc(43px - var(--orbw, 52px) * var(--pk) / 2);
  }
  .sel--title .sel-roster .sel-card[data-key="saturn"]{ --pk:.5; }
  .sel--title .sel-roster .sel-card[data-key="moon"],
  .sel--title .sel-roster .sel-card[data-key="chibimoon"],
  .sel--title .sel-roster .sel-card[data-key="tuxedomask"],
  .sel--title .sel-roster .sel-card[data-key="jupiter"]{ --pk:1.5; }
  .sel--title .sel-roster .sel-card[data-key="mooncats"]{ --pk:.5; }
  /* on hover the band of light crosses her symbol instead of her planet */
  .sel--title .sel-card[data-key="moon"]{ --glyph:url("images/sailormoon/select/planetglyph/moon.png"); }
  .sel--title .sel-card[data-key="chibimoon"]{ --glyph:url("images/sailormoon/select/planetglyph/moon.png"); }
  .sel--title .sel-card[data-key="mooncats"]{ --glyph:url("images/sailormoon/select/planetglyph/moon.png"); }
  .sel--title .sel-card[data-key="tuxedomask"]{ --glyph:url("images/sailormoon/select/planetglyph/sun.png"); }
  .sel--title .sel-card[data-key="mercury"]{ --glyph:url("images/sailormoon/select/planetglyph/mercury.png"); }
  .sel--title .sel-card[data-key="venus"]{ --glyph:url("images/sailormoon/select/planetglyph/venus.png"); }
  .sel--title .sel-card[data-key="mars"]{ --glyph:url("images/sailormoon/select/planetglyph/mars.png"); }
  .sel--title .sel-card[data-key="jupiter"]{ --glyph:url("images/sailormoon/select/planetglyph/jupiter.png"); }
  .sel--title .sel-card[data-key="saturn"]{ --glyph:url("images/sailormoon/select/planetglyph/saturn.png"); }
  .sel--title .sel-card[data-key="uranus"]{ --glyph:url("images/sailormoon/select/planetglyph/uranus.png"); }
  .sel--title .sel-card[data-key="neptune"]{ --glyph:url("images/sailormoon/select/planetglyph/neptune.png"); }
  .sel--title .sel-card[data-key="pluto"]{ --glyph:url("images/sailormoon/select/planetglyph/pluto.png"); }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-field::after{
    display:block; top:5px; left:5px; right:auto; width:40px; height:40px; transform:none; z-index:7;
    -webkit-mask:var(--glyph) no-repeat center / 100% 100%;
            mask:var(--glyph) no-repeat center / 100% 100%;
  }
  /* while she is picked her symbol, with its light, comes in front of her bigger bust */
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-glyphmark{ z-index:6; }
  /* the light behind her follows her */
  .sel--title .sel-card[data-key] .sel-field::before{
    left:48px; top:80px; width:120px; height:120px; margin:-60px 0 0 -60px;
  }
  /* the name band: her glass's foot colour, the name white */
  .sel--title .sel-roster .sel-card[data-key] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-plate{
    background:linear-gradient(180deg, transparent 0%,
               color-mix(in srgb, var(--g4) 72%, transparent) 50%, color-mix(in srgb, var(--g4) 90%, transparent) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key] .sel-name{
    color:#fff; text-shadow:1px 1px 0 rgba(0,0,0,.75), 0 0 3px rgba(0,0,0,.5);
  }

  /* ---- the glass ---- */
  .sel--title .sel-card[data-key]{ --g4:var(--g3); }
  .sel--title .sel-card[data-key]::before{
    background:linear-gradient(175deg, var(--g1) 0%, var(--g2) 42%, var(--g3) 76%, var(--g4) 100%);
  }
  .sel--title .sel-card[data-key="moon"]{    --g1:#ffffff; --g2:#efe6ff; --g3:#e6cf9a; --g4:#1b2a6b; }
  .sel--title .sel-card[data-key="venus"]{   --g1:#fff36b; --g2:#ffb000; --g3:#ff6200; --g4:#18245e; }
  .sel--title .sel-card[data-key="mars"]{    --g1:#d0102e; --g2:#8a1fb0; --g3:#2c0838; --g4:#170420; }
  .sel--title .sel-card[data-key="jupiter"]{ --g1:#2fe07a; --g2:#ff4fb8; --g3:#9a3fd8; --g4:#5a1e96; }
  .sel--title .sel-card[data-key="mercury"]{ --g1:#9ffff0; --g2:#00c2d6; --g3:#0080c8; --g4:#0048a0; }
  .sel--title .sel-card[data-key="uranus"]{  --g1:#ffd23a; --g2:#16225e; --g3:#b0122c; --g4:#6a0818; }
  .sel--title .sel-card[data-key="neptune"]{ --g1:#3dffd0; --g2:#0b9a80; --g3:#0a3a52; --g4:#061c34; }
  .sel--title .sel-card[data-key="pluto"]{   --g1:#127a42; --g2:#741232; --g3:#12040a; --g4:#000000; }
  .sel--title .sel-card[data-key="saturn"]{  --g1:#ffffff; --g2:#5b1fc2; --g3:#14052e; --g4:#000000; }

  /* ---- nobody picked: the group shot fills the box ---- */
  .sel--title .sel-panel--blank .sel-back{ top:0; left:0; width:100%; height:100%; object-fit:contain; object-position:center; }
  body.wing.select .sel--title .sel-blank-frame{ top:1px; left:1px; right:1px; width:auto; height:auto; bottom:1px; }

  /* ---- the middle box: name, her names, portrait, down the left ---- */
  .sel--title .sel-panel .sel-head{ top:7px; }
  .sel--title .sel-panel .sel-planet{ line-height:1.15; }
  .sel--title .sel-panel[data-key="chibimoon"] .sel-planet{ font-size:12px; line-height:1.15; }
  .sel--title .sel-panel .sel-strip,
  .sel--title .sel-panel[data-key="chibimoon"] .sel-strip{
    top:47px; left:8px; right:auto; width:128px; max-width:none; text-align:left;
  }
  .sel--title .sel-panel[data-key="chibimoon"] .sel-strip{ top:51px; }
  .sel--title .sel-panel .sel-strip-civ{ margin:0 0 1px; }
  .sel--title .sel-panel .sel-strip-meta{ flex-direction:row; align-items:center; justify-content:flex-start; gap:6px; }
  .sel--title .sel-panel .sel-strip-sign{ font-size:0; gap:0; }

  /* the paintings that sit against the right edge, and past it where there
     is only dark background on that side, so that she stands about 10px in
     from the frame (her hair touches it, for Moon and Venus) */
  .sel--title .sel-panel{ --px:0px; --py:0px; }
  .sel--title .sel-panel[data-key="moon"]{      --px:50px; }
  .sel--title .sel-panel[data-key="venus"]{     --px:10px; }
  .sel--title .sel-panel[data-key="chibimoon"]{ --px:26px; }
  .sel--title .sel-panel[data-key="jupiter"]{   --px:40px; }
  .sel--title .sel-panel[data-key="saturn"]{    --px:40px; }
  .sel--title .sel-panel[data-key="uranus"]{    --px:26px; }
  .sel--title .sel-panel[data-key="neptune"]{   --px:18px; }
  .sel--title .sel-panel[data-key="pluto"]{     --px:12px; }
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank):is([data-key="moon"],[data-key="chibimoon"],[data-key="venus"],[data-key="jupiter"],
                            [data-key="saturn"],[data-key="uranus"],[data-key="neptune"],[data-key="pluto"]) .sel-back{
    left:calc(100% - 858px * var(--s) + var(--px));
    -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 18px);
            mask-image:linear-gradient(90deg, transparent 0, #000 18px);
  }

  /* the name: a faster sweep with a white flash through it, and a white glint */
  .sel--title .sel-panel .sel-planet{
    background-image:linear-gradient(100deg, var(--nm1) 0%, var(--nm2) 18%, var(--nm3) 36%, #ffffff 46%, var(--nm3) 56%, var(--nm2) 76%, var(--nm1) 100%);
    background-size:250% 100%;
    animation:sel-nameflash 2.6s linear infinite;
  }
  @keyframes sel-nameflash{ from{ background-position:100% 0; } to{ background-position:0% 0; } }
  .sel--title .sel-panel[data-active] .sel-planet::after{
    color:#fff; text-shadow:0 0 6px #fff, 0 0 12px color-mix(in srgb, var(--nm2) 70%, #fff);
    animation-duration:2.2s;
  }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-panel .sel-planet{ animation:none; }
  }

  /* ---- the Moon Cats in the middle box ---- */
  .sel--title .sel-panel--cats .sel-sphere{ display:none; }
  .sel--title .sel-panel--cats::before{
    content:""; position:absolute; z-index:1; pointer-events:none;
    left:134px; top:-68px; width:259px; height:380px;
    background:url("images/sailormoon/manga/mooncats/moon-cats-human-forms.webp") 0 0 / 100% 100% no-repeat;
    -webkit-mask-image:linear-gradient(90deg, transparent 10px, #000 40px, #000 176px, transparent 208px),
                       linear-gradient(180deg, transparent 68px, #000 100px, #000 334px, transparent 370px);
    -webkit-mask-composite:source-in;
            mask-image:linear-gradient(90deg, transparent 10px, #000 40px, #000 176px, transparent 208px),
                       linear-gradient(180deg, transparent 68px, #000 100px, #000 334px, transparent 370px);
            mask-composite:intersect;
  }
  .sel--title .sel-panel--cats .sel-head{ width:128px; }
  .sel--title .sel-panel--cats .sel-planet{ word-spacing:200px; }
  .sel--title .sel-panel--cats .sel-strip{ top:47px; width:128px; }
  .sel--title .sel-panel--cats .sel-strip-jp{ word-break:keep-all; }
  .sel--title .sel-panel--cats .sel-cats-art{
    left:8px; bottom:8px; width:128px; height:124px; box-sizing:border-box;
    display:flex; align-items:flex-end; justify-content:center;
    border:2px solid var(--trim);
    box-shadow:0 0 0 2px rgba(0,0,0,.55), 4px 4px 0 rgba(0,0,0,.4);
    background:linear-gradient(180deg, #ffd9c8 0%, #f0a6e4 55%, #8a64d8 100%);
  }
  .sel--title .sel-panel--cats .sel-cats-art img{ width:100px; height:99px; image-rendering:pixelated; }
}


/* ==========================================================================
   133. BIGGER SMALL PLANETS, A PEARL MOON, THE WATER RIPPLES     (2 Oct 2026)
   ==========================================================================
   Ash: "we've got room to make the planets a little larger again. make sure to
   increase the size of mercury mars saturn and pluto", "within the character
   select cards, I think we can make their sailor name just slightly bigger
   now", the pixel Moon on Sailor Moon's and Chibi Moon's cards "hued like"
   the moon in Takeuchi's painting of Mamoru and Usagi dancing, the castle's
   water to ripple "like A Link to the Past", and of the paintings in the
   middle box "a few girls are [now] too far to the right... saturn, neptune,
   jupiter, venus, chibimoon, moon".

   THE PLANETS. Mercury, Mars and Pluto go from 1x to 2x (52), the size of
   Venus, Uranus and Neptune; Saturn goes back to 2x (108 x 52 with her
   rings), up in the top right corner, where her rings pass over her own
   head's empty corner rather than her face. The Sun, the Moon and Jupiter
   stay the biggest (78).

   THE NAMES on the cards go from 8px to 9px.

   THE GLASS. Ash: "whatever color is on the bottom should be a very thin,
   final color shift. the two colors above it should be the main colors",
   and card by card: Uranus yellow to navy with a thin red under her name,
   Venus "a smoother transition from the yellow orange to the blue", Saturn
   more contrast between her white and her purple, Chibi Moon red at the
   foot, Mars "way more red", Jupiter "way more green", Mercury lighter at the
   top. Each pane now runs from her first colour to her second by about
   two thirds down, holds it, and shifts to her third only in the last fifth,
   behind her name band, which takes that third colour. Mars and Jupiter hold
   their first colour for the top third; Mars, Jupiter, Saturn and Uranus
   have thicker glass at the top so the red, the green, the white and the
   yellow don't go pastel over the lace. Venus's orange runs into the navy through coral,
   berry and plum, so it never passes through a muddy brown.

   THE PEARL MOON. A new copy of the 26px Moon (orb/moon-pearl.png): the same
   pixels, light and shade, coloured from the painted moon point for point,
   dusty rose and mauve across the middle, peach, and pale gold and cream on
   the right. Sailor Moon's and Chibi Moon's cards use it (the page points to
   it); the roster page keeps the grey one.

   THE WATER. The canvases the page's water script draws (.sm-water) sit
   exactly over the pictures they ripple: the castle backdrop (sized like it,
   cover, 34% down) and the opening's video (cover, centred, crisp).

   THE PAINTINGS. The six that touched the right edge come back in, so each
   stands about 10 to 15px inside the frame; where a painting's own edge now
   shows inside the frame (Venus's and Neptune's hair), it fades out.
   ========================================================================== */
@media (min-width:901px){
  /* ---- the planets ---- */
  .sel--title .sel-roster .sel-card[data-key="mercury"],
  .sel--title .sel-roster .sel-card[data-key="mars"],
  .sel--title .sel-roster .sel-card[data-key="pluto"],
  .sel--title .sel-roster .sel-card[data-key="saturn"]{ --pk:1; }
  .sel--title .sel-roster .sel-card[data-key="saturn"] .sel-orb{ top:3px; right:3px; }

  /* ---- the glass: two main colours, and a thin third at the foot ---- */
  .sel--title .sel-card[data-key]::before{
    background:linear-gradient(175deg, var(--c1) var(--s1, 0%), var(--c2) var(--s2, 62%), var(--c2) 82%, var(--c3) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-plate{
    background:linear-gradient(180deg, transparent 0%,
               color-mix(in srgb, var(--c3) 70%, transparent) 55%, color-mix(in srgb, var(--c3) 92%, transparent) 100%);
  }
  .sel--title .sel-card[data-key="moon"]{       --c1:#ffffff; --c2:#e6d6fb; --c3:#1b2a6b; }
  .sel--title .sel-card[data-key="tuxedomask"]{ --c1:#f2c94c; --c2:#3b2f5c; --c3:#06071a; }
  .sel--title .sel-card[data-key="chibimoon"]{  --c1:#7cc0ff; --c2:#f04fb4; --c3:#d0102a; }
  .sel--title .sel-card[data-key="mooncats"]{   --c1:#ffc2a8; --c2:#e27ad8; --c3:#5c34c8; }
  .sel--title .sel-card[data-key="mercury"]{    --c1:#f0fffd; --c2:#00b4e0; --c3:#0046b0; }
  .sel--title .sel-card[data-key="venus"]{      --c1:#fff36b; --c2:#ff8a00; --c3:#18245e; }
  .sel--title .sel-card[data-key="mars"]{       --c1:#ff1238; --c2:#7a16b0; --c3:#1e0626; --s1:34%; --s2:76%; }
  .sel--title .sel-card[data-key="jupiter"]{    --c1:#14d864; --c2:#ff4fb8; --c3:#6a28b0; --s1:38%; --s2:78%; }
  .sel--title .sel-card[data-key="saturn"]{     --c1:#ffffff; --c2:#3c0c9e; --c3:#000000; --s1:6%; --s2:52%; }
  .sel--title .sel-card[data-key="uranus"]{     --c1:#ffd23a; --c2:#16225e; --c3:#b0122c; --s1:8%; }
  .sel--title .sel-card[data-key="neptune"]{    --c1:#3dffd0; --c2:#0b7a6a; --c3:#0a2a4a; }
  .sel--title .sel-card[data-key="pluto"]{      --c1:#127a42; --c2:#6e1030; --c3:#000000; }
  /* Mars, Jupiter, Saturn and Uranus: thicker glass at the top, so the red,
     the green, the white and the yellow hold their colour over the lace
     instead of going pastel */
  .sel--title .sel-card[data-key="mars"]::before,
  .sel--title .sel-card[data-key="jupiter"]::before,
  .sel--title .sel-card[data-key="saturn"]::before,
  .sel--title .sel-card[data-key="uranus"]::before{
    -webkit-mask-image:linear-gradient(180deg, rgba(0,0,0,.74) 0%, rgba(0,0,0,.9) 35%, #000 60%);
            mask-image:linear-gradient(180deg, rgba(0,0,0,.74) 0%, rgba(0,0,0,.9) 35%, #000 60%);
  }
  /* Venus: orange runs into the navy through a sunset (coral, berry, plum),
     not through the muddy brown a straight mix makes */
  .sel--title .sel-card[data-key="venus"]::before{
    background:linear-gradient(175deg, #fff36b 0%, #ff8a00 56%, #ff7400 70%, #f2483c 80%,
               #b8306c 88%, #5a2a74 95%, #18245e 100%);
  }
  .sel--title .sel-roster .sel-card[data-key="venus"] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key="venus"][data-active] .sel-plate{
    background:linear-gradient(180deg, transparent 0%,
               color-mix(in srgb, #4a2870 62%, transparent) 55%, color-mix(in srgb, #18245e 90%, transparent) 100%);
  }

  /* ---- the names ---- */
  .sel--title .sel-roster .sel-card[data-key] .sel-name{ font-size:9px; letter-spacing:0; }
  .sel--title .sel-roster .sel-card[data-key="chibimoon"] .sel-plate{ padding-left:5px; padding-right:5px; }

  /* ---- the paintings ---- */
  .sel--title .sel-panel[data-key="moon"]{      --px:34px; }
  .sel--title .sel-panel[data-key="venus"]{     --px:-6px; }
  .sel--title .sel-panel[data-key="chibimoon"]{ --px:12px; }
  .sel--title .sel-panel[data-key="jupiter"]{   --px:26px; }
  .sel--title .sel-panel[data-key="saturn"]{    --px:26px; }
  .sel--title .sel-panel[data-key="neptune"]{   --px:-6px; }
  /* where a painting now stops inside the frame, its own right edge fades out
     instead of ending in a hard line (Venus's and Neptune's hair) */
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank):is([data-key="moon"],[data-key="chibimoon"],[data-key="venus"],[data-key="jupiter"],
                            [data-key="saturn"],[data-key="uranus"],[data-key="neptune"],[data-key="pluto"]) .sel-back{
    -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 18px, #000 calc(100% - 16px), transparent 100%);
            mask-image:linear-gradient(90deg, transparent 0, #000 18px, #000 calc(100% - 16px), transparent 100%);
  }
}

/* ---- the water (every width: the backdrop is behind the menu on a phone too) ---- */
.sel--title .sm-bg .sm-water{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; object-position:center 34%;
}
.sel--title .sm-intro .sm-water{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; object-position:center; image-rendering:pixelated;
}


/* ==========================================================================
   134. CLEARER GLASS AGAIN, REDDER MARS, GREENER JUPITER          (2 Oct 2026)
   ==========================================================================
   Ash: "the gradient is starting to be less stained glass like.. getting
   hard to see the doily through them", "more red on the mars gradient. way
   more green, for jupiter ending towards pink.. barely any purple if any at
   all", and of the paintings in the middle box "jupiter, saturn, moon and
   chibimoon need to still be slightly more left".

   THE GLASS is thinner all the way down to the name band: about 40% at the
   top, 60% halfway, 80% just above the band, solid only under the name. The
   four panes that section 133 thickened (Mars, Jupiter, Saturn, Uranus) stay
   a little thicker than the rest, but the lace now shows through them too.
   Mars holds her red to halfway before turning purple; Jupiter is green to
   past halfway, then pink, ending in a deeper pink with no purple.

   THE PAINTINGS of Jupiter, Saturn and Chibi Moon move 10 to 14px left.
   Sailor Moon ("her hair cuts off on the right, her hand and skirt cut off on
   the left... she might need to be bigger") is shown about 9% bigger, against
   the right edge with her hair running into the frame, and only her left
   edge fading, so less of her hand and skirt is lost.

   THE CAST PICTURE. Ash sent a copy of the group shot with its white
   background taken out ("if you can make this work to have the background
   bleed through, might be pretty"). The middle box now uses it (the page
   points to plates/roster-cast-clear.png), with the moon castle behind the
   cast, inside the green frame: the castle picture as the box's background,
   and over it, where motion is allowed, a live copy of the backdrop's canvas,
   so the stars twinkle and the water ripples behind the cast too.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-card[data-key]::before{
    -webkit-mask-image:linear-gradient(180deg, rgba(0,0,0,.4) 0%, rgba(0,0,0,.6) 45%, rgba(0,0,0,.8) 82%, #000 100%);
            mask-image:linear-gradient(180deg, rgba(0,0,0,.4) 0%, rgba(0,0,0,.6) 45%, rgba(0,0,0,.8) 82%, #000 100%);
  }
  .sel--title .sel-card[data-key="mars"]::before,
  .sel--title .sel-card[data-key="jupiter"]::before,
  .sel--title .sel-card[data-key="saturn"]::before,
  .sel--title .sel-card[data-key="uranus"]::before{
    -webkit-mask-image:linear-gradient(180deg, rgba(0,0,0,.52) 0%, rgba(0,0,0,.68) 45%, rgba(0,0,0,.84) 82%, #000 100%);
            mask-image:linear-gradient(180deg, rgba(0,0,0,.52) 0%, rgba(0,0,0,.68) 45%, rgba(0,0,0,.84) 82%, #000 100%);
  }
  .sel--title .sel-card[data-key="mars"]{    --c1:#ff0a2a; --c2:#6a12a0; --c3:#1e0626; --s1:48%; --s2:84%; }
  .sel--title .sel-card[data-key="jupiter"]{ --c1:#00d460; --c2:#ff5cbc; --c3:#ff2f96; --s1:56%; --s2:88%; }

  /* Sailor Moon a little bigger (the window from her moon to just under her
     rod, 1380 tall instead of 1510), against the right edge with no fade there,
     so her hair runs into the frame; only her left edge fades */
  .sel--title .sel-panel[data-key="moon"]{      --wy:90; --wh:1380; --px:0px; }
  .sel--title .sel-panel[data-key="moon"] .sel-back{
    -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 12px) !important;
            mask-image:linear-gradient(90deg, transparent 0, #000 12px) !important;
  }
  .sel--title .sel-panel[data-key="chibimoon"]{ --px:0px; }
  .sel--title .sel-panel[data-key="jupiter"]{   --px:14px; }
  .sel--title .sel-panel[data-key="saturn"]{    --px:14px; }
}

/* ---- the cast picture with the castle behind it (every width) ---- */
.sel--title .sel-panel--blank{
  background:#0a1130 url("images/sailormoon/video/castle-poster.png") center 30% / cover no-repeat;
}
.sel--title .sel-panel--blank .sm-water{
  position:absolute; inset:0; z-index:0; width:100%; height:100%;
  object-fit:cover; object-position:center 30%; pointer-events:none;
}
.sel--title .sel-panel--blank .sel-fill{ display:none; }


/* ==========================================================================
   135. A VEIL BEHIND THE CAST, A BRIGHTER SUN, FOUR PANES RETUNED (2 Oct 2026)
   ==========================================================================
   Ash: of the group shot with the castle behind it, "can you add the
   slightest translucent background behind them... just to soften the
   background, but definitely not hide it"; "the sailor jupiter gradient... a
   slightly darker green"; "mars gradient is still too purply on the bottom.
   more brilliant primary red on top"; "the sun pixel planet. give it a
   little more light? it looks like a bronze ball"; and "the moon cats
   gradient should follow the cat colors. white, lavender, purply black".

   THE VEIL. A thin wash of the night sky's navy (30%) between the castle and
   the cast, so the bright water lights and the stars sit back a step behind
   the girls. The castle still shows, moving.

   THE PANES.
     Mars      a true primary red, held to past halfway, into a deep wine and
               her near-black, with the purple gone; her glass is a little
               thicker at the top so the red stays red over the lace
     Jupiter   a deeper green, then pink
     Moon Cats white (Artemis), lavender, purple-black (Luna)

   THE SUN. A new copy of the 26px Sun (orb/sun-bright.png): the same pixels,
   light and shade, coloured as sunlight, orange at the rim through gold and
   yellow to a near-white middle. Tuxedo Mask's card uses it (the page points
   to it).

   THE MOON SYMBOL. Ash: "the moon glyph inside moon, chibi and the cats. can
   we make it more silvery lavendery?... like the pixel moon we just colored."
   A new copy of the 20px crescent (planetglyph/moon-silver.png), the same
   pixels in four flat tones lit from the top left, pearl white through
   silver lilac and lavender to a dusky lavender, with a deep plum outline.
   The three Moon cards use it (the page points to it).

   LUNA'S HEAD on the Moon Cats' card goes up into the top right corner
   ("the luna-p in the top right needs to be moved more top right").
   ========================================================================== */
.sel--title .sel-panel--blank::before{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:rgba(4,8,52,.3);
}
.sel--title .sel-panel--blank .sel-back{ z-index:2; }

@media (min-width:901px){
  .sel--title .sel-card[data-key="mars"]{     --c1:#ff1414; --c2:#8a0a2c; --c3:#240814; --s1:58%; --s2:88%; }
  .sel--title .sel-card[data-key="mars"]::before{
    -webkit-mask-image:linear-gradient(180deg, rgba(0,0,0,.66) 0%, rgba(0,0,0,.76) 45%, rgba(0,0,0,.86) 82%, #000 100%);
            mask-image:linear-gradient(180deg, rgba(0,0,0,.66) 0%, rgba(0,0,0,.76) 45%, rgba(0,0,0,.86) 82%, #000 100%);
  }
  .sel--title .sel-card[data-key="jupiter"]{  --c1:#00a648; }
  .sel--title .sel-card[data-key="mooncats"]{ --c1:#ffffff; --c2:#b49ce6; --c3:#1e1030; --s2:66%; }
}

@media (min-width:901px){
  /* Luna's head up into the Moon Cats' top right corner */
  .sel--title .sel-roster .sel-card[data-key="mooncats"] .sel-orb{ top:7px; right:7px; }
}


/* ==========================================================================
   136. THE 1P CURSOR, THE GROUP SHOT AS A MAP, THE LOCK-IN       (2 Oct 2026)
   ==========================================================================
   Ash chose three ideas from fighting games: the group shot as a pointer map,
   a blinking 1P cursor the arrow keys move, and a lock-in flash when a senshi
   is chosen (the page's cursor script, c143, does the moving parts). And:
   "group shot veil. a little stronger veil", "jupiter needs to be closer to a
   forest green. it looks like a kelly green right now", and of the middle
   box "we have a zodiac sign for their... sign... remove those. replace it
   with another senshi glyph. the same one in the character select boxes".

   THE 1P CURSOR. Whichever card is picked (by the mouse, the keyboard or the
   group shot) wears gold corner brackets just outside it, blinking gold and
   white, with a red 1P tag on its top edge. It replaces the old focus ring
   on these cards; it shows wherever focus is.

   THE MAP. Over the group shot, one invisible spot per girl (not the Moon
   Cats, who aren't in the picture). Pointing at one frames her with the same
   blinking brackets, puts her name under the frame, and lights her card with
   the 1P cursor; the middle box keeps the picture. Desktop only.

   THE LOCK-IN. A chosen card flashes white twice, her portrait in the middle
   box flashes with it and her name grows a size in two steps, before her
   profile opens.

   THE GROUP SHOT'S VEIL goes from 30% to 62% ("tbh not seeing a difference
   with the veil... stronger veil for a more muted background"), so the
   castle behind the cast is clearly muted. JUPITER'S green is a forest
   green. THE MIDDLE BOX shows her planet's symbol (the card's, 20px) beside
   her Japanese name, in place of her sign's symbol.
   ========================================================================== */
.sel--title .sel-panel--blank::before{ background:rgba(4,8,52,.62); }

@media (min-width:901px){
  .sel--title .sel-card[data-key="jupiter"]{ --c1:#167233; }

  /* ---- the 1P cursor ---- */
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-active]),
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-lit]){ z-index:3; }
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-active])::after,
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-lit])::after,
  .sel--title .sel-castmap-spot:hover::before{
    content:""; position:absolute; inset:-6px; pointer-events:none; z-index:8;
    --cc:#ffd84a;
    background:
      linear-gradient(var(--cc), var(--cc)) left top / 16px 4px no-repeat,
      linear-gradient(var(--cc), var(--cc)) left top / 4px 16px no-repeat,
      linear-gradient(var(--cc), var(--cc)) right top / 16px 4px no-repeat,
      linear-gradient(var(--cc), var(--cc)) right top / 4px 16px no-repeat,
      linear-gradient(var(--cc), var(--cc)) left bottom / 16px 4px no-repeat,
      linear-gradient(var(--cc), var(--cc)) left bottom / 4px 16px no-repeat,
      linear-gradient(var(--cc), var(--cc)) right bottom / 16px 4px no-repeat,
      linear-gradient(var(--cc), var(--cc)) right bottom / 4px 16px no-repeat;
    filter:drop-shadow(1px 0 0 #000) drop-shadow(-1px 0 0 #000) drop-shadow(0 1px 0 #000) drop-shadow(0 -1px 0 #000);
    animation:sel-cursor .5s infinite;
  }
  @keyframes sel-cursor{ 0%, 100%{ --cc:#ffd84a; } 50%{ --cc:#ffffff; } }
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-active])::before,
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-lit])::before{
    content:"1P"; position:absolute; top:-9px; left:50%; transform:translateX(-50%); z-index:9;
    padding:2px 4px 1px; border:2px solid #fff; background:#e0102a; color:#fff;
    font-family:"Press Start 2P",monospace; font-size:8px; line-height:1; letter-spacing:0;
    width:max-content; white-space:nowrap; word-break:normal; overflow-wrap:normal; text-transform:none;
    box-shadow:0 0 0 1px #000, 2px 2px 0 rgba(0,0,0,.45); pointer-events:none;
  }
  .sel--title .sel-roster .sel-card[data-key]:focus-visible{ outline:none; }
  .sel--title .sel-card[data-key][data-lit]::before{ filter:brightness(1.18) saturate(1.1); }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-roster .sel-row > li::after,
    .sel--title .sel-castmap-spot::before{ animation:none !important; }
  }

  /* ---- the group shot as a map ---- */
  .sel--title .sel-castmap{
    position:absolute; top:0; left:50%; height:100%; aspect-ratio:1000 / 888;
    transform:translateX(-50%); z-index:4;
  }
  .sel--title .sel-castmap-spot{ position:absolute; display:block; cursor:pointer; }
  .sel--title .sel-castmap-spot span{
    position:absolute; left:50%; bottom:3px; transform:translateX(-50%); z-index:9;
    padding:3px 5px 2px; background:rgba(8,6,28,.82); border:2px solid #ffd84a;
    font-family:"Press Start 2P",monospace; font-size:8px; line-height:1; color:#fff;
    white-space:nowrap; pointer-events:none; opacity:0;
  }
  .sel--title .sel-castmap-spot:hover span{ opacity:1; }

  /* ---- the lock-in ---- */
  .sel--title .sel-card.is-chosen{ animation:sel-chosen .5s both; }
  @keyframes sel-chosen{
    0%, 17%  { filter:brightness(2.6) saturate(.25); }
    18%, 35% { filter:none; }
    36%, 53% { filter:brightness(2.6) saturate(.25); }
    54%, 100%{ filter:none; }
  }
  .sel--title.is-choosing .sel-panel[data-active] .sel-window{
    animation:sel-bob 1.2s steps(1, end) infinite, sel-chosen .5s both;
  }
  .sel--title.is-choosing .sel-panel[data-active] .sel-planet{
    transform-origin:left top;
    animation:sel-nameflash 2.6s linear infinite, sel-namepop .5s both;
  }
  @keyframes sel-namepop{
    0%, 24%  { transform:scale(1); }
    25%, 49% { transform:scale(1.12); }
    50%, 100%{ transform:scale(1.25); }
  }

  /* ---- her planet's symbol in the middle box, not her sign's ---- */
  .sel--title .sel-panel .sel-strip-sign img{ display:none; }
  .sel--title .sel-panel .sel-strip-sign::before{
    content:""; flex:none; width:20px; height:20px;
    background:var(--pglyph, none) center / 100% 100% no-repeat; image-rendering:pixelated;
  }
  .sel--title .sel-panel[data-key="moon"],
  .sel--title .sel-panel[data-key="chibimoon"]{  --pglyph:url("images/sailormoon/select/planetglyph/moon-silver.png"); }
  .sel--title .sel-panel[data-key="tuxedomask"]{ --pglyph:url("images/sailormoon/select/planetglyph/sun.png"); }
  .sel--title .sel-panel[data-key="mercury"]{    --pglyph:url("images/sailormoon/select/planetglyph/mercury.png"); }
  .sel--title .sel-panel[data-key="venus"]{      --pglyph:url("images/sailormoon/select/planetglyph/venus.png"); }
  .sel--title .sel-panel[data-key="mars"]{       --pglyph:url("images/sailormoon/select/planetglyph/mars.png"); }
  .sel--title .sel-panel[data-key="jupiter"]{    --pglyph:url("images/sailormoon/select/planetglyph/jupiter.png"); }
  .sel--title .sel-panel[data-key="saturn"]{     --pglyph:url("images/sailormoon/select/planetglyph/saturn.png"); }
  .sel--title .sel-panel[data-key="uranus"]{     --pglyph:url("images/sailormoon/select/planetglyph/uranus.png"); }
  .sel--title .sel-panel[data-key="neptune"]{    --pglyph:url("images/sailormoon/select/planetglyph/neptune.png"); }
  .sel--title .sel-panel[data-key="pluto"]{      --pglyph:url("images/sailormoon/select/planetglyph/pluto.png"); }
}
@media (max-width:900px){
  .sel--title .sel-castmap{ display:none; }
}


/* ==========================================================================
   137. NO 1P TAG, AND ROOM ROUND THE PLANET LABELS               (2 Oct 2026)
   ==========================================================================
   Ash: "remove the 1p from the selector please. i like the brackets. make
   sure the brackets are not covering the words inner planets and outer
   planets", and "inner planets and outer planets.... they still need more
   padding on the top and bottom. they are damn near touching the character
   cards."

   The red 1P tag is gone; the blinking brackets stay, and sit 4px outside
   the card instead of 6. The three label rows go from 32px to 44px, so each
   label has 14px of air above and below its words (it had 7 and 9), and the
   brackets stop 10px short of them. The select screen grows by 36px.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .frost-win{
    grid-template-rows:12px 56px 44px 148px 44px 308px 44px 148px 12px;
  }
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-active])::before,
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-lit])::before{ content:none; }
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-active])::after,
  .sel--title .sel-roster .sel-row > li:has(> .sel-card[data-lit])::after{ inset:-4px; }
}


/* ==========================================================================
   138. NOTHING DRAWN ON THE GROUP SHOT                           (2 Oct 2026)
   ==========================================================================
   Ash: "remove the brackets from the group shot when hovering over a
   character", and "remove the names from the same place." Pointing at a girl
   in the group shot no longer draws anything on the picture: no blinking
   brackets round her, no name under her. Her card still lights with the
   brackets, and a click still chooses her.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-castmap-spot:hover::before{ content:none; }
  .sel--title .sel-castmap-spot span,
  .sel--title .sel-castmap-spot:hover span{ display:none; }
}


/* ==========================================================================
   139. THE NAMES AT THE TOP OF THE CARDS                         (3 Oct 2026)
   ==========================================================================
   Ash: "I want the character names at the top of the character select
   boxes, rather than at the bottom under the busts... This will move the
   busts down all the way to the bottom of the card. Please move the glyphs
   and the planet to make room as well."

   The name band moves to the top of each card (24px), dark at the top edge in
   her third colour and fading down into the glass, the name in white. On
   hover it slides up and out, as it used to slide down. Her 80px bust stands
   on the card's foot; her symbol (40px) sits just under the band on the
   left, her planet under the band on the right, all centred on the same
   point as before but 26px lower. Saturn's planet with her rings and Luna's
   head on the Moon Cats' card sit just under the band in the corner. The
   light behind her moves down with her. The 2x bust on hover is unchanged.
   ========================================================================== */
@media (min-width:901px){
  /* ---- the name band, at the top ---- */
  .sel--title .sel-roster .sel-card[data-key] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-plate{
    top:0; bottom:auto; height:24px; padding:7px 7px 0; justify-content:flex-start;
    background:linear-gradient(0deg, transparent 0%,
               color-mix(in srgb, var(--c3) 70%, transparent) 45%, color-mix(in srgb, var(--c3) 92%, transparent) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key="venus"] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key="venus"][data-active] .sel-plate{
    background:linear-gradient(0deg, transparent 0%,
               color-mix(in srgb, #4a2870 62%, transparent) 45%, color-mix(in srgb, #18245e 90%, transparent) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key="chibimoon"] .sel-plate{ padding-left:5px; padding-right:5px; }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-plate{ transform:translateY(-100%); }

  /* ---- her bust on the foot of the card ---- */
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats) .sel-bust{ bottom:0; }
  .sel--title .sel-roster .sel-card--cats[data-key] .sel-bust{ bottom:0; }

  /* ---- her symbol and her planet, under the band ---- */
  .sel--title .sel-roster .sel-card[data-key] .sel-glyphmark{ top:30px; }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-field::after{ top:30px; }
  .sel--title .sel-roster .sel-card[data-key] .sel-orb{
    top:calc(70px - var(--orbh, 52px) * var(--pk) / 2);
  }
  .sel--title .sel-roster .sel-card[data-key="saturn"] .sel-orb{ top:29px; right:3px; }
  .sel--title .sel-roster .sel-card[data-key="mooncats"] .sel-orb{ top:31px; right:7px; }
  .sel--title .sel-card[data-key] .sel-field::before{ top:104px; }
}


/* ==========================================================================
   140. FULL WIDTH, SQUARE CARDS, THE PLANET TAKES HER PLACE      (3 Oct 2026)
   ==========================================================================
   From the mock-up Ash approved (c148): the select screen across the whole
   page with the sidebar below it; double-size busts at rest with the planet
   veiled behind; when she is picked her bust leaves the card (she is in the
   middle box) and her planet shows at full strength. Then: "lets move the
   glyph back to the right side, on the other side of the character bust.
   enlarge the planet when the character is selected. saturn and uranus
   planets tilt on their sides to make them fit better... I'd like [the
   cards] square... and also, with this extra room, please make the middle
   section bigger again", and the logo and CHOOSE YOUR SAILOR SENSHI stay on
   top.

   FULL WIDTH. On a screen wide enough for the sidebar to sit beside the page
   (1250px and up), the select screen runs on into the sidebar's column, 245px
   wider, and the sidebar starts underneath it. Narrower screens already have
   the sidebar above the page, and the select screen fills the width it has.

   THE BOX. Square cards, 176 x 176. The four cards along the top and the four
   along the bottom spread evenly, with up to 64px between them, and the
   middle box spans everything between Mercury and Venus: 592 x 364 (it was
   348 x 308). The box is about 1040 wide and 894 tall.

   THE CARDS. Her name on the band at the top. Her double-size bust stands on
   the card's foot, to the left; her symbol sits on the other side, in the top
   right corner under the band (Pluto's lower down, clear of her staff, until
   she is picked), tucked behind her if they touch. Her planet is veiled
   behind her, in the middle of the card. Picked: the band slides away, she
   leaves the card, and her planet grows a size and shows at full strength,
   from the same centre. The planets are 26px pixel art at whole-number sizes:
     at rest   the Moon, the Sun, Jupiter 4x (104); the others 3x (78);
               Uranus 3x (78 x 102); Saturn 2x (108 x 52)
     picked    the Moon, the Sun, Jupiter 6x (156); the others 5x (130);
               Uranus 4x (104 x 136); Saturn 3x (162 x 78)
   Saturn tilts 28 degrees and Uranus 20, so they fit the square. The Moon
   Cats stand at double size (they lose a few pixels of tail and whisker at
   the sides), with Luna's head behind them.

   THE MIDDLE BOX. The paintings are a little taller and sit in the middle of
   the space right of her portrait column, each fading at both sides; the
   Moon Cats' human forms too.
   ========================================================================== */

/* ---- full width ---- */
@media (min-width:1250px){
  .cabinet > .container--post > .sel--title{ margin-right:-245px; padding-right:245px; }
  .sel--title .sm-stage{ margin-right:-245px; }
  .cabinet:has(> .container--post > .sel--title) > .rightsidebox--home{ margin-top:var(--sel-side-drop, 944px); }
}

@media (min-width:901px){
  /* ---- the box ---- */
  .sel--title .frost-win{
    grid-template-columns:minmax(0,1fr) 2px 176px minmax(0,64px) 176px minmax(0,64px) 176px minmax(0,64px) 176px 2px minmax(0,1fr);
    grid-template-rows:12px 52px 34px 176px 34px 364px 34px 176px 12px;
    column-gap:12px;
  }
  .sel--title .frost-win > .sel-stage::before{ grid-column:2 / 11; }
  .sel--title .sel-roster::before,
  .sel--title .sel-roster::after{ grid-column:2 / 11; }
  .sel--title .sel-roster > .sel-group > .sel-h{ grid-column:3 / 10; }
  .sel--title .sel-group > .sel-row > li:nth-child(1){ grid-column:3; }
  .sel--title .sel-group > .sel-row > li:nth-child(2){ grid-column:5; }
  .sel--title .sel-group > .sel-row > li:nth-child(3){ grid-column:7; }
  .sel--title .sel-group > .sel-row > li:nth-child(4){ grid-column:9; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li{ height:176px; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="mercury"]),
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="mars"]){ grid-column:3; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="venus"]),
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="jupiter"]){ grid-column:9; }
  body.wing.select .sel--title .frost-win > .sel-panels{ grid-column:4 / 9; }
  .sel--title .sel-banner .sel-logo,
  .sel--title .sel-banner .sel-title{ grid-column:3 / 10; }

  /* ---- the bust, double size, on the foot of the card ---- */
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats) .sel-bust{ opacity:0 !important; }
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats) .sel-bust-lg{
    opacity:1; visibility:visible; z-index:4; transform:none;
    top:auto; bottom:0; margin-left:0; left:max(0px, calc((128px - var(--bustw, 140px)) / 2));
  }
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats)[data-active] .sel-bust-lg,
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats)[data-lit] .sel-bust-lg{ opacity:0; visibility:hidden; }
  .sel--title .sel-roster .sel-card--cats[data-key] .sel-bust,
  .sel--title .sel-roster .sel-card--cats[data-key][data-active] .sel-bust{
    width:200px !important; height:160px; left:-12px !important; bottom:0; opacity:1; z-index:4;
  }
  .sel--title .sel-roster .sel-card--cats[data-key][data-active] .sel-bust,
  .sel--title .sel-roster .sel-card--cats[data-key][data-lit] .sel-bust{ opacity:0; }

  /* ---- her symbol, on the other side ---- */
  .sel--title .sel-roster .sel-card[data-key] .sel-glyphmark,
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-field::after{ left:auto; right:6px; top:28px; }
  .sel--title .sel-roster .sel-card[data-key="pluto"] .sel-glyphmark,
  .sel--title .sel-roster .sel-card[data-key="pluto"][data-active] .sel-field::after{ top:100px; }
  .sel--title .sel-roster .sel-card[data-key] .sel-glyphmark{ z-index:3; }
  .sel--title .sel-roster .sel-card[data-key="pluto"][data-active] .sel-glyphmark,
  .sel--title .sel-roster .sel-card[data-key="pluto"][data-lit] .sel-glyphmark,
  .sel--title .sel-roster .sel-card[data-key="pluto"][data-active] .sel-field::after{ top:28px; }

  /* ---- her planet: veiled behind her; picked, bigger and full strength ---- */
  .sel--title .sel-card[data-key]{ --rk:1.5; --hk:2.5; }
  .sel--title .sel-card[data-key="moon"],
  .sel--title .sel-card[data-key="chibimoon"],
  .sel--title .sel-card[data-key="tuxedomask"],
  .sel--title .sel-card[data-key="jupiter"]{ --rk:2; --hk:3; }
  .sel--title .sel-card[data-key="uranus"]{ --rk:1.5; --hk:2; }
  .sel--title .sel-card[data-key="saturn"]{ --rk:1; --hk:1.5; }
  .sel--title .sel-roster .sel-card[data-key] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="saturn"] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="mooncats"] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="tuxedomask"] .sel-orb{
    --k:var(--rk);
    width:calc(var(--orbw, 52px) * var(--k)); height:calc(var(--orbh, 52px) * var(--k));
    left:calc(50% - var(--orbw, 52px) * var(--k) / 2); right:auto;
    top:calc(96px - var(--orbh, 52px) * var(--k) / 2);
    opacity:.34; filter:saturate(.7); z-index:2; transition:none;
  }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key][data-lit] .sel-orb{ --k:var(--hk); }
  .sel--title .sel-roster .sel-card[data-key="saturn"] .sel-orb{ transform:rotate(-28deg); }
  .sel--title .sel-roster .sel-card[data-key="uranus"] .sel-orb{ transform:rotate(-20deg); }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key][data-lit] .sel-orb{ opacity:1; filter:none; z-index:3; }

  /* ---- the middle box: the paintings taller, centred right of her column ---- */
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank) .sel-back,
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank):is([data-key="moon"],[data-key="chibimoon"],[data-key="venus"],[data-key="jupiter"],
                            [data-key="saturn"],[data-key="uranus"],[data-key="neptune"],[data-key="pluto"]) .sel-back{
    --s:calc(360 / var(--wh));
    left:calc(144px + (100% - 144px - 858px * var(--s)) / 2);
    top:calc(0px - var(--wy) * 1px * var(--s));
    -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 16px, #000 calc(100% - 16px), transparent 100%) !important;
            mask-image:linear-gradient(90deg, transparent 0, #000 16px, #000 calc(100% - 16px), transparent 100%) !important;
  }

  /* the Moon Cats' human forms, centred in the space right of their column */
  .sel--title .sel-panel--cats::before{ left:calc(144px + (100% - 144px - 259px) / 2); }
}


/* ==========================================================================
   141. SYMBOL AND NAME ON TOP, THE CARDS IN THE MIDDLE, THE ?     (3 Oct 2026)
   ==========================================================================
   Ash: "let's move the senshi glyph to the top left corner of the character
   select boxes, followed by their name, name fonts bigger please. take some
   time with each box and make sure the proportions are right", "the
   luminaries and outer rows... there is a lot of space between the select
   boxes. scoot them closer together towards the center, leaving the corners
   with the empty space", and "move the words choose your senshi back to the
   middle... and after the logo is where we can put the 'what is sailor moon'
   prompt to click". Her answers: the words go into the middle box, under the
   group shot; the prompt works now.

   THE CARDS, 184 x 184. Across the top, a 48px header: her symbol at 2x
   (40px) in the corner, then her name in two lines, the last word big at
   16px (the type's crisp double size) and the rest small at 8px above it
   (SAILOR / MERCURY, SAILOR CHIBI / MOON, TUXEDO / MASK, MOON / CATS). The
   longest big word, MERCURY, JUPITER or NEPTUNE, is 112px of the 126 the
   name has. The header is her darkest colour at the top, fading into the
   glass, and stays when she is picked. Her double-size bust stands on the
   foot of the card, centred; her planet is veiled behind her, in the middle
   of the space under the header. Picked: her bust leaves, the planet grows a
   size and comes up full strength, and the band of light crosses her symbol.
     at rest   the Moon, the Sun, Jupiter 4x; the others 3x; Uranus 3x;
               Saturn 2x
     picked    the Moon, the Sun, Jupiter 5x (130); the others 4x (104);
               Uranus 4x (104 x 136); Saturn 3x (162 x 78)

   THE ROWS. The four Luminaries and the four outer planets sit together in
   the middle of their rows, 14px apart, leaving the corners empty; Mercury
   and Mars, Venus and Jupiter stand at the box's sides. The middle box
   between them is up to 644 x 382 (it was 592 x 364).

   THE TITLE BAR: the logo, then the "what is sailor moon?" button. CHOOSE
   YOUR SAILOR SENSHI is back in the middle box, under the group shot, while
   nobody is picked. The button opens the site's own "what is sailor moon?"
   words over the middle box, with Takeuchi's 1994 frontispiece; the x closes
   it, and so does pointing at a senshi.
   ========================================================================== */
/* the sidebar waits for the taller select screen (960 tall) */
@media (min-width:1250px){
  .cabinet:has(> .container--post > .sel--title) > .rightsidebox--home{ margin-top:978px; }
}

@media (min-width:901px){
  /* ---- the box ---- */
  .sel--title .frost-win{
    grid-template-columns:minmax(0,1fr) 2px 184px minmax(0,644px) 184px 2px minmax(0,1fr);
    grid-template-rows:12px 52px 34px 184px 34px 382px 34px 184px 12px;
    column-gap:14px;
  }
  .sel--title .frost-win > .sel-stage::before,
  .sel--title .sel-roster::before,
  .sel--title .sel-roster::after{ grid-column:2 / 7; }
  .sel--title .sel-roster > .sel-group > .sel-h{ grid-column:3 / 6; }

  /* the top and bottom rows: four together in the middle */
  .sel--title .sel-group[data-group="luminaries"] > .sel-row > li,
  .sel--title .sel-group[data-group="outer"] > .sel-row > li{
    grid-column:3 / 6; justify-self:center; width:184px; height:184px; left:var(--cx);
  }
  .sel--title .sel-group > .sel-row > li:nth-child(1){ --cx:-297px; }
  .sel--title .sel-group > .sel-row > li:nth-child(2){ --cx:-99px; }
  .sel--title .sel-group > .sel-row > li:nth-child(3){ --cx:99px; }
  .sel--title .sel-group > .sel-row > li:nth-child(4){ --cx:297px; }
  /* the middle row: at the sides */
  .sel--title .sel-group[data-group="inner"] > .sel-row > li{ height:184px; left:0; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="mercury"]),
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="mars"]){ grid-column:3; }
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="venus"]),
  .sel--title .sel-group[data-group="inner"] > .sel-row > li:has(> [data-key="jupiter"]){ grid-column:5; }
  body.wing.select .sel--title .frost-win > .sel-panels{ grid-column:4; }

  /* ---- the header: her symbol, then her name ---- */
  .sel--title .sel-roster .sel-card[data-key] .sel-glyphmark{
    top:4px; left:5px; right:auto; width:40px; height:40px; z-index:6;
  }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-field::after,
  .sel--title .sel-roster .sel-card[data-key="pluto"][data-active] .sel-field::after{ top:4px; left:5px; right:auto; z-index:7; }
  .sel--title .sel-roster .sel-card[data-key="pluto"] .sel-glyphmark,
  .sel--title .sel-roster .sel-card[data-key="pluto"][data-active] .sel-glyphmark,
  .sel--title .sel-roster .sel-card[data-key="pluto"][data-lit] .sel-glyphmark{ top:4px; }
  .sel--title .sel-roster .sel-card[data-key] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key="chibimoon"] .sel-plate{
    height:48px; padding:0 6px 4px 52px; justify-content:center; transform:none;
    background:linear-gradient(0deg, transparent 0%,
               color-mix(in srgb, var(--c3) 62%, transparent) 30%, color-mix(in srgb, var(--c3) 92%, transparent) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key="venus"] .sel-plate,
  .sel--title .sel-roster .sel-card[data-key="venus"][data-active] .sel-plate{
    background:linear-gradient(0deg, transparent 0%,
               color-mix(in srgb, #4a2870 58%, transparent) 30%, color-mix(in srgb, #18245e 90%, transparent) 100%);
  }
  .sel--title .sel-roster .sel-card[data-key] .sel-name{
    display:flex; flex-direction:column; align-items:flex-start; gap:4px;
    font-size:16px; line-height:1; letter-spacing:0; white-space:nowrap;
  }
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-name{ transform:none; opacity:1; }
  .sel--title .sel-roster .sel-card[data-key] .sel-name-pre{ font-size:8px; line-height:1; }
  .sel--title .sel-roster .sel-card[data-key] .sel-name-main{ font-size:16px; line-height:1; }

  /* ---- her bust, centred on the foot of the card ---- */
  .sel--title .sel-roster .sel-card[data-key]:not(.sel-card--cats) .sel-bust-lg{
    left:calc((184px - 4px - var(--bustw, 140px)) / 2);
  }
  /* his hat is the tallest: he stands 8px lower, so its crown clears his name */
  .sel--title .sel-roster .sel-card[data-key="tuxedomask"] .sel-bust-lg{ bottom:-8px; }
  .sel--title .sel-roster .sel-card--cats[data-key] .sel-bust,
  .sel--title .sel-roster .sel-card--cats[data-key][data-active] .sel-bust{ left:-10px !important; }

  /* ---- her planet ---- */
  .sel--title .sel-card[data-key]{ --rk:1.5; --hk:2; }
  .sel--title .sel-card[data-key="moon"],
  .sel--title .sel-card[data-key="chibimoon"],
  .sel--title .sel-card[data-key="tuxedomask"],
  .sel--title .sel-card[data-key="jupiter"]{ --rk:2; --hk:2.5; }
  .sel--title .sel-card[data-key="uranus"]{ --rk:1.5; --hk:2; }
  .sel--title .sel-card[data-key="saturn"]{ --rk:1; --hk:1.5; }
  .sel--title .sel-card[data-key="mooncats"]{ --rk:1.5; --hk:2; }
  .sel--title .sel-roster .sel-card[data-key] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="saturn"] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="mooncats"] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="tuxedomask"] .sel-orb{
    top:calc(114px - var(--orbh, 52px) * var(--k) / 2);
  }

  /* ---- the title bar: the logo, then the button ---- */
  .sel--title .sel-banner .sel-logo{
    grid-column:3 / 6; grid-row:2; align-self:center; justify-self:center;
    width:130px; height:50px; margin:0 266px 0 0;
  }
  .sel--title .sel-about-btn{
    grid-column:3 / 6; grid-row:2; align-self:center; justify-self:center;
    width:250px; margin:0 0 0 146px; position:relative; z-index:2;
  }
  /* ---- CHOOSE YOUR SAILOR SENSHI, in the middle box, under the group shot ---- */
  .sel--title .sel-banner .sel-title,
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-banner .sel-title{
    grid-column:4; grid-row:6; align-self:end; justify-self:center; z-index:3;
    width:auto; margin:0 0 12px 0; white-space:nowrap; text-align:center; pointer-events:none;
    font-size:16px; line-height:1; letter-spacing:0; color:#fff;
    text-shadow:2px 0 0 #2a1440, -2px 0 0 #2a1440, 0 2px 0 #2a1440, 0 -2px 0 #2a1440,
                2px 2px 0 #2a1440, -2px 2px 0 #2a1440, 2px -2px 0 #2a1440, -2px -2px 0 #2a1440,
                0 0 10px rgba(255,216,74,.55);
  }
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-banner .sel-title,
  .sel--title.is-about .sel-banner .sel-title{ opacity:0; }
  .sel--title .sel-panel--blank .sel-back{ height:calc(100% - 44px); }
  .sel--title .sel-castmap{ height:calc(100% - 44px); }

  /* ---- the paintings, for the taller box ---- */
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank) .sel-back,
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank):is([data-key="moon"],[data-key="chibimoon"],[data-key="venus"],[data-key="jupiter"],
                            [data-key="saturn"],[data-key="uranus"],[data-key="neptune"],[data-key="pluto"]) .sel-back{
    --s:calc(376 / var(--wh));
  }

  /* ---- what is sailor moon? ---- */
  .sel--title .sel-about{
    position:absolute; inset:0; z-index:20; box-sizing:border-box;
    display:grid; grid-template-columns:200px minmax(0,1fr); gap:0 18px; align-items:start;
    padding:16px 16px 14px; background:#0e0c14; color:#f3eefa;
    border:3px solid #ffd84a; box-shadow:inset 0 0 0 1px rgba(0,0,0,.6);
  }
  .sel--title .sel-about[hidden]{ display:none; }
  .sel--title .sel-about-pic{
    width:200px; height:auto; display:block; border:2px solid #ffd84a;
    box-shadow:0 0 0 2px rgba(0,0,0,.55), 4px 4px 0 rgba(0,0,0,.4);
  }
  .sel--title .sel-about-body{
    max-height:346px; overflow:auto; padding-right:8px;
    font-family:Raleway, system-ui, sans-serif; font-size:13.5px; line-height:1.55;
    scrollbar-width:thin; scrollbar-color:#ffd84a #2a2238;
  }
  .sel--title .sel-about-body p{ margin:0 0 9px; }
  .sel--title .sel-about-h{
    margin:0 30px 4px 0; font-family:"Press Start 2P",monospace; font-size:16px; line-height:1.25;
    color:transparent; --nm1:#ffc8e8; --nm2:#fff3a8; --nm3:#9fc4ff;
    background-image:linear-gradient(100deg, var(--nm1) 0%, var(--nm2) 18%, var(--nm3) 36%, #ffffff 46%, var(--nm3) 56%, var(--nm2) 76%, var(--nm1) 100%);
    background-size:250% 100%; -webkit-background-clip:text; background-clip:text;
    filter:drop-shadow(2px 0 0 #000) drop-shadow(-2px 0 0 #000) drop-shadow(0 2px 0 #000) drop-shadow(0 -2px 0 #000);
    animation:sel-nameflash 2.6s linear infinite;
  }
  .sel--title .sel-about-sub{ font-style:italic; color:#ffd84a; }
  .sel--title .sel-about-stats{
    display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:4px 14px; margin:0 0 10px;
    padding:8px 10px; border:1px dashed rgba(255,216,74,.45); background:rgba(255,255,255,.04);
  }
  .sel--title .sel-about-stat{ display:flex; flex-direction:column; }
  .sel--title .sel-about-stat dt{ font-family:"Press Start 2P",monospace; font-size:8px; line-height:1.4; color:#c9b0ff; text-transform:uppercase; }
  .sel--title .sel-about-stat dd{ margin:0; font-size:13px; line-height:1.35; font-weight:600; }
  .sel--title .sel-about-x{
    position:absolute; top:8px; right:8px; width:28px; height:28px; padding:0; cursor:pointer;
    font:16px/1 "Press Start 2P",monospace; color:#0e0c14; background:#ffd84a;
    border:2px solid #fff; box-shadow:0 0 0 1px #000, 2px 2px 0 rgba(0,0,0,.5);
  }
  .sel--title .sel-about-x:hover,
  .sel--title .sel-about-x:focus-visible{ background:#fff; outline:none; }
  @media (prefers-reduced-motion:reduce){ .sel--title .sel-about-h{ animation:none; } }
}

/* ---- the button (every width; on a phone it opens the box further down) ---- */
.sel--title .sel-about-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:8px; cursor:pointer;
  padding:7px 10px 6px; font-family:"Press Start 2P",monospace; font-size:10px; line-height:1;
  text-transform:uppercase;
  color:#fff; background:#4a1c5e; border:2px solid #ffd84a; letter-spacing:0;
  box-shadow:0 0 0 1px #2a1440, 3px 3px 0 rgba(42,20,64,.45);
}
.sel--title .sel-about-q{
  display:inline-grid; place-items:center; width:16px; height:16px; flex:none;
  background:#ffd84a; color:#4a1c5e; font-size:10px; box-shadow:inset -2px -2px 0 rgba(0,0,0,.2);
}
.sel--title .sel-about-btn:hover,
.sel--title .sel-about-btn[aria-expanded="true"]{ background:#ffd84a; color:#4a1c5e; }
.sel--title .sel-about-btn:hover .sel-about-q,
.sel--title .sel-about-btn[aria-expanded="true"] .sel-about-q{ background:#4a1c5e; color:#ffd84a; }
.sel--title .sel-about-btn:focus-visible{ outline:3px solid #fff; outline-offset:2px; }
.sel--title .sel-about-btn:active{ transform:translate(2px,2px); box-shadow:0 0 0 1px #2a1440; }
/* on a narrower screen the middle box is under 410 wide: the words go down a size */
@media (min-width:901px) and (max-width:1099px){
  .sel--title .sel-banner .sel-title,
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-banner .sel-title{ font-size:12px; margin-bottom:15px; }
}


/* ==========================================================================
   142. THE SIDEBAR STAYS WHERE IT IS                             (3 Oct 2026)
   ==========================================================================
   Ash: "the entire pixel and planets right column... with the menu my
   profile box and the music player have all been moved. the character
   select feature does not fuck with that."

   Sections 140 and 141 ran the select screen on into the sidebar's column
   and pushed the sidebar down below it. Undone: the select screen keeps to
   the page's own column again, and the sidebar is back beside it, sticky, as
   on every other page. Everything else from 140 and 141 stays, fitted to the
   narrower box: the cards keep their size, the rows still sit together in the
   middle, and the middle box is up to 489 wide (on a screen 1250 or wider),
   382 tall. The frontispiece in "what is sailor moon?" goes from 200 to 160
   wide to leave the words room.
   ========================================================================== */
@media (min-width:1250px){
  .cabinet > .container--post > .sel--title{ margin-right:0; padding-right:0; }
  .sel--title .sm-stage{ margin-right:0; }
  .cabinet:has(> .container--post > .sel--title) > .rightsidebox--home{ margin-top:0; }
}
@media (min-width:901px){
  .sel--title .sel-about{ grid-template-columns:160px minmax(0,1fr); gap:0 16px; }
  .sel--title .sel-about-pic{ width:160px; }
}


/* ==========================================================================
   143. CHOOSE YOUR SAILOR GUARDIAN, BOUNCING, IN THE LOGO'S RAINBOW (3 Oct 2026)
   ==========================================================================
   Ash: "choose your sailor senshi... change the word senshi to guardian and
   have that text bounce like a retro select... and give it a shimmer.. can
   you copy the sailor moon logo rainbow gradient with shimmer?"

   THE WORDS read CHOOSE YOUR SAILOR GUARDIAN (the page's heading changes;
   each letter is its own span, numbered --i).

   THE RAINBOW is the logo's own. The logo GIF is filled with twelve flat
   colours that it cycles one step every 150ms: blue #5284ff, violet
   #8452ff, purple #ad29ff, orchid #d629ff, magenta #ff52ff, pink #ff84d6,
   peach #ffadad, apricot #ffd684, yellow #ffff00, lime #d6ff84, sage
   #add6ad, sky #84add6. Here the same twelve, half a letter wide each, as
   hard bands with no blending (so each letter shows two, as the logo's do),
   stepping one band every 150ms the same way, with the logo's magenta
   keyline (#ad0084) round every letter. A white glint steps across the
   words about every three and a half seconds.

   THE BOUNCE. Each letter hops 2px, 4px, 2px and down, in whole-pixel steps,
   one letter after the other, so a wave runs along the words, like the
   blinking PRESS START of an old title screen.

   Desktop only, where the words sit in the middle box; the phone keeps its
   heading as it was (with the new word). No motion when reduced motion is
   asked for: the rainbow stands still and the letters stay down.
   ========================================================================== */
@media (min-width:901px){
  .sel--title .sel-banner .sel-title,
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-banner .sel-title{ text-shadow:none; }
  .sel--title .sel-title-t{ display:inline-block; white-space:nowrap; }
  .sel--title .sel-title-t > span{
    display:inline-block; width:1em; text-align:center; white-space:pre;
    color:transparent; -webkit-background-clip:text; background-clip:text;
    background-image:
      linear-gradient(90deg, transparent 0, rgba(255,255,255,.95) 50%, transparent 100%),
      linear-gradient(90deg,
        #5284ff 0 .5em, #8452ff .5em 1em, #ad29ff 1em 1.5em, #d629ff 1.5em 2em,
        #ff52ff 2em 2.5em, #ff84d6 2.5em 3em, #ffadad 3em 3.5em, #ffd684 3.5em 4em,
        #ffff00 4em 4.5em, #d6ff84 4.5em 5em, #add6ad 5em 5.5em, #84add6 5.5em 6em);
    background-size:3em 100%, 6em 100%;
    background-repeat:no-repeat, repeat-x;
    background-position:calc(-6em - var(--i) * 1em) 0, calc(0em - var(--i) * 1em) 0;
    filter:drop-shadow(2px 0 0 #ad0084) drop-shadow(-2px 0 0 #ad0084)
           drop-shadow(0 2px 0 #ad0084) drop-shadow(0 -2px 0 #ad0084)
           drop-shadow(0 2px 0 #2a1440);
    animation:sel-guard-shine 3.6s steps(24, end) infinite,
              sel-guard-hop 1.6s steps(1, end) infinite;
    animation-delay:0s, calc(var(--i) * 50ms);
  }
  .sel--title .sel-title-t > span.sp{ filter:none; }
  @keyframes sel-guard-shine{
    from{ background-position:calc(-6em - var(--i) * 1em) 0, calc(0em - var(--i) * 1em) 0; }
    to  { background-position:calc(34em - var(--i) * 1em) 0, calc(12em - var(--i) * 1em) 0; }
  }
  @keyframes sel-guard-hop{
    0%       { transform:translateY(0); }
    8%       { transform:translateY(-2px); }
    16%      { transform:translateY(-4px); }
    24%      { transform:translateY(-2px); }
    32%, 100%{ transform:translateY(0); }
  }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-title-t > span{ animation:none; }
  }
}


/* ==========================================================================
   144. THE WHOLE SENTENCE BOUNCES; SHORTER CARDS                  (3 Oct 2026)
   ==========================================================================
   Ash: "i don't like it. just bounce the entire sentence. take away the
   rainbow", and "the character select boxes. shorten them. It's okay if the
   name text touches the tops of the bust heads... we want the next article
   peeking out from the bottom of the page."

   THE TITLE. CHOOSE YOUR SAILOR GUARDIAN is plain text again (the page's
   heading loses its letter spans), white with its dark plum outline and gold
   glow as before section 143, and the whole sentence hops: up 2px, 4px, 2px
   and down, in whole-pixel steps, once every 1.2 seconds. Section 143's
   rainbow no longer applies to anything. Still for reduced motion.

   THE CARDS go from 184 x 184 to 184 x 148. Her bust still stands on the foot
   of the card, so the top of her head now rises into the header; she is
   drawn over the header's shading, and her symbol and name over her, each
   letter with a dark outline so it reads over her hair. Ash: "you can push
   the busts down lower if needed to not chop off heads": Tuxedo Mask's hat,
   Saturn's glaive and Pluto's head were at or past the card's top, so those
   three stand 6, 4 and 2px lower; every head has at least 4px of sky. Her
   planet sits behind her, centred 86px down; picked, it grows a size (the
   biggest rising so they end at the card's foot):
     at rest   the Moon, the Sun, Jupiter 4x (104); the others 3x (78);
               Uranus 2x; Saturn 2x (108 x 52); Luna's head 3x
     picked    the Moon, the Sun, Jupiter 5x (130); the others 4x (104);
               Uranus 3x; Saturn 3x (162 x 78, tilted 14 degrees, not 28,
               so her rings stay inside the shorter card); Luna's head 4x

   THE BOX is 144px shorter: 816 tall instead of 960, so on a desktop monitor
   the first article below shows under it. The middle box is 489 x 310; the
   paintings, the group shot (now 293 x 260 above the title) and "what is
   sailor moon?" are fitted to it.
   ========================================================================== */
@media (min-width:901px){
  /* ---- the title: plain, and the whole sentence hops ---- */
  .sel--title .sel-banner .sel-title,
  .sel--title .frost-win:not(:has(.sel-panel--blank[data-active])) .sel-banner .sel-title{
    text-shadow:2px 0 0 #2a1440, -2px 0 0 #2a1440, 0 2px 0 #2a1440, 0 -2px 0 #2a1440,
                2px 2px 0 #2a1440, -2px 2px 0 #2a1440, 2px -2px 0 #2a1440, -2px -2px 0 #2a1440,
                0 0 10px rgba(255,216,74,.55);
    animation:sel-guard-jump 1.2s steps(1, end) infinite;
  }
  @keyframes sel-guard-jump{
    0%       { transform:translateY(0); }
    10%      { transform:translateY(-2px); }
    20%      { transform:translateY(-4px); }
    30%      { transform:translateY(-2px); }
    40%, 100%{ transform:translateY(0); }
  }
  @media (prefers-reduced-motion:reduce){
    .sel--title .sel-banner .sel-title{ animation:none; }
  }

  /* ---- the box: shorter cards ---- */
  .sel--title .frost-win{
    grid-template-rows:12px 52px 34px 148px 34px 310px 34px 148px 12px;
  }
  .sel--title .sel-group[data-group="luminaries"] > .sel-row > li,
  .sel--title .sel-group[data-group="outer"] > .sel-row > li,
  .sel--title .sel-group[data-group="inner"] > .sel-row > li{ height:148px; }

  /* her bust over the header's shading; her symbol and name over her */
  .sel--title .sel-roster .sel-card[data-key] .sel-plate,
  .sel--title .sel-roster .sel-card--cats[data-key] .sel-plate{ z-index:auto; }
  .sel--title .sel-roster .sel-card[data-key] .sel-name{ position:relative; z-index:6; }
  .sel--title .sel-roster .sel-card[data-key] .sel-name-main{
    text-shadow:2px 0 0 #120a1e, -2px 0 0 #120a1e, 0 2px 0 #120a1e, 0 -2px 0 #120a1e,
                2px 2px 0 #120a1e, -2px 2px 0 #120a1e, 2px -2px 0 #120a1e, -2px -2px 0 #120a1e;
  }
  .sel--title .sel-roster .sel-card[data-key] .sel-name-pre{
    text-shadow:1px 0 0 #120a1e, -1px 0 0 #120a1e, 0 1px 0 #120a1e, 0 -1px 0 #120a1e,
                1px 1px 0 #120a1e, -1px 1px 0 #120a1e, 1px -1px 0 #120a1e, -1px -1px 0 #120a1e;
  }

  /* no head cut off by the card's top: the tallest busts stand a little lower
     (at least 4px of sky over every head, hat and glaive) */
  .sel--title .sel-roster .sel-card[data-key="tuxedomask"]:not(.sel-card--cats) .sel-bust-lg{ bottom:-6px; }
  .sel--title .sel-roster .sel-card[data-key="saturn"]:not(.sel-card--cats) .sel-bust-lg{ bottom:-4px; }
  .sel--title .sel-roster .sel-card[data-key="pluto"]:not(.sel-card--cats) .sel-bust-lg{ bottom:-2px; }

  /* ---- her planet ---- */
  .sel--title .sel-card[data-key]{ --rk:1.5; --hk:2; }
  .sel--title .sel-card[data-key="moon"],
  .sel--title .sel-card[data-key="chibimoon"],
  .sel--title .sel-card[data-key="tuxedomask"],
  .sel--title .sel-card[data-key="jupiter"]{ --rk:2; --hk:2.5; }
  .sel--title .sel-card[data-key="uranus"]{ --rk:1; --hk:1.5; }
  .sel--title .sel-card[data-key="saturn"]{ --rk:1; --hk:1.5; }
  .sel--title .sel-card[data-key="mooncats"]{ --rk:1.5; --hk:2; }
  .sel--title .sel-roster .sel-card[data-key] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="saturn"] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="mooncats"] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key="tuxedomask"] .sel-orb{
    top:calc(86px - var(--orbh, 52px) * var(--k) / 2);
  }
  .sel--title .sel-roster .sel-card[data-key="saturn"] .sel-orb{ transform:rotate(-14deg); }
  /* picked, the biggest planets rise so they end at the card's foot instead of past it */
  .sel--title .sel-roster .sel-card[data-key][data-active] .sel-orb,
  .sel--title .sel-roster .sel-card[data-key][data-lit] .sel-orb{
    top:min(calc(86px - var(--orbh, 52px) * var(--k) / 2), calc(142px - var(--orbh, 52px) * var(--k)));
  }

  /* ---- the middle box, 310 tall ---- */
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank) .sel-back,
  .sel--title .sel-panel[data-key]:not(.sel-panel--blank):is([data-key="moon"],[data-key="chibimoon"],[data-key="venus"],[data-key="jupiter"],
                            [data-key="saturn"],[data-key="uranus"],[data-key="neptune"],[data-key="pluto"]) .sel-back{
    --s:calc(304 / var(--wh));
  }
  .sel--title .sel-about-body{ max-height:274px; }
  .sel--title .sel-panel--cats::before{
    top:calc(-68px * 304 / 376); width:calc(259px * 304 / 376); height:calc(380px * 304 / 376);
    left:calc(144px + (100% - 144px - 259px * 304 / 376) / 2);
    background-size:100% 100%;
    -webkit-mask-image:linear-gradient(90deg, transparent 8%, #000 19%, #000 68%, transparent 80%),
                       linear-gradient(180deg, transparent 18%, #000 26%, #000 88%, transparent 97%);
            mask-image:linear-gradient(90deg, transparent 8%, #000 19%, #000 68%, transparent 80%),
                       linear-gradient(180deg, transparent 18%, #000 26%, #000 88%, transparent 97%);
  }
}


/* ==========================================================================
   URANUS'S CARD DROPS THE RED                                 (10 Oct 2026)
   ==========================================================================
   Ashley: "the fuku gradient needs updating on the profile and the character
   select now."

   Her card glass ran gold into navy into crimson into a darker crimson,
   because her profile ran that way too. It now runs gold into her trim blue
   into her skirt navy and out into the near-black navy her skirt measures in
   the transformation still. Bright at the top, dark at the foot, same as the
   rest of the roster.

   Top level and last in the file, so it beats the stops set earlier without
   touching them.
   ========================================================================== */
.sel--title .sel-card[data-key="uranus"]{
  --g1:#ffd23a; --g2:#2a6aa8; --g3:#16225e; --g4:#01061c;
  --c1:#ffd23a; --c2:#2a6aa8; --c3:#101c4e;
}
