/* Paper grain — applied as a fixed overlay so every page gets the texture. * All three layers sit behind content (negative z-index) so fixed-positioned * modals (e.g. the search palette) can escape ancestor stacking traps. */ body::before { content: ""; position: fixed; inset: 0; pointer-events: none; z-index: -3; background-color: var(--base); } body::after { content: ""; position: fixed; inset: 0; pointer-events: none; z-index: -1; opacity: 0.32; mix-blend-mode: multiply; background-image: url("data:image/svg+xml;utf8,"); } .salon-noir body::after, html.salon-noir body::after { opacity: 0.5; } .gothic body::after, html.gothic body::after { opacity: 0.55; background-image: url("data:image/svg+xml;utf8,"); mix-blend-mode: screen; } /* Breakcore: blown-out RGB-tinted digital noise + CRT scanlines. */ .breakcore body::after, html.breakcore body::after { opacity: 0.55; background-image: url("data:image/svg+xml;utf8,"), repeating-linear-gradient( 0deg, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 2px, rgba(0, 0, 0, 0.28) 3px, rgba(0, 0, 0, 0) 4px ); mix-blend-mode: screen; } .breakcore .salon-atmosphere::before { opacity: 0.32; } .breakcore .salon-atmosphere::after { opacity: 0.28; } /* Floating motes of pigment — far background, very subtle. */ .salon-atmosphere { position: fixed; inset: 0; z-index: -2; pointer-events: none; overflow: hidden; } .salon-atmosphere::before, .salon-atmosphere::after { content: ""; position: absolute; border-radius: 50%; filter: blur(120px); opacity: 0.18; } .salon-atmosphere::before { width: 55vw; height: 55vw; top: -15vw; left: -10vw; background: var(--mauve); } .salon-atmosphere::after { width: 45vw; height: 45vw; bottom: -10vw; right: -10vw; background: var(--blue); opacity: 0.12; } code, pre, kbd, samp { font-family: var(--font-mono); } /* Selection */ ::selection { background: var(--mauve); color: var(--rosewater); } /* Breakcore: chromatic-aberration glow on display headings + nameplate. */ .breakcore .prose h1, .breakcore .prose h2, .breakcore h1.font-display, .breakcore .nameplate-title { text-shadow: -1px 0 0 color-mix(in srgb, var(--teal) 70%, transparent), 1px 0 0 color-mix(in srgb, var(--mauve) 70%, transparent), 0 0 18px color-mix(in srgb, var(--mauve) 35%, transparent); } .breakcore ::selection { background: var(--green); color: var(--crust); text-shadow: 0 0 6px var(--mauve); }