/* Agoramores — "february" theme overrides. Loaded after main.css.
   Every selector here is scoped to body[data-theme-id="february"]. */

/* February — a Victorian valentine. A die-cut paper-lace card laid on deep
   velvet, seen by candlelight.

   The trap in a love theme is pink-on-pink: blush type on a blush ground, every
   value in the same narrow band, nothing legible and nothing rich. This theme
   inverts that. The GROUND is the darkest thing on the page — a wine-black
   velvet — and the blush tones are spent entirely on SURFACES and ORNAMENT: the
   lace hem, the scallops, the card stock, the roses. Type is cream, gold, rose
   and crimson, every one of them a light value on a near-black ground, so the
   value ladder is real and the contrast is never in doubt:

     cream  #f7e4d2  15.5:1   body copy
     foil   #f2d9a0  13.9:1   chip glyphs, tarot numeral, gold ornament
     blush  #eec6c9  12.4:1   soft text, table cells
     gold   #e8b45c  10.2:1   metallic accent, highlight
     sage   #a9c294   9.9:1   rose foliage, emphasis, tags
     rose   #ff8fa6   8.9:1   links, breadcrumb text
     shade  #c9a4ac   8.6:1   muted text
     rosegd #e8927a   8.1:1   eyebrow, warm accent
     mauve  #c08fb0   7.1:1   visited links, dusty accent
     carmine#ff5c78   6.5:1   bold text, hot accent
     crimson#f43e5e   5.2:1   THE anchor red — borders, frames, ornament
     dusk   #a2455f   3.3:1   scrollbar and dim structure only (3:1 class)

   All ratios are against --feb-velvet (#1b0910). Every stop in every heading
   gradient clears 5.2:1, so a heading is legible at h6 as well as h1, and the
   gradient reads as a gradient instead of the black-on-black mush that the old
   placeholder months shipped.

   Distinct from January (cold, barren) and March by construction: this is the
   warmest ground on the calendar, there is not one blue or cyan value in it,
   and the ornament is all curve — scallops, lobes, whorls — where a winter or
   an early-spring month is straight lines and bare stems.

   No asset references of any kind. Every illustration below — lace, scallops,
   eyelets, hearts, roses, leaves, bokeh, petals, brocade — is a CSS gradient.
   Nothing here loads a byte over the network, so the first painted frame is
   already the finished picture. */
body[data-theme-id="february"] {
  /* ---- Ink ----------------------------------------------------------------
     Twelve colours, ordered dark to light. The three darkest are ground and
     fill only; everything from --feb-crimson up is a value that can legally
     carry type on --feb-velvet. */
  --feb-ink: #130505;        /* deepest — punched holes in the lace, hard shadow */
  --feb-velvet: #1c0909;     /* the page ground: wine-black, warm, no blue in it */
  --feb-wine: #2d0e0e;       /* card stock, the astrolabe's face */
  /* Link-hover paired to THIS block's ground (standing rule 2026-08-14), not
     the mode name. #1b0910 is dark: #FF465A clears 5.74:1 here. */
  --link-hover: #FF4947;
  --feb-wine-lit: #5d1413;   /* the one mid-value: table header band, lace hem */
  --feb-crimson: #f5423f;    /* THE anchor red — valentine carmine, h≈350°, s≈89% */
  --feb-carmine: #ff6060;    /* one step hotter: bold text, live accents */
  --feb-rose: #ff9292;       /* links, breadcrumb text */
  --feb-rosegold: #e8927a;   /* the warm copper note — eyebrow, list markers */
  --feb-mauve: #c6918e;      /* dusty mauve — visited links, quiet accents */
  --feb-sage: #a9c294;       /* rose foliage. The palette's only cool-ish note,
                                and it earns its place: crimson + gold + sage +
                                cream is the exact four-colour set a chromo-
                                lithograph valentine was printed in. */
  --feb-shade: #caa4a4;      /* muted text */
  --feb-blush: #eec6c6;      /* soft text, table cells */
  --feb-cream: #f7e4d2;      /* body copy */
  --feb-gold: #e8b45c;       /* metallic accent */
  --feb-foil: #f2d9a0;       /* pale gold leaf — the brightest metal */
  --feb-dusk: #a54646;       /* 3.3:1 — dim structure and the scrollbar rail,
                                never type */

  /* ---- Lace grid ----------------------------------------------------------
     One band of ornament runs along the foot of the page, and every piece of it
     is positioned off these four numbers so the whole thing scales as a unit.
     The mobile block at the bottom rescales the same vars and nothing drifts. */
  --feb-lace-h: 6.4rem;      /* the whole ground band */
  --feb-hem: 1.7rem;         /* solid velvet hem at the very bottom */
  /* Scallop radius. Small is the whole point: paper lace is a fine, dense
     edging, and the first pass of this theme ran it at 20px, where the crest
     stopped reading as lace and started reading as a row of bubbles. */
  --feb-scallop: 11px;
  --feb-heart: 15px;         /* heart unit — width and height are both this */
  --feb-heart-gap: 96px;     /* one heart per this much run */
  --feb-heart-sm: 10px;
  --feb-heart-sm-gap: 67px;  /* coprime-ish with the row above so the two heart
                                rows never stack into a column */
  --feb-bloom: 30px;         /* rose diameter */
  --feb-bloom-gap: 168px;

  --tt-bg: var(--feb-velvet);
  --tt-bg-alt: var(--feb-wine);
  --tt-cyan: var(--feb-cream);
  --tt-cyan-soft: var(--feb-blush);
  --tt-yellow: var(--feb-gold);
  --tt-orange: var(--feb-rosegold);
  /* Bold text is red, per the standing red bias — a valentine sets its emphasis
     in carmine, not in a second neutral. 6.5:1, so 800-weight body copy clears
     small-text AA with room. */
  --tt-chartreuse: var(--feb-carmine);
  --tt-green: var(--feb-sage);
  --tt-pink: var(--feb-rose);
  --tt-purple: var(--feb-mauve);
  /* No blue exists in this month. The token is kept pointed at the mauve so any
     rule in main.css that reaches for it lands somewhere deliberate rather than
     dragging July's #3465a4 into a warm page. */
  --tt-blue: var(--feb-mauve);
  --tt-teal: var(--feb-dusk);
  --tt-gray: var(--feb-shade);
  --tt-gold: var(--feb-foil);
  --tt-red: var(--feb-crimson);
  --tt-breadcrumb-text: var(--feb-rose);
  --tt-breadcrumb-glow: rgba(255, 146, 146, 0.5);
  /* Hover/focus halo for the zodiac glyphs, checked against the ground the
     chips actually sit on — the breadcrumb card, which runs #301019 at its head
     down to #1d0810 at its foot. A pale rose at 0.82 traces a ♌ or an ogham
     stave clearly on that. Never a border: the rule that consumes this token
     lives once, in main.css, and it draws on the glyph, not on the box. */
  --zodiac-glow: rgba(255, 207, 207, 0.82);

  /* ---- Structural border palette -----------------------------------------
     Every visible frame on the site is border-image'd from this. Crimson leads
     and returns at the midpoint, so the frames read red-anchored; gold and foil
     between them make the frame look like foil stamping on card stock, which is
     the whole point. Seven stops, first and last identical so a frame that
     wraps a corner meets itself. */
  --tt-heading-rainbow: linear-gradient(
    90deg,
    var(--feb-crimson),
    var(--feb-rose),
    var(--feb-gold),
    var(--feb-crimson),
    var(--feb-mauve),
    var(--feb-foil),
    var(--feb-crimson)
  );
  --tt-heading-rainbow-vertical: linear-gradient(
    180deg,
    var(--feb-crimson),
    var(--feb-rose),
    var(--feb-gold),
    var(--feb-crimson),
    var(--feb-mauve),
    var(--feb-foil),
    var(--feb-crimson)
  );
  /* Heading text gradient. Two identical eight-colour cycles plus a closing
     crimson across a 200% background, which is what makes headingRainbowFlow
     loop with no visible reset — the window at position 0% and at 100% shows
     the same colour.

     The cycle is a genuine spectrum arc read in this month's ink:
       crimson → rosegold → gold → foil → sage → crimson → mauve → rose
       (red    → orange   → yellow→ cream→ green→ red     → purple→ pink)
     Crimson sits at stops one and six, so red leads and reappears twice per
     cycle. Every stop clears 5.2:1 on the ground — this is the check the old
     placeholder months failed, where eight colours from the same dark band all
     rendered as flat black and the gradient was invisible. */
  --tt-heading-text-rainbow: linear-gradient(
    90deg,
    var(--feb-crimson),
    var(--feb-rosegold),
    var(--feb-gold),
    var(--feb-foil),
    var(--feb-sage),
    var(--feb-crimson),
    var(--feb-mauve),
    var(--feb-rose),
    var(--feb-crimson),
    var(--feb-rosegold),
    var(--feb-gold),
    var(--feb-foil),
    var(--feb-sage),
    var(--feb-crimson),
    var(--feb-mauve),
    var(--feb-rose),
    var(--feb-crimson)
  );

  /* ---- Type ---------------------------------------------------------------
     The heading stack is system faces. The project loads no webfonts anywhere —
     no @font-face, no @import, no stylesheet link to a font host — so this adds
     zero requests and the first paint is already the finished typography.

     Headings take a didone. Bodoni and Didot are the display faces of the
     engraved valentine and the Victorian greeting card: extreme thick/thin,
     hairline serifs, unmistakably formal and a little bit swooning. A didone
     goes spindly as light BODY type on a dark ground, which is exactly why it
     is confined to headings here — the smallest thing set in it is an h6. Note
     that this is also the one face in the project that a myopic reader loses
     entirely at distance: hairlines are the first thing defocus deletes. That
     is an accepted cost at display size, and it is the reason a didone may
     never be spent on --font-text or on anything set below h6.

     Body is NOT this sheet's decision any more (2026-08-15, user instruction).
     What stood here was Georgia via --font-sans, picked for sturdy strokes as
     cream type on a near-black ground. The locked --font-text in main.css
     satisfies that requirement by the same argument and on every theme at once.

     --font-mono and --font-cursive stay untouched at the token level: the brand
     wordmark and the breadcrumb/time chrome are locked fixtures. */
  --font-heading: Didot, "Didot LT STD", "Bodoni 72", "Bodoni MT", "Hoefler Text", "Big Caslon", Georgia, "Times New Roman", serif;

  --bg: var(--feb-velvet);
  /* Transparent, always: there is one shared site background and the breadcrumb
     bar is its only exception. Nothing below paints a second one. */
  --surface: transparent;
  --text: var(--feb-cream);
  --text-soft: var(--feb-blush);
  --muted: var(--feb-shade);
  --border: var(--feb-crimson);
  --border-dim: rgba(245, 66, 63, 0.28);
  --border-teal: rgba(232, 180, 92, 0.6);
  background: var(--feb-velvet);
  color: var(--feb-cream);
  color-scheme: dark;
}

/* The CRT scanline is a permanent fixture, so it stays — it just stops being a
   cathode-ray artefact and becomes the weave of the velvet the card is lying
   on. A fine horizontal pass with a much fainter vertical thread crossing it
   reads as woven cloth rather than as a screen. Both alphas are near the floor
   on purpose: this layer sits above the text at z-index 5, so it has to be felt
   and never read. Static, two repeating gradients, one already-existing fixed
   element. */
