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

/* November — Thanksgiving as a hand-drawn illustration. An ink-and-watercolour
   harvest sketch: warm cream paper, a pen line that wobbles, and washed colour
   fills that sit slightly off-register from the line that was meant to hold
   them, the way a two-plate print or a hurried watercolour always does.

   This is deliberately the opposite of October. October is hard-edged NES pixel
   art on a black-indigo night: flat fills, whole-pixel edges, square corners,
   stepped animation. November is a LIGHT theme on paper, with soft edges,
   uneven radii, translucent washes and slow continuous drift. Nothing about the
   two reads as the same hand.

   THE FOUR ILLUSTRATION TECHNIQUES, used everywhere below:

     1. OFF-REGISTER FILL. Every drawn object is two layers — a pen outline and
        a colour wash — with the wash nudged a few px off the outline. On
        gourds that is two radial-gradients at slightly different centres; on
        cards and headings it is a zero-blur box-shadow / drop-shadow in a
        translucent wash colour. Zero blur is the point: a blur reads as a
        drop shadow, a hard offset reads as misprinted ink.

     2. WOBBLY RADII. --nov-wobble-* give each corner a different horizontal and
        vertical radius, so a "rectangle" is never quite square. Values are kept
        modest (under 25px) so the browser never has to scale them down on a
        short element and turn the box into a lozenge.

     3. BROKEN PEN LINES. Rules, rails and outlines are painted through a
        repeating-gradient mask with uneven gaps, so a straight line has the
        density variation of a nib running dry. Where mask-image is unsupported
        the line simply renders solid — a complete, correct fallback.

     4. HATCHING. repeating-linear-gradient at a shallow angle, at very low
        alpha, standing in for pencil shading. It lives only in the shared page
        background, the CRT overlay and surfaces that already had a fill.

   PURE CSS. No url(), no images, no webfonts, no external assets of any kind.
   Both type stacks are system faces.

   MOTION. Exactly one ambient effect: two depths of leaves drifting down. It
   REPLACES the star drift on the elements that already carried it, so the
   theme adds no new continuous animation beyond what main.css already ran.
   Everything else — the table, the still life, the paper, the washes — is
   static, so the first painted frame is already the finished illustration. */

body[data-theme-id="november"] {
  /* ---- Ink and paper ----------------------------------------------------
     Contrast measured against --nov-paper (#f3e6ce), and against --nov-kraft
     (#dcc5a0) for anything that lands on the breadcrumb card:

       ink          13.58 : 1    body copy
       ink-line     10.23 : 1    pen outlines
       ink-soft      9.23 : 1    secondary copy / td / chip labels (6.80 kraft)
       pencil        6.33 : 1    muted, footer, calendar numerals
       cranberry     6.24 : 1    ANCHOR RED (4.59 on kraft)
       cranberry-deep 8.87: 1    breadcrumb + time bar text (6.53 on kraft)
       cranberry-hot  5.92: 1    link hover / bullet star
       sienna         5.37: 1    eyebrow, ordered-list markers
       roast          6.01: 1    scrollbar, quiet frames
       ochre          4.71: 1    focus ring, display gradient stop
       gold           6.40: 1    zodiac glyphs, mark, tooltip cue (4.72 kraft)
       sage           5.87: 1    emphasis, tags
       olive          7.64: 1    stems, leaf accents
       plum           8.24: 1    visited links
       slate          6.69: 1    cool gradient stop

     Every one clears 4.5:1 for body text. The lowest, ochre at 4.71, is only
     ever used at display size or as a focus ring, where 3:1 is the bar. */
  --nov-paper: #f3e6ce;
  --nov-paper-deep: #e8d6b6;
  --nov-kraft: #dcc5a0;
  --nov-ink: #2a1a0f;
  --nov-ink-line: #4a2c17;
  --nov-ink-soft: #513320;
  --nov-pencil: #6a4c30;
  --nov-cranberry: #a41918;
  --nov-cranberry-deep: #7a1210;
  --nov-cranberry-hot: #a72323;
  --nov-sienna: #a03d11;
  --nov-roast: #7a4a24;
  --nov-ochre: #8a5c04;
  --nov-gold: #6f4a05;
  --nov-sage: #4f5c2c;
  --nov-olive: #414a22;
  --nov-plum: #702b2b;
  --nov-slate: #534e42;

  /* ---- Washes -----------------------------------------------------------
     Translucent, so the paper grain reads through them the way it does under
     real watercolour. Decorative only — nothing legible is ever set in one. */
  --nov-wash-cranberry: rgba(164, 25, 24, 0.22);
  --nov-wash-sienna: rgba(176, 72, 28, 0.24);
  --nov-wash-ochre: rgba(186, 138, 30, 0.26);
  --nov-wash-sage: rgba(94, 107, 52, 0.22);
  --nov-wash-roast: rgba(122, 74, 36, 0.20);
  --nov-hatch: rgba(74, 44, 23, 0.055);

  /* ---- Wobble kit -------------------------------------------------------
     A "rectangle" drawn by hand. Each corner gets a different horizontal and
     vertical radius (the value before and after the slash), which is what
     stops the eye reading a machined box. Kept under 25px on purpose: when the
     radii on one side sum to more than that side's length the browser scales
     every corner down proportionally, and on a short element like the time bar
     the classic 255px sketch values collapse into a lozenge. */
  --nov-wobble-lg: 20px 6px 24px 7px / 7px 22px 6px 20px;
  --nov-wobble-lg-alt: 7px 22px 6px 20px / 20px 6px 24px 7px;
  --nov-wobble-md: 14px 4px 17px 5px / 5px 16px 4px 14px;
  --nov-wobble-sm: 9px 3px 11px 4px / 4px 10px 3px 9px;

  /* Off-register fill for boxed objects: hard-edged, no blur, translucent. */
  --nov-offset: 6px 7px 0 var(--nov-wash-sienna);
  --nov-offset-alt: 5px 6px 0 var(--nov-wash-ochre);
  --nov-offset-hot: 3px 4px 0 var(--nov-wash-cranberry);

  /* ---- Illustration geometry -------------------------------------------
     One drawing unit plus the two heights the harvest table is built from.
     The mobile block at the foot of the file scales all three together. */
  --nov-scene-h: clamp(6.6rem, 15vh, 8.6rem);
  --nov-table-h: clamp(2.6rem, 6vh, 3.8rem);
  --nov-table-top: calc(var(--nov-table-h) * 0.4);
  --nov-table-apron: calc(var(--nov-table-h) * 0.6);

  --tt-bg: var(--nov-paper);
  /* Link-hover paired to THIS block's ground (standing rule 2026-08-14),
     not the mode name — november's unmoded block is its own canonical
     lighting. #f3e6ce is light: #FF465A only measures 2.71:1 here, so this
     lighting takes the same-hue dark variant, #BD0014 — 5.36:1. */
  --link-hover: #BC0900;
  --tt-bg-alt: var(--nov-paper-deep);
  --tt-cyan: var(--nov-ink);
  --tt-cyan-soft: var(--nov-ink-soft);
  --tt-yellow: var(--nov-ochre);
  --tt-orange: var(--nov-sienna);
  /* Bold text is red, per the standing red bias — --tt-chartreuse is the token
     main.css sets `strong, b` from, so the anchor colour goes here. */
  --tt-chartreuse: var(--nov-cranberry);
  --tt-green: var(--nov-sage);
  --tt-pink: var(--nov-cranberry-hot);
  --tt-purple: var(--nov-plum);
  --tt-blue: var(--nov-slate);
  --tt-teal: var(--nov-roast);
  --tt-gray: var(--nov-pencil);
  --tt-gold: var(--nov-gold);
  --tt-red: var(--nov-cranberry);
  --tt-breadcrumb-text: var(--nov-cranberry-deep);
  /* Soft, not a neon halo: this is ink bleeding a little into paper stock. */
  --tt-breadcrumb-glow: rgba(122, 18, 16, 0.28);
  /* Hover/focus halo for the zodiac glyphs. This is a LIGHT theme and the
     chips sit on the kraft card, so the halo has to be DARK — a light glow on
     a light ground is invisible, which is the same trap the lava-lamp theme
     hits. A deep cranberry at 0.62 traces a glyph on #dcc5a0 as ink soaking
     outward. Never a border: the rule that consumes this token lives once, in
     main.css, and it casts from the character's own shape. */
  --zodiac-glow: rgba(122, 18, 16, 0.62);
  /* The tarot card's engraving, and the second place this theme has to cut the
     other way. :root sets --tt-engrave for a DARK card — a black line below the
     glyph, which is where the shadow of a cut falls when the light is above it.
     On kraft the lit lip is the white one, and the theme was inheriting the
     dark value and getting a smudge under the numeral instead of a struck edge. */
  --tt-engrave: 0 1px 0 rgba(242, 230, 210, 0.75);

  /* Structural border palette. Red leads and returns at the midpoint, so every
     rail, frame and divider in the theme reads red-dominant. Smooth stops
     rather than October's hard blocks — this is a wash, not a sprite. */
  --tt-heading-rainbow: linear-gradient(
    90deg,
    var(--nov-cranberry),
    var(--nov-sienna),
    var(--nov-ochre),
    var(--nov-sage),
    var(--nov-cranberry),
    var(--nov-plum),
    var(--nov-cranberry)
  );
  --tt-heading-rainbow-vertical: linear-gradient(
    180deg,
    var(--nov-cranberry),
    var(--nov-sienna),
    var(--nov-ochre),
    var(--nov-sage),
    var(--nov-cranberry),
    var(--nov-plum),
    var(--nov-cranberry)
  );
  /* Two identical eight-stop cycles across the 200% background main.css sets,
     so headingRainbowFlow loops with no visible reset. Red is stop one and
     stop six of each cycle — twice per revolution, as the red bias requires.
     Every stop clears 3:1 on the paper ground (lowest is ochre at 4.71), which
     is the check a light theme has to run in the opposite direction from a
     dark one: here the danger is a stop being too PALE to read, not too dark. */
  --tt-heading-text-rainbow: linear-gradient(
    90deg,
    var(--nov-cranberry),
    var(--nov-sienna),
    var(--nov-ochre),
    var(--nov-sage),
    var(--nov-slate),
    var(--nov-cranberry),
    var(--nov-plum),
    var(--nov-roast),
    var(--nov-cranberry),
    var(--nov-sienna),
    var(--nov-ochre),
    var(--nov-sage),
    var(--nov-slate),
    var(--nov-cranberry),
    var(--nov-plum),
    var(--nov-roast),
    var(--nov-cranberry)
  );

  /* ---- Type -------------------------------------------------------------
     Both stacks are system faces. The project loads no webfonts anywhere —
     no @font-face, no @import, no font CDN link in main.js or any stylesheet —
     so this adds zero network requests and the first paint is already the
     finished typography.

     Headings take one illustrator's hand, top to bottom: Bradley Hand ships on
     every Mac and iOS device, Segoe Print on every Windows install since Vista,
     and Chalkboard / Noteworthy / Marker Felt / Segoe Script cover the gaps.
     Unlike September — which gave H1 a different script from H2/H3 — every
     heading level here is the SAME hand, because a sketchbook is lettered by
     one person. main.css sets H1 in --font-cursive and synthesises an italic;
     both are cancelled below, since a hand face already slants and doubling
     the slant smears it at display size.

     Body is NOT this sheet's decision any more (2026-08-15, user instruction).
     What stood here was Iowan Old Style via --font-sans, chosen deliberately
     against September's Palatino so the two warm months would not share a text
     face. That whole argument is moot: the text font is now locked to
     --font-text in main.css and every month shares it by design. The override
     and its token are gone, and November's voice lives in the hand face, the
     cream ground and the paper grain.

     --font-mono and --font-cursive are left untouched at the token level. The
     brand wordmark, time bar and breadcrumbs are locked fixtures. */
  /* A cursive-category face — see .github/agents/style/fonts.md. Held as a
     sheet-local token, not in --font-cursive, because main.css spends
     --font-cursive on markdown H1 and this sheet wants the same hand on every
     heading level. */
  --nov-font-hand: "Bradley Hand", "Segoe Print", "Chalkboard SE", Chalkboard, Noteworthy, "Marker Felt", "Segoe Script", "Comic Sans MS", cursive;
  --font-heading: var(--nov-font-hand);

  --bg: var(--nov-paper);
  --surface: transparent;
  --text: var(--tt-cyan);
  --text-soft: var(--tt-cyan-soft);
  --muted: var(--tt-gray);
  --border: var(--nov-cranberry);
  --border-dim: rgba(164, 25, 24, 0.3);
  --border-teal: rgba(122, 74, 36, 0.6);
  background: var(--nov-paper);
  color: var(--tt-cyan);
  /* Light, so UA form controls, the default scrollbar and any user-agent
     chrome render for paper rather than for a terminal. */
  color-scheme: light;
}

