{"version":3,"file":"shared-lib.DQ94l8eV.mjs","names":["useRef","useState","fonts","css","className"],"sources":["https:/framerusercontent.com/modules/HQx0tiPKqgCElZwDxD4x/EoGzPv8IcXlQSvG5yGa2/Untergrund_1.js","https:/framerusercontent.com/modules/kya8xQmz84BP1J74VU4f/zCJbCaI1BxhyuzCCuPZm/DVFh5F3C0.js","https:/framerusercontent.com/modules/ZBTwhR41wze5nAE4lWsX/cnCqAubjeH9uG6sELFts/yNq2tzKH8.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{useEffect,useRef,useState}from\"react\";/**\n * Untergrund\n *\n * Prozedurale Materialoberfläche als WebGL-Shader, nachgebildet nach der\n * Vorlage schwarzstahl_higru.png: matte Platte mit grosser Lichtform,\n * ausgefransten Flecken, waagrechten Absätzen und senkrechten Läufern.\n *\n * Die Fläche deckt die ganze Seite ab und **scrollt mit** — nichts steht fest.\n * Weil eine einzelne Zeichenfläche auf Retina an der Kantengrenze der\n * Grafikkerne scheitert (Seite 2880 × 16728 Punkte, Grenze 16384), wird die\n * Seite in **Scheiben** gerendert: ein einziges WebGL-Werkzeug malt\n * nacheinander Streifen in voller Punktdichte, jeder wird auf eine eigene\n * Fläche kopiert und exakt positioniert. Das Rauschfeld ist in absoluten\n * Seitenkoordinaten definiert — die Scheiben fügen sich nahtlos.\n *\n * Wird einmal gezeichnet, nicht animiert: kein Dauerverbrauch von Rechenzeit\n * oder Akku. Das Foto in `bildquelle` ist reiner Rückfall für Umgebungen ohne\n * WebGL.\n *\n * Messwerte der Vorlage (Graustufe 0..255):\n *   Tiefe #222224 · Mitte #343638 · Lichter #424447\n *\n * Die Vorgaben unten stehen aber nicht auf diesen Messwerten, sondern auf der\n * CI-Herleitung aus Cool Gray 11 C (#55575C): Tiefe #222325 (× 0,40),\n * Lichter #424448 (× 0,78). Abweichung höchstens ein Punkt je Kanal — damit\n * ist die Platte eine abgedunkelte Verlängerung der CI-Farbe und nicht mehr\n * nur eine Messung. Angeglichen 14.08.2026.\n *\n * @framerIntrinsicWidth 1200\n * @framerIntrinsicHeight 800\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n *//** Versionskennung. Steht als data-fassung im DOM, damit sich auf der\n    veroeffentlichten Seite zweifelsfrei ablesen laesst, welcher Stand\n    laeuft — Schluss mit Raten ueber Publish-Zeitpunkte. */const FASSUNG=\"F25\";/** Der Grundton der Seite. Nur fuer das Startdunkel gebraucht — die\n    Platte selbst kommt aus den Reglern „Tiefe\" und „Lichter\". */const KOHLE=\"var(--token-ade8327d-738a-4ea6-ad7a-c5f34e4f3c59)\";/** Scheibenhoehe in CSS-Punkten. Ganzzahlig, damit die Kanten der Scheiben\n    exakt aneinanderstossen und kein Haarspalt entsteht. */const SCHEIBE=1024;/** Wer den Untergrund abzeichnet, muss wissen, wann er neu ist.\n    Die Kopfleiste malt ihren Metallstreifen von den Scheiben ab. Bis\n    26.08.2026 erfuhr sie nicht, wenn ein Durchgang fertig war — nach einem\n    Sprung in den Vollbildmodus blieb ihr rechtes Stueck grau, solange\n    niemand scrollte (gemessen: 13 % der Leiste, auch nach 5 s noch).\n    Deshalb meldet der Untergrund jede fertige Scheibe des Erstaufbaus und\n    jeden abgeschlossenen Durchgang als Ereignis am Fenster. */const EREIGNIS_GEZEICHNET=\"gusswerk:untergrund\";const melden=was=>{try{window.dispatchEvent(new CustomEvent(EREIGNIS_GEZEICHNET,{detail:{was}}));}catch{/* egal */}};const VS=`\n    attribute vec2 lage;\n    void main() { gl_Position = vec4(lage, 0.0, 1.0); }\n`;const FS=`\n    precision highp float;\n    uniform vec2  aufloesung;   /* Gesamtpuffer der ganzen Seite */\n    uniform float abBoden;      /* Puffer-Punkte unterhalb dieser Scheibe */\n    uniform vec3  grund;\n    uniform vec3  hell;\n    uniform float licht;\n    uniform float koernung;\n    uniform float stoerungen;\n    uniform float baender;\n    uniform float laeufer;\n    uniform float schlieren;\n    uniform float wasser;\n    uniform float verzerrung;\n    uniform float einheit;      /* Kantenlaenge Feinkorn */\n    uniform float einheitGrob;  /* Kantenlaenge Wasserzeichnung */\n    uniform float aussteuerung;\n    uniform float saat;\n\n    /** Streuwert mit begrenztem Zahlenraum.\n\n        Der naive Weg — Koordinate mal grosse Zahl, dann Nachkommateil —\n        bricht zusammen, sobald die Koordinaten gross werden: die 24 Bit\n        Mantisse einer Grafikkarte haben in den Hunderttausendern keine\n        Nachkommastellen mehr, die feinen Oktaven verkommen zur Konstanten.\n        Deshalb ein Permutationspolynom modulo 289: alle Zwischenwerte\n        bleiben unter 2,8 Millionen und damit ganzzahlig exakt. */\n    vec2 permutiere(vec2 x) {\n        return mod((34.0 * x + 1.0) * x, 289.0);\n    }\n\n    float hash(vec2 p) {\n        vec2 g = mod(floor(p + 0.5), 289.0);\n        float h = permutiere(permutiere(vec2(g.x, 0.0)) + vec2(g.y, 0.0)).x;\n        h = mod(h + mod(saat, 289.0) * 17.0, 289.0);\n        return h / 289.0;\n    }\n\n    /** Wertrauschen mit weicher Interpolation. Die vier Gitterpunkte werden\n        vor dem Streuen umgebrochen, damit auch sie im begrenzten Zahlenraum\n        bleiben. */\n    float rauschen(vec2 p) {\n        vec2 i = floor(p);\n        vec2 f = fract(p);\n        f = f * f * (3.0 - 2.0 * f);\n        vec2 i0 = mod(i, 289.0);\n        vec2 i1 = mod(i + 1.0, 289.0);\n        float a = hash(i0);\n        float b = hash(vec2(i1.x, i0.y));\n        float c = hash(vec2(i0.x, i1.y));\n        float d = hash(i1);\n        return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n    }\n\n    /** Gebrochene Selbst\\xe4hnlichkeit. Drei Tiefen, damit grobe Masken nicht\n        so teuer sind wie die bildbestimmenden Felder. */\n    float fbm6(vec2 p) {\n        float s = 0.0; float g = 0.5;\n        for (int i = 0; i < 6; i++) { s += g * rauschen(p); p *= 2.03; g *= 0.5; }\n        return s;\n    }\n    float fbm4(vec2 p) {\n        float s = 0.0; float g = 0.5;\n        for (int i = 0; i < 4; i++) { s += g * rauschen(p); p *= 2.03; g *= 0.5; }\n        return s;\n    }\n    float fbm3(vec2 p) {\n        float s = 0.0; float g = 0.5;\n        for (int i = 0; i < 3; i++) { s += g * rauschen(p); p *= 2.03; g *= 0.5; }\n        return s;\n    }\n\n    void main() {\n        /** Absolute Seitenkoordinate in Puffer-Punkten, von unten gezaehlt.\n            Nur dadurch fuegen sich die Scheiben nahtlos: jede rechnet im\n            selben Feld, lediglich ihr Ausschnitt verschiebt sich. */\n        float ax = gl_FragCoord.x;\n        float ay = abBoden + gl_FragCoord.y;\n\n        vec2 uv = vec2(ax, ay) / aufloesung;\n        float u = uv.x;\n        float v = uv.y;\n\n        /** Die Struktur haengt an einer festen Groesse in Bildpunkten, nicht\n            am Seitenverhaeltnis — sonst wird sie auf einer langen Seite in\n            die Laenge gezogen. \"einheit\" ist die Kantenlaenge einer\n            Struktureinheit im Zeichenpuffer. */\n        /** Zwei Massstaebe: die Wasserzeichnung (Flecken, Absaetze,\n            Laeufer) ist gross und ruhig, das Korn fein — wie in der\n            Vorlage, die beides zugleich hat. Ein einziger Massstab kann\n            nur eines von beiden treffen. */\n        vec2 p = vec2(ax, ay) / einheitGrob;\n        vec2 pF = vec2(ax, ay) / einheit;\n        float ty = (aufloesung.y - ay) / einheitGrob;\n\n        // --- Grosse Lichtform ---------------------------------------\n        // Einziger Teil, der auf die ganze Flaeche bezogen bleibt: sie\n        // ist Komposition, nicht Material. Hell im oberen Bereich, nach\n        // unten und zu den Ecken abfallend, mit Rauschen verbogen.\n        float nty = 1.0 - v;\n        float lw = fbm4(p * 0.35 + 91.0) - 0.5;\n        float dx = (u - 0.5) + lw * 0.30;\n        float dy = (nty - 0.28) + lw * 0.22;\n        float kuppe = exp(-(dx * dx * 2.1 + dy * dy * 1.5) * 2.4);\n        float grossform = (kuppe - 0.42) * 0.595 - (nty - 0.5) * 0.255;\n\n        // --- Grundfleckigkeit ---------------------------------------\n        float grob = fbm6(p * 1.6 + vec2(0.0, 3.1));\n        float fein = fbm6(vec2(pF.x * 14.0, pF.y * 3.5) + 11.0);\n        float schl = fbm6(vec2(p.x * 0.8, p.y * 9.0) + 27.0);\n        float fluss = (grob - 0.5) * 0.42\n                    + (fein - 0.5) * 0.16 * koernung\n                    + (schl - 0.5) * schlieren * 0.30;\n\n        // --- Ausgefranste Flecken mit harter Kante ------------------\n        // Erst das Feld verbiegen, dann hart schwellen: das ergibt\n        // Raender wie eine Kuestenlinie statt weicher Wolken.\n        float wx = fbm6(p * 0.9 + 41.0) - 0.5;\n        float wy = fbm6(p * 0.9 + 63.0) - 0.5;\n        vec2 q = p + vec2(wx, wy) * verzerrung * 3.0;\n\n        float flecken = 0.0;\n        flecken += (smoothstep(0.490, 0.510, fbm6(q * 1.05 + 50.0)) - 0.5) * 1.00;\n        flecken += (smoothstep(0.540, 0.560, fbm6(q * 2.30 + 55.0)) - 0.5) * 0.62;\n        flecken += (smoothstep(0.450, 0.470, fbm6(q * 0.55 + 46.0)) - 0.5) * 0.48;\n        flecken += (smoothstep(0.520, 0.540, fbm6(q * 4.10 + 53.0)) - 0.5) * 0.40;\n        fluss += flecken * stoerungen * 0.1725;\n\n        // --- Wasserflecken ------------------------------------------\n        // Das praegendste Merkmal der Vorlage: grosse dunkle Standflecken\n        // mit harter, ausgefranster Kante. Sehr niederfrequent — ein bis\n        // zwei je Bildschirm — und deutlich dunkler als die freie Flaeche.\n        float wf = fbm4(p * 0.30 + vec2(131.0, 17.0))\n                 + (fbm6(q * 0.9 + 77.0) - 0.5) * 0.35;\n        float fleckMaske = smoothstep(0.495, 0.525, wf);\n        float fleckKante = fleckMaske * (1.0 - fleckMaske) * 4.0;\n        fluss -= fleckMaske * wasser * 0.22;\n        fluss -= fleckKante * wasser * 0.07;\n\n        // --- Waagrechte Absaetze ------------------------------------\n        // Die Hochachse wird in Zeilen gerastert. Jede Zeile bekommt\n        // ihren eigenen Zufallswert; nur wenige tragen ueberhaupt einen\n        // Absatz.\n        //\n        // SAUM (21.08.2026): Frueher brach jede Zeile an ihrer Grenze\n        // hart ab — und weil der Beitrag laengs der Zeile zwischen −0,5\n        // und +0,5 pendelt, stand an jeder Zeilengrenze eine Stufe ueber\n        // die VOLLE Breite. Genau das sind die waagrechten Baender, die\n        // Marcus gemeldet hat: kerzengerade Linien im Raster 35 px und\n        // 114 px. Gemessen als groesster Sprung der Zeilenmittel: 0,705\n        // mit harter Kante, 0,195 ohne Absaetze — 0,233 mit Saum. Die\n        // Streuung der Zeilenmittel bleibt dabei unveraendert bei 1,52;\n        // sie ist fuer harte Kanten blind, deshalb hat sie den Fehler\n        // erst nicht gezeigt.\n        //\n        // Der Saum laesst den Absatz an Ober- und Unterkante seiner\n        // Zeile auf null auslaufen. Der Absatz bleibt also erhalten, nur\n        // seine Zeilengrenze ist nicht mehr sichtbar. Die feine Zeile\n        // (35 px) braucht einen breiteren Anteil als die grobe (114 px),\n        // damit der Auslauf in Punkten aehnlich lang ist.\n        float z1 = floor(p.y * 16.25);\n        float r1 = fract(p.y * 16.25);\n        float saum1 = smoothstep(0.0, 0.22, r1) * smoothstep(1.0, 0.78, r1);\n        float w1 = hash(vec2(z1, 5.0));\n        fluss += (smoothstep(0.470, 0.495, fbm6(vec2(p.x * 1.417 + w1 * 9.0, z1 * 0.41 + 5.0))) - 0.5)\n               * baender * 0.135 * saum1\n               * smoothstep(0.58, 0.70, w1)\n               * smoothstep(0.44, 0.62, fbm3(vec2(p.x * 0.792 + w1 * 13.0, z1 * 0.23 + 47.0)));\n\n        float z2 = floor(p.y * 5.0);\n        float r2 = fract(p.y * 5.0);\n        float saum2 = smoothstep(0.0, 0.10, r2) * smoothstep(1.0, 0.90, r2);\n        float w2 = hash(vec2(z2, 23.0));\n        fluss += (smoothstep(0.470, 0.495, fbm6(vec2(p.x * 0.708 + w2 * 9.0, z2 * 0.41 + 23.0))) - 0.5)\n               * baender * 0.100 * saum2\n               * smoothstep(0.58, 0.70, w2)\n               * smoothstep(0.44, 0.62, fbm3(vec2(p.x * 0.792 + w2 * 13.0, z2 * 0.23 + 47.0)));\n\n        // --- Senkrechte Laeufer -------------------------------------\n        // Jede Spalte bekommt Startpunkt, Laenge und Breite; nur rund\n        // jede achte laeuft. Die Hochachse ist in Zellen von 1,6\n        // Einheiten geteilt, damit die Rinnsale auf einer langen Seite\n        // immer wieder neu ansetzen statt mitzuwachsen. Zwei Zellen je\n        // Durchgang, sonst reisst jede Zellgrenze die Laeufer ab.\n        float lauf = 0.0;\n        float zelle = floor(ty / 1.6);\n        for (int kk = 0; kk < 2; kk++) {\n            float takt = kk == 0 ? 62.5 : 24.167;\n            float staerke = kk == 0 ? 1.0 : 0.8;\n            float fx = p.x * takt + wx * 4.0;\n            float sp = floor(fx);\n            float lokal = fx - sp;\n            for (int zz = 0; zz < 2; zz++) {\n                float zi = zelle - float(zz);\n                float rk = zi * 31.0 + float(kk) * 7.0;\n                float r1 = hash(vec2(sp, 3.0 + rk));\n                float r2 = hash(vec2(sp, 11.0 + rk));\n                float r3 = hash(vec2(sp, 19.0 + rk));\n                float r4 = hash(vec2(sp, 29.0 + rk));\n                float oben = zi * 1.6 + 0.16 + r1 * 1.12;\n                float laenge = 0.048 + r2 * 0.352;\n                float breite = 0.20 + r4 * 0.45;\n                float profil = 1.0 - smoothstep(breite * 0.45, breite, abs(lokal - 0.5) * 2.0);\n                float senk = smoothstep(oben, oben + 0.048, ty)\n                           * (1.0 - smoothstep(oben + laenge, oben + laenge + 0.288, ty));\n                lauf += senk * profil * smoothstep(0.78, 0.90, r3) * staerke;\n            }\n        }\n        // Rinnsale haengen in Gruppen — und bevorzugt an den Kanten der\n        // Wasserflecken, wie in der Vorlage, wo sie aus den Flecken laufen.\n        float nester = smoothstep(0.42, 0.64, fbm3(vec2(p.x * 0.7, p.y * 0.5) + 71.0)) * 0.55\n                     + fleckKante * 0.85;\n        fluss -= lauf * nester * laeufer * 0.34;\n\n        // --- Geisterraster ------------------------------------------\n        // Sehr schwache rechteckige Schatten, wie Abdruecke auf der\n        // Platte; leicht verzogen, damit kein achsenparalleles Gitter\n        // sichtbar wird.\n        float geist = hash(vec2(floor(p.x * 4.583 + wy * 1.4), floor(p.y * 5.0 + wx * 1.1)) + 3.0);\n        fluss += (smoothstep(0.62, 0.68, geist) - 0.5) * 0.030;\n\n        // --- Einfaerben ---------------------------------------------\n        float m = clamp(0.52 + (grossform * licht + fluss) * aussteuerung, 0.0, 1.0);\n        vec3 farbe = mix(grund, hell, m);\n\n        /** Feines Filmkorn gegen Farbstreifen in dunklen Flaechen —\n            in absoluten Koordinaten, damit es an Scheibengrenzen nicht\n            umspringt. */\n        farbe += (hash(vec2(ax, ay) * 0.7 + 9.0) - 0.5) * (0.006 + 0.010 * koernung);\n\n        gl_FragColor = vec4(farbe, 1.0);\n    }\n`;/** Farbwert in Anteile zerlegen. Framer uebergibt Steuerfarben je nach\n    Quelle als \"#rrggbb\", \"rgb(r, g, b)\" oder als var(--token) — der einzige\n    Weg, der alle Formen sicher trifft, ist der Browser selbst: Wert auf ein\n    Element legen, berechneten Stil zuruecklesen.\n\n    Genau daran ist Fassung F9 gescheitert: der Parser kannte nur #rrggbb,\n    \"rgb(34, 34, 36)\" fiel still auf den Ersatzton zurueck — fuer BEIDE\n    Farben. mix(grau, grau, m) ist konstant, egal was der Shader rechnet;\n    uebrig blieb das Filmkorn. Live gemessen: Streuung 0,89 statt 7. */function farbeLesen(wert,bezug){const m6=/^#?([0-9a-f]{6})$/i.exec(wert.trim());if(m6){const n=parseInt(m6[1],16);return[(n>>16&255)/255,(n>>8&255)/255,(n&255)/255];}try{const el=document.createElement(\"span\");el.style.display=\"none\";/** Erst den Ersatzton setzen: ist der Wert ungueltig, bleibt er\n            stehen, statt dass die Erbfarbe des Umfelds durchschlaegt. */el.style.color=\"#212124\";el.style.color=wert;bezug.appendChild(el);const cs=getComputedStyle(el).color;el.remove();const m=/rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)/.exec(cs);if(m)return[Number(m[1])/255,Number(m[2])/255,Number(m[3])/255];}catch(e){}return[.13,.13,.14];}/** Die Auftaktblende laeuft EINMAL je geladener Seite (Marcus, 09.09.2026).\n    Framer wechselt Seiten ohne Neuladen — dieser Merker ueberlebt deshalb den\n    Weg Startseite → Impressum → zurueck, aber kein Neuladen und keinen neuen\n    Besuch. Bewusst KEIN sessionStorage: Gespeichertes auf dem Geraet waere\n    einwilligungspflichtig, und das fuer eine Blende. */let blendeGelaufen=false;export default function Untergrund(props){const{bildquelle=\"\",grundfarbe=\"var(--token-ef181f7a-a108-44c1-a0a5-5aa9598677b5)\",aufhellung=\"var(--token-cfec728b-ef13-41fb-9f75-1bdf17cd0d9c)\",licht=1,koernung=1.5,stoerungen=1,/** 0 seit 21.08.2026 — siehe Reglerbeschreibung unten. Diese Zahl\n            ist der Rueckfall, wenn die Instanz den Regler nicht mitgibt;\n            sie muss mit `defaultValue` uebereinstimmen. */baender=0,laeufer=1.4,schlieren=.8,wasser=1.4,verzerrung=.5,massstab=8,zeichnung=1.4,aussteuerung=1,saat=7,parallaxe=.08,startdunkel=0,dunkelSteht=.3,dunkelWegIn=1.7,dunkelRueckfall=6,pruefen=false}=props;/** Traeger fuer die Scheiben-Flaechen; wird vom Effekt befuellt. */const halterRef=useRef(null);/** Die Abdunklung, die mit dem Hero-Intro weggeht. */const dunkelRef=useRef(null);/** Nur fuer den Pruefmodus: haelt fest, was zur Laufzeit gemessen wurde. */const[bericht,setBericht]=useState(\"nicht gezeichnet\");/** Messmodus ohne Web-Inspector (16.08.2026): `?mess` an der URL blendet\n        das Prüf-Overlay ein und zählt Größenereignisse und Neuzeichnungen\n        live mit — für Diagnosen direkt am Gerät. */const[messModus,setMessModus]=useState(false);const[messTick,setMessTick]=useState(0);const zaehlGroesse=useRef(0);const zaehlNeu=useRef(0);/** Die letzten durchgelassenen Änderungen als \"Breite/Höhe\"-Deltas —\n        zeigt, WAS die Neuzeichnungen auslöst. */const zaehlUrsachen=useRef([]);const messStart=useRef(0);useEffect(()=>{if(typeof window===\"undefined\")return;if(window.location.search.indexOf(\"mess\")===-1)return;messStart.current=performance.now();setMessModus(true);const uhr=window.setInterval(()=>setMessTick(t=>t+1),1e3);return()=>window.clearInterval(uhr);},[]);const isStatic=useIsStaticRenderer();/** Der Shader ist der Regelfall. Das Foto springt nur ein, wenn WebGL\n        fehlt oder der Shader nicht uebersetzt — Rueckfall, nicht Ersatz. */const[rueckfall,setRueckfall]=useState(false);const zeigeBild=rueckfall&&bildquelle.trim().length>0;useEffect(()=>{const halter=halterRef.current;if(!halter||typeof window===\"undefined\"||zeigeBild)return;/** Ein einziges WebGL-Werkzeug ausserhalb des DOM; die Ergebnisse\n            werden auf einfache 2D-Flaechen kopiert. So braucht die ganze\n            Seite genau einen WebGL-Kontext, egal wie viele Scheiben. */const werkzeug=document.createElement(\"canvas\");const gl=werkzeug.getContext(\"webgl\",{antialias:false,preserveDrawingBuffer:true});if(!gl){setBericht(FASSUNG+\" \\xb7 kein WebGL — Foto-Rueckfall\");setRueckfall(true);return;}const ctx=gl;const bauen=(art,quelle)=>{const s=ctx.createShader(art);if(!s)return null;ctx.shaderSource(s,quelle);ctx.compileShader(s);if(!ctx.getShaderParameter(s,ctx.COMPILE_STATUS))return null;return s;};const v=bauen(ctx.VERTEX_SHADER,VS);const f=bauen(ctx.FRAGMENT_SHADER,FS);const prog=v&&f?ctx.createProgram():null;if(!v||!f||!prog){setBericht(FASSUNG+\" \\xb7 Shader liess sich nicht uebersetzen — Foto-Rueckfall\");setRueckfall(true);return;}ctx.attachShader(prog,v);ctx.attachShader(prog,f);ctx.linkProgram(prog);if(!ctx.getProgramParameter(prog,ctx.LINK_STATUS)){setBericht(FASSUNG+\" \\xb7 Shader liess sich nicht binden — Foto-Rueckfall\");setRueckfall(true);return;}ctx.useProgram(prog);const puffer=ctx.createBuffer();ctx.bindBuffer(ctx.ARRAY_BUFFER,puffer);ctx.bufferData(ctx.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),ctx.STATIC_DRAW);const lage=ctx.getAttribLocation(prog,\"lage\");ctx.enableVertexAttribArray(lage);ctx.vertexAttribPointer(lage,2,ctx.FLOAT,false,0,0);const zahl=(name,wert)=>ctx.uniform1f(ctx.getUniformLocation(prog,name),wert);/** Bricht einen laufenden Scheibendurchgang ab, wenn neu gezeichnet\n            oder abgebaut wird. */let lauf=0;/** Zeigergeraet: steht hier oben, weil BEIDE Stellen es brauchen —\n            die Zeichenroutine (Ueberzug) und die Groessenbremse weiter\n            unten. Ein `const` weiter unten waere beim ersten `zeichnen()`\n            noch nicht belegt und wuerfe. */const grobzeiger=typeof window.matchMedia===\"function\"&&window.matchMedia(\"(pointer: coarse)\").matches;/** ÜBERZUG (21.08.2026) — gegen das Stauchen beim Fensterziehen.\n            Die Scheiben standen auf `width:100%` bei fester Punktbreite:\n            zieht man das Fenster, streckt der Browser das fertige Bild,\n            bis 400 ms spaeter neu gezeichnet wird. Man sieht erst eine\n            horizontale Stauchung, dann einen Sprung.\n\n            Jetzt wird 15 % breiter gemalt als das Fenster misst und die\n            Scheibe mit FESTER Punktbreite links angeschlagen; der Halter\n            hat `overflow:hidden`. Wird das Fenster schmaler, wird\n            beschnitten statt gestaucht — das Material sitzt fest, weil\n            der Shader waagrecht ab x=0 rechnet. Wird es breiter, reicht\n            der Vorrat 15 % weit.\n\n            Der Speicher bleibt gleich: die Punktdichte sinkt um Wurzel\n            1,15, die Flaeche waechst um 1,15 — das hebt sich exakt auf\n            (die 99-MB-Rechnung von oben gilt unveraendert). Auf Touch\n            kein Ueberzug: dort zieht niemand Fenster, und das iPad hat\n            das knappste Budget. */const ueberzug=grobzeiger?1:1.15;/** Zuletzt gemalte Punktbreite und -hoehe — daran erkennt die\n            Groessenbremse, ob der Vorrat noch reicht und ob unten eine Luecke\n            klafft. */let gemalteBreite=0;let gemalteHoehe=0;/** Steht erst, wenn ein Durchgang alle Scheiben gemalt hat. */let fertig=false;const zeichnen=()=>{const kennung=++lauf;fertig=false;const b=halter.getBoundingClientRect();if(b.width<2||b.height<2){setBericht(FASSUNG+` \\xb7 Box zu klein: ${b.width.toFixed(1)} x ${b.height.toFixed(1)}`);return;}/** Volle Punktdichte, gedeckelt bei 2 — mehr unterscheidet kein\n                Auge auf einer matten Flaeche. Nie unter 1: ein halb\n                aufgeloester Puffer wird beim Anzeigen hochgezogen und ist\n                genau die Unschaerfe, um die es hier ging. */const maxKante=ctx.getParameter(ctx.MAX_RENDERBUFFER_SIZE)||4096;let dpr=Math.min(window.devicePixelRatio||1,2);/** **Auf 1,5 gekappt — überall, nicht nur auf Touch**\n                (16.08.2026, erweitert am 17.08.2026): Die Scheiben der ganzen\n                Seite belegten bei dpr 2 rund 176 MB Canvas-Speicher (11 × 2048\n                × 2048, am Mac gemessen). Erst fiel es am iPad auf, wo Safari\n                nahe seines Budgets Flächen verwirft und neu aufbaut — das\n                sah man als ruckelnden Hintergrund. Am Mac endete dieselbe\n                Ursache mit „Diese Webseite wurde neu geladen, weil sie sehr\n                viel Speicher benötigte\": Safari schiesst den Tab ab und lädt\n                ihn neu, die Seite springt an den Anfang.\n\n                1,5 spart quadratisch ~44 % (176 → 99 MB). Auf dem matten\n                Rauschgrund ist der Unterschied praktisch unsichtbar; **nur der\n                Shader ist betroffen**, Text und Bilder bleiben scharf, denn\n                die sind keine Canvas-Elemente. Der eigentliche Auslöser bleibt\n                die Seitenhöhe: Der Untergrund malt sie ganz vor. Wächst die\n                Seite weiter, ist der nächste Schritt, Scheiben ausserhalb des\n                Sichtfelds freizugeben und bei Bedarf neu zu malen. *//** GANZZAHLIGES VERHÄLTNIS ZUM SCHIRM (21.08.2026) — gegen die\n                waagrechten Bänder.\n\n                Wird mit 1,4 Punkten je CSS-Punkt gemalt und mit 2,0\n                dargestellt, rechnet der Browser 10 : 7 hoch. Das ist eine\n                Schwebung: alle sieben Punkte wiederholt sich das\n                Interpolationsmuster, und auf dem Rauschgrund liest es sich\n                als feine waagrechte Streifen, die sich zu Bändern bündeln.\n                In Marcus' Bildschirmfoto vom 21.08. steht sie messbar drin\n                (Autokorrelation +0,36 / −0,39 / −0,51 bei Abstand 1/2/3).\n\n                Deshalb wird die Dichte nicht mehr frei gedeckelt, sondern\n                auf einen **ganzzahligen Teiler** der Gerätedichte gerastet:\n                auf Retina (2,0) also 1,0, nie 1,4. Dann fällt jeder gemalte\n                Punkt auf genau zwei Gerätepunkte, es gibt nichts zu\n                interpolieren und nichts zu schweben. In der Nachbildung der\n                Schirmskalierung halbiert das die Streifenstärke (0,047 →\n                0,025); die Feinkörnung selbst ändert nichts daran (fbm6,\n                fbm4, fbm3 gemessen gleich).\n\n                Kein Verlust an Materialgrösse: `einheit` und `einheitGrob`\n                skalieren mit der Dichte, das Muster bleibt in CSS-Punkten\n                gleich gross — nur feiner abgetastet wird es nicht mehr.\n                Nebenbei halbiert sich der Speicher noch einmal (99 → 51 MB). */const geraet=Math.min(window.devicePixelRatio||1,3);const deckel=1.5/Math.sqrt(ueberzug);let teiler=1;while(geraet/teiler>deckel)teiler++;dpr=Math.min(dpr,Math.max(1,geraet/teiler));/** Breite, die wirklich gemalt wird — Fenster plus Vorrat. */const cssBreite=b.width*ueberzug;gemalteBreite=cssBreite;gemalteHoehe=b.height;dpr=Math.min(dpr,maxKante/cssBreite);const bBreite=Math.max(1,Math.round(cssBreite*dpr));const bHoehe=Math.max(1,Math.round(b.height*dpr));const farbeGrund=farbeLesen(grundfarbe,halter);const farbeHell=farbeLesen(aufhellung,halter);const t0=performance.now();/** Scheibenraster in CSS-Punkten; jede Kante ganzzahlig, damit\n                die Flaechen exakt aneinanderstossen. */const anzahl=Math.ceil(b.height/SCHEIBE);const flaechen=[];/** Beim allerersten Aufbau jede fertige Scheibe sofort zeigen —\n                sonst bleibt die Seite bis zur letzten Scheibe leer. Bei\n                spaeteren Durchgaengen (Groessenwechsel) erst am Ende tauschen,\n                damit nichts flackert. */const erstaufbau=halter.childElementCount===0;const scheibe=i=>{if(kennung!==lauf)return;if(i>=anzahl){if(!erstaufbau)halter.replaceChildren(...flaechen);fertig=true;melden(\"durchgang\");setBericht(FASSUNG+` \\xb7 Flaeche ${Math.round(b.width)} x ${Math.round(b.height)}`+` \\xb7 Puffer ${bBreite} x ${bHoehe} \\xb7 ${anzahl} Scheiben`+` \\xb7 dpr ${dpr.toFixed(2)} \\xb7 ${Math.round(performance.now()-t0)} ms`);return;}const cssOben=i*SCHEIBE;const cssHoehe=Math.min(SCHEIBE,b.height-cssOben);const sBreite=bBreite;const sHoehe=Math.max(1,Math.round(cssHoehe*dpr));/** Puffer-Punkte unterhalb dieser Scheibe — der Anker, mit dem\n                    der Shader seinen Ausschnitt im Gesamtfeld findet. */const abBoden=Math.max(0,bHoehe-Math.round(cssOben*dpr)-sHoehe);if(werkzeug.width!==sBreite||werkzeug.height!==sHoehe){werkzeug.width=sBreite;werkzeug.height=sHoehe;}ctx.viewport(0,0,sBreite,sHoehe);/** Bewusst die SICHTBARE Breite, nicht die gemalte: `uv` traegt\n                    allein die grosse Lichtform, und die ist Komposition — sie\n                    soll weiter auf das Fenster bezogen sein, nicht auf den\n                    Vorrat. Das Material rechnet ohnehin in Punkten ab x=0 und\n                    ist davon unberuehrt. Ohne diese Trennung wanderte die\n                    Lichtkuppe um 7,5 % der Fensterbreite nach rechts. */const sichtBreite=Math.max(1,Math.round(b.width*dpr));ctx.uniform2f(ctx.getUniformLocation(prog,\"aufloesung\"),sichtBreite,bHoehe);zahl(\"abBoden\",abBoden);ctx.uniform3fv(ctx.getUniformLocation(prog,\"grund\"),farbeGrund);ctx.uniform3fv(ctx.getUniformLocation(prog,\"hell\"),farbeHell);zahl(\"licht\",licht);zahl(\"koernung\",koernung);zahl(\"stoerungen\",stoerungen);zahl(\"baender\",baender);zahl(\"laeufer\",laeufer);zahl(\"schlieren\",schlieren);zahl(\"wasser\",wasser);zahl(\"verzerrung\",verzerrung);/** Kantenlaenge einer Struktureinheit im Zeichenpuffer:\n                    800 CSS-Punkte geteilt durch den Massstab, mal Dichte. */zahl(\"einheit\",800/Math.max(.05,massstab)*dpr);zahl(\"einheitGrob\",800/Math.max(.05,zeichnung)*dpr);zahl(\"aussteuerung\",aussteuerung);zahl(\"saat\",saat);ctx.drawArrays(ctx.TRIANGLES,0,3);const ziel=document.createElement(\"canvas\");ziel.width=sBreite;ziel.height=sHoehe;const z2=ziel.getContext(\"2d\");if(z2)z2.drawImage(werkzeug,0,0);/** Feste Punktbreite statt 100 %: Der Halter beschneidet,\n                    der Browser streckt nichts mehr (siehe ÜBERZUG oben).\n\n                    Die CSS-Masse kommen aus dem Puffer geteilt durch die\n                    Dichte, nicht umgekehrt: Nur so ist das Verhaeltnis\n                    wirklich ganzzahlig. Rechnete man mit der ungerundeten\n                    Wunschbreite, brächte die Rundung des Puffers einen\n                    Bruchteil Punkt wieder herein — und damit die Schwebung,\n                    gegen die der ganze Aufwand geht. */ziel.style.cssText=`position:absolute;left:0;top:${cssOben}px;`+`width:${sBreite/dpr}px;height:${sHoehe/dpr}px;display:block`;ziel.setAttribute(\"data-scheibe\",String(i));if(erstaufbau){halter.appendChild(ziel);melden(\"scheibe \"+i);}else flaechen.push(ziel);/** Naechste Scheibe im naechsten Zeitschlitz. Bewusst kein\n                    requestAnimationFrame: das friert in Hintergrund-Tabs und\n                    beim Vorab-Laden von Safari komplett ein — die Seite bliebe\n                    leer, bis der Tab aktiv wird. setTimeout laeuft gedrosselt\n                    weiter. */window.setTimeout(()=>scheibe(i+1),0);};scheibe(0);};zeichnen();/** NOTFUELLUNG WAEHREND DES ZIEHENS (26.08.2026)\n\n            Der Untergrund malt 15 % breiter als das Fenster (Vorrat). Wer\n            schneller zieht, hat rechts einen flachen Streifen in Plattenton —\n            auf der ganzen Seite, und die Kopfleiste kopiert ihn mit. Der\n            volle Durchgang beginnt erst 150 ms NACH dem Ziehen und braucht\n            fuer 18 Scheiben noch einmal einige hundert Millisekunden. Marcus,\n            nach K26: „immer noch sichtbar bei schnellem Window-Resize\".\n\n            Deshalb waehrend des Ziehens eine **grobe Fuellung nur fuer den\n            sichtbaren Bereich**: eine einzige Scheibe, Punktdichte 1, mit\n            Vorrat, alle 100 ms neu. Sie liegt als letztes Kind ueber den\n            alten Scheiben, kostet einen einzigen Shader-Durchlauf von\n            Fenstergroesse — und der volle Durchgang ersetzt sie am Ende\n            mit `replaceChildren`, wie alles andere auch. Sie traegt\n            `data-not`, damit ein weiterer Notlauf sie vorher entfernt. */let notTimer=0;let letzteNot=0;const notfuellung=()=>{if(kennung_laeuft_erstaufbau())return;const b=halter.getBoundingClientRect();if(b.width<2||b.height<2)return;const d=1;const cssBreite=b.width*ueberzug;const von=Math.max(0,Math.floor(-b.top));const bis=Math.min(b.height,Math.ceil(-b.top+window.innerHeight));if(bis-von<2)return;const bBreite=Math.max(1,Math.round(cssBreite*d));const bHoehe=Math.max(1,Math.round(b.height*d));const sHoehe=Math.max(1,Math.round((bis-von)*d));const abBoden=Math.max(0,bHoehe-Math.round(bis*d));if(werkzeug.width!==bBreite||werkzeug.height!==sHoehe){werkzeug.width=bBreite;werkzeug.height=sHoehe;}ctx.viewport(0,0,bBreite,sHoehe);ctx.uniform2f(ctx.getUniformLocation(prog,\"aufloesung\"),Math.max(1,Math.round(b.width*d)),bHoehe);zahl(\"abBoden\",abBoden);ctx.uniform3fv(ctx.getUniformLocation(prog,\"grund\"),farbeLesen(grundfarbe,halter));ctx.uniform3fv(ctx.getUniformLocation(prog,\"hell\"),farbeLesen(aufhellung,halter));zahl(\"licht\",licht);zahl(\"koernung\",koernung);zahl(\"stoerungen\",stoerungen);zahl(\"baender\",baender);zahl(\"laeufer\",laeufer);zahl(\"schlieren\",schlieren);zahl(\"wasser\",wasser);zahl(\"verzerrung\",verzerrung);zahl(\"einheit\",800/Math.max(.05,massstab)*d);zahl(\"einheitGrob\",800/Math.max(.05,zeichnung)*d);zahl(\"aussteuerung\",aussteuerung);zahl(\"saat\",saat);ctx.drawArrays(ctx.TRIANGLES,0,3);const ziel=document.createElement(\"canvas\");ziel.width=bBreite;ziel.height=sHoehe;const z2=ziel.getContext(\"2d\");if(!z2)return;z2.drawImage(werkzeug,0,0);ziel.style.cssText=`position:absolute;left:0;top:${von}px;`+`width:${bBreite/d}px;height:${sHoehe/d}px;display:block`;ziel.setAttribute(\"data-scheibe\",\"not\");ziel.setAttribute(\"data-not\",\"\");halter.querySelectorAll(\"[data-not]\").forEach(alt=>alt.remove());halter.appendChild(ziel);letzteNot=performance.now();melden(\"not\");};/** Solange der Erstaufbau laeuft, gibt es nichts zu ueberbruecken. */const kennung_laeuft_erstaufbau=()=>halter.childElementCount===0;const notAnstossen=()=>{const seit=performance.now()-letzteNot;window.clearTimeout(notTimer);if(seit>=100)notfuellung();else notTimer=window.setTimeout(notfuellung,100-seit);};/** KONTEXTVERLUST (26.08.2026) — Versicherung, kein gemessener Fall.\n\n            Verliert der Browser den WebGL-Kontext (Speicherdruck, Treiber,\n            Tabwechsel), zeichnet `drawArrays` still nichts, und kopiert wird\n            eine leere Flaeche. Ohne Behandlung faende man das nie: keine\n            Meldung, nur graue Scheiben. `preventDefault` bittet um\n            Wiederherstellung; kommt sie, wird neu gezeichnet.\n\n            Bei einem Durchgang mit sieben schnellen Fensterzuegen war KEINE\n            Scheibe leer — der Fall ist hier also nicht die Ursache der\n            schwarzen Rechtecke. Die Behandlung bleibt trotzdem: sie kostet\n            acht Zeilen und faengt eine Klasse von Fehlern ab, die man sonst\n            nur als Raetsel zu sehen bekommt. */const beiVerlust=e=>{e.preventDefault();setBericht(FASSUNG+\" \\xb7 WebGL-Kontext verloren — warte auf Wiederkehr\");};const beiRueckkehr=()=>{setBericht(FASSUNG+\" \\xb7 Kontext zurueck, zeichne neu\");zeichnen();};werkzeug.addEventListener(\"webglcontextlost\",beiVerlust);werkzeug.addEventListener(\"webglcontextrestored\",beiRueckkehr);/** Nur bei Groessenaenderung neu zeichnen, keine Dauerschleife.\n            Der Beobachter feuert auch beim ersten Layout — darauf ist\n            Verlass, das Fenster-Ereignis allein nicht. */let warten=0;let letzteBreite=0;let letzteHoehe=0;/** Touch-Bremse (16.08.2026): iOS meldet beim Ein-/Ausfahren der\n            Adressleiste laufend Groessenereignisse. Jedes durchgelassene\n            loest ein Neuzeichnen der GANZEN Seite aus (elf Scheiben\n            6-Oktaven-Rauschen) — das iPad wurde heiss. Auf Touch wird nur\n            neu gezeichnet, wenn sich die Breite aendert (Drehung) oder die\n            Hoehe deutlich (echte Inhaltsaenderung), nicht fuer ein paar\n            Punkte Leistenwackeln. */const beiGroesse=()=>{zaehlGroesse.current++;const b=halter.getBoundingClientRect();const dB=Math.abs(b.width-letzteBreite);const dH=Math.abs(b.height-letzteHoehe);if(dB<1&&dH<1)return;/** Verschärft am 16.08. abends: Die 160er-Schwelle liess am iPad\n                noch 7 Neuzeichnungen in 3 Minuten durch (gemessen). Auf Touch\n                gilt jetzt: Neuzeichnen nur bei echter Breitenänderung\n                (Drehung, ≥ 8 px) oder einem Höhensprung ≥ 400 px. Die\n                Gestaltungsregel der Seite verbietet ohnehin Höhenänderungen\n                während der Bedienung — was hier ankommt, ist Leistenwackeln\n                oder Zoomerei, kein Inhalt. */if(grobzeiger&&dB<8&&dH<400){letzteHoehe=b.height;letzteBreite=b.width;return;}letzteBreite=b.width;letzteHoehe=b.height;zaehlNeu.current++;zaehlUrsachen.current.push(Math.round(dB)+\"/\"+Math.round(dH));if(zaehlUrsachen.current.length>8)zaehlUrsachen.current.shift();window.clearTimeout(warten);/** Am Mauszeiger-Gerät 400 ms statt 150: Beim Fensterziehen in\n                Stufen (Responsive-Test) loeste jeder kurze Halt ein volles\n                Neuzeichnen aus — Marcus' Mac lief 16.08.2026 heiss. Die\n                laengere Ruhe frisst die Zwischenstopps; der Untergrund\n                erscheint nach dem Ziehen eine halbe Sekunde spaeter, das\n                sieht auf dem dunklen Grund niemand. *//** Reicht der Ueberzug nicht mehr — das Fenster ist breiter\n                geworden als gemalt —, steht rechts ein Streifen ohne\n                Struktur. Dann frueher nachziehen (150 statt 400 ms); wird\n                schmaler gezogen, beschneidet der Halter ohnehin sauber und\n                die lange Ruhe darf bleiben. */const vorratLeer=!grobzeiger&&b.width>gemalteBreite;/** WAECHST DIE SEITE, KLAFFT UNTEN EINE LUECKE (26.08.2026)\n\n                Zieht man das Fenster breiter, ordnen sich Module um und die\n                Seite wird laenger — die gemalten Scheiben decken dann nur die\n                alte Hoehe. Gemessen: nach einem Zug von 900 auf 1800 blieben\n                **1479 px unbedeckt**. Bis zum Neuzeichnen steht dort nur der\n                Plattenton. Das ist der eine Fall, in dem die lange Ruhe\n                schadet — hier also so kurz wie moeglich. *//** NUR wenn ein Durchgang wirklich fertig ist (26.08.2026).\n\n                Sonst reisst die kurze Ruhe waehrend des Seitenaufbaus einen\n                laufenden Durchgang ab: Die Seite waechst beim Laden ohnehin\n                (Bilder, Schriften), `zuKurz` waere staendig wahr, und jeder\n                neue Lauf verwirft die halb fertigen Scheiben. Sichtbar wurde\n                das an der Kopfleiste, die ihren Grund von den Scheiben\n                abzeichnet — ohne Scheiben stand sie beim Neuladen leer da. */const zuKurz=fertig&&b.height>gemalteHoehe+2;warten=window.setTimeout(zeichnen,zuKurz?60:grobzeiger||vorratLeer?150:400);/** Fehlt Vorrat oder Hoehe, sofort ueberbruecken — nicht erst\n                nach der Ruhe. Auf Touch nicht: dort zieht niemand Fenster. */if(!grobzeiger&&(vorratLeer||zuKurz))notAnstossen();};const beobachter=typeof ResizeObserver!==\"undefined\"?new ResizeObserver(beiGroesse):null;beobachter?.observe(halter);window.addEventListener(\"resize\",beiGroesse);return()=>{lauf++;window.clearTimeout(warten);window.clearTimeout(notTimer);beobachter?.disconnect();window.removeEventListener(\"resize\",beiGroesse);werkzeug.removeEventListener(\"webglcontextlost\",beiVerlust);werkzeug.removeEventListener(\"webglcontextrestored\",beiRueckkehr);halter.replaceChildren();ctx.getExtension(\"WEBGL_lose_context\")?.loseContext();};},[grundfarbe,aufhellung,licht,koernung,stoerungen,baender,laeufer,schlieren,wasser,verzerrung,massstab,zeichnung,aussteuerung,saat,isStatic,zeigeBild]);/** Parallaxe: der Untergrund laeuft dem Scrollen einen Ticken nach.\n        Beim Faktor p wird der Halter um scrollY * p nach unten mitgenommen —\n        der Untergrund bewegt sich also um p langsamer als der Inhalt. Reiner\n        Transform, laeuft im Compositor, nichts wird neu gezeichnet. Die\n        Deckung bleibt immer erhalten: sichtbar ist der Ausschnitt\n        [scrollY*(1-p), scrollY*(1-p)+Fenster], und der liegt fuer p<1 stets\n        innerhalb der gemalten Flaeche. */useEffect(()=>{const el=halterRef.current;if(!el||typeof window===\"undefined\"||isStatic||parallaxe<=0)return;el.style.willChange=\"transform\";let ticket=0;const setzen=()=>{ticket=0;el.style.transform=`translate3d(0, ${window.scrollY*parallaxe}px, 0)`;};const beiScroll=()=>{if(!ticket)ticket=window.requestAnimationFrame(setzen);};setzen();window.addEventListener(\"scroll\",beiScroll,{passive:true});return()=>{if(ticket)window.cancelAnimationFrame(ticket);window.removeEventListener(\"scroll\",beiScroll);el.style.willChange=\"\";el.style.transform=\"\";};},[parallaxe,isStatic,zeigeBild]);/* ------------------------------------------------------------------\n       STARTDUNKEL DES GRUNDS — synchron zum Hero-Intro (18.08.2026)\n\n       Der Grund liegt beim Aufschlagen der Seite fast schwarz da und kommt\n       gemeinsam mit dem Icon heraus. Drei Dinge sind daran wichtig:\n\n       1. KEINE EIGENE UHR. Der Hero startet sein Intro erst, wenn das Video\n          durchspielbereit ist — am Berg kann das dauern. Der Grund haengt\n          deshalb an dessen Signal (`gusswerk:introstart`), nicht an einem\n          eigenen Timer. Wer den Zeitpunkt verpasst hat, findet ihn noch am\n          `window` vor; die Reihenfolge des Aufbaus spielt also keine Rolle.\n\n       2. RUECKFALL. Auf Seiten OHNE Hero — Impressum, Datenschutz — kommt nie\n          ein Signal. Ohne Rueckfall blieben sie schwarz. Nach\n          `dunkelRueckfall` Sekunden geht die Flaeche darum von selbst weg.\n\n       3. EINMALIG. Der Hero startet sein Intro erneut, sobald er den\n          Sichtbereich vollstaendig verlassen hatte. Der Grund macht das nicht\n          mit — sonst wuerde der halbe Seitenhintergrund mitten im Scrollen\n          wieder dunkel (Entscheidung Marcus, 18.08.2026).\n\n       4. NUR VON OBEN. Wer die Seite mitten drin aufschlaegt — Neuladen mit\n          wiederhergestellter Scrollposition, Zurueck-Taste, Sprungmarke —,\n          hat den Hero nie gesehen. Dessen Intro startet dann gar nicht (es\n          haengt am Sichtbarkeitswaechter), und ohne diese Sperre zoege der\n          Rueckfall nach `dunkelRueckfall` Sekunden den Auftakt trotzdem auf:\n          erst Sekunden dunkel, dann eine Blende ohne Anlass. Der Grund bleibt\n          in diesem Fall von vornherein hell (Marcus, 18.08.2026).\n\n       Bewegungsarme Darstellung schaltet die Flaeche ganz ab.\n       ------------------------------------------------------------------ */useEffect(()=>{const el=dunkelRef.current;if(!el||isStatic||typeof window===\"undefined\")return;if(blendeGelaufen){el.style.opacity=\"0\";return;}if(startdunkel<=0){el.style.opacity=\"0\";return;}const ruhig=window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches;if(ruhig){el.style.opacity=\"0\";return;}/** Steht der Hero schon ausser Sicht? Eine halbe Fensterhoehe ist die\n            Grenze: darunter ist er noch mit im Bild und sein Intro laeuft. */const heroFort=()=>window.scrollY>window.innerHeight*.5;if(heroFort()){el.style.opacity=\"0\";return;}const anteil=Math.min(1,Math.max(0,startdunkel/100));const stehtMs=Math.max(0,dunkelSteht*1e3);const wegMs=Math.max(100,dunkelWegIn*1e3);el.style.opacity=String(anteil);/** Dieselbe Kurve wie im Hero: zur Haelfte zwischen linear und\n            Ease-in-out gemischt. Volles eIO war zu kraeftig, ganz ohne zu\n            mechanisch. */const eIO=p=>p<.5?4*p*p*p:1-Math.pow(-2*p+2,3)/2;const blende=p=>{const q=Math.min(1,Math.max(0,p));return q+(eIO(q)-q)*.5;};let laeuft=true;let ticket=0;let start=null;/** Dieselbe Uhr wie im Hero — GEZEICHNETE Zeit, nicht Wanduhrzeit\n            (20.08.2026). Der Hero legt seinen Stand laufend unter\n            `__gusswerkIntrouhr` ab; solange er da ist, gilt seine Zahl, sonst\n            zaehlt der Grund selbst mit gedeckeltem Schritt (Rechtsseiten haben\n            keinen Hero). Grund fuer den Deckel: Steht der Hauptfaden zwischen\n            zwei Bildern zwei Sekunden still, war der Vorhang vorher in genau\n            einem Sprung weg. */const MAX_SCHRITT=50;let eigeneUhr=0;let letztesBild=null;const schritt=()=>{if(!laeuft||start===null)return;const jetzt=performance.now();eigeneUhr+=letztesBild===null?0:Math.min(MAX_SCHRITT,Math.max(0,jetzt-letztesBild));letztesBild=jetzt;const heroUhr=window.__gusswerkIntrouhr;const zeit=typeof heroUhr===\"number\"?heroUhr:eigeneUhr;/** Sicherung: Bliebe der Hero stehen (aus dem Bild gescrollt,\n                Tab im Hintergrund), stuende auch seine Uhr — und der Vorhang\n                bliebe liegen. Nach dem Vierfachen der Auftaktdauer geht er in\n                jedem Fall. */const notbremse=jetzt-start>(stehtMs+wegMs)*4;const p=notbremse?1:(zeit-stehtMs)/wegMs;const zu=1-blende(p);el.style.opacity=String(anteil*Math.max(0,zu));if(zu>0)ticket=window.requestAnimationFrame(schritt);else blendeGelaufen=true;};const losgehen=zeitpunkt=>{if(!laeuft||start!==null)return;/* Der Hero meldet seinen Startzeitpunkt; liegt der schon zurueck,\n               setzt der Grund entsprechend spaeter ein statt von vorn. */start=typeof zeitpunkt===\"number\"?zeitpunkt:performance.now();ticket=window.requestAnimationFrame(schritt);};const beiSignal=e=>{const d=e.detail;losgehen(d?.start);};window.addEventListener(\"gusswerk:introstart\",beiSignal);/* Falls der Hero frueher fertig war als dieser Baustein. */const schon=window.__gusswerkIntrostart;if(typeof schon===\"number\")losgehen(schon);/* Rueckfall fuer Seiten ohne Hero. */const notaus=window.setTimeout(()=>losgehen(),Math.max(1e3,dunkelRueckfall*1e3));/* Die Scroll-Wiederherstellung des Browsers kann nach diesem Effekt\n           kommen — die Sperre oben saehe dann noch 0. Solange die Blende\n           nicht angefangen hat, darf sie darum noch wortlos entfallen.\n           Danach nicht mehr: ein Sprung mitten in der Blende waere\n           sichtbarer als die Blende selbst. */const beiScrollFrueh=()=>{if(!laeuft||start!==null||!heroFort())return;laeuft=false;window.clearTimeout(notaus);el.style.opacity=\"0\";window.removeEventListener(\"scroll\",beiScrollFrueh);};window.addEventListener(\"scroll\",beiScrollFrueh,{passive:true});return()=>{laeuft=false;if(ticket)window.cancelAnimationFrame(ticket);window.clearTimeout(notaus);window.removeEventListener(\"gusswerk:introstart\",beiSignal);window.removeEventListener(\"scroll\",beiScrollFrueh);};},[isStatic,startdunkel,dunkelSteht,dunkelWegIn,dunkelRueckfall]);return /*#__PURE__*/_jsxs(\"div\",{\"data-fassung\":FASSUNG+(zeigeBild?\"-bild\":\"-shader\"),style:{position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",background:pruefen?\"linear-gradient(135deg, #8A2020, #20408A)\":grundfarbe,...props.style},\"aria-hidden\":\"true\",children:[zeigeBild?/** Rueckfall ohne WebGL: das Foto, senkrecht wiederholt.\n                    Naehte sind hier hinnehmbar — dieser Zweig ist die\n                    Notloesung, nicht der Regelfall. *//*#__PURE__*/_jsx(\"div\",{ref:halterRef,style:{position:\"absolute\",inset:0,pointerEvents:\"none\",backgroundImage:`url(${bildquelle})`,backgroundSize:\"100% auto\",backgroundRepeat:\"repeat-y\",backgroundPosition:\"top center\"}}):/*#__PURE__*/_jsx(\"div\",{ref:halterRef,style:{position:\"absolute\",inset:0,pointerEvents:\"none\",/** DER HALTER MUSS UNDURCHSICHTIG SEIN (26.08.2026)\n\n                            Er traegt den Parallax-Transform und ist damit eine\n                            eigene Compositor-Ebene. Chrome malt in einer\n                            durchsichtigen Ebene alles SCHWARZ, was noch nicht\n                            gerastert ist — beim Fensterziehen sah Marcus\n                            deshalb schwarze Rechtecke, obwohl der Rahmen\n                            darunter den Plattenton traegt. Mit einem eigenen\n                            Grund ist die Ebene undurchsichtig: Ungezeichnetes\n                            erscheint als Plattenton, nicht als Loch.\n\n                            Der Artefakt laesst sich NICHT fotografieren —\n                            `Page.captureScreenshot` erzwingt ein Neurastern.\n                            Deshalb hier die Ursachenklasse beseitigt statt\n                            das Symptom gemessen. */background:grundfarbe}}),/*#__PURE__*/_jsx(\"div\",{ref:dunkelRef,\"data-gwdunkel\":\"\",style:{position:\"absolute\",inset:0,// 2 statt 1: Verlaufsschrift (background-clip:text) rendert Framer mit z-index 1,\n// sonst bliebe sie beim Abblenden hell stehen. Marcus, 10.9.2026.\nzIndex:2,pointerEvents:\"none\",background:KOHLE,opacity:isStatic?0:Math.min(1,Math.max(0,startdunkel/100))}}),(pruefen||messModus)&&/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",top:12,left:12,zIndex:3,font:\"600 13px/1.5 ui-monospace, monospace\",color:\"#fff\",background:\"rgba(0,0,0,.72)\",padding:\"8px 12px\",borderRadius:4,whiteSpace:\"pre\"},children:\"Untergrund — \"+bericht+(messModus?\"\\nMessung \"+Math.round((performance.now()-messStart.current)/1e3)+\" s\"+\" \\xb7 Gr\\xf6\\xdfenereignisse \"+zaehlGroesse.current+\" \\xb7 neu gezeichnet \"+zaehlNeu.current+(zaehlUrsachen.current.length?\" (Δ \"+zaehlUrsachen.current.join(\", \")+\")\":\"\")+\" \\xb7 Touch \"+(typeof window!==\"undefined\"&&window.matchMedia(\"(pointer: coarse)\").matches?\"ja\":\"nein\"):\"\")})]});}addPropertyControls(Untergrund,{bildquelle:{type:ControlType.String,title:\"Bildquelle\",description:\"R\\xfcckfallfoto. Erscheint nur, wenn WebGL fehlt oder der Shader nicht \\xfcbersetzt — sonst malt immer der Shader.\",defaultValue:\"\",placeholder:\"https://…\"},grundfarbe:{type:ControlType.Color,title:\"Tiefe\",description:\"Dunkelster Ton der Platte\",defaultValue:\"var(--token-ef181f7a-a108-44c1-a0a5-5aa9598677b5)\"},aufhellung:{type:ControlType.Color,title:\"Lichter\",description:\"Hellster Ton der Platte\",defaultValue:\"var(--token-cfec728b-ef13-41fb-9f75-1bdf17cd0d9c)\"},licht:{type:ControlType.Number,title:\"Lichtform\",description:\"Grosse Aufhellung im oberen Bereich\",defaultValue:1,min:0,max:2,step:.05},stoerungen:{type:ControlType.Number,title:\"Flecken\",description:\"Ausgefranste Fl\\xe4chen mit harter Kante\",defaultValue:1,min:0,max:2,step:.05},baender:{type:ControlType.Number,title:\"Abs\\xe4tze\",description:\"Waagrechte Abbr\\xfcche wie Wasserr\\xe4nder. AUS seit 21.08.2026: Jede Zeile trug ihren Helligkeitsversatz \\xfcber die volle Breite und las sich als Band (Entscheidung Marcus nach Sichtvergleich). Der Saum im Shader nimmt die harte Kante, reicht aber nicht — wer aufdreht, holt die B\\xe4nder zur\\xfcck.\",defaultValue:0,min:0,max:2,step:.05},laeufer:{type:ControlType.Number,title:\"L\\xe4ufer\",description:\"Senkrechte Rinnsale\",defaultValue:1.4,min:0,max:2,step:.05},koernung:{type:ControlType.Number,title:\"K\\xf6rnung\",description:\"St\\xe4rke des feinen Korns — Feinanteil und Filmkorn, unabh\\xe4ngig von der Zeichnung.\",defaultValue:1.5,min:0,max:2,step:.05},wasser:{type:ControlType.Number,title:\"Wasserflecken\",description:\"Grosse dunkle Standflecken mit harter Kante — die L\\xe4ufer h\\xe4ngen an ihren R\\xe4ndern.\",defaultValue:1.4,min:0,max:2,step:.05},schlieren:{type:ControlType.Number,title:\"Schlieren\",defaultValue:.8,min:0,max:1,step:.05},verzerrung:{type:ControlType.Number,title:\"Verzerrung\",description:\"Wie stark die Fleckenr\\xe4nder ausfransen\",defaultValue:.5,min:0,max:1.5,step:.05},zeichnung:{type:ControlType.Number,title:\"Zeichnung\",description:\"Gr\\xf6sse der Wasserzeichnung — Flecken, Abs\\xe4tze, L\\xe4ufer. Klein = gross und ruhig wie die Vorlage.\",defaultValue:1.4,min:.3,max:6,step:.1},massstab:{type:ControlType.Number,title:\"K\\xf6rnung fein\",description:\"Feinheit des Korns, unabh\\xe4ngig von der Zeichnung.\",defaultValue:8,min:.3,max:12,step:.1},aussteuerung:{type:ControlType.Number,title:\"St\\xe4rke\",description:\"Gesamtintensit\\xe4t aller Strukturen\",defaultValue:1,min:0,max:2,step:.05},parallaxe:{type:ControlType.Number,title:\"Parallaxe\",description:\"Wie stark der Untergrund dem Scrollen nachl\\xe4uft. 0 = fest mit dem Inhalt verbunden.\",defaultValue:.08,min:0,max:.3,step:.01},startdunkel:{type:ControlType.Number,title:\"Startdunkel\",description:\"Der Grund liegt beim Aufschlagen der Seite so dunkel da und kommt gemeinsam mit dem Hero-Intro heraus. 0 schaltet den Auftakt ab. Vorgabe 0 seit 21.08.2026: Auf einer Seite OHNE Hero bliebe der Grund sonst dunkel, bis der R\\xfcckfall nach sechs Sekunden greift. Startseite und /en tragen 95 als \\xdcberschreibung.\",defaultValue:0,min:0,max:100,step:1,unit:\"%\"},dunkelSteht:{type:ControlType.Number,title:\"Dunkel steht\",description:\"Wie lange der Grund voll abgedunkelt bleibt. Gleicher Wert wie im Hero.\",defaultValue:.3,min:0,max:6,step:.1,unit:\"s\",hidden:({startdunkel})=>!startdunkel},dunkelWegIn:{type:ControlType.Number,title:\"Dunkel weg in\",description:\"Dauer des Aufhellens. Gleicher Wert wie im Hero.\",defaultValue:1.7,min:.1,max:6,step:.1,unit:\"s\",hidden:({startdunkel})=>!startdunkel},dunkelRueckfall:{type:ControlType.Number,title:\"R\\xfcckfall\",description:\"Nach so vielen Sekunden hellt der Grund auch ohne Signal vom Hero auf — n\\xf6tig f\\xfcr Seiten ohne Hero (Impressum, Datenschutz), die sonst dunkel blieben.\",defaultValue:6,min:1,max:20,step:.5,unit:\"s\",hidden:({startdunkel})=>!startdunkel},pruefen:{type:ControlType.Boolean,title:\"Pr\\xfcfmodus\",description:\"Zeigt die gemessenen Werte und legt einen Farbverlauf unter die Scheiben — sichtbarer Verlauf hiesse: dort fehlt eine.\",defaultValue:false},saat:{type:ControlType.Number,title:\"Variante\",description:\"Anderer Wert ergibt ein anderes Muster\",defaultValue:7,min:0,max:50,step:1}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Untergrund\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Untergrund_1.map","// Generated by Framer (80f113d)\nimport{fontStore}from\"framer\";fontStore.loadFonts([\"CUSTOMV2;Museo Sans 500\",\"CUSTOMV2;Museo Sans 700\"]);export const fonts=[{explicitInter:true,fonts:[{cssFamilyName:\"Museo Sans 500\",source:\"custom\",style:\"normal\",uiFamilyName:\"Museo Sans\",url:\"https://framerusercontent.com/assets/HV1QAc0jAIojibmaqyKbCYEXhE8.woff2\",weight:\"400\"},{cssFamilyName:\"Museo Sans 700\",source:\"custom\",style:\"normal\",uiFamilyName:\"Museo Sans\",url:\"https://framerusercontent.com/assets/Jpd8tOQCtuHxj8DvNQWODnTC6N4.woff2\",weight:\"600\"}]}];export const css=[\".framer-niIgg .framer-styles-preset-xeo2we:not(.rich-text-wrapper), .framer-niIgg .framer-styles-preset-xeo2we.rich-text-wrapper p { --framer-font-family: \\\"Museo Sans 500\\\", \\\"Museo Sans 500 Placeholder\\\", sans-serif; --framer-font-family-bold: \\\"Museo Sans 700\\\", \\\"Museo Sans 700 Placeholder\\\", sans-serif; --framer-font-open-type-features: 'blwf' on, 'cv03' on, 'cv04' on, 'cv09' on, 'cv11' on; --framer-font-size: 16px; --framer-font-style: normal; --framer-font-style-bold: normal; --framer-font-variation-axes: normal; --framer-font-weight: 400; --framer-font-weight-bold: 600; --framer-letter-spacing: 0.16em; --framer-line-height: 24px; --framer-paragraph-spacing: 20px; --framer-text-alignment: start; --framer-text-color: var(--token-a555343b-38ed-4c49-bdd0-ed07de8547fd); --framer-text-decoration: none; --framer-text-stroke-color: initial; --framer-text-stroke-width: initial; --framer-text-transform: uppercase; }\"];export const className=\"framer-niIgg\";\nexport const __FramerMetadata__ = {\"exports\":{\"fonts\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"className\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"css\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","// Generated by Framer (0e6a859)\nimport{fontStore}from\"framer\";fontStore.loadFonts([\"CUSTOMV2;Museo Sans 300\",\"CUSTOMV2;Museo Sans 700\"]);export const fonts=[{explicitInter:true,fonts:[{cssFamilyName:\"Museo Sans 300\",openType:true,source:\"custom\",style:\"normal\",uiFamilyName:\"Museo Sans\",url:\"https://framerusercontent.com/assets/8Mk8axfnMCLJVdjR5sw8LS4mA.woff2\",weight:\"300\"},{cssFamilyName:\"Museo Sans 700\",openType:true,source:\"custom\",style:\"normal\",uiFamilyName:\"Museo Sans\",url:\"https://framerusercontent.com/assets/Jpd8tOQCtuHxj8DvNQWODnTC6N4.woff2\",weight:\"600\"}]}];export const css=[\".framer-WeK3m .framer-styles-preset-1c8s4rs:not(.rich-text-wrapper), .framer-WeK3m .framer-styles-preset-1c8s4rs.rich-text-wrapper p { --framer-font-family: \\\"Museo Sans 300\\\", \\\"Museo Sans 300 Placeholder\\\", sans-serif; --framer-font-family-bold: \\\"Museo Sans 700\\\", \\\"Museo Sans 700 Placeholder\\\", sans-serif; --framer-font-open-type-features: 'blwf' on, 'cv03' on, 'cv04' on, 'cv09' on, 'cv11' on; --framer-font-size: 20px; --framer-font-style: normal; --framer-font-style-bold: normal; --framer-font-variation-axes: normal; --framer-font-weight: 300; --framer-font-weight-bold: 600; --framer-letter-spacing: -0.02em; --framer-line-height: 32px; --framer-paragraph-spacing: 24px; --framer-text-alignment: start; --framer-text-color: var(--token-86eae3b3-7996-46ca-85dd-cf090d1b440f); --framer-text-decoration: none; --framer-text-stroke-color: initial; --framer-text-stroke-width: initial; --framer-text-transform: none; }\"];export const className=\"framer-WeK3m\";\nexport const __FramerMetadata__ = {\"exports\":{\"fonts\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"css\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"className\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}