body[data-theme-id="february"]::before {
  background:
    repeating-linear-gradient(0deg, rgba(247, 228, 210, 0.016) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(247, 228, 210, 0.009) 0 1px, transparent 1px 5px);
}

/* ---------------------------------------------------------------------------
   THE VELVET. Deep wine-black overhead, warming as it falls, with candlelight
   banked along the bottom edge where the lace sits. The whole page reads as a
   card photographed on a dark cloth: the eye is pulled down to the ornament and
   the reading column stays over the darkest part of the frame.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] .night-sky {
  background:
    radial-gradient(ellipse at 50% 112%, rgba(245, 66, 63, 0.17), transparent 40%),
    radial-gradient(ellipse at 15% 104%, rgba(232, 180, 92, 0.1), transparent 32%),
    radial-gradient(ellipse at 86% 106%, rgba(198, 145, 142, 0.11), transparent 30%),
    radial-gradient(ellipse at 64% 20%, rgba(255, 146, 146, 0.05), transparent 48%),
    linear-gradient(180deg, #130505 0%, #1c0909 46%, #270c0c 78%, #351010 100%);
}

/* ---------------------------------------------------------------------------
   BOKEH AND PETALS. Three depths, all of them reusing keyframes that already
   exist in main.css — starDrift/starTwinkle, farStarDrift/farStarTwinkle,
   nearStarDrift/nearStarTwinkle — so this month adds no ambient keyframe at
   all. Every one of those is a transform translate plus an opacity fade on a
   composited layer, which is the cheapest continuous motion available; nothing
   here animates a gradient, a filter or a background-position.

     ::before   far bokeh — big, soft, out-of-focus candlelight. Two filled
                discs and one ring, because real bokeh from a wide aperture is
                a ring, not a blob.
     --far      the fine pass: gold sparks and specks of petal, dense and small.
     --near     large blush petals and one near bokeh ring, sparse and slow.

   Alpha is held between 0.06 and 0.30 throughout. These layers cover the whole
   viewport and sit under the reading column, so the test is not "can I see it"
   but "can I still read over it".
   --------------------------------------------------------------------------- */

/* Far bokeh: two big, soft, defocused lights.

   Every radius here is stated explicitly, and that is not a style preference —
   it is the bug fix. A radial-gradient with no radius defaults to
   farthest-corner, so a light placed at 22% 28% of its tile sizes itself off
   the FAR corner and then runs off the near two edges, where the tile clips it
   into a straight line. Repeat that and the page fills with faint soft-edged
   rectangles instead of circles. An explicit radius that fits inside the tile
   ends at transparent on every side, and the seam disappears.

   Tiles are deliberately enormous (44rem and 58rem) so a desktop viewport holds
   one or two lights, not a grid of them. A viewport stippled with circles is
   noise; two of them is candlelight. */
body[data-theme-id="february"] .night-sky::before {
  opacity: 0.9;
  background-image:
    radial-gradient(circle 8rem at 26% 30%, rgba(255, 146, 146, 0.08) 0 12%, rgba(255, 146, 146, 0.03) 44%, transparent 74%),
    radial-gradient(circle 11rem at 74% 66%, rgba(232, 180, 92, 0.06) 0 10%, rgba(232, 180, 92, 0.022) 42%, transparent 74%);
  background-size: 44rem 38rem, 58rem 50rem;
  background-position: 0 0, 9rem 5rem;
  background-repeat: repeat;
  animation: starDrift 54s linear infinite alternate, starTwinkle 7.6s ease-in-out infinite;
}

/* The fine pass: gold sparks (the foil catching light) and tiny petal flecks.
   The petals are axis-aligned ellipses of differing aspect, which at two or
   three pixels reads exactly as petals caught at different angles. */
body[data-theme-id="february"] .night-sky__stars--far {
  opacity: 0.66;
  background-image:
    radial-gradient(circle at 30% 26%, rgba(242, 217, 160, 0.72) 0 0.8px, transparent 1.3px),
    radial-gradient(ellipse 2.6px 1.4px at 68% 58%, rgba(255, 146, 146, 0.44) 0 62%, transparent 100%),
    radial-gradient(ellipse 1.5px 2.6px at 12% 78%, rgba(255, 207, 207, 0.34) 0 62%, transparent 100%),
    radial-gradient(circle at 86% 14%, rgba(247, 228, 210, 0.4) 0 0.6px, transparent 1.1px);
  background-size: 9rem 11rem, 14rem 12rem, 17rem 15rem, 6rem 7rem;
  background-position: 0 0, 2.5rem 1rem, 5rem 6rem, 1rem 3rem;
  background-repeat: repeat;
  animation: farStarDrift 120s linear infinite alternate, farStarTwinkle 9s ease-in-out infinite;
}

/* The near pass: petals big enough to read as petals, plus one true bokeh ring
   — a defocused highlight from a wide aperture is a ring, not a disc, and one
   of them is worth more than a page of blobs.

   The ring's feather is very wide on purpose (a stop at 44% and the next at
   70%). A tight ring band reads as a drawn outline, which is what the first
   pass of this theme shipped and it looked like a rendering fault. Its tile is
   62rem, so at most one is on screen at a time. */
body[data-theme-id="february"] .night-sky__stars--near {
  opacity: 0.8;
  background-image:
    radial-gradient(ellipse 5px 2.9px at 34% 30%, rgba(255, 171, 170, 0.3) 0 56%, transparent 100%),
    radial-gradient(ellipse 3.2px 5px at 72% 66%, rgba(243, 124, 123, 0.26) 0 56%, transparent 100%),
    radial-gradient(ellipse 4.2px 2.2px at 14% 82%, rgba(242, 217, 160, 0.24) 0 58%, transparent 100%),
    radial-gradient(circle 4.2rem at 30% 72%, transparent 0 44%, rgba(242, 217, 160, 0.055) 70%, transparent 92%);
  background-size: 17rem 15rem, 23rem 21rem, 13rem 14rem, 62rem 54rem;
  background-position: 0 0, 4rem 3rem, 9rem 7rem, 6rem 4rem;
  background-repeat: repeat;
  animation: nearStarDrift 82s linear infinite alternate, nearStarTwinkle 6.2s ease-in-out infinite;
}

/* ---------------------------------------------------------------------------
   THE PAPER LACE. .night-sky__aurora is the shared ground element — the July
   city skyline, October's tilled field — and February's is the die-cut lace
   edging off a Victorian valentine, running along the foot of the viewport.

   It is built dark on purpose. Real paper lace is cream, and cream lace behind
   cream body copy is unreadable, so the construction is inverted: the hem is a
   deep wine wash (13.4:1 for cream text sitting on it), and the cream only
   appears as THIN shapes — scallop crests at 0.17, eyelet rings at 0.24, picot
   dots at 0.42. Type crosses a hairline, never a field.

   Seven layers, all static, all repeat-x, every one positioned off the four
   lace vars in the token block:

     1  picot dots      gold pinpricks along the crest of the near scallops
     2  eyelet rings    punched rings in the hem — a ring, not a disc, so the
                        velvet shows through the middle the way an eyelet does
     3  punched holes   near-black discs in the hem; painting the GROUND colour
                        over a translucent hem is how you cut a hole in a
                        background-image, since layers can only union
     4  scallop row A   cream half-discs, radius R on a 2R tile — an exact fit,
                        so the bumps meet tangentially with no flat between them
     5  scallop row B   rose half-discs at 1.25R on a 2.5R tile — also exact,
                        but a different pitch, so the two rows beat against each
                        other the way the concentric rings of a real doily do
     6  selvedge        one gold hairline capping the hem
     7  hem             the wine wash itself
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] .night-sky__aurora {
  display: block;
  z-index: 2;
  left: 0;
  right: 0;
  top: auto;
  bottom: 0;
  inset-block-start: auto;
  height: var(--feb-lace-h);
  /* The skyline polygon and its magenta bloom are July furniture. */
  clip-path: none;
  box-shadow: none;
  background-color: transparent;
  background-image:
    radial-gradient(circle 1.4px at 50% 50%, rgba(242, 217, 160, 0.36) 0 82%, transparent 100%),
    radial-gradient(circle 3.2px at 50% 50%, transparent 0 44%, rgba(247, 228, 210, 0.15) 54% 76%, transparent 86%),
    radial-gradient(circle 1.8px at 50% 50%, rgba(19, 5, 5, 0.45) 0 84%, transparent 100%),
    radial-gradient(circle var(--feb-scallop) at 50% 100%, rgba(247, 228, 210, 0.11) 0 94%, transparent 100%),
    radial-gradient(circle calc(var(--feb-scallop) * 1.25) at 50% 100%, rgba(255, 146, 146, 0.075) 0 94%, transparent 100%),
    linear-gradient(rgba(232, 180, 92, 0.28), rgba(232, 180, 92, 0.28)),
    linear-gradient(180deg, rgba(93, 20, 19, 0.4) 0%, rgba(59, 12, 12, 0.84) 58%, rgba(39, 7, 7, 0.94) 100%);
  background-size:
    calc(var(--feb-scallop) * 2) 4px,
    calc(var(--feb-scallop) * 2) 9px,
    15px 7px,
    calc(var(--feb-scallop) * 2) var(--feb-scallop),
    calc(var(--feb-scallop) * 2.5) calc(var(--feb-scallop) * 1.25),
    100% 1px,
    100% var(--feb-hem);
  background-position:
    left 0 bottom calc(var(--feb-hem) + var(--feb-scallop) + 1px),
    left 0 bottom 4px,
    left 7px bottom calc(var(--feb-hem) - 9px),
    left 0 bottom var(--feb-hem),
    left calc(var(--feb-scallop) * -0.6) bottom var(--feb-hem),
    left 0 bottom var(--feb-hem),
    left 0 bottom 0;
  background-repeat: repeat-x;
}