/* The CRT scanline is a permanent fixture, so it stays — it just stops being a
   CRT. Here it is the tooth of the paper: a shallow pen hatch crossed by the
   laid lines of the stock. This layer is fixed at z-index 5, ABOVE the text, so
   the alpha is held near the floor deliberately — it has to be felt and never
   read. Both passes are static. */
body[data-theme-id="november"]::before {
  background:
    repeating-linear-gradient(
      52deg,
      transparent 0 7px,
      var(--nov-hatch) 7px 8px,
      transparent 8px 15px
    ),
    repeating-linear-gradient(
      0deg,
      rgba(74, 44, 23, 0.03) 0 1px,
      transparent 1px 5px
    );
}

/* ---------------------------------------------------------------------------
   THE PAPER. The shared site background becomes a sheet of warm cream stock
   with colour bled into it: a cranberry wash in the upper left, ochre across
   the top right, sage low on the left, and a broad sienna pool banked along
   the bottom where the table sits. Large, soft, and completely static.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] .night-sky {
  background:
    radial-gradient(ellipse 60% 44% at 14% 8%, rgba(164, 25, 24, 0.09), transparent 70%),
    radial-gradient(ellipse 52% 40% at 88% 4%, rgba(186, 138, 30, 0.13), transparent 72%),
    radial-gradient(ellipse 46% 38% at 6% 72%, rgba(94, 107, 52, 0.09), transparent 74%),
    radial-gradient(ellipse 78% 34% at 50% 104%, rgba(176, 72, 28, 0.16), transparent 76%),
    linear-gradient(174deg, #f2e6d0 0%, var(--nov-paper) 46%, #eddcc0 100%);
}

/* Paper grain plus two watercolour blooms with visible edges — the darker ring
   a wash leaves as it dries. Static: paper does not move, so the star drift and
   twinkle main.css runs on this element are switched off outright, which is one
   fewer continuous animation than July or October pay for. */
body[data-theme-id="november"] .night-sky::before {
  inset: 0;
  opacity: 1;
  background-image:
    radial-gradient(circle at 50% 50%, rgba(74, 44, 23, 0.055) 0 0.6px, transparent 1.1px),
    radial-gradient(circle at 50% 50%, rgba(122, 74, 36, 0.04) 0 0.5px, transparent 1px),
    radial-gradient(ellipse 15rem 11rem at 24% 30%, transparent 0 82%, rgba(176, 72, 28, 0.07) 86% 96%, transparent 100%),
    radial-gradient(ellipse 19rem 13rem at 79% 63%, transparent 0 84%, rgba(94, 107, 52, 0.06) 88% 97%, transparent 100%);
  background-size: 13px 11px, 19px 23px, auto, auto;
  background-position: 0 0, 7px 5px, 0 0, 0 0;
  background-repeat: repeat, repeat, no-repeat, no-repeat;
  animation: none;
}

/* ---------------------------------------------------------------------------
   FALLING LEAVES — the theme's only ambient motion, and it replaces the star
   drift rather than adding to it.

   Each leaf is one elongated radial-gradient: a soft-edged ellipse whose aspect
   ratio does the work a shape outline would at this size. Two depths, three
   tiles each. Every tile in a depth is the same HEIGHT and the layer translates
   exactly that height per loop, so the column restarts with no seam; the widths
   vary freely because the travel is vertical only. Vertical-only travel is also
   what keeps the elements small — a diagonal fall would need the element
   oversized on both axes and would roughly double the painted area for no
   visible gain at this alpha.

   Density comes from tile width: the far depth puts about ten leaves on a
   desktop viewport and the near depth about eleven. Transform only — no filter,
   no background-position animation, no blur.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] .night-sky__stars--far {
  inset: -26rem -2rem -2rem -2rem;
  opacity: 0.5;
  background-image:
    radial-gradient(ellipse 7px 3.5px at 27% 18%, rgba(160, 61, 17, 0.55) 0 46%, transparent 78%),
    radial-gradient(ellipse 4px 7px at 64% 52%, rgba(186, 138, 30, 0.5) 0 44%, transparent 76%),
    radial-gradient(ellipse 8px 4px at 41% 81%, rgba(164, 25, 24, 0.45) 0 44%, transparent 76%);
  background-size: 41rem 24rem, 57rem 24rem, 73rem 24rem;
  background-position: 0 0, 11rem 0, 26rem 0;
  background-repeat: repeat;
  animation: novemberLeafFar 56s linear infinite;
}

body[data-theme-id="november"] .night-sky__stars--near {
  inset: -32rem -2rem -2rem -2rem;
  opacity: 0.62;
  background-image:
    radial-gradient(ellipse 12px 5px at 22% 26%, rgba(160, 61, 17, 0.6) 0 42%, transparent 74%),
    radial-gradient(ellipse 6px 11px at 71% 58%, rgba(164, 25, 24, 0.5) 0 42%, transparent 74%),
    radial-gradient(ellipse 10px 6px at 46% 88%, rgba(122, 74, 36, 0.5) 0 42%, transparent 74%);
  background-size: 33rem 30rem, 47rem 30rem, 63rem 30rem;
  background-position: 0 0, 7rem 0, 19rem 0;
  background-repeat: repeat;
  animation: novemberLeafNear 38s linear infinite;
}

/* ---------------------------------------------------------------------------
   THE HARVEST TABLE. .night-sky__aurora is the shared ground element; July
   makes it a city skyline, October a tilled field, and November makes it the
   near edge of a laid table with a still life standing on it.

   The element itself is the wood: a top plane and a front apron, separated and
   capped by broken pen lines. The clip-path main.css uses for July's skyline is
   cleared, and no clip-path or mask replaces it — both would clip the ::before
   and ::after, and the gourds have to stand ABOVE the tabletop line. Instead
   the element is made taller than the wood and the wood is painted only into
   the bottom band, leaving the paper showing through above it.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] .night-sky__aurora {
  display: block;
  z-index: 2;
  left: 0;
  right: 0;
  top: auto;
  bottom: 0;
  height: var(--nov-scene-h);
  clip-path: none;
  box-shadow: none;
  background-color: transparent;
  background-image:
    /* The lip along the back of the tabletop. Two ink runs of different length
       with gaps between them: a straight line whose density varies is what a
       nib actually leaves, and it is the whole reason this does not read as a
       ruled CAD edge. */
    repeating-linear-gradient(
      90deg,
      var(--nov-ink-line) 0 29px,
      transparent 29px 34px,
      var(--nov-ink-line) 34px 71px,
      transparent 71px 76px
    ),
    /* The front edge, where the top meets the apron — a longer, steadier run. */
    repeating-linear-gradient(
      90deg,
      var(--nov-ink-line) 0 47px,
      transparent 47px 51px,
      var(--nov-ink-line) 51px 103px,
      transparent 103px 108px
    ),
    /* Grain drawn across the top plane, two weights, no common factor. */
    repeating-linear-gradient(
      90deg,
      rgba(58, 34, 16, 0.17) 0 2px,
      transparent 2px 19px,
      rgba(58, 34, 16, 0.1) 19px 20px,
      transparent 20px 47px
    ),
    linear-gradient(180deg, #c39456 0%, #ab7c43 100%),
    linear-gradient(180deg, #8d5c2f 0%, #6d4420 100%);
  background-size:
    100% 2px,
    100% 2px,
    100% var(--nov-table-top),
    100% var(--nov-table-top),
    100% var(--nov-table-apron);
  background-position:
    left 0px bottom var(--nov-table-h),
    left 0px bottom var(--nov-table-apron),
    left 0px bottom var(--nov-table-apron),
    left 0px bottom var(--nov-table-apron),
    left 0px bottom 0;
  background-repeat: repeat-x, repeat-x, repeat-x, no-repeat, no-repeat;
}

body[data-theme-id="november"] .night-sky__aurora::before,
body[data-theme-id="november"] .night-sky__aurora::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background-repeat: repeat-x;
}

