/* EON — surface texture utilities.
   V2 rule: dark surface tokens must never be a flat digital block; they carry
   a faint grain (feTurbulence fractalNoise, overlay blend). Light applied from top-left.
   Apply .eon-grain / .eon-grain-soft to a positioned element (adds ::after). */
.eon-grain, .eon-grain-soft { position: relative; }
.eon-grain::after {
  content: ""; position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E");
  mix-blend-mode: overlay; opacity: 0.7;
}
.eon-grain-soft::after {
  content: ""; position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.28'/%3E%3C/svg%3E");
  mix-blend-mode: overlay; opacity: 0.6;
}