/* ---------------------------------------------------------------------------
   HEARTS, in pure CSS, as repeatable background layers.

   A heart is two lobes and a V. The lobes are easy — a radial-gradient with an
   explicit radius is a circle. The V is the interesting part, because a
   background layer list can only UNION shapes, never intersect them, so the
   usual "two crossed linear-gradients" trick cannot cut a triangle.

   A conic-gradient can. Put the centre at the BOTTOM of its own tile and colour
   a wedge symmetric about north:

       conic-gradient(from -37deg at Xpx 100%, C 0 74deg, transparent 74deg)

   Angles run clockwise from north, so 0 rotated back by 37deg colours the range
   -37deg…+37deg — all of which point UP. Every direction below the centre falls
   outside the range and stays transparent, and the tile's own top edge cuts the
   wedge off. The result is an exact triangle: apex at the bottom, base along
   the top. 37deg is not arbitrary — tan(37deg) = 0.754, so a wedge 0.66 units
   tall is 0.996 units wide at its base, which is precisely the width of the two
   lobes above it. The seam is invisible.

   Each of the three layers is sized to the ROW PERIOD, not to the heart, and
   the heart's own geometry is expressed in lengths inside the gradient. That is
   what lets one heart repeat every 96px instead of every 15px. All positions
   are `bottom`-anchored so the row sits at a fixed height above the hem no
   matter what the band's height is.

   Two rows: gold hearts at 15px on a 96px pitch, rose hearts at 10px on a 67px
   pitch. The periods share no useful factor, so the rows never stack up.

   If a browser is old enough to not know conic-gradient the whole declaration
   is dropped and the hearts simply do not appear — the lace, the roses and the
   page are all still there, which is the correct fallback.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] .night-sky__aurora::before,
body[data-theme-id="february"] .night-sky__aurora::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background-repeat: repeat-x;
}

body[data-theme-id="february"] .night-sky__aurora::before {
  background-image:
    /* gold row — left lobe, right lobe, V */
    radial-gradient(circle calc(var(--feb-heart) * 0.27) at calc(var(--feb-heart) * 0.27) 50%, rgba(242, 217, 160, 0.34) 0 86%, transparent 100%),
    radial-gradient(circle calc(var(--feb-heart) * 0.27) at calc(var(--feb-heart) * 0.73) 50%, rgba(242, 217, 160, 0.34) 0 86%, transparent 100%),
    conic-gradient(from -37deg at calc(var(--feb-heart) * 0.5) 100%, rgba(242, 217, 160, 0.34) 0 74deg, transparent 74deg),
    /* rose row — left lobe, right lobe, V */
    radial-gradient(circle calc(var(--feb-heart-sm) * 0.27) at calc(var(--feb-heart-sm) * 0.27) 50%, rgba(255, 146, 146, 0.3) 0 86%, transparent 100%),
    radial-gradient(circle calc(var(--feb-heart-sm) * 0.27) at calc(var(--feb-heart-sm) * 0.73) 50%, rgba(255, 146, 146, 0.3) 0 86%, transparent 100%),
    conic-gradient(from -37deg at calc(var(--feb-heart-sm) * 0.5) 100%, rgba(255, 146, 146, 0.3) 0 74deg, transparent 74deg);
  background-size:
    var(--feb-heart-gap) calc(var(--feb-heart) * 0.54),
    var(--feb-heart-gap) calc(var(--feb-heart) * 0.54),
    var(--feb-heart-gap) calc(var(--feb-heart) * 0.66),
    var(--feb-heart-sm-gap) calc(var(--feb-heart-sm) * 0.54),
    var(--feb-heart-sm-gap) calc(var(--feb-heart-sm) * 0.54),
    var(--feb-heart-sm-gap) calc(var(--feb-heart-sm) * 0.66);
  background-position:
    left 18px bottom calc(var(--feb-hem) + var(--feb-scallop) + 22px + var(--feb-heart) * 0.39),
    left 18px bottom calc(var(--feb-hem) + var(--feb-scallop) + 22px + var(--feb-heart) * 0.39),
    left 18px bottom calc(var(--feb-hem) + var(--feb-scallop) + 22px),
    left 51px bottom calc(var(--feb-hem) + var(--feb-scallop) + 44px + var(--feb-heart-sm) * 0.39),
    left 51px bottom calc(var(--feb-hem) + var(--feb-scallop) + 44px + var(--feb-heart-sm) * 0.39),
    left 51px bottom calc(var(--feb-hem) + var(--feb-scallop) + 44px);
}

/* ---------------------------------------------------------------------------
   THE ROSES, appliquéd onto the lace crest — a full bloom, a bud beside it, two
   fallen petals, and two leaf tips showing from underneath.

   A rose seen face-on is concentric whorls of petal, and concentric is what a
   radial-gradient gives for free. Two details do the actual work:

     · The stops are SOFT, not hard. A hard-stopped ring stack is a dartboard.
       Letting each whorl blend into the next reads as petal shading instead,
       which is the difference between an archery target and a flower.
     · The inner whorl is a second gradient OFFSET up and left of the first, so
       the centre of the bloom is not the centre of the disc. No real rose is
       radially symmetric, and that single offset is what sells it at 30px.

   The leaves are declared LAST, so the bloom paints over them and only their
   tips show — which is the whole reason they work. Drawn on top and at full
   length, a sage ellipse at this size does not read as a leaf, it reads as a
   grey bar; the first pass of this theme proved that, along with a dashed vine
   that read as a stray horizontal rule. Both are gone. Nothing in this band is
   a straight line any more.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] .night-sky__aurora::after {
  background-image:
    /* inner whorl, offset up and left of the disc centre */
    radial-gradient(
      circle calc(var(--feb-bloom) * 0.17) at calc(var(--feb-bloom) * 0.62) 43%,
      rgba(255, 207, 207, 0.32) 0 18%,
      rgba(216, 56, 53, 0.38) 64%,
      transparent 100%
    ),
    /* outer petals — four soft whorls */
    radial-gradient(
      circle calc(var(--feb-bloom) * 0.5) at calc(var(--feb-bloom) * 0.72) 50%,
      rgba(255, 146, 146, 0.24) 0 14%,
      rgba(177, 37, 37, 0.26) 34%,
      rgba(255, 171, 170, 0.22) 52%,
      rgba(177, 37, 37, 0.22) 70%,
      rgba(255, 146, 146, 0.14) 88%,
      transparent 100%
    ),
    /* the bud */
    radial-gradient(
      circle calc(var(--feb-bloom) * 0.19) at calc(var(--feb-bloom) * 1.46) 64%,
      rgba(255, 171, 170, 0.22) 0 20%,
      rgba(177, 37, 37, 0.24) 60%,
      transparent 100%
    ),
    /* two fallen petals, different aspect so they read as different angles */
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.13) calc(var(--feb-bloom) * 0.07) at calc(var(--feb-bloom) * 0.1) 24%, rgba(255, 171, 170, 0.24) 0 62%, transparent 100%),
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.08) calc(var(--feb-bloom) * 0.13) at calc(var(--feb-bloom) * 1.92) 32%, rgba(255, 207, 207, 0.2) 0 62%, transparent 100%),
    /* leaf tips, mostly hidden under the bloom above */
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.22) calc(var(--feb-bloom) * 0.09) at calc(var(--feb-bloom) * 0.28) 80%, rgba(140, 170, 118, 0.26) 0 64%, transparent 100%),
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.19) calc(var(--feb-bloom) * 0.08) at calc(var(--feb-bloom) * 1.14) 74%, rgba(140, 170, 118, 0.22) 0 64%, transparent 100%);
  background-size:
    var(--feb-bloom-gap) var(--feb-bloom),
    var(--feb-bloom-gap) var(--feb-bloom),
    var(--feb-bloom-gap) var(--feb-bloom),
    var(--feb-bloom-gap) var(--feb-bloom),
    var(--feb-bloom-gap) var(--feb-bloom),
    var(--feb-bloom-gap) var(--feb-bloom),
    var(--feb-bloom-gap) var(--feb-bloom);
  background-position:
    left 14px bottom calc(var(--feb-hem) + 2px),
    left 14px bottom calc(var(--feb-hem) + 2px),
    left 14px bottom calc(var(--feb-hem) + 2px),
    left 14px bottom calc(var(--feb-hem) + 2px),
    left 14px bottom calc(var(--feb-hem) + 2px),
    left 14px bottom calc(var(--feb-hem) + 2px),
    left 14px bottom calc(var(--feb-hem) + 2px);
}

/* Fireworks are Independence Day furniture: July theme only. The JS also refuses
   to spawn them off-July, so this is belt-and-braces for any burst already on
   screen when the theme is switched. */
body[data-theme-id="february"] .night-sky__fireworks {
  display: none;
}

/* ---------------------------------------------------------------------------
   THE CARD. The breadcrumb bar is the one element allowed its own background,
   so it is where the valentine itself gets built: rose-wine card stock, a
   brocade trellis pressed into it, gold nodes at the crossings, and a row of
   embossed lace scallops along the head and the foot.

   Six layers, all static:
     1  head lace     cream half-discs hanging from the top edge
     2  foot lace     the same, offset half a period, one step quieter
     3  brocade nodes gold pinpricks on a 36×32 lattice
     4  trellis, +58  hairline diagonals
     5  trellis, -58  the crossing pair — together they read as damask
     6  card stock    the fill, darkening toward the foot

   The stock is kept dark (#301019 at the head) so the crimson tarot numeral and
   keyline clear 4.7:1 against it. A lighter, prettier rose card stock was the
   first attempt and it put the numeral at 4.0:1, which is a fail. The blush is
   spent on the ornament instead — which is the rule this whole theme is built
   on. */