/* GOURDS AND SQUASH — the still life, drawn the way the whole theme is drawn.

   Each gourd is TWO layers: a pen outline and a colour wash, with the wash
   centred a fraction of a percent off the outline so the fill spills past the
   line on one side and falls short on the other. That single trick is what
   makes the row read as painted rather than rendered.

   The outline is a ring: transparent through the middle, ink from 92% to the
   edge. Because the interior is transparent, the wash beneath shows through it
   AND the paper grain shows through the wash.

   Every layer shares one background-size and one background-position — a tile
   30rem wide by 3.4rem tall whose bottom edge is pinned to the tabletop line.
   Each ellipse is then centred `at X% 100%`, so its lower half falls outside
   the tile and is never painted: what is left is a gourd standing on the table.
   Stems are the same idea at a different aspect — a tall, narrow ellipse
   positioned above each crown with calc(). Painted back to front. */
body[data-theme-id="november"] .night-sky__aurora::before {
  background-image:
    /* front — the wide squash */
    radial-gradient(2.6rem 1.5rem at 12% 100%, transparent 0 92%, var(--nov-ink-line) 92% 100%, transparent 100%),
    radial-gradient(2.5rem 1.45rem at 11.4% 99%, var(--nov-wash-sienna) 0 96%, transparent 100%),
    /* middle — the round gourd */
    radial-gradient(1.85rem 1.85rem at 26% 100%, transparent 0 93%, var(--nov-ink-line) 93% 100%, transparent 100%),
    radial-gradient(1.78rem 1.78rem at 25.5% 98.6%, var(--nov-wash-cranberry) 0 96%, transparent 100%),
    /* back — the small gourd */
    radial-gradient(1.15rem 1.05rem at 36% 100%, transparent 0 91%, var(--nov-ink-line) 91% 100%, transparent 100%),
    radial-gradient(1.1rem 1rem at 35.6% 99%, var(--nov-wash-ochre) 0 95%, transparent 100%),
    /* stems */
    radial-gradient(0.1rem 0.4rem at 12% calc(100% - 1.5rem), var(--nov-olive) 0 82%, transparent 100%),
    radial-gradient(0.09rem 0.34rem at 26% calc(100% - 1.85rem), var(--nov-olive) 0 82%, transparent 100%);
  background-size: 30rem 3.4rem;
  background-position: left 1.5rem bottom var(--nov-table-h);
}

/* WHEAT AND FALLEN LEAVES, on a 41rem tile against the gourds' 30rem one so the
   two rows never line up into wallpaper. The sheaf is three thin vertical
   strokes with two grain heads over them; a stalk drawn as an angled
   linear-gradient would band the whole tile instead of standing where it was
   put, so every stroke here is a narrow ellipse. The two leaves lie flat on the
   tabletop, which is why they are wide and shallow. */
body[data-theme-id="november"] .night-sky__aurora::after {
  background-image:
    radial-gradient(0.07rem 1.2rem at 61% 100%, rgba(138, 92, 4, 0.85) 0 78%, transparent 100%),
    radial-gradient(0.06rem 1.45rem at 63% 100%, rgba(138, 92, 4, 0.75) 0 78%, transparent 100%),
    radial-gradient(0.07rem 1.05rem at 65% 100%, rgba(138, 92, 4, 0.8) 0 78%, transparent 100%),
    radial-gradient(0.2rem 0.42rem at 63% calc(100% - 1.5rem), rgba(138, 92, 4, 0.7) 0 72%, transparent 100%),
    radial-gradient(0.18rem 0.36rem at 61% calc(100% - 1.24rem), rgba(160, 61, 17, 0.6) 0 72%, transparent 100%),
    radial-gradient(0.6rem 0.22rem at 82% 99%, var(--nov-wash-cranberry) 0 60%, transparent 74%),
    radial-gradient(0.5rem 0.2rem at 88% 99%, var(--nov-wash-sage) 0 60%, transparent 74%);
  background-size: 41rem 2.6rem;
  background-position: left 9rem bottom var(--nov-table-h);
}

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

/* The brand keeps its locked cursive stack and its float; only the ink changes.
   July's yellow neon would vanish on cream, so the wordmark is written in
   cranberry with a hard, unblurred sienna offset behind it — the same
   off-register fill every drawn object in this theme carries. */
body[data-theme-id="november"] .brand a {
  color: var(--nov-cranberry);
  text-shadow: 0.045em 0.055em 0 var(--nov-wash-sienna);
}

body[data-theme-id="november"] .brand a:hover {
  color: var(--nov-cranberry-deep);
  text-shadow: 0.03em 0.038em 0 var(--nov-wash-ochre);
}

/* ---------------------------------------------------------------------------
   HEADINGS — lettered by hand, in one hand, at every level.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] main h1,
body[data-theme-id="november"] .page-title,
body[data-theme-id="november"] main h2,
body[data-theme-id="november"] main h3,
body[data-theme-id="november"] main h4,
body[data-theme-id="november"] main h5,
body[data-theme-id="november"] main h6,
body[data-theme-id="november"] .markdown-page .heading-section__trigger {
  font-family: var(--nov-font-hand);
  /* main.css synthesises an italic on H1; a hand face already slants, and
     doubling the slant smears it at display size. */
  font-style: normal;
  font-weight: 700;
  letter-spacing: 0.005em;
  /* July casts a cyan bloom here, which would be a grey smudge on cream. The
     off-register plate replaces it. It has to be a filter rather than a
     text-shadow: these letters are painted with background-clip:text, and a
     text-shadow renders in the TEXT phase — on top of the clipped background —
     which would bury the whole gradient under a flat block. A zero-blur
     drop-shadow() reads the composited alpha instead and lands behind them. */
  text-shadow: none;
  /* `var(--heading-tint)` first: it is the site-wide per-level heading ladder
     from main.css, and `filter` replaces rather than accumulates, so a rule
     that omits it drops the ladder for this whole sheet. The plate follows it
     so the sienna stays sienna rather than being hue-rotated with the wash. */
  filter: var(--heading-tint) drop-shadow(2px 3px 0 var(--nov-wash-sienna));
  /* Slower than July's 5.4s. A wash creeps; it does not scroll. */
  animation-duration: 8.5s;
}

/* Hand faces set wide and tall for their point size, so every display level
   comes down. 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="november"] main h1,
body[data-theme-id="november"] .page-title,
body[data-theme-id="november"] .heading-section--level-1 > .heading-section__summary > .heading-section__trigger {
  font-size: clamp(2.1rem, 5.6vw, 3.6rem);
}

body[data-theme-id="november"] main h2,
body[data-theme-id="november"] .heading-section--level-2 > .heading-section__summary > .heading-section__trigger {
  font-size: clamp(1.45rem, 3.4vw, 2.1rem);
}

body[data-theme-id="november"] main h3,
body[data-theme-id="november"] .heading-section--level-3 > .heading-section__summary > .heading-section__trigger {
  font-size: clamp(1.12rem, 2.2vw, 1.4rem);
}

/* A short stroke ruled under every H2, drawn through the same broken-pen mask
   as the section rails and painted in the structural --tt-heading-rainbow, so
   it stays inside the shared border palette. Left-aligned rather than centred:
   this is a margin note in a sketchbook, not a menu board. */
body[data-theme-id="november"] main h2::after {
  content: "";
  display: block;
  width: min(11rem, 44%);
  height: 3px;
  margin: 0.42rem 0 0;
  background: var(--tt-heading-rainbow);
  opacity: 0.85;
  -webkit-mask-image: repeating-linear-gradient(
    90deg,
    rgba(0, 0, 0, 1) 0 27px,
    rgba(0, 0, 0, 0.35) 27px 31px,
    rgba(0, 0, 0, 1) 31px 64px,
    rgba(0, 0, 0, 0.6) 64px 68px
  );
  mask-image: repeating-linear-gradient(
    90deg,
    rgba(0, 0, 0, 1) 0 27px,
    rgba(0, 0, 0, 0.35) 27px 31px,
    rgba(0, 0, 0, 1) 31px 64px,
    rgba(0, 0, 0, 0.6) 64px 68px
  );
}

