"use client"; import { useState, useEffect } from "react"; // <-- Добавили useEffect import { Switch } from "@/components/ui/switch"; import { motion } from "framer-motion"; import { Shield, EyeOff } from "lucide-react"; import { Dictionary } from "@/lib/IDict"; import { CyberButton } from "../ui/cyber-button"; import { NetrunnerMatrix } from "../../matrix-engine/NetrunnerMatrix"; // Импорт из пакета import { GlassShatter } from "../../matrix-engine/GlassShatter"; import { useTheme } from "next-themes"; // <-- ДОБАВЛЕНО export function Hero({ dict, lang, }: { dict: Dictionary["hero"]; lang: string; }) { const [isVpnOn, setIsVpnOn] = useState(false); // Достаем тему const { resolvedTheme, theme } = useTheme(); const [mounted, setMounted] = useState(false); // next-themes не знает реальную тему до монтирования на клиенте (значение SSR // всегда неопределено, чтобы избежать hydration mismatch) — поэтому до monted=true // считаем тему тёмной по умолчанию (defaultTheme в ThemeProvider тоже "dark"), // а после монтирования переключаемся на реальное значение для канваса матрицы. useEffect(() => { setMounted(true); }, []); const isDark = mounted ? resolvedTheme === "dark" || theme === "dark" : true; return (
{/* ПЕРЕДАЕМ ТЕМУ В МАТРИЦУ */} {/* key={lang} форсирует полный ремаунт WASM-канваса при смене языка — движок матрицы (matrix-engine/) инициализируется один раз и сам не реагирует на смену пропсов лучше, чем через пересоздание инстанса */} {/* Стекло поверх матрицы, показывается только когда глаза закрыты (isVpnOn = true) — бей кликом/тапом, трещины растут от удара, после нескольких ударов стекло осыпается и через паузу собирается заново. См. matrix-engine/GlassShatter.tsx. */}
{isVpnOn ? ( ) : ( )} {isVpnOn ? dict.badgeSecure : dict.badge}

{dict.titleStart}{" "} {dict.titleHighlight}

{dict.subtitle}

Netrunner VPN
{dict.ctaPrimary} {dict.ctaSecondary}
); }