/* Grain texture overlay tuned for LIGHT backgrounds — black noise + multiply blend
   at low opacity produces very subtle speckles on the cream/white bg. */
body::after {
  content: "";
  position: fixed;
  inset: -8%;
  pointer-events: none;
  z-index: 9999;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='320' height='320'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  opacity: 0.07;
  mix-blend-mode: multiply;
  animation: _grainShift 0.9s steps(1) infinite;
  will-change: transform;
}
@keyframes _grainShift {
  0%   { transform: translate( 0%,  0%); }
  10%  { transform: translate(-2%, -3%); }
  20%  { transform: translate( 3%,  1%); }
  30%  { transform: translate(-1%,  2%); }
  40%  { transform: translate( 2%, -2%); }
  50%  { transform: translate(-3%,  1%); }
  60%  { transform: translate( 1%,  3%); }
  70%  { transform: translate(-2%, -1%); }
  80%  { transform: translate( 2%,  2%); }
  90%  { transform: translate(-1%, -2%); }
  100% { transform: translate( 0%,  0%); }
}
