fix: ohne JavaScript blieb der gesamte Seiteninhalt unter dem Hero unsichtbar

Hero, ScrollReveal und ProductCard starten mit opacity 0 und werden per
motion/react eingeblendet. Diese Startwerte stehen als inline-style bereits im
server-gerenderten HTML — auf wabenhain.com an 38 Elementen nachgezaehlt. Laeuft
kein JavaScript, blendet sie niemand wieder ein: der Besucher sieht das
Hero-Bild und darunter eine leere Seite. Kein Teilausfall, sondern der
komplette Inhalt.

Fuer Suchmaschinen war das unkritisch, der Text steht im HTML. Fuer Menschen
mit deaktiviertem JavaScript war es ein Totalausfall.

Die drei Bausteine tragen jetzt data-reveal, und ein noscript-Block im
Root-Layout hebt darueber die Startwerte auf. Das Attribut statt eines
Treffers auf [style*="opacity:0"] ist der Kern der Sache: Warenkorb-Schublade,
Menue und Cookie-Banner blenden ueber AnimatePresence ebenfalls mit opacity 0
ein, sollen ohne JavaScript aber verborgen BLEIBEN. Sie tragen das Attribut
nicht.

!important ist hier notwendig und nicht nachlaessig — einen inline-style
ueberschreibt sonst nichts.

Grenze der Loesung: noscript deckt "JavaScript deaktiviert" ab. Laedt das
Bundle dagegen und schlaegt erst spaeter fehl, greift es nicht; dafuer waere
ein Zeitgeber noetig, der die Animation im Normalfall stoeren wuerde.

tsc: 0 Fehler. vitest: 359/359 gruen. eslint: 0 Warnungen. next build: gruen.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5 committed 2026-09-20 03:51:51 +02:00
1 parent c5e4978fad
commit cc267ad8d4
4 files changed
+35 -5

No files matched your search

+22
View File
@@ -89,6 +89,28 @@ export default async function RootLayout({ children }: LayoutProps<"/">) {
className={`${cormorant.variable} ${inter.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col bg-background text-ink">
{/* Rettungsnetz fuer den Fall, dass kein JavaScript laeuft.
Hero, ScrollReveal und ProductCard starten mit opacity 0 und werden
erst per motion/react eingeblendet. Weil diese Startwerte schon im
server-gerenderten HTML als inline-style stehen, blieb ohne
JavaScript alles unterhalb des Hero-Bildes dauerhaft unsichtbar —
kein Teilausfall, sondern der komplette Seiteninhalt. Auf
wabenhain.com waren das 38 Elemente.
!important ist hier notwendig und nicht nachlaessig: es gibt keine
andere Moeglichkeit, einen inline-style zu ueberschreiben. Die
Regel zielt ausschliesslich auf [data-reveal] — Ein- und
Ausblendungen in AnimatePresence (Warenkorb-Schublade, Menue,
Cookie-Banner) tragen das Attribut nicht und bleiben verborgen.
Deckt den Fall "JavaScript deaktiviert" ab. Laedt das Bundle
dagegen und schlaegt erst spaeter fehl, greift noscript nicht —
dafuer waere ein Zeitgeber noetig, der die Animation im Normalfall
stoeren wuerde. */}
<noscript>
<style>{`[data-reveal]{opacity:1!important;transform:none!important}`}</style>
</noscript>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(localBusinessJsonLd).replace(/</g, "\\u003c") }}