/* The section rail and the table-of-contents accent become pen strokes ruled
   down the margin: same rainbow, broken by a vertical mask, and with July's
   cyan bloom removed — a glow makes no sense on paper. Collapse behaviour, the
   hover/focus reveal and the rail's span are all untouched. */
body[data-theme-id="november"] .heading-section::before,
body[data-theme-id="november"] .page-toc::before {
  width: 3px;
  box-shadow: none;
  -webkit-mask-image: repeating-linear-gradient(
    180deg,
    rgba(0, 0, 0, 1) 0 21px,
    rgba(0, 0, 0, 0.3) 21px 26px,
    rgba(0, 0, 0, 1) 26px 53px,
    rgba(0, 0, 0, 0.55) 53px 57px
  );
  mask-image: repeating-linear-gradient(
    180deg,
    rgba(0, 0, 0, 1) 0 21px,
    rgba(0, 0, 0, 0.3) 21px 26px,
    rgba(0, 0, 0, 1) 26px 53px,
    rgba(0, 0, 0, 0.55) 53px 57px
  );
}

body[data-theme-id="november"] .page-toc .page-toc__title {
  color: var(--nov-cranberry-deep);
}

/* ---------------------------------------------------------------------------
   Links. main.css leaves `a` at the body colour and distinguishes it only on
   hover; on paper that used to not be enough, so prose links rested in
   cranberry under a wavy pen underline. The underline is gone per the standing
   no-underline rule (2026-08-14). Nothing rendered at rest changes by dropping
   it — link-camouflage.css already holds every link flat at rest sitewide and
   was already winning the cascade over the rest-state rule below, so the wavy
   line never painted there. It DID paint on hover, where camouflage's
   rest-only selector stops matching and this rule's own specificity governed
   unopposed; that live instance is removed below along with it.

   None of this can reach the zodiac chips: they live in the header, not in
   main, and main.css pins them at (0,2,0) with the doubled .celestial-chip
   class, which outranks the (0,1,2) selectors below either way.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] main a {
  color: var(--nov-cranberry);
}

/* Hover is the nib pressing harder: colour alone now, since no rule is drawn
   under the word in any state. The letters still pick up the same off-register
   offset the rest of the theme uses. July's looping hotpink keyframe is
   cancelled — a link is not allowed to run a continuous animation, and a pen
   stroke does not pulse.

   Hover colour is --link-hover, standing user rule 2026-08-14: #FF465A on
   every theme, not --nov-sienna any more. Locked in main.css's :root. */
body[data-theme-id="november"] a:hover,
body[data-theme-id="november"] a:focus-visible {
  color: var(--link-hover);
  text-shadow: 0.035em 0.045em 0 var(--nov-wash-ochre);
  text-decoration-line: none;
  animation: none;
}

body[data-theme-id="november"] a:visited {
  color: var(--nov-plum);
  text-shadow: none;
}

/* NOVEMBER AT NIGHT — colour-blindness fallback (2026-08-14, task #38). The
   resting prose-link colour at night is --nov-cranberry, #f2545c (coral-red),
   and the hover swing is --link-hover, #FF465A (rose-red) — same red family.
   A Brettel-style LMS simulation collapses the two to near-identical tones
   under BOTH protanopia (Delta-E76 ~1.6) and deuteranopia (~3.1): to a
   red-green colorblind reader the hover swing is effectively invisible here,
   worse than any other theme checked. The day lighting (base, unmoded block
   above) is unaffected — its cranberry is dark enough that the pair still
   separates (~16-18). The existing single-offset "ink pressing harder" shadow
   is real but only 26% alpha at a ~1-2px offset, too faint to rely on alone.
   A currentColor text-shadow stroke on top of it adds a shape/edge cue that
   does not depend on hue discrimination, so it survives the simulation, and —
   unlike font-weight — does not reflow text. */
body[data-theme-id="november"][data-mode="night"] a:hover,
body[data-theme-id="november"][data-mode="night"] a:focus-visible {
  text-shadow:
    0.035em 0.045em 0 var(--nov-wash-ochre),
    -1px -1px 0 currentColor, 1px -1px 0 currentColor, -1px 1px 0 currentColor, 1px 1px 0 currentColor;
}

body[data-theme-id="november"] .eyebrow {
  color: var(--nov-sienna);
  letter-spacing: 0.28em;
  text-shadow: none;
}

/* A highlighter swipe, not a filled box: the wash is a gradient banked into the
   lower two thirds of the line, so it reads as a pen dragged across the words
   rather than a surface behind them. main.css strips mark's UA background; this
   is putting a text highlight back, which is what the element means — it is not
   a new card, shell or section background. */
body[data-theme-id="november"] mark {
  padding: 0 0.14em;
  background: linear-gradient(
    180deg,
    transparent 0 22%,
    var(--nov-wash-ochre) 26%,
    rgba(186, 138, 30, 0.34) 92%,
    transparent 98%
  );
  color: var(--nov-ink);
  text-shadow: none;
}

/* No left rule on quotes — left borders are reserved for list anchors. The
   inset wash moves from July's green to sage, and the type turns to match the
   marginal-aside feel. */
body[data-theme-id="november"] blockquote {
  color: var(--nov-ink-soft);
  font-style: italic;
  box-shadow: inset 1.1rem 0 1.6rem -1.2rem var(--nov-wash-sage);
}

/* ---------------------------------------------------------------------------
   DRAWN OBJECTS vs RULED GUIDES.

   main.css paints every structural border with `border-image:
   var(--tt-heading-rainbow) 1`, and border-image is drawn over the border box
   IGNORING border-radius — so a wobbly radius and a rainbow border-image cannot
   coexist on the same element. The theme splits them on a line that reads as
   intentional rather than as a compromise:

     RULED GUIDES keep the rainbow border-image, because they are meant to be
     straight: hr, table, th/td rules, the .hero divider, the section rails, the
     H2 stroke, the theme-name preview.

     DRAWN OBJECTS take a pen outline and a wobbly radius instead: cards, tags,
     code, pre, inputs, the sitemap link, the time bar, images, and the
     breadcrumb card. Using the `border` SHORTHAND is what resets border-image
     back to none, which is the same move October makes on its inputs and code.

   The pen is one colour — --nov-ink-line — because a person draws with one pen.
   Red is not missing from these: it is in the wash offset behind every one of
   them, in the frame around the two featured objects, and in every hover state.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] input,
body[data-theme-id="november"] textarea,
body[data-theme-id="november"] select,
body[data-theme-id="november"] code,
body[data-theme-id="november"] pre {
  border: 1px solid var(--nov-ink-line);
  border-radius: var(--nov-wobble-sm);
  background-color: rgba(232, 214, 182, 0.62);
  color: var(--nov-ink);
}

/* Pencil shading inside the code panel — the one place hatching is allowed on
   a content surface, because <pre> already carried a fill in main.css and gains
   no new background here. Inline <code> is deliberately left flat: an inline
   box fragments across line breaks and the hatch would break with it. */
body[data-theme-id="november"] pre {
  border-radius: var(--nov-wobble-md);
  background-image: repeating-linear-gradient(
    52deg,
    transparent 0 9px,
    var(--nov-hatch) 9px 10px,
    transparent 10px 19px
  );
  box-shadow: var(--nov-offset-alt);
}

/* One pane of paper, not one per line: the fill and the hatch belong to the
   <pre> and the <code> inside it stays clear. Stated explicitly because the
   surface rule above outranks main.css's `pre code`. */
body[data-theme-id="november"] pre code {
  border: 0;
  border-radius: 0;
  background-color: transparent;
  background-image: none;
  box-shadow: none;
}

/* Buttons are selected BY CLASS, never as bare `button`. The strip in the
   breadcrumb bar ran mixed — seven <a href> signs beside a <button> moon — so
   any bare `button` rule in a theme sheet styled half of one row and not the
   other. October and the old November both did this and it is exactly how the
   moon chip drifted from its neighbours. The moon is an anchor now; the rule
   stands, because the drift was caused by the element selector, not the moon. */
body[data-theme-id="november"] .sitemap-link,
body[data-theme-id="november"] .time-bar,
body[data-theme-id="november"] .calendar-app__nav,
body[data-theme-id="november"] .calendar-app__today {
  border: 1px solid var(--nov-ink-line);
  border-radius: var(--nov-wobble-sm);
  color: var(--nov-ink-soft);
  box-shadow: var(--nov-offset-alt);
}

body[data-theme-id="november"] .time-bar {
  border-color: var(--nov-cranberry);
  border-radius: var(--nov-wobble-md);
  color: var(--nov-cranberry-deep);
  letter-spacing: 0.14em;
  box-shadow: var(--nov-offset-hot);
}

body[data-theme-id="november"] .sitemap-link:hover,
body[data-theme-id="november"] .sitemap-link:focus-visible,
body[data-theme-id="november"] .calendar-app__nav:hover,
body[data-theme-id="november"] .calendar-app__nav:focus-visible,
body[data-theme-id="november"] .calendar-app__today:hover,
body[data-theme-id="november"] .calendar-app__today:focus-visible {
  border-color: var(--nov-cranberry);
  color: var(--nov-cranberry-deep);
  background: rgba(164, 25, 24, 0.07);
  /* The wash slides closer to the outline, as if the plates were re-registered
     on press. Transform and shadow only, and inside the 120–240ms band. */
  box-shadow: var(--nov-offset-hot);
  transform: translate3d(1px, 1px, 0);
}

