"use client"; import { useRef, useState, type ReactNode } from "react"; import { cn } from "@/lib/utils"; import { PikselZemin } from "@/components/piksel-zemin"; import { PikselListe, PikselListeAciklama } from "@/components/piksel-liste"; /** * Kapanış yüzeyi (DESIGN.md §10.8) — arama penceresindeki kartın dili: * koyu slate-950 zemin, ince mavi kenar, turuncu CTA. Arka planda büyüklü * küçüklü, masonry gibi kaymış piksel dokusu (PixelMasonry); yüzeyin * kreatifi 24'lük listenin kendisidir (PikselListe). Kartın içindeki bir * düğmeye ya da linke imleç/odak gelince 24 kare birden dolar — "listen * böyle hazır olur". Yazılıp silinen satır yok (Bilal, 24 Eyl 2026). */ export function PikselCtaYuzeyi({ children, className, seed = 7, }: { children: ReactNode; className?: string; /** Piksel dokusunun deseni; aynı sayfadaki iki yüzey farklı olsun */ seed?: number; }) { const [tamamla, setTamamla] = useState(false); // Piksel tablosunun çevresi dokuda boş kalır (Bilal, 24 Eyl 2026: // "tablonun arkasına çok piksel yığılmış"); ölçü gerçek yerleşimden. const listeRef = useRef(null); const hedefMi = (t: EventTarget | null) => t instanceof Element && t.closest("a, button") != null; return (
setTamamla(hedefMi(e.target))} onPointerLeave={() => setTamamla(false)} onFocusCapture={(e) => setTamamla(hedefMi(e.target))} onBlurCapture={() => setTamamla(false)} className={cn( "relative isolate overflow-hidden rounded-3xl border border-blue-400/20 bg-slate-950 text-white shadow-xl shadow-slate-900/10", className, )} >
{children}
); }