body[data-theme-id="february"] .breadcrumb-nav {
  background-color: #270c0c;
  background-image:
    radial-gradient(circle 7px at 50% 0, rgba(247, 228, 210, 0.13) 0 92%, transparent 100%),
    radial-gradient(circle 7px at 50% 100%, rgba(247, 228, 210, 0.1) 0 92%, transparent 100%),
    radial-gradient(circle 1.5px at 50% 50%, rgba(242, 217, 160, 0.14) 0 78%, transparent 100%),
    repeating-linear-gradient(58deg, rgba(255, 146, 146, 0.055) 0 1px, transparent 1px 18px),
    repeating-linear-gradient(-58deg, rgba(255, 146, 146, 0.055) 0 1px, transparent 1px 18px),
    linear-gradient(180deg, #311010 0%, #270c0c 52%, #1e0808 100%);
  background-size:
    14px 7px,
    14px 7px,
    36px 32px,
    auto,
    auto,
    100% 100%;
  background-position:
    left 0 top 0,
    left 7px bottom 0,
    18px 16px,
    0 0,
    0 0,
    left top;
  background-repeat: repeat-x, repeat-x, repeat, repeat, repeat, no-repeat;
  /* Foil edge at the head, shadow at the foot, and a rose bloom off the card. */
  box-shadow:
    inset 0 1px 0 rgba(242, 217, 160, 0.3),
    inset 0 -1px 0 rgba(19, 5, 5, 0.7),
    0 0 22px rgba(245, 66, 63, 0.14);
}

/* The existing sweep becomes light travelling across satin. Same element, same
   animation, same duration — only the colours move from July's cyan/hotpink to
   this month's cream and rose. */
body[data-theme-id="february"] .breadcrumb-nav::before {
  background: linear-gradient(
    90deg,
    transparent,
    rgba(247, 228, 210, 0.22),
    rgba(255, 146, 146, 0.16),
    transparent
  );
}

/* The card's numeral. --tt-red is 4.7:1 on the stock, which passes, but the
   numeral sets at 0.66rem and a hairline serif at ten pixels wants more margin
   than that — so the date takes the carmine one step up, at 5.8:1. */
body[data-theme-id="february"] .tarot-card__numeral-date {
  color: var(--feb-carmine);
}

/* Same reasoning for the astrolabe: the current sign is 8.6px of SVG text, so
   it goes to the brighter red rather than the structural one. */
body[data-theme-id="february"] .zodiac-clock .zc-glyph--current {
  fill: var(--feb-carmine);
}

/* ---------------------------------------------------------------------------
   THE ZODIAC CHIPS CARRY NO BORDER, ON THIS THEME OR ANY OTHER.

   Restated here as a pin, per the permanent note on .celestial-chip in
   main.css. Their hover and focus affordance is the halo cast from
   --zodiac-glow at the top of this file, which is drawn on the GLYPH — a
   text-shadow follows the outline of ♌ and a drop-shadow follows the moon's
   SVG path, and neither one can render as a rectangle. A box-shadow on the chip
   can and does, which is why the property is nailed to `none` here.

   This exists so that nothing added to this sheet later can reach the strip by
   accident. Every chip is an <a href> into the vault today, the moon included,
   but the pin is written against the bare class and is never element-qualified:
   the strip ran mixed once and can again, and a class cannot be bitten by it.

   `transform` is deliberately NOT pinned. February's chrome moves; the chips
   should lift on hover exactly as main.css says they do, and leaving transform
   alone lets the reduced-motion block cancel that lift at its own weight.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] .celestial-chip,
body[data-theme-id="february"] .celestial-chip:hover,
body[data-theme-id="february"] .celestial-chip:focus-visible {
  border: 0;
  box-shadow: none;
  outline: none;
}

/* ---------------------------------------------------------------------------
   HEADER
   --------------------------------------------------------------------------- */

body[data-theme-id="february"] .brand a {
  text-shadow:
    0 0 10px rgba(232, 180, 92, 0.56),
    0 0 26px rgba(245, 66, 63, 0.32),
    0 0 48px rgba(198, 145, 142, 0.2);
}

body[data-theme-id="february"] .brand a:hover {
  text-shadow:
    0 0 12px rgba(242, 217, 160, 0.86),
    0 0 32px rgba(245, 66, 63, 0.46),
    0 0 66px rgba(255, 146, 146, 0.24);
}

/* The time bar is the little printed strip along a card's edge: wider caps, a
   foil top edge, a shadow under it. Selected by class, so it cannot reach the
   chips that share the bar with it. */
body[data-theme-id="february"] .time-bar {
  letter-spacing: 0.16em;
  box-shadow:
    inset 0 1px 0 rgba(242, 217, 160, 0.22),
    inset 0 -1px 0 rgba(19, 5, 5, 0.5);
}

/* ---------------------------------------------------------------------------
   HEADINGS — the engraved card.
   --------------------------------------------------------------------------- */

/* H1 is the inscription. English roundhand is the hand a Victorian valentine
   was actually written in, and Snell Roundhand ships on every Mac while
   Edwardian Script and Palace Script cover Office installs on Windows; the
   locked cursive stack from main.css closes the chain, so there is always
   something joined-up to fall back to. Weight 700 matters: these letters are
   painted with background-clip:text, and a hairline script leaves the gradient
   nowhere to show. The synthesised italic main.css applies is cancelled — every
   face in the stack already slants, and doubling the slant smears it at display
   size. Only markdown H1 is touched; the brand wordmark keeps its own stack. */
body[data-theme-id="february"] main h1,
body[data-theme-id="february"] .page-title {
  font-family: "Snell Roundhand", "Apple Chancery", "Palace Script MT", "Edwardian Script ITC", "Segoe Script", "Lucida Handwriting", "Brush Script MT", cursive;
  font-style: normal;
  font-weight: 700;
  letter-spacing: 0.015em;
}

/* Every heading's bloom goes warm. main.css casts a cyan one here, which is
   July's colour and has been leaking onto this month. It has to stay a BLURRED
   shadow: these letters are clipped backgrounds, and a hard-edged shadow renders
   through the transparent glyph and buries the gradient under a flat block. */
body[data-theme-id="february"] main h1,
body[data-theme-id="february"] .page-title,
body[data-theme-id="february"] main h2,
body[data-theme-id="february"] main h3,
body[data-theme-id="february"] main h4,
body[data-theme-id="february"] main h5,
body[data-theme-id="february"] main h6,
body[data-theme-id="february"] .markdown-page .heading-section__trigger {
  text-shadow:
    0 0 14px rgba(245, 66, 63, 0.24),
    0 0 34px rgba(232, 180, 92, 0.12);
}

/* H2 down: the didone, tracked open a touch. A didone's thick stems and
   hairline serifs need air or the hairlines fill in at small sizes. The trigger
   selectors are stated explicitly because main.css sizes those at (0,3,0) and
   would otherwise outrank a bare `main h2`. */
body[data-theme-id="february"] main h2,
body[data-theme-id="february"] main h3,
body[data-theme-id="february"] main h4,
body[data-theme-id="february"] main h5,
body[data-theme-id="february"] main h6 {
  letter-spacing: 0.018em;
  font-weight: 700;
}

body[data-theme-id="february"] main h3,
body[data-theme-id="february"] .heading-section--level-3 > .heading-section__summary > .heading-section__trigger {
  letter-spacing: 0.04em;
}

/* ---------------------------------------------------------------------------
   The H2 flourish — the same heart recipe as the lace, at nine pixels, with a
   gold rule running off it. Four layers on a 9px-tall block:
     lobe, lobe, V, rule.

   Scoped to .markdown-page so it lands on prose headings only and never under
   a .hero-card h2 on the index, where it would just be noise. It is left
   aligned rather than centred: the collapsible trigger takes a small left
   indent on hover, and a centred ornament would slide under a heading that is
   itself sliding, which twitches. Left aligned, it simply travels with the
   heading it belongs to.

   No content but the empty string, so the inherited
   -webkit-text-fill-color: transparent from the clipped heading has nothing to
   act on, and background-clip is not an inherited property — the ::after box
   paints its own background normally.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] .markdown-page h2::after {
  content: "";
  display: block;
  width: min(11rem, 46%);
  height: 9px;
  margin: 0.55rem 0 0;
  background-image:
    radial-gradient(circle 2.4px at 2.4px 50%, var(--feb-crimson) 0 88%, transparent 100%),
    radial-gradient(circle 2.4px at 6.6px 50%, var(--feb-crimson) 0 88%, transparent 100%),
    conic-gradient(from -37deg at 4.5px 100%, var(--feb-crimson) 0 74deg, transparent 74deg),
    linear-gradient(90deg, rgba(232, 180, 92, 0.6) 0 58%, transparent 100%);
  background-size: 9px 4.9px, 9px 4.9px, 9px 6px, calc(100% - 15px) 1px;
  background-position:
    left 0 bottom 3.5px,
    left 0 bottom 3.5px,
    left 0 bottom 0,
    left 15px bottom 3.5px;
  background-repeat: no-repeat;
}

/* The section rails and the table-of-contents rail take a rose bloom instead of
   July's cyan filament. The gradient itself comes from the vertical token, so
   both are already crimson-led. */
body[data-theme-id="february"] .heading-section::before {
  box-shadow: 0 0 10px rgba(245, 66, 63, 0.3);
}

body[data-theme-id="february"] .page-toc::before {
  box-shadow: 0 0 8px rgba(245, 66, 63, 0.2);
}

body[data-theme-id="february"] .page-toc .page-toc__title {
  color: var(--feb-gold);
  letter-spacing: 0.16em;
}

/* ---------------------------------------------------------------------------
   LINKS. main.css leaves a link the same colour as body copy and marks it only
   on hover, which is thin. Here the resting state is its own colour — rose at
   8.9:1, a full hue away from the cream body copy at 15.5:1 — so a link is
   identifiable without moving the pointer. Hover lifts it to foil, which is
   both brighter and a different metal, so the change is unmissable at any
   colour vision. Scoped to main so the brand, the breadcrumb trail and the
   theme picker keep their own colours.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] main a {
  color: var(--feb-rose);
}

/* Hover colour is --link-hover, standing user rule 2026-08-14: #FF465A on
   every theme, not --feb-foil any more — "the change is unmissable at any
   colour vision" above still holds, rose resting to a red-family hover is a
   hue AND lightness move. The rose-gold glow below is independent art and is
   left as it was. */
body[data-theme-id="february"] a:hover,
body[data-theme-id="february"] a:focus-visible {
  color: var(--link-hover);
  text-shadow:
    0 0 8px rgba(255, 146, 146, 0.8),
    0 0 16px rgba(245, 66, 63, 0.56),
    0 0 28px rgba(232, 180, 92, 0.3);
  animation: februaryLinkRoseGlow 1.05s ease-in-out infinite alternate;
}

/* A read link goes dusty — mauve at 7.1:1, still comfortably legible, just one
   step off the live rose. The dark inner stop keeps it from smearing into the
   bokeh behind it. */
body[data-theme-id="february"] a:visited {
  color: var(--feb-mauve);
  text-shadow:
    0 0 3px rgba(19, 5, 5, 0.95),
    0 0 10px rgba(198, 145, 142, 0.6),
    0 0 18px rgba(19, 5, 5, 0.86);
}

/* The eyebrow is the printer's line along the head of a card: small, wide, warm. */
body[data-theme-id="february"] .eyebrow {
  letter-spacing: 0.3em;
  text-shadow: 0 0 10px rgba(232, 146, 122, 0.4);
}

/* Highlight becomes gold leaf brushed under the words rather than a block
   behind them — a hard stop at 58% means the wash sits on the baseline and the
   letters stay on the page ground, so nothing has to be re-checked for
   contrast. */
body[data-theme-id="february"] mark {
  background: linear-gradient(180deg, transparent 0 56%, rgba(232, 180, 92, 0.3) 56% 96%, transparent 96%);
  color: var(--feb-foil);
  text-shadow: 0 0 8px rgba(232, 180, 92, 0.3);
}

/* ---------------------------------------------------------------------------
   SURFACES. Every element below already had a fill or a frame in main.css. Each
   one gains a warm tint, a lit edge, or both. Nothing gains a background it did
   not already have — there is one shared site background and the card above is
   its only exception.
   --------------------------------------------------------------------------- */

/* Rose-washed paper for the input and code surfaces. 13.7:1 for cream on the
   composited tint, so a code block is if anything easier to read than the page.
   Inline <code> is left without the lit edge on purpose: an inline box
   fragments across line breaks and the hairline would break with it. */
body[data-theme-id="february"] input,
body[data-theme-id="february"] textarea,
body[data-theme-id="february"] select,
body[data-theme-id="february"] code,
body[data-theme-id="february"] pre {
  background-color: rgba(93, 20, 19, 0.45);
  background-image: linear-gradient(
    180deg,
    rgba(247, 228, 210, 0.06) 0%,
    rgba(247, 228, 210, 0.015) 30%,
    rgba(19, 5, 5, 0) 56%,
    rgba(19, 5, 5, 0.18) 100%
  );
  color: var(--feb-cream);
}

body[data-theme-id="february"] input,
body[data-theme-id="february"] textarea,
body[data-theme-id="february"] select,
body[data-theme-id="february"] pre {
  box-shadow:
    inset 0 1px 0 rgba(247, 228, 210, 0.14),
    inset 0 -1px 0 rgba(19, 5, 5, 0.5);
}

/* A code block is one sheet, not one per line: the wash and the lit edge belong
   to the <pre> and the <code> inside it stays clear. Stated explicitly because
   the tinted-surface rule above outranks main.css's `pre code`. */
body[data-theme-id="february"] pre code {
  background-color: transparent;
  background-image: none;
  box-shadow: none;
}

/* The table header is the ribbon banner across the card: a deep wine band with
   the title stamped in foil. 9.7:1. The band is the month's own dark red rather
   than a neutral, which is what keeps the red anchor visible in a data table.
   The gloss is an overlay on top of the fill rather than a second hex, so the
   bar can never drift off the palette if the wine is ever retuned. */
body[data-theme-id="february"] th {
  background-color: var(--feb-wine-lit);
  background-image: linear-gradient(
    180deg,
    rgba(247, 228, 210, 0.12) 0%,
    rgba(247, 228, 210, 0.03) 46%,
    rgba(19, 5, 5, 0.1) 54%,
    rgba(19, 5, 5, 0.24) 100%
  );
  color: var(--feb-foil);
  font-family: var(--font-heading);
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

body[data-theme-id="february"] td {
  color: var(--feb-blush);
}

/* Cards keep their foil frame and gain a lit top edge and a rose bloom, moved
   off July's purple. Selected by class so nothing here can reach the chips. */
body[data-theme-id="february"] .hero-card,
body[data-theme-id="february"] .folder-section {
  box-shadow:
    inset 0 1px 0 rgba(242, 217, 160, 0.16),
    0 0 20px rgba(245, 66, 63, 0.1);
}

body[data-theme-id="february"] .hero-card:hover,
body[data-theme-id="february"] .folder-section:hover {
  border-color: rgba(255, 146, 146, 0.5);
  box-shadow:
    inset 0 1px 0 rgba(242, 217, 160, 0.32),
    0 0 26px rgba(245, 66, 63, 0.18);
}

body[data-theme-id="february"] .sitemap-link:hover,
body[data-theme-id="february"] .calendar-app__nav:hover,
body[data-theme-id="february"] .calendar-app__today:hover,
body[data-theme-id="february"] .sitemap-link:focus-visible,
body[data-theme-id="february"] .calendar-app__nav:focus-visible,
body[data-theme-id="february"] .calendar-app__today:focus-visible {
  color: var(--feb-foil);
  background: rgba(245, 66, 63, 0.12);
  box-shadow:
    inset 0 1px 0 rgba(242, 217, 160, 0.3),
    0 0 16px rgba(245, 66, 63, 0.22);
}

/* No left rule on quotes — border-left is reserved for anchors inside a list,
   and a blockquote is neither. The mark is the inset wash, moved from July's
   green to a rose, plus the italic a verse is set in on a valentine. */
body[data-theme-id="february"] blockquote {
  color: var(--feb-blush);
  font-style: italic;
  box-shadow: inset 1.1rem 0 1.5rem -1.2rem rgba(255, 146, 146, 0.55);
}

/* Tags are the little printed labels off a card's back. */
body[data-theme-id="february"] .tag {
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

/* The footer sits over the lace band, whose hem composites to about #3c0e1b.
   The muted shade only reaches 7.4:1 there, which passes, but the blush is the
   safer read against the eyelets and picots crossing it. */
body[data-theme-id="february"] footer {
  color: var(--feb-blush);
  letter-spacing: 0.14em;
}

/* No list marker and no rose halo — unordered lists carry nothing at rest or on
   hover, sheet-wide. */

/* ---------------------------------------------------------------------------
   The calendar's event links are one of the only two places in the whole
   stylesheet allowed a left border — they are anchors inside a list, and the
   border doubles as the category swatch. Only the COLOURS are restated here;
   the border itself is main.css's and stays exactly where it is. Every other
   element in this file marks its edge with a frame, a wash or a shadow.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"] .calendar-event__link {
  color: var(--feb-blush);
  border-left-color: var(--feb-crimson);
  background: rgba(245, 66, 63, 0.1);
}

body[data-theme-id="february"] .calendar-event__link:hover,
body[data-theme-id="february"] .calendar-event__link:focus-visible {
  color: var(--feb-foil);
  background: rgba(232, 180, 92, 0.14);
}

body[data-theme-id="february"] .calendar-event[data-category="running"] .calendar-event__link { border-left-color: var(--feb-rosegold); background: rgba(232, 146, 122, 0.1); }

body[data-theme-id="february"] .calendar-event[data-category="hiking"] .calendar-event__link { border-left-color: var(--feb-sage); background: rgba(169, 194, 148, 0.1); }

body[data-theme-id="february"] .calendar-event[data-category="food"] .calendar-event__link { border-left-color: var(--feb-gold); background: rgba(232, 180, 92, 0.1); }

body[data-theme-id="february"] .calendar-event[data-category="growing"] .calendar-event__link,
body[data-theme-id="february"] .calendar-event[data-category="gardening"] .calendar-event__link { border-left-color: var(--feb-sage); background: rgba(169, 194, 148, 0.12); }

body[data-theme-id="february"] .calendar-event[data-category="observance"] .calendar-event__link { border-left-color: var(--feb-mauve); background: rgba(198, 145, 142, 0.12); }

/* Also a list anchor, so it also keeps its left border. */
body[data-theme-id="february"] .calendar-subscribe__action {
  color: var(--feb-blush);
  border-left-color: var(--feb-rose);
  background: rgba(255, 146, 146, 0.1);
}

body[data-theme-id="february"] .calendar-subscribe__action--download {
  border-left-color: var(--feb-gold);
  background: rgba(232, 180, 92, 0.1);
}

body[data-theme-id="february"] .calendar-subscribe__action:hover,
body[data-theme-id="february"] .calendar-subscribe__action:focus-visible {
  color: var(--feb-foil);
  background: rgba(245, 66, 63, 0.16);
}

/* Today's cell is marked in the month's red rather than July's yellow. */
body[data-theme-id="february"] .calendar-day--today {
  background: rgba(245, 66, 63, 0.09);
  box-shadow: inset 0 0 0 1px var(--feb-crimson);
}

body[data-theme-id="february"] .calendar-day--today .calendar-day__number {
  color: var(--feb-carmine);
}

/* The scrollbar is the last piece of trim: a rose rail lit down one side, gold
   under the pointer. */
body[data-theme-id="february"]::-webkit-scrollbar-thumb,
body[data-theme-id="february"] ::-webkit-scrollbar-thumb {
  background-image: linear-gradient(
    90deg,
    rgba(255, 146, 146, 0.4) 0%,
    rgba(245, 66, 63, 0.24) 44%,
    rgba(19, 5, 5, 0.34) 100%
  );
}

/* ---------------------------------------------------------------------------
   Mobile. The lace is the only thing on the page with a fixed pixel geometry,
   and every piece of it is derived from the vars below, so rescaling those
   four numbers rescales the entire ground band — scallops, eyelets, holes,
   hearts and roses all move together and nothing has to be repositioned by
   hand. The band also loses about a third of its height, so it does not eat
   a phone viewport, and the H2 flourish shortens with it.
   --------------------------------------------------------------------------- */
@media (max-width: 800px) {
  body[data-theme-id="february"] {
    --feb-lace-h: 5rem;
    --feb-hem: 1.25rem;
    --feb-scallop: 8px;
    --feb-heart: 11px;
    --feb-heart-gap: 68px;
    --feb-heart-sm: 7px;
    --feb-heart-sm-gap: 47px;
    --feb-bloom: 21px;
    --feb-bloom-gap: 118px;
  }

  /* The two heart rows sit at fixed pixel offsets above the scallop crest, and
     at the smaller lace those offsets have to come down with everything else or
     the upper row floats off the top of the band. */
  body[data-theme-id="february"] .night-sky__aurora::before {
    background-position:
      left 12px bottom calc(var(--feb-hem) + var(--feb-scallop) + 16px + var(--feb-heart) * 0.39),
      left 12px bottom calc(var(--feb-hem) + var(--feb-scallop) + 16px + var(--feb-heart) * 0.39),
      left 12px bottom calc(var(--feb-hem) + var(--feb-scallop) + 16px),
      left 36px bottom calc(var(--feb-hem) + var(--feb-scallop) + 32px + var(--feb-heart-sm) * 0.39),
      left 36px bottom calc(var(--feb-hem) + var(--feb-scallop) + 32px + var(--feb-heart-sm) * 0.39),
      left 36px bottom calc(var(--feb-hem) + var(--feb-scallop) + 32px);
  }

  /* Eyelets and punched holes are absolute sizes inside a hem that just lost
     7px, so they shrink too rather than crowding it. */
  body[data-theme-id="february"] .night-sky__aurora {
    background-size:
      calc(var(--feb-scallop) * 2) 3px,
      calc(var(--feb-scallop) * 2) 8px,
      12px 6px,
      calc(var(--feb-scallop) * 2) var(--feb-scallop),
      calc(var(--feb-scallop) * 2.5) calc(var(--feb-scallop) * 1.25),
      100% 1px,
      100% var(--feb-hem);
    background-position:
      left 0 bottom calc(var(--feb-hem) + var(--feb-scallop) + 1px),
      left 0 bottom 3px,
      left 6px bottom calc(var(--feb-hem) - 7px),
      left 0 bottom var(--feb-hem),
      left calc(var(--feb-scallop) * -0.6) bottom var(--feb-hem),
      left 0 bottom var(--feb-hem),
      left 0 bottom 0;
  }

  body[data-theme-id="february"] .markdown-page h2::after {
    width: min(7.5rem, 52%);
  }

  /* The didone's tracking comes off a little at phone width: a hairline serif
     at 1.35rem does not need the extra air, and the heading fits one more word
     per line without it. */
  body[data-theme-id="february"] main h2,
  body[data-theme-id="february"] main h3 {
    letter-spacing: 0.01em;
  }
}

/* ---------------------------------------------------------------------------
   Reduced motion. Month blocks set their ambient motion on higher-specificity
   selectors than the generic .night-sky rules, so they need their own entry
   here or main.css's block never reaches them.

   Everything stops where it stands. Every bokeh light, spark and petal is still
   painted, so the first frame and the final frame are the same complete
   picture — only the travel is removed. The lace, the hearts and the roses
   never moved in the first place.
   --------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  body[data-theme-id="february"] .night-sky::before,
  body[data-theme-id="february"] .night-sky__stars--far,
  body[data-theme-id="february"] .night-sky__stars--near {
    animation: none !important;
    transform: none !important;
  }

  body[data-theme-id="february"] a:hover,
  body[data-theme-id="february"] a:focus-visible {
    animation: none;
  }
}

/* ---------------------------------------------------------------------------
   Reduced data. Same selectors, plus the ambient layers are thinned rather than
   merely frozen: the soft multi-stop bokeh discs and the fine petal passes are
   the only parts of this theme that cost real fill, so on a metered or slow
   connection each depth drops to one or two shapes and holds still. What is
   left is still recognisably candlelight and petals, at a fraction of the
   paint. The lace, hearts and roses stay — they are static and they are the
   theme.
   --------------------------------------------------------------------------- */
@media (prefers-reduced-data: reduce) {
  body[data-theme-id="february"] .night-sky::before,
  body[data-theme-id="february"] .night-sky__stars--far,
  body[data-theme-id="february"] .night-sky__stars--near {
    animation: none;
    transform: none;
  }

  body[data-theme-id="february"] .night-sky::before {
    background-image:
      radial-gradient(circle at 24% 30%, rgba(255, 146, 146, 0.09) 0 20%, transparent 56%);
    background-size: 30rem 27rem;
    background-position: 0 0;
  }

  body[data-theme-id="february"] .night-sky__stars--far {
    background-image:
      radial-gradient(circle at 30% 26%, rgba(242, 217, 160, 0.6) 0 0.8px, transparent 1.3px);
    background-size: 11rem 12rem;
    background-position: 0 0;
  }

  body[data-theme-id="february"] .night-sky__stars--near {
    background-image:
      radial-gradient(ellipse 5px 2.9px at 34% 30%, rgba(255, 171, 170, 0.26) 0 56%, transparent 100%);
    background-size: 19rem 17rem;
    background-position: 0 0;
  }

  body[data-theme-id="february"] a:hover,
  body[data-theme-id="february"] a:focus-visible {
    animation: none;
  }
}

/* ===========================================================================
   FEBRUARY BY DAY.

   The valentine taken off the velvet and set down on a table by a window.

   Same card, same roses, same crimson — the difference is only that the light
   is coming from outside instead of from a candle, and everything the theme
   spends on ORNAMENT changes state accordingly: the velvet becomes blush
   paper, the die-cut lace goes back to being cream paper instead of a hole cut
   in the dark, and the foil stops being a glint and becomes gold leaf, which
   in daylight is not bright at all — it is a deep, flat ochre that only reads
   as metal because of what it is next to.

   HOW THE FLIP IS DONE, and why it is short.

   The base block routes essentially everything through the twelve --feb-*
   steps: --tt-*, --bg/--text/--border, every heading gradient, the tables, the
   links, the calendar. Custom properties resolve against the winning
   declaration on the SAME element, so redeclaring the ramp here re-lights all
   of that in one pass and the counterpart only has to patch what the sheet
   still paints with a literal rgba() — the scenery, the card and the shadows.

   The names keep their ROLE and change their value. --feb-cream is still "the
   colour body copy is set in"; by day the paper is the cream and the copy is
   not. Read every step below as its job, not as its noun, or the block looks
   like nonsense.

   THE VALUE LADDER, INVERTED. All ratios against --feb-velvet (#fbf1ef):

     cream  #3a1a18  14.12:1  body copy
     blush  #55303a  10.12:1  soft text, table cells
     shade  #6d4650   7.16:1  muted text
     foil   #6b4e07   6.96:1  gold leaf — chip glyphs, numeral, link hover
     carmine#a80c33   6.85:1  bold text, hot accent
     mauve  #77447f   6.49:1  visited links
     rose   #a82c51   6.02:1  links, breadcrumb text
     crimson#c20e3c   5.53:1  THE anchor red — borders, frames, ornament
     gold   #855b07   5.41:1  metallic accent, highlight
     rosegd #a4482e   5.34:1  eyebrow, warm accent
     sage   #46702f   5.23:1  foliage, emphasis, tags
     dusk   #b8677c   3.59:1  scrollbar and dim structure only (3:1 class)

   Every stop in every heading gradient clears 5.2:1, exactly as the night
   block promises, and the eight-stop text cycle still steps
   red > orange > ochre > gold-leaf > green > red > purple > pink, so the
   gradient reads as a gradient on paper and not as one brown smear — which is
   the failure a light mode invites, since it is much easier to land eight
   accents in the same mid band on white than on black.

   Two grounds get measured separately because type actually lands on them:
   the page foot under the lace, which composites to about #f2dfe0 and holds
   the whole ramp at 4.7:1 or better, and the card, below.
   =========================================================================== */
body[data-theme-id="february"][data-mode="day"] {
  --feb-ink: #2c0d0d;        /* still the deepest value: the hard shadow under
                                a raised edge, and the darkest ink available */
  --feb-velvet: #fbe1dc;     /* the page ground: blush paper, warm, no blue */
  --feb-wine: #fbe0e0;       /* card stock, the astrolabe's face */
  /* #fbf1ef is light: #FF465A only measures 3.02:1 here, so day takes the
     same-hue dark variant, #BD0014 — 5.96:1. */
  --link-hover: #BC0900;
  --feb-wine-lit: #edcdcd;   /* the one mid-value: table header band, lace hem */
  --feb-crimson: #c31616;    /* THE anchor red — h≈345°, s≈87%. Same hue family
                                as the night crimson, taken to ink weight so it
                                can frame and letter on paper instead of glow */
  --feb-carmine: #a91212;    /* one step DEEPER, not hotter: on a light ground
                                "more emphatic" means further from the paper */
  --feb-rose: #ab2f2e;
  --feb-rosegold: #a4482e;
  --feb-mauve: #824842;
  --feb-sage: #46702f;       /* the chromolithograph green, at printing weight */
  --feb-shade: #6f4746;
  --feb-blush: #563130;
  --feb-cream: #3a1a18;
  --feb-gold: #855b07;
  --feb-foil: #6b4e07;       /* gold leaf in daylight. Deliberately NOT a bright
                                yellow: real leaf on white paper is a dark warm
                                ochre, and it has to carry 0.66rem type on the
                                card, which a bright yellow cannot */
  --feb-dusk: #bb6868;

  /* The chips sit on the card, which runs #f6dee2 at its head to #e7c2ca at
     its foot. The night glow is a pale rose at 0.82 and would be invisible
     there, so the halo cuts the other way: a deep crimson traced around the
     glyph. Still drawn on the GLYPH by main.css — a text-shadow follows the
     outline of a ♌ and a drop-shadow follows the moon's path — so it cannot
     render as a rectangle no matter which mode is on. */
  --zodiac-glow: rgba(147, 20, 20, 0.5);
  --tt-breadcrumb-glow: rgba(171, 47, 46, 0.22);

  --border-dim: rgba(195, 22, 22, 0.3);
  --border-teal: rgba(133, 91, 7, 0.5);
  /* Cut the other way: on pale card stock the lit lip of an engraved stroke
     falls white BELOW the glyph, not black. */
  --tt-engrave: 0 1px 0 rgba(242, 230, 210, 0.75);

  background: var(--feb-velvet);
  color: var(--feb-cream);
  color-scheme: light;
}

/* The scanline is a permanent fixture and survives the flip; it only changes
   sign. A pale thread over velvet becomes a faint impression in paper — the
   laid lines of the stock rather than the weave of the cloth. Alphas stay near
   the floor because this element is fixed above the text at z-index 5. */
body[data-theme-id="february"][data-mode="day"]::before {
  background:
    repeating-linear-gradient(0deg, rgba(44, 13, 13, 0.026) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(44, 13, 13, 0.014) 0 1px, transparent 1px 5px);
}

/* ---------------------------------------------------------------------------
   THE TABLE. Same construction as the velvet — three warm pools banked along
   the foot where the lace sits, one wash from the light source, and the ground
   gradient under them — with the light source moved from a candle below to a
   window above. So the page now opens BRIGHT at the top and deepens toward the
   foot, and the reading column still sits over the calmest part of the frame.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"][data-mode="day"] .night-sky {
  background:
    radial-gradient(ellipse at 50% 112%, rgba(195, 22, 22, 0.07), transparent 40%),
    radial-gradient(ellipse at 15% 104%, rgba(133, 91, 7, 0.06), transparent 32%),
    radial-gradient(ellipse at 86% 106%, rgba(130, 72, 66, 0.05), transparent 30%),
    radial-gradient(ellipse at 64% 8%, rgba(242, 230, 210, 0.85), transparent 54%),
    linear-gradient(180deg, #f2e6d2 0%, #fbe1dc 46%, #fbe0df 78%, #f2dfdf 100%);
}

/* The far bokeh goes, and only the far bokeh. Defocused candlelight is a
   night-time optical event — a wide aperture open on a dark room — and there
   is no daylight version of it, so the layer is hidden outright rather than
   faded: an honest removal, and it stops one animated full-viewport layer
   dead, which is the cheapest thing this switch can do to a slow machine.

   The other two depths STAY, because they are not bokeh. They are petals and
   flecks of foil scattered over the table, and scattered petals read in any
   light — see the note above --far and --near in the base block. They keep the
   base block's animations untouched (no `animation` is restated anywhere in
   this counterpart) so the existing reduced-motion block still reaches them at
   its own weight. */
body[data-theme-id="february"][data-mode="day"] .night-sky::before {
  display: none;
}

/* The fine pass: leaf glints and petal flecks. Alphas roughly double, because
   a 1px mark has to be DARKER than paper to exist, where at night it only had
   to be lighter than near-black — and the eye is far less forgiving of a faint
   dark speck than of a faint bright one. */
body[data-theme-id="february"][data-mode="day"] .night-sky__stars--far {
  opacity: 0.55;
  background-image:
    radial-gradient(circle at 30% 26%, rgba(133, 91, 7, 0.5) 0 0.8px, transparent 1.3px),
    radial-gradient(ellipse 2.6px 1.4px at 68% 58%, rgba(195, 22, 22, 0.3) 0 62%, transparent 100%),
    radial-gradient(ellipse 1.5px 2.6px at 12% 78%, rgba(171, 47, 46, 0.24) 0 62%, transparent 100%),
    radial-gradient(circle at 86% 14%, rgba(107, 78, 7, 0.26) 0 0.6px, transparent 1.1px);
}

/* The near pass: petals big enough to read as petals. The fourth layer was the
   one true bokeh ring, which has nothing to be by day — a ring of defocused
   highlight is the same night-only event as the discs above. Rather than leave
   a hole in the layer list (the tile sizes and offsets are the base block's and
   are not restated here, so the count has to match), it becomes the warmth of
   the room pooling on the paper: one very wide, very faint blush disc on the
   same 62rem tile, so at most one is on screen and it is felt rather than seen.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"][data-mode="day"] .night-sky__stars--near {
  opacity: 0.6;
  background-image:
    radial-gradient(ellipse 5px 2.9px at 34% 30%, rgba(195, 22, 22, 0.2) 0 56%, transparent 100%),
    radial-gradient(ellipse 3.2px 5px at 72% 66%, rgba(171, 47, 46, 0.18) 0 56%, transparent 100%),
    radial-gradient(ellipse 4.2px 2.2px at 14% 82%, rgba(133, 91, 7, 0.18) 0 58%, transparent 100%),
    radial-gradient(circle 4.2rem at 30% 72%, rgba(232, 146, 122, 0.05) 0 46%, rgba(232, 146, 122, 0.02) 74%, transparent 92%);
}

/* ---------------------------------------------------------------------------
   THE PAPER LACE, built the right way up at last.

   The night construction is inverted on purpose and says so: real paper lace
   is cream, cream lace behind cream body copy is unreadable, so at night the
   hem is a deep wine wash and the cream only ever appears as HAIRLINES. By day
   the body copy is near-black, which removes the reason, so the band goes back
   to being what it actually is — a white paper edging lying on a blush table,
   with the crimson and the gold worked into it.

   The seven layers keep their order and their geometry exactly (nothing here
   restates background-size or background-position, so the base block's lace
   vars and the mobile rescale below both still drive it); only the colours
   swap ends:

     1  picot dots      gold, unchanged in role, now dark enough to see
     2  eyelet rings    a shadow ring rather than a lit one — a punched eyelet
                        in daylight is a rim of shade, not a highlight
     3  punched holes   painted in the TABLE colour, since what shows through a
                        hole in the lace is now the blush page, not the dark
     4  scallop row A   white paper, near-opaque, biting up into the blush
     5  scallop row B   the same at a different pitch, one step pinker, so the
                        two periods still beat against each other
     6  selvedge        the gold hairline capping the hem
     7  hem             the white wash itself, at 13.9:1 for body copy
   --------------------------------------------------------------------------- */
body[data-theme-id="february"][data-mode="day"] .night-sky__aurora {
  background-image:
    radial-gradient(circle 1.4px at 50% 50%, rgba(133, 91, 7, 0.55) 0 82%, transparent 100%),
    radial-gradient(circle 3.2px at 50% 50%, transparent 0 44%, rgba(109, 61, 61, 0.2) 54% 76%, transparent 86%),
    radial-gradient(circle 1.8px at 50% 50%, rgba(242, 223, 223, 0.95) 0 84%, transparent 100%),
    radial-gradient(circle var(--feb-scallop) at 50% 100%, rgba(242, 230, 210, 0.95) 0 94%, transparent 100%),
    radial-gradient(circle calc(var(--feb-scallop) * 1.25) at 50% 100%, rgba(251, 224, 224, 0.9) 0 94%, transparent 100%),
    linear-gradient(rgba(133, 91, 7, 0.42), rgba(133, 91, 7, 0.42)),
    linear-gradient(180deg, rgba(242, 230, 210, 0.72) 0%, rgba(242, 230, 210, 0.95) 58%, rgba(242, 230, 210, 0.99) 100%);
}

/* The hearts. Same two rows on the same two coprime pitches; the conic wedge
   and both lobes simply take ink instead of foil. */
body[data-theme-id="february"][data-mode="day"] .night-sky__aurora::before {
  background-image:
    radial-gradient(circle calc(var(--feb-heart) * 0.27) at calc(var(--feb-heart) * 0.27) 50%, rgba(133, 91, 7, 0.45) 0 86%, transparent 100%),
    radial-gradient(circle calc(var(--feb-heart) * 0.27) at calc(var(--feb-heart) * 0.73) 50%, rgba(133, 91, 7, 0.45) 0 86%, transparent 100%),
    conic-gradient(from -37deg at calc(var(--feb-heart) * 0.5) 100%, rgba(133, 91, 7, 0.45) 0 74deg, transparent 74deg),
    radial-gradient(circle calc(var(--feb-heart-sm) * 0.27) at calc(var(--feb-heart-sm) * 0.27) 50%, rgba(195, 22, 22, 0.32) 0 86%, transparent 100%),
    radial-gradient(circle calc(var(--feb-heart-sm) * 0.27) at calc(var(--feb-heart-sm) * 0.73) 50%, rgba(195, 22, 22, 0.32) 0 86%, transparent 100%),
    conic-gradient(from -37deg at calc(var(--feb-heart-sm) * 0.5) 100%, rgba(195, 22, 22, 0.32) 0 74deg, transparent 74deg);
}

/* The roses, in daylight rather than by candle — which mostly means the reds
   get their saturation back. A candle throws away the blue end and everything
   red goes orange and pale; a window does not, so the whorls run rose-madder
   into a deep carmine shadow and the leaves are a real sap green.

   The inner whorl keeps its light-centre-into-dark-edge construction and its
   offset from the disc centre — that offset is what stops the bloom reading as
   a dartboard, in either light — but its highlight is now a bright warm pink
   rather than a near-white, because near-white is the ground here and a
   highlight has to be a colour, not an absence. */
body[data-theme-id="february"][data-mode="day"] .night-sky__aurora::after {
  background-image:
    radial-gradient(
      circle calc(var(--feb-bloom) * 0.17) at calc(var(--feb-bloom) * 0.62) 43%,
      rgba(255, 197, 197, 0.6) 0 18%,
      rgba(151, 26, 25, 0.42) 64%,
      transparent 100%
    ),
    radial-gradient(
      circle calc(var(--feb-bloom) * 0.5) at calc(var(--feb-bloom) * 0.72) 50%,
      rgba(216, 61, 61, 0.3) 0 14%,
      rgba(141, 22, 19, 0.3) 34%,
      rgba(235, 122, 121, 0.28) 52%,
      rgba(141, 22, 19, 0.26) 70%,
      rgba(198, 62, 62, 0.18) 88%,
      transparent 100%
    ),
    radial-gradient(
      circle calc(var(--feb-bloom) * 0.19) at calc(var(--feb-bloom) * 1.46) 64%,
      rgba(216, 61, 61, 0.28) 0 20%,
      rgba(141, 22, 19, 0.28) 60%,
      transparent 100%
    ),
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.13) calc(var(--feb-bloom) * 0.07) at calc(var(--feb-bloom) * 0.1) 24%, rgba(216, 61, 61, 0.28) 0 62%, transparent 100%),
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.08) calc(var(--feb-bloom) * 0.13) at calc(var(--feb-bloom) * 1.92) 32%, rgba(183, 62, 62, 0.24) 0 62%, transparent 100%),
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.22) calc(var(--feb-bloom) * 0.09) at calc(var(--feb-bloom) * 0.28) 80%, rgba(70, 112, 47, 0.34) 0 64%, transparent 100%),
    radial-gradient(ellipse calc(var(--feb-bloom) * 0.19) calc(var(--feb-bloom) * 0.08) at calc(var(--feb-bloom) * 1.14) 74%, rgba(70, 112, 47, 0.3) 0 64%, transparent 100%);
}