/* Cards: pen outline, uneven corners, and a colour wash printed out of
   register behind them. The alternating radius token keeps two cards stacked in
   a grid from looking stamped from the same die. */
body[data-theme-id="november"] .hero-card,
body[data-theme-id="november"] .folder-section {
  border: 2px solid var(--nov-ink-line);
  border-radius: var(--nov-wobble-lg);
  box-shadow: var(--nov-offset);
}

body[data-theme-id="november"] .folder-section:nth-of-type(even) {
  border-radius: var(--nov-wobble-lg-alt);
  box-shadow: var(--nov-offset-alt);
}

/* The hero card is the one framed in the anchor red at rest. */
body[data-theme-id="november"] .hero-card {
  border-color: var(--nov-cranberry);
}

body[data-theme-id="november"] .hero-card:hover,
body[data-theme-id="november"] .folder-section:hover {
  border-color: var(--nov-cranberry);
  box-shadow: var(--nov-offset-hot);
  transform: translate3d(2px, 2px, 0);
}

body[data-theme-id="november"] .tag {
  border: 1px solid var(--nov-sage);
  border-radius: var(--nov-wobble-sm);
  color: var(--nov-sage);
  letter-spacing: 0.04em;
}

/* An illustration taped into the sketchbook: ink frame, uneven corners, and the
   same wash printed a few px off. */
body[data-theme-id="november"] .markdown-page img {
  border: 2px solid var(--nov-ink-line);
  border-radius: var(--nov-wobble-md);
  box-shadow: var(--nov-offset);
}

/* The horizontal rule keeps the rainbow — it is a ruled guide — but it is no
   longer a border, so the broken-pen mask can reach it. `border: 0` plus a
   painted height is the only way to mask a rule: a border-image cannot be
   masked. Without mask support it renders as a solid 3px rainbow rule. */
body[data-theme-id="november"] hr {
  border: 0;
  height: 3px;
  margin: 2.2rem 0;
  background: var(--tt-heading-rainbow);
  -webkit-mask-image: repeating-linear-gradient(
    90deg,
    rgba(0, 0, 0, 1) 0 34px,
    rgba(0, 0, 0, 0.4) 34px 39px,
    rgba(0, 0, 0, 1) 39px 81px,
    rgba(0, 0, 0, 0.62) 81px 85px,
    rgba(0, 0, 0, 1) 85px 137px,
    rgba(0, 0, 0, 0.28) 137px 143px
  );
  mask-image: repeating-linear-gradient(
    90deg,
    rgba(0, 0, 0, 1) 0 34px,
    rgba(0, 0, 0, 0.4) 34px 39px,
    rgba(0, 0, 0, 1) 39px 81px,
    rgba(0, 0, 0, 0.62) 81px 85px,
    rgba(0, 0, 0, 1) 85px 137px,
    rgba(0, 0, 0, 0.28) 137px 143px
  );
}

/* ---------------------------------------------------------------------------
   List anchors — the ONE place in the stylesheet a left border is allowed, and
   the only place this theme uses one. Every entry in a folder listing or a
   sitemap is an <a> inside a <ul>, so each gets a short ragged rule down its
   left the way an item ticked off a list does. The broken mask means the rule
   is heavier at the top than the bottom, like a stroke pulled downward.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] .folder-section ul a,
body[data-theme-id="november"] .sitemap-list a,
body[data-theme-id="november"] .page-list a {
  display: inline-block;
  padding-left: 0.6rem;
  border-left: 2px solid var(--nov-wash-roast);
  transition: border-left-color 140ms ease, padding-left 140ms ease;
}

body[data-theme-id="november"] .folder-section ul a:hover,
body[data-theme-id="november"] .folder-section ul a:focus-visible,
body[data-theme-id="november"] .sitemap-list a:hover,
body[data-theme-id="november"] .sitemap-list a:focus-visible,
body[data-theme-id="november"] .page-list a:hover,
body[data-theme-id="november"] .page-list a:focus-visible {
  border-left-color: var(--nov-cranberry);
  padding-left: 0.75rem;
}

/* ---------------------------------------------------------------------------
   Tables — ruled guides, so they keep the rainbow border-image. The header band
   is the anchor red with paper knocked out of it at 6.2:1, set in the same hand
   as the headings. No uppercase: a hand face has real lowercase and looks
   forced in caps, which is the opposite of September's engraved menu board.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] th {
  background: var(--nov-cranberry);
  color: var(--nov-paper);
  font-family: var(--nov-font-hand);
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: none;
}

body[data-theme-id="november"] td {
  color: var(--nov-ink-soft);
}

/* ---------------------------------------------------------------------------
   THE PLACE CARD. The breadcrumb bar is the single element allowed its own
   background, so it becomes the one piece of card stock on the table: kraft,
   flecked, hatched in one corner, ink-framed in the anchor red with uneven
   corners, and printed with its colour plate out of register like everything
   else. main.css's ::after keyline takes `border-radius: inherit`, so it picks
   up the wobble for free and the card ends up double-drawn — an outer pen line
   and an inner one that does not quite follow it.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] .breadcrumb-nav {
  border-radius: var(--nov-wobble-lg);
  background:
    radial-gradient(circle at 30% 40%, rgba(74, 44, 23, 0.11) 0 1px, transparent 1.6px)
      0 0 / 17px 13px repeat,
    radial-gradient(circle at 70% 65%, rgba(164, 25, 24, 0.09) 0 1.1px, transparent 1.7px)
      5px 7px / 23px 19px repeat,
    radial-gradient(circle at 45% 20%, rgba(122, 74, 36, 0.1) 0 0.9px, transparent 1.5px)
      11px 3px / 29px 23px repeat,
    repeating-linear-gradient(
      48deg,
      transparent 0 6px,
      rgba(74, 44, 23, 0.045) 6px 7px,
      transparent 7px 13px
    ) 0 0 / 100% 100%,
    linear-gradient(168deg, #e7d4b0 0%, var(--nov-kraft) 46%, #d2b891 100%)
      0 0 / 100% 100% no-repeat;
  box-shadow: var(--nov-offset);
}

/* July's specular sweep is a lit-chrome effect; card stock does not have one,
   and dropping it removes a continuous animation the theme does not need. */
body[data-theme-id="november"] .breadcrumb-nav::before {
  display: none;
}

body[data-theme-id="november"] .breadcrumbs {
  text-shadow: none;
}

/* ---------------------------------------------------------------------------
   Celestial instruments. Everything here resolves from the tokens above, so the
   astrolabe is already drawn in gold ink on kraft; only the outer ring is
   pulled to the anchor red to tie the dial to the card frame around it.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] .zodiac-clock .zc-ring--outer {
  stroke: var(--nov-cranberry);
}

body[data-theme-id="november"] .celestial-chip__moonname {
  text-shadow: none;
}

/* Belt-and-braces, per the permanent note on .celestial-chip in main.css: the
   chips carry no border, no ring and no box halo under ANY theme. Their
   hover/focus affordance is the halo cast from --zodiac-glow, which traces the
   glyph's own outline and cannot render as a rectangle. This pin exists so no
   future rule added to this sheet can reach them by accident.

   Note what is deliberately NOT here: October pins `.celestial-chip:hover {
   transform: none }` because its `button:hover { transform: none }` rule had
   been silently cancelling the chip lift for years, and pinning it preserved
   that month's flat chrome. This sheet contains no bare `button` selector at
   all — every button is reached by class — so there is no cancellation to
   preserve, and the chips lift the way they do on every other month. */
body[data-theme-id="november"] .celestial-chip,
body[data-theme-id="november"] .celestial-chip:hover,
body[data-theme-id="november"] .celestial-chip:focus-visible {
  border: 0;
  box-shadow: none;
  outline: none;
}

/* July's tooltip drops a heavy black shadow; on paper it needs a light warm one
   or the card looks like it is floating over a hole. */
body[data-theme-id="november"] .celestial-tooltip {
  box-shadow: 4px 5px 0 var(--nov-wash-roast);
}

/* ---------------------------------------------------------------------------
   Calendar. Covered further than September or October covered it, for one
   reason: main.css writes the calendar's tints as literal rgba() values in
   July's cyan, yellow and purple rather than through tokens, and on a dark
   ground those read as a faint glow while on cream they read as pastel stains.
   Every one is restated as a harvest wash. The category left-borders are the
   second sanctioned use of border-left — they are <a> inside <ul> — and their
   colours already resolve from the tokens above.
   --------------------------------------------------------------------------- */
body[data-theme-id="november"] .calendar-day--today {
  background: rgba(164, 25, 24, 0.08);
  box-shadow: inset 0 0 0 2px var(--nov-cranberry);
}

body[data-theme-id="november"] .calendar-day--today .calendar-day__number {
  color: var(--nov-cranberry-deep);
}

body[data-theme-id="november"] .calendar-event__link {
  color: var(--nov-ink);
  background: rgba(164, 25, 24, 0.08);
  border-left-color: var(--nov-cranberry);
}

body[data-theme-id="november"] .calendar-event__link:hover,
body[data-theme-id="november"] .calendar-event__link:focus-visible {
  color: var(--nov-cranberry-deep);
  background: rgba(186, 138, 30, 0.16);
}

body[data-theme-id="november"] .calendar-event[data-category="running"] .calendar-event__link { background: rgba(160, 61, 17, 0.1); }

body[data-theme-id="november"] .calendar-event[data-category="hiking"] .calendar-event__link { background: rgba(79, 92, 44, 0.12); }

