/* =====================================================================
   KRATEO SHARED TOKENS
   The neutral palette and the grain of every page in public/ outside
   public/setmaster/, which has its own shell. One copy, linked by each
   page: when every page inlined its own, --mid was #9e9e9e on three and
   #888888 on nine (homepage#86). Where the copies disagreed, the lighter
   value won (Lorenz, 2026-09-15). check_public.py fails if a page defines
   one of these tokens or a grain itself, or does not link this file.
   Page-specific tokens stay in the page: the accent, the fonts, and
   anything only that page uses.
   ===================================================================== */

:root {
  --bg:        #0a0a0a;
  --bg2:       #111111;
  --bg3:       #1a1a1a;
  --rule:      #222222;
  --dim:       #8a8a8a;
  --mid:       #9e9e9e;
  --light:     #d0d0d0;
  --white:     #f0ede8;
  --warm:      #d8d2c8;
  --hi:        rgba(240,237,232,0.04);   /* subtle highlight bg */
  --hi-border: rgba(240,237,232,0.12);   /* highlight border */
}

/* The grain, made visible (Lorenz, 2026-09-15). It sat at z-index -1,
   behind body's opaque background, and never rendered (homepage#85).
   Same tile and strength as the SetMaster pages' .grain: opacity 0.07 in
   normal blend, above the content, and clicks pass through it. */
body::before {
  content: '';
  position: fixed; inset: 0; z-index: 9999; pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='1'/%3E%3C/svg%3E");
  background-repeat: repeat; background-size: 128px 128px;
  opacity: 0.07; mix-blend-mode: normal;
}