/* ---------------------------------------------------------------------------
   THE CARD, in daylight.

   The night card is kept dark and the note above it records why: a prettier
   rose stock put the crimson numeral at 4.0:1, which is a fail, so the blush
   went on the ornament instead. By day that constraint runs the other way and
   the pretty stock is finally available — the numeral is now dark ink on light
   paper, so the card can be the rose card it always wanted to be.

   Measured on the new stock (#f0d2d8, the mid stop):
     --feb-carmine  5.39:1  the numeral date, 0.66rem — the tight one
     --feb-foil     5.49:1  the numeral itself and the breadcrumb separators
     --feb-rose     4.74:1  the breadcrumb trail
     --feb-crimson  4.36:1  the keyline — a border, so the 3:1 class applies
   Six layers, same order, same geometry, all static. */
body[data-theme-id="february"][data-mode="day"] .breadcrumb-nav {
  background-color: #f1d2d2;
  background-image:
    radial-gradient(circle 7px at 50% 0, rgba(242, 230, 210, 0.72) 0 92%, transparent 100%),
    radial-gradient(circle 7px at 50% 100%, rgba(242, 230, 210, 0.55) 0 92%, transparent 100%),
    radial-gradient(circle 1.5px at 50% 50%, rgba(133, 91, 7, 0.3) 0 78%, transparent 100%),
    repeating-linear-gradient(58deg, rgba(171, 47, 46, 0.09) 0 1px, transparent 1px 18px),
    repeating-linear-gradient(-58deg, rgba(171, 47, 46, 0.09) 0 1px, transparent 1px 18px),
    linear-gradient(180deg, #f7dede 0%, #f1d2d2 52%, #e8c2c2 100%);
  /* Lit lip at the head, contact shadow at the foot, and the bloom off the
     card becomes an actual cast shadow — a lit page does not glow. */
  box-shadow:
    inset 0 1px 0 rgba(242, 230, 210, 0.85),
    inset 0 -1px 0 rgba(109, 61, 61, 0.22),
    0 1px 14px rgba(109, 41, 41, 0.1);
}

/* The sweep stays a pass of light across satin; on a pale card the pass has to
   be white rather than cream or it disappears into the stock. */
body[data-theme-id="february"][data-mode="day"] .breadcrumb-nav::before {
  background: linear-gradient(
    90deg,
    transparent,
    rgba(242, 230, 210, 0.62),
    rgba(171, 47, 46, 0.1),
    transparent
  );
}

/* ---------------------------------------------------------------------------
   HEADER AND HEADINGS.

   Every glow in this theme is a candle effect and every one of them has to
   become an ink effect: on paper a light halo is nothing at all, and a heavy
   dark one is a smudge. The rule is one soft, low-alpha warm shadow, which
   reads as the bleed a letterpress leaves in damp stock.
   --------------------------------------------------------------------------- */

body[data-theme-id="february"][data-mode="day"] .brand a {
  text-shadow:
    0 1px 0 rgba(242, 230, 210, 0.9),
    0 2px 10px rgba(133, 91, 7, 0.3);
}

body[data-theme-id="february"][data-mode="day"] .brand a:hover {
  text-shadow:
    0 1px 0 rgba(242, 230, 210, 0.95),
    0 2px 14px rgba(195, 22, 22, 0.34);
}

body[data-theme-id="february"][data-mode="day"] .time-bar {
  box-shadow:
    inset 0 1px 0 rgba(242, 230, 210, 0.8),
    inset 0 -1px 0 rgba(109, 61, 61, 0.18);
}

/* Still a BLURRED shadow, for the reason the night rule gives: these letters
   are clipped backgrounds, and a zero-blur shadow renders through the
   transparent glyph and buries the gradient under a flat block. Only the
   colour and the alpha move — dark and very light, so it reads as ink bleed
   under the letter rather than as a halo around it. */
body[data-theme-id="february"][data-mode="day"] main h1,
body[data-theme-id="february"][data-mode="day"] .page-title,
body[data-theme-id="february"][data-mode="day"] main h2,
body[data-theme-id="february"][data-mode="day"] main h3,
body[data-theme-id="february"][data-mode="day"] main h4,
body[data-theme-id="february"][data-mode="day"] main h5,
body[data-theme-id="february"][data-mode="day"] main h6,
body[data-theme-id="february"][data-mode="day"] .markdown-page .heading-section__trigger {
  text-shadow:
    0 0 10px rgba(195, 22, 22, 0.16),
    0 0 26px rgba(133, 91, 7, 0.1);
}

/* The H2 heart flourish: the heart itself is --feb-crimson and re-lights
   through the ramp for free. Only the gold rule running off it is a literal,
   and at 0.6 alpha of a pale gold it would vanish on paper. */
body[data-theme-id="february"][data-mode="day"] .markdown-page h2::after {
  background-image:
    radial-gradient(circle 2.4px at 2.4px 50%, var(--feb-crimson) 0 88%, transparent 100%),
    radial-gradient(circle 2.4px at 6.6px 50%, var(--feb-crimson) 0 88%, transparent 100%),
    conic-gradient(from -37deg at 4.5px 100%, var(--feb-crimson) 0 74deg, transparent 74deg),
    linear-gradient(90deg, rgba(133, 91, 7, 0.75) 0 58%, transparent 100%);
}

body[data-theme-id="february"][data-mode="day"] .heading-section::before {
  box-shadow: 0 1px 4px rgba(195, 22, 22, 0.22);
}

body[data-theme-id="february"][data-mode="day"] .page-toc::before {
  box-shadow: 0 1px 3px rgba(195, 22, 22, 0.18);
}

/* ---------------------------------------------------------------------------
   LINKS. Colours all come through the ramp — rose at rest (6.0:1), gold leaf
   on hover (7.0:1), mauve once read (6.5:1) — so only the shadows need saying.

   Hover keeps a pulse because the interaction should feel the same in both
   modes, but it cannot keep the ROSE pulse: februaryLinkRoseGlow animates
   three light halos, which on paper animate nothing. This is the same effect
   re-lit, not a second one — the two keyframes are mutually exclusive, only
   ever one link runs one of them, and it is still text-shadow alone on a
   single hovered element.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"][data-mode="day"] a:hover,
body[data-theme-id="february"][data-mode="day"] a:focus-visible {
  text-shadow: 0 1px 0 rgba(242, 230, 210, 0.8);
  animation: februaryLinkInkBloom 1.05s ease-in-out infinite alternate;
}

/* The night rule stacks a near-black inner stop under the mauve to hold it off
   the bokeh behind it. There is no bokeh by day and a dark halo on paper is a
   smudge, so the shadow goes entirely. */
body[data-theme-id="february"][data-mode="day"] a:visited {
  text-shadow: none;
}

body[data-theme-id="february"][data-mode="day"] .eyebrow {
  text-shadow: 0 1px 0 rgba(242, 230, 210, 0.75);
}

/* Gold leaf brushed under the words, unchanged in construction: the hard stop
   at 56% keeps the wash on the baseline and the letters on the page ground, so
   no contrast has to be re-checked. Only the wash gets the density that leaf
   has in daylight, and the glow comes off — leaf does not glow, it just sits
   there being flat and expensive. */
body[data-theme-id="february"][data-mode="day"] mark {
  background: linear-gradient(180deg, transparent 0 56%, rgba(214, 166, 62, 0.55) 56% 96%, transparent 96%);
  text-shadow: none;
}

/* ---------------------------------------------------------------------------
   SURFACES. The wine wash under the inputs and code becomes a sheet of
   slightly whiter, slightly cooler stock laid on the blush page — still a
   tint, still not a second page background, just cut the other way. The lit
   lip stays at the top and the shadow at the foot, so the panel reads as
   raised in both modes.
   --------------------------------------------------------------------------- */
body[data-theme-id="february"][data-mode="day"] input,
body[data-theme-id="february"][data-mode="day"] textarea,
body[data-theme-id="february"][data-mode="day"] select,
body[data-theme-id="february"][data-mode="day"] code,
body[data-theme-id="february"][data-mode="day"] pre {
  background-color: rgba(242, 230, 210, 0.75);
  background-image: linear-gradient(
    180deg,
    rgba(242, 230, 210, 0.6) 0%,
    rgba(242, 230, 210, 0.2) 30%,
    rgba(109, 61, 61, 0) 56%,
    rgba(109, 61, 61, 0.07) 100%
  );
}

body[data-theme-id="february"][data-mode="day"] input,
body[data-theme-id="february"][data-mode="day"] textarea,
body[data-theme-id="february"][data-mode="day"] select,
body[data-theme-id="february"][data-mode="day"] pre {
  box-shadow:
    inset 0 1px 0 rgba(242, 230, 210, 0.9),
    inset 0 -1px 0 rgba(109, 61, 61, 0.16);
}

/* The ribbon banner. --feb-wine-lit is the band and --feb-foil the stamped
   title, both through the ramp, so only the gloss overlay is restated: its
   dark stops are near-black in the night block and would grey the foot of a
   pale band. 5.2:1 for the leaf on the band. */
body[data-theme-id="february"][data-mode="day"] th {
  background-image: linear-gradient(
    180deg,
    rgba(242, 230, 210, 0.5) 0%,
    rgba(242, 230, 210, 0.14) 46%,
    rgba(109, 61, 61, 0.04) 54%,
    rgba(109, 61, 61, 0.1) 100%
  );
}

/* Cards keep their rainbow frame; the ambient bloom becomes a cast shadow and
   the foil top edge becomes a plain lit lip. */
body[data-theme-id="february"][data-mode="day"] .hero-card,
body[data-theme-id="february"][data-mode="day"] .folder-section {
  box-shadow:
    inset 0 1px 0 rgba(242, 230, 210, 0.8),
    0 1px 10px rgba(109, 41, 41, 0.08);
}

body[data-theme-id="february"][data-mode="day"] .hero-card:hover,
body[data-theme-id="february"][data-mode="day"] .folder-section:hover {
  border-color: rgba(195, 22, 22, 0.5);
  box-shadow:
    inset 0 1px 0 rgba(242, 230, 210, 0.95),
    0 2px 14px rgba(109, 41, 41, 0.14);
}

body[data-theme-id="february"][data-mode="day"] .sitemap-link:hover,
body[data-theme-id="february"][data-mode="day"] .calendar-app__nav:hover,
body[data-theme-id="february"][data-mode="day"] .calendar-app__today:hover,
body[data-theme-id="february"][data-mode="day"] .sitemap-link:focus-visible,
body[data-theme-id="february"][data-mode="day"] .calendar-app__nav:focus-visible,
body[data-theme-id="february"][data-mode="day"] .calendar-app__today:focus-visible {
  background: rgba(195, 22, 22, 0.09);
  box-shadow:
    inset 0 1px 0 rgba(242, 230, 210, 0.85),
    0 1px 8px rgba(109, 41, 41, 0.14);
}

/* Still no left rule on a quote. The inset wash simply has to be an ink wash
   rather than a rose light. */
body[data-theme-id="february"][data-mode="day"] blockquote {
  box-shadow: inset 1.1rem 0 1.5rem -1.2rem rgba(195, 22, 22, 0.45);
}

/* The footer sits over the lace, which composites to about #fdfaf8 by day, so
   --feb-blush reads 10.8:1 there — the night block took the blush over the
   muted shade for safety on a dark hem and the same choice is comfortable
   here, so nothing needs restating but this note. */

/* Calendar. Every border-left swatch and every text colour arrives through the
   ramp; only the washes behind them are literals, and a 0.1 alpha of a pale
   night colour is invisible on paper. Same hues, same alphas, day values —
   so the categories still read at a glance. */
body[data-theme-id="february"][data-mode="day"] .calendar-event__link { background: rgba(195, 22, 22, 0.08); }

body[data-theme-id="february"][data-mode="day"] .calendar-event__link:hover,
body[data-theme-id="february"][data-mode="day"] .calendar-event__link:focus-visible { background: rgba(133, 91, 7, 0.14); }

body[data-theme-id="february"][data-mode="day"] .calendar-event[data-category="running"] .calendar-event__link { background: rgba(164, 72, 46, 0.1); }

body[data-theme-id="february"][data-mode="day"] .calendar-event[data-category="hiking"] .calendar-event__link { background: rgba(70, 112, 47, 0.1); }

body[data-theme-id="february"][data-mode="day"] .calendar-event[data-category="food"] .calendar-event__link { background: rgba(133, 91, 7, 0.1); }

body[data-theme-id="february"][data-mode="day"] .calendar-event[data-category="growing"] .calendar-event__link,
body[data-theme-id="february"][data-mode="day"] .calendar-event[data-category="gardening"] .calendar-event__link { background: rgba(70, 112, 47, 0.12); }

body[data-theme-id="february"][data-mode="day"] .calendar-event[data-category="observance"] .calendar-event__link { background: rgba(130, 72, 66, 0.12); }

body[data-theme-id="february"][data-mode="day"] .calendar-subscribe__action { background: rgba(171, 47, 46, 0.09); }

body[data-theme-id="february"][data-mode="day"] .calendar-subscribe__action--download { background: rgba(133, 91, 7, 0.1); }

body[data-theme-id="february"][data-mode="day"] .calendar-subscribe__action:hover,
body[data-theme-id="february"][data-mode="day"] .calendar-subscribe__action:focus-visible { background: rgba(195, 22, 22, 0.14); }

body[data-theme-id="february"][data-mode="day"] .calendar-day--today {
  background: rgba(195, 22, 22, 0.07);
}

/* The scrollbar rail, lit down the same side. */
body[data-theme-id="february"][data-mode="day"]::-webkit-scrollbar-thumb,
body[data-theme-id="february"][data-mode="day"] ::-webkit-scrollbar-thumb {
  background-image: linear-gradient(
    90deg,
    rgba(195, 22, 22, 0.45) 0%,
    rgba(171, 47, 46, 0.3) 44%,
    rgba(109, 61, 61, 0.16) 100%
  );
}

/* ---------------------------------------------------------------------------
   REDUCED MOTION AND REDUCED DATA, extended for the day.

   Both existing blocks select at (0,1,2). The day rules above are (0,2,2) and
   would outrank them, so the two preferences need day entries or the
   counterpart would quietly reinstate what they turn off. Two things need it:
   the link pulse (the day keyframe is declared at (0,2,2)) and the thinned
   ambient layers (the day background-images are (0,2,2)).

   The layer ANIMATIONS deliberately need no entry: nothing in this counterpart
   restates `animation` on .night-sky__stars--*, so the base declarations are
   still the ones in play and the existing blocks already switch them off at
   their own weight.
   --------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  body[data-theme-id="february"][data-mode="day"] a:hover,
  body[data-theme-id="february"][data-mode="day"] a:focus-visible {
    animation: none;
  }
}

@media (prefers-reduced-data: reduce) {
  body[data-theme-id="february"][data-mode="day"] a:hover,
  body[data-theme-id="february"][data-mode="day"] a:focus-visible {
    animation: none;
  }

  /* One shape a depth instead of four, held still. The far bokeh is already
     display:none by day, so this mode costs the page two small tiled layers
     in total — less than the night mode spends. */
  body[data-theme-id="february"][data-mode="day"] .night-sky__stars--far {
    background-image:
      radial-gradient(circle at 30% 26%, rgba(133, 91, 7, 0.45) 0 0.8px, transparent 1.3px);
  }

  body[data-theme-id="february"][data-mode="day"] .night-sky__stars--near {
    background-image:
      radial-gradient(ellipse 5px 2.9px at 34% 30%, rgba(195, 22, 22, 0.18) 0 56%, transparent 100%);
  }
}