body[data-theme-id="november"] .calendar-event[data-category="food"] .calendar-event__link { background: rgba(138, 92, 4, 0.12); }

body[data-theme-id="november"] .calendar-event[data-category="growing"] .calendar-event__link,
body[data-theme-id="november"] .calendar-event[data-category="gardening"] .calendar-event__link { background: rgba(65, 74, 34, 0.12); }

body[data-theme-id="november"] .calendar-event[data-category="observance"] .calendar-event__link { background: rgba(112, 43, 43, 0.12); }

body[data-theme-id="november"] .calendar-subscribe__action {
  color: var(--nov-ink);
  background: rgba(164, 25, 24, 0.08);
  border-left-color: var(--nov-cranberry);
}

body[data-theme-id="november"] .calendar-subscribe__action--download {
  background: rgba(79, 92, 44, 0.12);
  border-left-color: var(--nov-sage);
}

body[data-theme-id="november"] .calendar-subscribe__action:hover,
body[data-theme-id="november"] .calendar-subscribe__action:focus-visible {
  color: var(--nov-cranberry-deep);
  background: rgba(186, 138, 30, 0.18);
}

body[data-theme-id="november"] footer {
  letter-spacing: 0.1em;
}

/* The scrollbar. --tt-teal is declared on <body> and the thumb on the document
   scroller resolves against <html>, which never sees it — the same gap every
   month sheet has — so the colours are stated outright here. */
body[data-theme-id="november"]::-webkit-scrollbar-thumb,
body[data-theme-id="november"] ::-webkit-scrollbar-thumb {
  background-color: var(--nov-roast);
}

body[data-theme-id="november"]::-webkit-scrollbar-thumb:hover,
body[data-theme-id="november"] ::-webkit-scrollbar-thumb:hover {
  background-color: var(--nov-ink-line);
}

body[data-theme-id="november"]::-webkit-scrollbar-thumb:active,
body[data-theme-id="november"] ::-webkit-scrollbar-thumb:active {
  background-color: var(--nov-cranberry);
}

/* ---------------------------------------------------------------------------
   Responsive. The scene scales through the three geometry variables so the
   still life keeps its proportions instead of being cropped, and the hand
   faces — which set wide — come down again at phone width.
   --------------------------------------------------------------------------- */
@media (max-width: 800px) {
  body[data-theme-id="november"] {
    --nov-scene-h: clamp(4.8rem, 13vh, 6.4rem);
    --nov-table-h: clamp(2rem, 5.5vh, 2.8rem);
    /* --nov-table-top and --nov-table-apron are calc()s over --nov-table-h and
       resolve at computed-value time on this same element, so they follow the
       new height without being restated.

       Hard offsets that read as a printing misregistration at desktop size read
       as a smudge at phone size, so every plate pulls in. */
    --nov-offset: 4px 5px 0 var(--nov-wash-sienna);
    --nov-offset-alt: 3px 4px 0 var(--nov-wash-ochre);
    --nov-offset-hot: 2px 3px 0 var(--nov-wash-cranberry);
  }

  /* The gourds and the sheaf shrink with the table, and the tiles tighten so a
     narrow viewport still shows more than one gourd. */
  body[data-theme-id="november"] .night-sky__aurora::before {
    background-size: 21rem 2.5rem;
    background-position: left 1rem bottom var(--nov-table-h);
  }

  body[data-theme-id="november"] .night-sky__aurora::after {
    background-size: 28rem 2rem;
    background-position: left 6rem bottom var(--nov-table-h);
  }

  body[data-theme-id="november"] main h1,
  body[data-theme-id="november"] .page-title,
  body[data-theme-id="november"] .heading-section--level-1 > .heading-section__summary > .heading-section__trigger {
    font-size: clamp(1.75rem, 8vw, 2.4rem);
  }

  body[data-theme-id="november"] main h2,
  body[data-theme-id="november"] .heading-section--level-2 > .heading-section__summary > .heading-section__trigger {
    font-size: clamp(1.28rem, 5.2vw, 1.6rem);
  }

  body[data-theme-id="november"] .breadcrumb-nav {
    border-radius: var(--nov-wobble-md);
  }
}

/* ---------------------------------------------------------------------------
   Reduced motion. Month blocks set their ambient motion on higher-specificity
   selectors than the generic .night-sky rules, so they need their own entry.
   The leaves stop where they stand: every leaf, wash, gourd and grain layer is
   still painted, so the first and final frame is the complete illustration and
   only the travel is removed. The heading gradient freezes mid-flow rather than
   snapping to a corner, which main.css already handles by pinning
   background-position.
   --------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  body[data-theme-id="november"] .night-sky::before,
  body[data-theme-id="november"] .night-sky__stars--far,
  body[data-theme-id="november"] .night-sky__stars--near,
  body[data-theme-id="november"] .brand a,
  body[data-theme-id="november"] main h1,
  body[data-theme-id="november"] .page-title,
  body[data-theme-id="november"] main h2,
  body[data-theme-id="november"] main h3,
  body[data-theme-id="november"] main h4,
  body[data-theme-id="november"] main h5,
  body[data-theme-id="november"] main h6,
  body[data-theme-id="november"] .markdown-page .heading-section__trigger {
    animation: none !important;
    transform: none !important;
  }

  /* The hover nudge on cards and buttons is the only transform the theme adds;
     the colour change and the tightened wash carry the state on their own. */
  body[data-theme-id="november"] .hero-card:hover,
  body[data-theme-id="november"] .folder-section:hover,
  body[data-theme-id="november"] .sitemap-link:hover,
  body[data-theme-id="november"] .calendar-app__nav:hover,
  body[data-theme-id="november"] .calendar-app__today:hover {
    transform: none;
  }

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

/* ---------------------------------------------------------------------------
   Reduced data. Same freeze, plus the two costliest fills go: the paper-grain
   speckle drops to the flat washes underneath it, and each leaf depth drops
   from three tiles to one. Still legibly a sheet of paper with leaves on it, at
   a fraction of the fill.
   --------------------------------------------------------------------------- */
