/* Cyera PostProcess-derived DOM port: real paper-grain samples, ±.02 temporal noise.
   The browser blends this with live DOM; it does not rasterize the page into WebGL. */
:root { --grain-dpr:1; --grain-tile-size:calc(256px / var(--grain-dpr)); }
/* Disable the superseded translated binary texture if this replaces it in-place. */
body::after { content:none; }
dialog.art-dialog::after { content:none; }
.site-grain {
  position:fixed;
  inset:0;
  pointer-events:none;
  user-select:none;
  background-repeat:repeat,no-repeat;
  background-size:var(--grain-tile-size),cover;
  background-position:0 0,center;
  background-blend-mode:screen;
  animation:cyera-grain-seeds 1s steps(1,end) infinite;
  animation-play-state:paused;
}
.site-grain-negative {
  z-index:2147483000;
  background-image:var(--noise-negative,url('assets/noise/frame-00-negative.png')),url('assets/noise/paper-negative.png');
  mix-blend-mode:difference;
}
.site-grain-positive {
  z-index:2147483001;
  background-image:var(--noise-positive,url('assets/noise/frame-00-positive.png')),url('assets/noise/paper-positive.png');
  mix-blend-mode:screen;
}
@supports (mix-blend-mode:plus-lighter) {
  .site-grain-positive { mix-blend-mode:plus-lighter; }
}
/* Safari can subtract with clipping. Chromium/Firefox use difference as a close
   subtraction fallback; near pure black this is not shader-equivalent arithmetic. */
@supports (mix-blend-mode:plus-darker) {
  .site-grain-negative { mix-blend-mode:plus-darker; filter:invert(1); }
}
html[data-noise-ready=true]:not([data-noise-paused=true]) body>.site-grain,
html[data-noise-ready=true]:not([data-noise-paused=true]) dialog.art-dialog[open]>.site-grain,
html[data-noise-ready=true]:not([data-noise-paused=true]) dialog.theme-dialog[open]>.site-grain {
  animation-play-state:running;
}
/* Top-layer modal content has its own two small texture layers. Its backdrop keeps
   the existing opaque tint, with a static neutral paper texture outside the dialog. */
dialog.art-dialog::backdrop {
  background-color:#161812e8;
  background-image:url('assets/noise/paper-backdrop.png');
  background-repeat:no-repeat;
  background-size:cover;
  background-position:center;
}
@media(prefers-reduced-motion:reduce) {
  .site-grain { animation:none; }
}
/* The generated keyframes below follow floor(fract(seconds) * 12.1).
   Seeds 0..11 last 82.6446 ms; seed 12 lasts 8.2645 ms before the 1 s reset. */
@keyframes cyera-grain-seeds {
  0.000000000% { --noise-negative:url('assets/noise/frame-00-negative.png'); --noise-positive:url('assets/noise/frame-00-positive.png'); }
  8.264462810% { --noise-negative:url('assets/noise/frame-01-negative.png'); --noise-positive:url('assets/noise/frame-01-positive.png'); }
  16.528925620% { --noise-negative:url('assets/noise/frame-02-negative.png'); --noise-positive:url('assets/noise/frame-02-positive.png'); }
  24.793388430% { --noise-negative:url('assets/noise/frame-03-negative.png'); --noise-positive:url('assets/noise/frame-03-positive.png'); }
  33.057851240% { --noise-negative:url('assets/noise/frame-04-negative.png'); --noise-positive:url('assets/noise/frame-04-positive.png'); }
  41.322314050% { --noise-negative:url('assets/noise/frame-05-negative.png'); --noise-positive:url('assets/noise/frame-05-positive.png'); }
  49.586776860% { --noise-negative:url('assets/noise/frame-06-negative.png'); --noise-positive:url('assets/noise/frame-06-positive.png'); }
  57.851239669% { --noise-negative:url('assets/noise/frame-07-negative.png'); --noise-positive:url('assets/noise/frame-07-positive.png'); }
  66.115702479% { --noise-negative:url('assets/noise/frame-08-negative.png'); --noise-positive:url('assets/noise/frame-08-positive.png'); }
  74.380165289% { --noise-negative:url('assets/noise/frame-09-negative.png'); --noise-positive:url('assets/noise/frame-09-positive.png'); }
  82.644628099% { --noise-negative:url('assets/noise/frame-10-negative.png'); --noise-positive:url('assets/noise/frame-10-positive.png'); }
  90.909090909% { --noise-negative:url('assets/noise/frame-11-negative.png'); --noise-positive:url('assets/noise/frame-11-positive.png'); }
  99.173553719% { --noise-negative:url('assets/noise/frame-12-negative.png'); --noise-positive:url('assets/noise/frame-12-positive.png'); }
}