/* Hover and keyboard focus only, one element at a time, text-shadow alone —
   the same shape as July's link pulse and September's ember, in this month's
   rose and gold. It replaces July's hotpink keyframe rather than adding to it,
   so no link ever runs two loops at once, and it is the only keyframe this
   theme defines: every ambient layer above reuses one that main.css already
   ships. */
@keyframes februaryLinkRoseGlow {
  from {
    text-shadow:
      0 0 6px rgba(255, 146, 146, 0.7),
      0 0 12px rgba(245, 66, 63, 0.46),
      0 0 22px rgba(232, 180, 92, 0.22);
  }
  to {
    text-shadow:
      0 0 9px rgba(255, 146, 146, 0.95),
      0 0 20px rgba(245, 66, 63, 0.76),
      0 0 32px rgba(232, 180, 92, 0.4);
  }
}

/* The daylight counterpart of the pulse above, and the only other keyframe in
   this file. A candle-lit link brightens; a link on paper cannot, so it deepens
   instead — the ink spreads a little further into the stock and pulls back.
   Same property, same duration, same single hovered element, and the two are
   mutually exclusive, so a link never runs both and the mode switch never
   stacks a second loop on anything. The white lip is held through both stops so
   the letter keeps its relief while the bloom moves under it. */
@keyframes februaryLinkInkBloom {
  from {
    text-shadow:
      0 1px 0 rgba(242, 230, 210, 0.8),
      0 0 6px rgba(195, 22, 22, 0.22),
      0 1px 4px rgba(109, 41, 41, 0.16);
  }
  to {
    text-shadow:
      0 1px 0 rgba(242, 230, 210, 0.9),
      0 0 10px rgba(195, 22, 22, 0.4),
      0 1px 7px rgba(109, 41, 41, 0.3);
  }
}