@media (prefers-reduced-data: reduce) {
  body[data-theme-id="november"] .night-sky::before,
  body[data-theme-id="november"] .night-sky__stars--far,
  body[data-theme-id="november"] .night-sky__stars--near,
  body[data-theme-id="november"] .brand a,
  body[data-theme-id="november"] main h1,
  body[data-theme-id="november"] .page-title,
  body[data-theme-id="november"] main h2,
  body[data-theme-id="november"] main h3,
  body[data-theme-id="november"] main h4,
  body[data-theme-id="november"] main h5,
  body[data-theme-id="november"] main h6,
  body[data-theme-id="november"] .markdown-page .heading-section__trigger {
    animation: none;
    transform: none;
  }

  body[data-theme-id="november"] .night-sky::before {
    background-image: none;
  }

  body[data-theme-id="november"] .night-sky__stars--far {
    background-image:
      radial-gradient(ellipse 7px 3.5px at 27% 18%, rgba(160, 61, 17, 0.55) 0 46%, transparent 78%);
    background-size: 47rem 24rem;
  }

  body[data-theme-id="november"] .night-sky__stars--near {
    background-image:
      radial-gradient(ellipse 12px 5px at 22% 26%, rgba(160, 61, 17, 0.6) 0 42%, transparent 74%);
    background-size: 39rem 30rem;
  }

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

/* ===========================================================================
   NOVEMBER BY NIGHT.

   Everything above this banner is November's canonical lighting — the harvest
   sketch on cream paper — and it stays exactly as it is. A body with no
   [data-mode] is what the server sends and what a reader with JS off keeps for
   good. This block set supplies the OTHER lighting, so base plus counterpart
   covers both modes and nothing is written twice.

   Selectors carry both attributes, body[data-theme-id="november"][data-mode="night"]
   at (0,2,1) over the base block's (0,1,1), so the counterpart wins on
   specificity rather than on source order — which matters, because every theme
   sheet is loaded on every page.

   THE CONCEPT. The same sketchbook, on the same desk, under one lamp. Not a
   dark mode and not a second theme: every technique above survives intact —
   the off-register plates, the wobbly radii, the broken pen lines, the
   hatching, the two depths of falling leaves. What changes is the stock and
   the hand. The paper darkens to a warm roast that is still brown and never
   grey or blue, and the drawing inverts with it: an ink line on cream becomes
   a chalk line on toned paper, which is a real illustrator's move and not a
   filter. Cranberry stays the anchor and is the one colour the lamp makes
   BRIGHTER rather than darker.

   HOW LITTLE OF THIS IS ACTUAL WORK. Almost everything above resolves from the
   --nov-* ramp, so the whole still life — the gourd outlines, the washes, the
   stems, the card frames, the tags, the list rules, the H2 stroke, the section
   rails, the hr, the scrollbar — re-lights from the token block below without
   being restated. The rules that follow it are exactly the ones the sheet
   paints with a literal rgba() or hex, which no token can reach. */
body[data-theme-id="november"][data-mode="night"] {
  /* ---- Ink and paper, by lamplight --------------------------------------
     Contrast measured against the night --nov-paper (#221810), and against the
     night --nov-kraft (#2f2114) for anything that lands on the tarot card:

       ink          13.61 : 1    body copy
       ink-line      8.40 : 1    chalk outlines
       ink-soft     10.39 : 1    secondary copy / td / chip labels (9.30 kraft)
       pencil        5.49 : 1    muted, footer, calendar numerals
       cranberry     5.14 : 1    ANCHOR RED (4.60 on kraft)
       cranberry-deep 7.07: 1    breadcrumb + time bar text (6.33 on kraft)
       cranberry-hot  6.04: 1    link hover / bullet star
       sienna        6.72 : 1    eyebrow, ordered-list markers
       roast         5.83 : 1    scrollbar, quiet frames
       ochre         8.19 : 1    focus ring, display gradient stop
       gold          8.39 : 1    zodiac glyphs, mark, tooltip cue (7.50 kraft)
       sage          7.77 : 1    emphasis, tags
       olive         5.66 : 1    stems, leaf accents
       plum          5.97 : 1    visited links
       slate         7.11 : 1    cool gradient stop

     Every one clears 4.5:1, and the check runs in the opposite direction from
     the base block's: there the danger was a stop being too PALE to read on
     cream, here it is a stop being too DARK to lift off the roast. The floor
     is set by cranberry, because the anchor red is also --tt-chartreuse, which
     is the token main.css sets `strong, b` from — the red has to hold up at
     body weight, not just at display size. That is why the ground is pushed
     down to #221810 rather than a mid brown: for light-on-dark, darkening the
     ground is what buys the accent its contrast back. */
  --nov-paper: #221810;
  /* Link-hover re-paired to THIS block's ground (standing rule 2026-08-14).
     #221810 is dark: #FF465A clears 5.20:1 here. */
  --link-hover: #FF4947;
  --nov-paper-deep: #2f2217;
  --nov-kraft: #2f2114;
  --nov-ink: #f0e2c8;
  --nov-ink-line: #c9b189;
  --nov-ink-soft: #d8c6a4;
  --nov-pencil: #a08e74;
  --nov-cranberry: #f25554;
  --nov-cranberry-deep: #ff7e7e;
  --nov-cranberry-hot: #fc6968;
  --nov-sienna: #e8894a;
  --nov-roast: #b98d5e;
  --nov-ochre: #e0a92a;
  --nov-gold: #d9ae4e;
  --nov-sage: #a3b56a;
  --nov-olive: #8a9a52;
  --nov-plum: #d48180;
  --nov-slate: #aba595;

  /* ---- Washes -----------------------------------------------------------
     Still translucent, still decorative only, still never carrying anything
     legible. Each is its own new ramp value at the same alpha — a wash mixed
     from the ink that is actually on the desk. Restated rather than derived
     because a colour cannot be given an alpha channel by a var() reference,
     and --nov-offset / -alt / -hot are calc-free aliases over these three, so
     every off-register plate in the theme re-registers from here for free. */
  --nov-wash-cranberry: rgba(242, 85, 84, 0.24);
  --nov-wash-sienna: rgba(232, 137, 74, 0.24);
  --nov-wash-ochre: rgba(224, 169, 42, 0.26);
  --nov-wash-sage: rgba(163, 181, 106, 0.22);
  --nov-wash-roast: rgba(185, 141, 94, 0.24);
  /* Pencil shading inverts outright: graphite on cream is darker than the
     sheet, chalk on toned stock is lighter. Alpha stays at the floor because
     the CRT layer that carries it is fixed ABOVE the text. */
  --nov-hatch: rgba(240, 226, 200, 0.05);

  /* The wobble kit, the illustration geometry, both type stacks and every
     --tt-* alias resolve from the ramp above and are deliberately absent here:
     lamplight changes the colour of a drawn line, not its radius, its face or
     which token it answers to. */
  --tt-breadcrumb-glow: rgba(255, 126, 126, 0.3);
  /* Inverted for the same reason as the base value, in the other direction.
     This is a DARK card now, so a dark halo would be invisible on it — the
     exact trap the base block flags for light themes, seen from the other
     side. A warm cranberry at 0.55 traces a gold glyph on #2f2114 as lamplight
     catching the edge of a character. Never a border: the rule that consumes
     this token lives once, in main.css, and casts from the glyph's own shape. */
  --zodiac-glow: rgba(255, 126, 126, 0.55);
  /* Back to the :root default, restated because the base block above now sets
     the white one. A dark card is cut into with black below the glyph. */
  --tt-engrave: 0 1px 0 rgba(0, 0, 0, 0.55);

  --border-dim: rgba(242, 85, 84, 0.34);
  --border-teal: rgba(185, 141, 94, 0.5);
  background: var(--nov-paper);
  /* Dark, so UA form controls, the default scrollbar and any user-agent chrome
     render for the lamp rather than for the sheet. */
  color-scheme: dark;
}

/* The paper's tooth. --nov-hatch carries the pen hatch and has already
   inverted; the laid lines of the stock are a separate literal and invert with
   it. Both passes stay static. */
body[data-theme-id="november"][data-mode="night"]::before {
  background:
    repeating-linear-gradient(
      52deg,
      transparent 0 7px,
      var(--nov-hatch) 7px 8px,
      transparent 8px 15px
    ),
    repeating-linear-gradient(
      0deg,
      rgba(240, 226, 200, 0.028) 0 1px,
      transparent 1px 5px
    );
}

/* THE PAPER under one lamp. The four colour bleeds keep their exact positions
   and sizes — this is the same sheet with the same stains on it — and only
   their pigment changes, since a 9% dark cranberry on a dark roast ground is
   no bleed at all. The base linear-gradient turns into the fall-off: warmest
   at the top left where the lamp stands, deepest at the bottom edge of the
   desk. Large, soft, and completely static. */
body[data-theme-id="november"][data-mode="night"] .night-sky {
  background:
    radial-gradient(ellipse 60% 44% at 14% 8%, rgba(242, 85, 84, 0.1), transparent 70%),
    radial-gradient(ellipse 52% 40% at 88% 4%, rgba(224, 169, 42, 0.12), transparent 72%),
    radial-gradient(ellipse 46% 38% at 6% 72%, rgba(163, 181, 106, 0.08), transparent 74%),
    radial-gradient(ellipse 78% 34% at 50% 104%, rgba(232, 137, 74, 0.14), transparent 76%),
    linear-gradient(174deg, #2c2016 0%, var(--nov-paper) 46%, #180f08 100%);
}

/* Grain and the two watercolour blooms. Only background-image is restated —
   size, position, repeat and the `animation: none` that stops the star drift
   all still come from the base rule, which this does not disturb. The speckle
   inverts to catch the light the way tooth on dark stock does; the drying
   rings stay the colour of the wash that left them. */
body[data-theme-id="november"][data-mode="night"] .night-sky::before {
  background-image:
    radial-gradient(circle at 50% 50%, rgba(240, 226, 200, 0.05) 0 0.6px, transparent 1.1px),
    radial-gradient(circle at 50% 50%, rgba(214, 196, 164, 0.04) 0 0.5px, transparent 1px),
    radial-gradient(ellipse 15rem 11rem at 24% 30%, transparent 0 82%, rgba(232, 137, 74, 0.07) 86% 96%, transparent 100%),
    radial-gradient(ellipse 19rem 13rem at 79% 63%, transparent 0 84%, rgba(163, 181, 106, 0.06) 88% 97%, transparent 100%);
}

/* FALLING LEAVES. Kept, not hidden: these are scenery, not stars, and November
   has no other ambient motion to fall back on. Every ellipse keeps its exact
   aspect, position and tile, so the density, the seamless per-loop travel and
   both keyframes are untouched — only the pigment moves, to leaves lit from
   the side by a lamp instead of by an overcast afternoon. The alphas rise a
   little because a translucent leaf has less to lift off a dark ground. */
body[data-theme-id="november"][data-mode="night"] .night-sky__stars--far {
  background-image:
    radial-gradient(ellipse 7px 3.5px at 27% 18%, rgba(232, 137, 74, 0.5) 0 46%, transparent 78%),
    radial-gradient(ellipse 4px 7px at 64% 52%, rgba(224, 169, 42, 0.46) 0 44%, transparent 76%),
    radial-gradient(ellipse 8px 4px at 41% 81%, rgba(242, 85, 84, 0.42) 0 44%, transparent 76%);
}

body[data-theme-id="november"][data-mode="night"] .night-sky__stars--near {
  background-image:
    radial-gradient(ellipse 12px 5px at 22% 26%, rgba(232, 137, 74, 0.56) 0 42%, transparent 74%),
    radial-gradient(ellipse 6px 11px at 71% 58%, rgba(242, 85, 84, 0.48) 0 42%, transparent 74%),
    radial-gradient(ellipse 10px 6px at 46% 88%, rgba(185, 141, 94, 0.46) 0 42%, transparent 74%);
}

/* THE HARVEST TABLE. The two broken pen lines resolve from --nov-ink-line and
   have already turned to chalk; they are restated only because background-image
   is one property and the wood underneath them is three literals. Walnut under
   a lamp rather than oak in daylight: the top plane still catches more light
   than the apron, and the grain inverts to the pale scratches a low light
   picks out across a dark board. Sizes and positions come from the base rule.

   The gourds on ::before are absent from this block on purpose — every layer
   of that still life is drawn in --nov-ink-line and the three washes, so it
   re-lights from the token block with no rule at all. */
body[data-theme-id="november"][data-mode="night"] .night-sky__aurora {
  background-image:
    repeating-linear-gradient(
      90deg,
      var(--nov-ink-line) 0 29px,
      transparent 29px 34px,
      var(--nov-ink-line) 34px 71px,
      transparent 71px 76px
    ),
    repeating-linear-gradient(
      90deg,
      var(--nov-ink-line) 0 47px,
      transparent 47px 51px,
      var(--nov-ink-line) 51px 103px,
      transparent 103px 108px
    ),
    repeating-linear-gradient(
      90deg,
      rgba(240, 226, 200, 0.13) 0 2px,
      transparent 2px 19px,
      rgba(240, 226, 200, 0.08) 19px 20px,
      transparent 20px 47px
    ),
    linear-gradient(180deg, #5a3d20 0%, #462f18 100%),
    linear-gradient(180deg, #33210f 0%, #241609 100%);
}

/* Wheat and fallen leaves. The two leaves are washes and would re-light on
   their own; the sheaf is five literal rgba() strokes and cannot. Grain heads
   go to the night ochre so they still read as the brightest thing standing on
   the table, which is what a lamp does to dry wheat. */
body[data-theme-id="november"][data-mode="night"] .night-sky__aurora::after {
  background-image:
    radial-gradient(0.07rem 1.2rem at 61% 100%, rgba(224, 169, 42, 0.85) 0 78%, transparent 100%),
    radial-gradient(0.06rem 1.45rem at 63% 100%, rgba(224, 169, 42, 0.75) 0 78%, transparent 100%),
    radial-gradient(0.07rem 1.05rem at 65% 100%, rgba(224, 169, 42, 0.8) 0 78%, transparent 100%),
    radial-gradient(0.2rem 0.42rem at 63% calc(100% - 1.5rem), rgba(224, 169, 42, 0.7) 0 72%, transparent 100%),
    radial-gradient(0.18rem 0.36rem at 61% calc(100% - 1.24rem), rgba(232, 137, 74, 0.6) 0 72%, transparent 100%),
    radial-gradient(0.6rem 0.22rem at 82% 99%, var(--nov-wash-cranberry) 0 60%, transparent 74%),
    radial-gradient(0.5rem 0.2rem at 88% 99%, var(--nov-wash-sage) 0 60%, transparent 74%);
}

/* The wavy pen underline that used to run under prose links here is gone
   (removed above per the standing no-underline rule, 2026-08-14); the resting
   link colour itself still re-derives for night on its own. */

/* A highlighter swipe is a translucent pigment over the stock, so it inverts
   with the stock: the same gradient banked into the same lower two thirds of
   the line, mixed from the night ochre. The type over it re-derives. */
body[data-theme-id="november"][data-mode="night"] mark {
  background: linear-gradient(
    180deg,
    transparent 0 22%,
    var(--nov-wash-ochre) 26%,
    rgba(224, 169, 42, 0.34) 92%,
    transparent 98%
  );
}

/* The one surface fill in the theme. It was cream stock knocked back a shade;
   it is now the same relationship on the other side — the paper-deep value at
   the same alpha, so an input still reads as a panel let into the sheet rather
   than a hole cut through it. The pen outline and the wobble come from the
   base rule. */
body[data-theme-id="november"][data-mode="night"] input,
body[data-theme-id="november"][data-mode="night"] textarea,
body[data-theme-id="november"][data-mode="night"] select,
body[data-theme-id="november"][data-mode="night"] code,
body[data-theme-id="november"][data-mode="night"] pre {
  background-color: rgba(47, 34, 20, 0.62);
}

/* THE PLACE CARD. Every fleck, the hatch and the stock itself are literals, so
   the whole fill is restated: the same three fleck tiles at the same offsets,
   the same 48deg hatch, and the same 168deg stock gradient, all mixed for card
   that has been sitting under a lamp. The 2px cranberry frame, the wobble and
   main.css's inherited ::after keyline are untouched — and the frame is why
   this stays legible as an object rather than a dark patch on a dark page. */
body[data-theme-id="november"][data-mode="night"] .breadcrumb-nav {
  background:
    radial-gradient(circle at 30% 40%, rgba(240, 226, 200, 0.1) 0 1px, transparent 1.6px)
      0 0 / 17px 13px repeat,
    radial-gradient(circle at 70% 65%, rgba(242, 85, 84, 0.1) 0 1.1px, transparent 1.7px)
      5px 7px / 23px 19px repeat,
    radial-gradient(circle at 45% 20%, rgba(224, 169, 42, 0.09) 0 0.9px, transparent 1.5px)
      11px 3px / 29px 23px repeat,
    repeating-linear-gradient(
      48deg,
      transparent 0 6px,
      rgba(240, 226, 200, 0.04) 6px 7px,
      transparent 7px 13px
    ) 0 0 / 100% 100%,
    linear-gradient(168deg, #3d2b1a 0%, var(--nov-kraft) 46%, #241809 100%)
      0 0 / 100% 100% no-repeat;
}

/* Nothing in this counterpart reaches .celestial-chip. The base block's pin is
   left exactly as written and is not repeated here, and — as the note beside it
   records — this sheet still contains no bare `button` selector anywhere, so
   there is no cancellation to preserve and the chips keep the hover lift they
   have on every other month. The only chip-facing change in either mode is
   --zodiac-glow, which is a halo cast from the glyph and never a frame. */

/* Button, card and list-anchor press states. The tinted backgrounds are the
   one part of the interaction grammar written as literal rgba, so they are the
   one part that needs restating; the borders, the colour changes, the wobble
   and the re-registered wash all re-derive. Alpha rises slightly because a
   tint has less to lift off a dark ground than off cream. */
body[data-theme-id="november"][data-mode="night"] .sitemap-link:hover,
body[data-theme-id="november"][data-mode="night"] .sitemap-link:focus-visible,
body[data-theme-id="november"][data-mode="night"] .calendar-app__nav:hover,
body[data-theme-id="november"][data-mode="night"] .calendar-app__nav:focus-visible,
body[data-theme-id="november"][data-mode="night"] .calendar-app__today:hover,
body[data-theme-id="november"][data-mode="night"] .calendar-app__today:focus-visible {
  background: rgba(242, 85, 84, 0.12);
}

/* Calendar. The base block covers this further than the other months because
   main.css writes the calendar's tints as literal rgba() in July's palette;
   the same argument applies twice over here, since the base block's OWN
   replacements are literals too. Each one is remixed from the night ramp at a
   slightly higher alpha. The category left-borders are the sanctioned
   border-left — <a> inside <ul> — and their colours already re-derive. */
body[data-theme-id="november"][data-mode="night"] .calendar-day--today {
  background: rgba(242, 85, 84, 0.12);
}

body[data-theme-id="november"][data-mode="night"] .calendar-event__link,
body[data-theme-id="november"][data-mode="night"] .calendar-subscribe__action {
  background: rgba(242, 85, 84, 0.12);
}

body[data-theme-id="november"][data-mode="night"] .calendar-event__link:hover,
body[data-theme-id="november"][data-mode="night"] .calendar-event__link:focus-visible,
body[data-theme-id="november"][data-mode="night"] .calendar-subscribe__action:hover,
body[data-theme-id="november"][data-mode="night"] .calendar-subscribe__action:focus-visible {
  background: rgba(224, 169, 42, 0.2);
}

body[data-theme-id="november"][data-mode="night"] .calendar-event[data-category="running"] .calendar-event__link { background: rgba(232, 137, 74, 0.14); }

body[data-theme-id="november"][data-mode="night"] .calendar-event[data-category="hiking"] .calendar-event__link { background: rgba(163, 181, 106, 0.16); }

body[data-theme-id="november"][data-mode="night"] .calendar-event[data-category="food"] .calendar-event__link { background: rgba(224, 169, 42, 0.16); }

body[data-theme-id="november"][data-mode="night"] .calendar-event[data-category="growing"] .calendar-event__link,
body[data-theme-id="november"][data-mode="night"] .calendar-event[data-category="gardening"] .calendar-event__link { background: rgba(138, 154, 82, 0.16); }

body[data-theme-id="november"][data-mode="night"] .calendar-event[data-category="observance"] .calendar-event__link { background: rgba(212, 129, 128, 0.16); }

body[data-theme-id="november"][data-mode="night"] .calendar-subscribe__action--download {
  background: rgba(163, 181, 106, 0.16);
}

/* Reduced data has to be restated for the two leaf depths and the grain, and
   for nothing else. The base reduced-motion block already carries
   `animation: none !important`, which beats any specificity this counterpart
   can reach and freezes the leaves where they stand in either lighting. The
   base reduced-data block does not use !important, so its (0,1,2) rules lose
   to the (0,2,2) background-image rules above — the grain would come back and
   each depth would keep all three tiles. Same reduction, night pigment: the
   speckle drops to the flat washes underneath it and each depth falls to one
   leaf tile, which is still legibly a lamplit sheet with leaves on it. */
@media (prefers-reduced-data: reduce) {
  body[data-theme-id="november"][data-mode="night"] .night-sky::before {
    background-image: none;
  }

  body[data-theme-id="november"][data-mode="night"] .night-sky__stars--far {
    background-image:
      radial-gradient(ellipse 7px 3.5px at 27% 18%, rgba(232, 137, 74, 0.5) 0 46%, transparent 78%);
    background-size: 47rem 24rem;
  }

  body[data-theme-id="november"][data-mode="night"] .night-sky__stars--near {
    background-image:
      radial-gradient(ellipse 12px 5px at 22% 26%, rgba(232, 137, 74, 0.56) 0 42%, transparent 74%);
    background-size: 39rem 30rem;
  }
}

/* Each depth travels exactly one background tile height, so the loop restarts
   with no seam and no reset flash. Transform only, on two small isolated
   layers; linear so the fall never appears to speed up or hesitate. */
@keyframes novemberLeafFar {
  from { transform: translate3d(0, 0, 0); }
  to { transform: translate3d(0, 24rem, 0); }
}

@keyframes novemberLeafNear {
  from { transform: translate3d(0, 0, 0); }
  to { transform: translate3d(0, 30rem, 0); }
}
