diff --git a/docs/tasarim/DESIGN.md b/docs/tasarim/DESIGN.md index d7fc22d..ba69644 100644 --- a/docs/tasarim/DESIGN.md +++ b/docs/tasarim/DESIGN.md @@ -677,9 +677,11 @@ karar. - Zemin `bg-primary` (sitenin mavisi), köşe `rounded-2xl`, yazı beyaz; alt satır da beyaz (`text-white`, `slate-300` değil). Piksel dokusu `PixelMasonry` (Bilal, 24 Eyl 2026: "arka - planda büyüklü küçüklü, masonry şeklinde"): 1–3 hücrelik kareler 3×3'lük makro hücrelere - kaymış düşer, çakışmaz ama hizaya girmez; orta bant (%22–78) boş, kenarlara doğru yoğun; iri - kare daha silik; **durağan** — imleç ısı fırçasına katılmaz, üzerine gelince hiçbir şey + planda büyüklü küçüklü, masonry şeklinde"): 2–4 hücrelik kareler 4×4'lük makro hücrelere + kaymış düşer, çakışmaz ama hizaya girmez. Doku **kabın gerçek ölçüsüne göre** üretilir + (ResizeObserver; sabit çizimi ölçeklemek yüksek kartlarda görünen kısmı boş banda düşürüyordu, + 24 Eyl 2026'da yaşandı): kısa kenarın %30'u kadar kenar çerçevesi kenara doğru yoğunlaşır, + orta tamamen boş; küçük kare yok (2–4 hücre), iri kare daha silik; **durağan** — imleç ısı fırçasına katılmaz, üzerine gelince hiçbir şey olmaz (Bilal, 24 Eyl 2026); yalnız seyrek turuncu vurgu kareleri kendi kendine yavaşça nefes alır. Kap `relative isolate overflow-hidden`, doku `-inset-y-6 -z-10`. Eşit ızgaralı eski `PixelField` kaldırıldı. @@ -691,19 +693,16 @@ karar. kart varyantı, "Kendi Listem" çekmecesinin altı (kompakt). Aynı sayfadaki iki band farklı `seed` alır. -**Her CTA benzeri yüzeyin arkasında piksel zemin — `PikselZemin`, `src/components/piksel-zemin.tsx`** -(Bilal, 24 Eyl 2026: "piksel arka planları her CTA benzeri kısmın arkasında olmalı, masonry gibi -büyüklü küçüklü"). CTA benzeri yüzey = tek bir aksiyona çağıran kart, bant, boş durum ya da -sayfa bölümü. Kap `relative isolate overflow-hidden`; zemin ilk çocuk. Açık kartta -`ton="acik"` (silik mavi, `text-primary/70`), mavi bant ve koyu kartta `ton="koyu"` (beyaz). -`CtaBandi` ve `PikselCtaYuzeyi` de bunu kullanır. Kapsananlar: `/sonuc` "24 tercihlik listen -hazır" kartı, `/listem` dört üretim kartı + boş durum + kilit kartı, tadımlık kartı, -sıralama-yok sayfası, meraklısına kapanış kartı, ana sayfa ve `/paket` ana paket kartı, kaydet -bandı, katalog üstü kompakt satır, arama penceresi kartı. **Kapsam dışı:** form kartları (giriş, -ödeme formu), durum kartları (ödeme sonucu), modal düğmeleri, hata/404 sayfası, yan kredi -kartları — bunlar tek aksiyona çağıran yüzey değil. Yeni bir CTA yüzeyi açan ajan zemini -ekler ve bu listeye yazar. Band üstündeki ikincil metin `text-white/90`, ince yazı `text-white/70`; - `slate-300`/`slate-400` yazılmaz. +**Piksel zemin yalnız CTA yüzeylerinde — `PikselZemin`, `src/components/piksel-zemin.tsx`** +(Bilal, 24 Eyl 2026: önce "her CTA benzeri kısmın arkasında olmalı", sonra "/sonuc'taki kartın +arkasına da piksel koymuşsun; pikseller CTA'larda olacak sadece"). CTA yüzeyi = renkli zeminli +çağrı yüzeyi: mavi `CtaBandi`, koyu kapanış kartı `PikselCtaYuzeyi`, arama penceresindeki koyu +kart. Beyaz içerik kartlarına (tadımlık, `/listem` üretim/kilit kartları, paket kartı, kaydet +bandı, katalog üstü kompakt satır, boş durumlar, sıralama-yok sayfası) **konmaz** — 24 Eyl'de +denendi ve geri alındı. Kap `relative isolate overflow-hidden`; zemin ilk çocuk; kareler beyaz. +Doku kabın gerçek ölçüsüne göre üretilir: yalnız kenar çerçevesinde (kısa kenarın %30'u), orta +tamamen boş; **küçük kare yok**, 2–4 hücrelik (17/27/37 px) kareler, iri olan seyrek ve daha +silik (Bilal: "çok fazla piksel, küçük olanlar hiç olmasın"). **Kapanış yüzeyi — `PikselCtaYuzeyi`, `src/components/piksel-cta-yuzeyi.tsx` (yalnız ana sayfa kapanışı "Tercih listen, pişmanlık listesi olmasın").** Bilal'in kararı (24 Eyl 2026): @@ -719,10 +718,9 @@ yok** (Bilal, 24 Eyl 2026: kaldırıldı); `FUNNEL_METINLERI` yalnız arama penc nabız atar (`kt-piksel-nabiz`). Hareketi azalt: dolu, durağan. Renk her zaman `PikselListeAciklama` metniyle. - Piksel tablosunun arkası boş kalır (Bilal, 24 Eyl 2026: "arkasına çok piksel yığılmış"): - telefon/tablette liste üstte ortada, dokunun boş bandında; `lg`'de liste sağ sütunda olduğu - için doku yalnız sol %16'da ve seyrek (`PikselZemin bosBant={[0.16, 1]} yogunluk={0.7}`). - Kural genel: bir kreatif ya da iri sayı piksel zeminin üstüne geliyorsa `bosBant` ile o - bölge boşaltılır; doku ile kreatif üst üste binmez. + tablo kabı `haric` ile zemine verilir, doku onun çevresini (14 px payla) her genişlikte boş + bırakır. Kural genel: bir kreatif ya da iri sayı piksel zeminin üstüne geliyorsa `haric` ile + boşaltılır; doku ile kreatif üst üste binmez. - Bu yüzey **sayfada bir kez** ve yalnız kapanışta durur; ara paneller ve çekmece mavi banttır. Yeni bir kreatif fikri (veriyi piksele çeviren, imlece tepki veren) önce burada denenir. - Çekmece başlığında denenen "gerçek liste" pikseli (12×2, her kare tercihin riski) **kaldırıldı**: diff --git a/src/app/page.tsx b/src/app/page.tsx index 506bf1a..7ad8b6b 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -28,7 +28,6 @@ import { SectionEyebrow, } from "@/components/pixel-decor"; import { PikselCtaYuzeyi } from "@/components/piksel-cta-yuzeyi"; -import { PikselZemin } from "@/components/piksel-zemin"; import { MAX_REVIZYON, URUNLER } from "@/lib/credits"; import { VERI_YIL_SAYISI } from "@/lib/veri-kapsami"; import { @@ -555,9 +554,8 @@ export default function Home() { > -

{URUNLER.paket.label} diff --git a/src/components/arama-funnel-karti.tsx b/src/components/arama-funnel-karti.tsx index bd35824..7709f93 100644 --- a/src/components/arama-funnel-karti.tsx +++ b/src/components/arama-funnel-karti.tsx @@ -73,7 +73,7 @@ export function AramaFunnelKarti({ onSec }: { onSec: () => void }) { aria-label="Tercih listeni kur" className="relative isolate mt-5 overflow-hidden rounded-2xl border border-blue-400/20 bg-slate-950 px-4 py-5 text-white sm:px-5" > - +
- + {children} ); diff --git a/src/components/piksel-cta-yuzeyi.tsx b/src/components/piksel-cta-yuzeyi.tsx index b72c633..84eded6 100644 --- a/src/components/piksel-cta-yuzeyi.tsx +++ b/src/components/piksel-cta-yuzeyi.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState, type ReactNode } from "react"; +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"; @@ -13,9 +13,6 @@ import { PikselListe, PikselListeAciklama } from "@/components/piksel-liste"; * 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). */ -// Geniş ekranda doku yalnız genişliğin ilk %16'sında (metnin sol boşluğu) -const SOL_KENAR: [number, number] = [0.16, 1]; - export function PikselCtaYuzeyi({ children, className, @@ -27,6 +24,9 @@ export function PikselCtaYuzeyi({ 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; @@ -42,23 +42,15 @@ export function PikselCtaYuzeyi({ className, )} > - {/* Telefon/tablet: liste üstte ortada, dokunun boş bandında. Geniş - ekranda liste sağ sütunda — orası tamamen boş kalır, doku yalnız - sol kenarda ve seyrek (Bilal, 24 Eyl 2026: "tablonun arkasına çok - piksel yığılmış"). */} - - +
{children}
-
+
; /** Dikey taşma payı vb. (varsayılan `-inset-y-6`) */ className?: string; }) { @@ -33,12 +38,16 @@ export function PikselZemin({
- +
); } diff --git a/src/components/pixel-decor.tsx b/src/components/pixel-decor.tsx index e0f23ea..c3c1d24 100644 --- a/src/components/pixel-decor.tsx +++ b/src/components/pixel-decor.tsx @@ -1,6 +1,14 @@ "use client"; -import { useMemo, useRef, type CSSProperties, type ReactNode } from "react"; +import { + useEffect, + useMemo, + useRef, + useState, + type CSSProperties, + type ReactNode, + type RefObject, +} from "react"; import { cn } from "@/lib/utils"; import { usePixelHeat } from "@/components/use-pixel-heat"; @@ -74,41 +82,86 @@ function pixelRect( /** * CTA yüzeylerinin piksel zemini: büyüklü küçüklü kareler, masonry gibi * hafif kaymış (Bilal, 24 Eyl 2026: "arka planda büyüklü küçüklü, masonry - * şeklinde"). İçeriğin oturduğu orta bant boş kalır; kareler kenarlara doğru - * yoğunlaşır. 3×3 hücrelik makro hücrelere 1–3 hücrelik tek kare düşer ve - * makro hücre içinde kaydırılır: kareler çakışmaz ama hizaya da girmez - * (§1.1 "doğal duruş"). Durağan zemin: imleç ısı fırçasına katılmaz - * (Bilal, 24 Eyl 2026: "üzerine gelindiğinde bir şey olmasın"). + * şeklinde"). Kabın **gerçek ölçüsüne** göre üretilir (ResizeObserver): + * sabit bir çizimi kaplayacak şekilde ölçeklemek yüksek kartlarda görünen + * kısmı boş banda düşürüyordu ("hiç doku yok"). Yalnız kenar çerçevesinde, + * orta tamamen boş; `haric` verilen öğenin (ör. 24'lük piksel tablosu) + * çevresi de boş kalır. Küçük (tek hücrelik) kare **yok** (Bilal, 24 Eyl + * 2026: "çok fazla piksel, küçük olanlar hiç olmasın"): 4×4 hücrelik makro + * hücrelere 2–4 hücrelik tek kare düşer ve makro hücre içinde kaydırılır: + * çakışmaz ama hizaya da girmez (§1.1 "doğal duruş"). Durağan zemin: + * imleç ısı fırçasına katılmaz. + * Sunucuda boş çizilir, ölçülünce belirir (dekor; aria-hidden). */ -// Varsayılan boş bant modül sabiti: her render'da yeni dizi olup useMemo'yu -// boşa düşürmesin (rendering-hoist-jsx) -const BOS_BANT_VARSAYILAN: [number, number] = [0.22, 0.78]; - export function PixelMasonry({ seed = 7, - bosBant = BOS_BANT_VARSAYILAN, yogunluk = 1, + kenar = 0.3, + haric, className, }: { seed?: number; - /** Genişliğin bu oranları arasındaki bant boş kalır (içerik orada) */ - bosBant?: [number, number]; /** Doluluk çarpanı; 1 varsayılan, 0.6 seyrek */ yogunluk?: number; + /** Kenar çerçevesinin genişliği: kısa kenarın oranı (0.3 = %30) */ + kenar?: number; + /** Çevresi boş bırakılacak öğe (kreatif, iri sayı) */ + haric?: RefObject; className?: string; }) { - const COLS = 42; - const ROWS = 12; - const MAKRO = 3; + const svgRef = useRef(null); + const [olcu, setOlcu] = useState<{ + w: number; + h: number; + hx: number; + hy: number; + hw: number; + hh: number; + } | null>(null); + + useEffect(() => { + const svg = svgRef.current; + if (!svg) return; + const olc = () => { + const r = svg.getBoundingClientRect(); + const hr = haric?.current?.getBoundingClientRect(); + const sonraki = { + w: Math.round(r.width), + h: Math.round(r.height), + hx: hr ? Math.round(hr.left - r.left) : 0, + hy: hr ? Math.round(hr.top - r.top) : 0, + hw: hr ? Math.round(hr.width) : 0, + hh: hr ? Math.round(hr.height) : 0, + }; + setOlcu((onceki) => + onceki && + onceki.w === sonraki.w && + onceki.h === sonraki.h && + onceki.hx === sonraki.hx && + onceki.hy === sonraki.hy && + onceki.hw === sonraki.hw && + onceki.hh === sonraki.hh + ? onceki + : sonraki, + ); + }; + olc(); + const ro = new ResizeObserver(olc); + ro.observe(svg); + const h = haric?.current; + if (h) ro.observe(h); + return () => ro.disconnect(); + }, [haric]); + + const MAKRO = 4; + const PAY = 14; // hariç öğenin çevresinde bırakılan boşluk (px) - // Çıktı seed'e göre deterministik; render başına yeniden üretme const pixels = useMemo(() => { - const cx = (COLS - 1) / 2; - const cy = (ROWS - 1) / 2; - const maxD = Math.sqrt(cx * cx + cy * cy); - const BAND_MIN = COLS * bosBant[0]; - const BAND_MAX = COLS * bosBant[1]; - + if (!olcu || olcu.w === 0 || olcu.h === 0) return null; + const { w, h, hx, hy, hw, hh } = olcu; + const cols = Math.ceil(w / CELL); + const rows = Math.ceil(h / CELL); + const kisa = Math.min(w, h); const sonuc: ReactNode[] = []; let accentIdx = 0; @@ -141,55 +194,57 @@ export function PixelMasonry({ ); } // İri kare daha silik: yazının yanında bağırmasın - const op = opacityFor(x, y) * (n === 1 ? 1 : n === 2 ? 0.8 : 0.6); + const op = opacityFor(x, y) * (n === 2 ? 0.9 : n === 3 ? 0.7 : 0.55); return ( ); }; - for (let my = 0; my < ROWS / MAKRO; my++) { - for (let mx = 0; mx < COLS / MAKRO; mx++) { + const haricte = (px: number, py: number) => + hw > 0 && + px >= hx - PAY && + px <= hx + hw + PAY && + py >= hy - PAY && + py <= hy + hh + PAY; + + for (let my = 0; my < rows / MAKRO; my++) { + for (let mx = 0; mx < cols / MAKRO; mx++) { const ox = mx * MAKRO; const oy = my * MAKRO; - const mcx = ox + MAKRO / 2; - if (mcx > BAND_MIN && mcx < BAND_MAX) continue; - // Kenarlara doğru artan doluluk - const d = Math.sqrt((mcx - cx) ** 2 + (oy + MAKRO / 2 - cy) ** 2) / maxD; - const density = (0.3 + 0.6 * d * d) * yogunluk; - if (hash(mx, my, seed) > density) { - // Boş makro hücrede ara sıra tek küçük piksel: doku kopmasın - if (hash(mx, my, seed + 3) < 0.25 * yogunluk) { - const px = ox + Math.floor(hash(mx, my, seed + 4) * MAKRO); - const py = oy + Math.floor(hash(mx, my, seed + 5) * MAKRO); - sonuc.push(kare(px, py, 1, `k-${mx}-${my}`, false)); - } - continue; - } + const cxPx = (ox + MAKRO / 2) * CELL; + const cyPx = (oy + MAKRO / 2) * CELL; + if (haricte(cxPx, cyPx)) continue; + // En yakın kenara uzaklık, kısa kenarın oranı olarak (0 kenar, 0.5 orta) + const k = Math.min(cxPx, w - cxPx, cyPx, h - cyPx) / kisa; + // Yalnız çerçevede, kenara doğru artan doluluk; orta boş + if (k >= kenar) continue; + const density = (0.06 + 0.5 * (1 - k / kenar) ** 1.6) * yogunluk; + if (hash(mx, my, seed) > density) continue; const r = hash(mx, my, seed + 7); - const n = r < 0.5 ? 1 : r < 0.85 ? 2 : 3; + // 2–4 hücre: orta boy sık, iri seyrek + const n = r < 0.5 ? 2 : r < 0.85 ? 3 : 4; const serbest = MAKRO - n; const kx = ox + Math.floor(hash(mx, my, seed + 11) * (serbest + 1)); const ky = oy + Math.floor(hash(mx, my, seed + 13) * (serbest + 1)); - const accent = n < 3 && hash(mx, my, seed + 99) > 0.94; + const accent = n === 2 && hash(mx, my, seed + 99) > 0.95; sonuc.push(kare(kx, ky, n, `m-${mx}-${my}`, accent)); - // Büyük karenin yanına küçük bir eş: büyüklü küçüklü ritim - if (n < 3 && hash(mx, my, seed + 17) < 0.45) { - const ex = kx + n < ox + MAKRO ? kx + n : kx - 1; - const ey = ky + n < oy + MAKRO ? ky + n : ky - 1; - if (ex >= ox && ey >= oy) sonuc.push(kare(ex, ey, 1, `e-${mx}-${my}`, false)); - } } } return sonuc; - }, [seed, bosBant, yogunluk]); + }, [olcu, seed, yogunluk, kenar]); return ( diff --git a/src/features/liste/components/kaydet-banner.tsx b/src/features/liste/components/kaydet-banner.tsx index 7983920..3526d7a 100644 --- a/src/features/liste/components/kaydet-banner.tsx +++ b/src/features/liste/components/kaydet-banner.tsx @@ -6,7 +6,6 @@ // hariç her yerde görünür; kapatma oturum boyunca kalıcıdır (sessionStorage). // Exit-intent/agresif popup YOK (PRD kuralı). -import { PikselZemin } from "@/components/piksel-zemin"; import { useEffect, useState } from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; @@ -61,9 +60,8 @@ export function KaydetBanner() { ref={gorunumRef} // Telefonda metin kendi satırında, düğme altında tam genişlik: // yan yana dizince başlık kelime kelime kırılıyordu (375 px). - className="pointer-events-auto relative isolate mx-auto flex max-w-xl flex-wrap items-center gap-3 overflow-hidden rounded-2xl border border-slate-200 bg-white p-4 pr-14 shadow-xl sm:flex-nowrap sm:gap-4" + className="pointer-events-auto relative mx-auto flex max-w-xl flex-wrap items-center gap-3 rounded-2xl border border-slate-200 bg-white p-4 pr-14 shadow-xl sm:flex-nowrap sm:gap-4" > - {/* Kullanıcının o anki işletim sisteminin logosu: "bu tarayıcıda" mesajını somutlaştırır */}
diff --git a/src/features/odeme/components/paket-satinal.tsx b/src/features/odeme/components/paket-satinal.tsx index 0c04290..fcca771 100644 --- a/src/features/odeme/components/paket-satinal.tsx +++ b/src/features/odeme/components/paket-satinal.tsx @@ -1,4 +1,3 @@ -import { PikselZemin } from "@/components/piksel-zemin"; import { Suspense } from "react"; import Image from "next/image"; import Link from "next/link"; @@ -59,8 +58,7 @@ export function PaketSatinAl() { className="mt-10 grid gap-6 sm:grid-cols-[1fr_auto]" > {/* Ana paket */} -
- +

Tercih Dönemi Paketi diff --git a/src/features/pazarlama/components/meraklisina-demo.tsx b/src/features/pazarlama/components/meraklisina-demo.tsx index 14cb772..d34ff55 100644 --- a/src/features/pazarlama/components/meraklisina-demo.tsx +++ b/src/features/pazarlama/components/meraklisina-demo.tsx @@ -7,7 +7,6 @@ // context'ten okur. (Sihirbaz hunisi statik bir şemayla anlatılır — bkz. // huni-semasi.tsx.) -import { PikselZemin } from "@/components/piksel-zemin"; import { createContext, useContext, @@ -235,8 +234,7 @@ export function DemoKapanisCta() { const profil = useTercihProfili(); return ( -
- +

{profil ? "Kuralları öğrendin — sayılar zaten senin sıralamanla hesaplandı." diff --git a/src/features/rapor/components/liste-uretici.tsx b/src/features/rapor/components/liste-uretici.tsx index bd75128..8f62125 100644 --- a/src/features/rapor/components/liste-uretici.tsx +++ b/src/features/rapor/components/liste-uretici.tsx @@ -22,7 +22,6 @@ // Kural: action cevabının hemen ardından yönlendiriciye TEK aksiyon gönder // (router.replace); ikinci aksiyon (refresh) ancak o gezinme bitince. -import { PikselZemin } from "@/components/piksel-zemin"; import { useEffect, useRef, useState, type ReactNode } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; @@ -265,8 +264,7 @@ export function ListeUretici({ // Paketli kullanıcıya paket satma: onun ürünü top-up. Liste ve sohbet // geçmişi kalıcı; kredi yükleyince kaldığı yerden devam eder. return ( -

- +

Kredin bu liste için yetmiyor @@ -296,8 +294,7 @@ export function ListeUretici({ if (durum.ad === "hata") { return ( -
- +

Liste kurulamadı

{durum.mesaj} @@ -347,8 +344,7 @@ function SunucuYokEkrani() { } return ( -

- +

Listen hazır, sunucuya şu an ulaşamıyoruz

@@ -379,8 +375,7 @@ function SunucuYokEkrani() { * "Tekrar dene" yok: tekrar taze requestId üretip ikinci üretimi başlatırdı. */ function SuruyorEkrani() { return ( -
- +

Listen zaten hazırlanıyor

Bunu başka bir sekmede başlatmışsın. İki kez kurmayalım — kredin bu diff --git a/src/features/rapor/components/listem-govde.tsx b/src/features/rapor/components/listem-govde.tsx index 49d911c..f2a6076 100644 --- a/src/features/rapor/components/listem-govde.tsx +++ b/src/features/rapor/components/listem-govde.tsx @@ -4,7 +4,6 @@ // ekranda. Harita ⇄ liste köprüsü (pinden satıra, satırdan haritaya) ve // paketsiz paywall kartları burada; veri çekimi sunucuda (page.tsx) kalır. -import { PikselZemin } from "@/components/piksel-zemin"; import { useMemo, useRef, useState } from "react"; import Link from "next/link"; import { @@ -338,9 +337,8 @@ export function ListemGovde({

-

Tablo ücretsiz. diff --git a/src/features/rapor/components/listem-icerik.tsx b/src/features/rapor/components/listem-icerik.tsx index fa50bbb..f0b0a41 100644 --- a/src/features/rapor/components/listem-icerik.tsx +++ b/src/features/rapor/components/listem-icerik.tsx @@ -19,7 +19,6 @@ import { raporMaskele, ACIK_SATIR } from "@/lib/rapor-maske"; import type { Mesaj } from "./sohbet-client"; import { ListemGovde } from "./listem-govde"; import { ListemBosCta } from "./listem-bos-cta"; -import { PikselZemin } from "@/components/piksel-zemin"; import { ListeUretici } from "./liste-uretici"; import { UretimBasladiOlayi } from "./uretim-basladi-olayi"; @@ -66,8 +65,7 @@ export async function ListemIcerik({ if (!raporVar) { const bosDurum = ( -
- +

Henüz Yapay Zeka listen yok diff --git a/src/features/rapor/components/tadimlik-satiri.tsx b/src/features/rapor/components/tadimlik-satiri.tsx index aa07d4d..73f2c93 100644 --- a/src/features/rapor/components/tadimlik-satiri.tsx +++ b/src/features/rapor/components/tadimlik-satiri.tsx @@ -8,7 +8,6 @@ // varsa /api/tadimlik'ten kategoriye özel satır çekilip yerinde değiştirilir // (seçim sunucuda kalır). Havuzda içerik yoksa hiç render edilmez. -import { PikselZemin } from "@/components/piksel-zemin"; import { useEffect, useRef, useState } from "react"; import Link from "next/link"; import { ArrowRight } from "lucide-react"; @@ -151,8 +150,7 @@ export function TadimlikSatiri({

-
- +
{/* Rapor listesinin satırıyla aynı düzen (§4.15): ad sarar, üniversite adı altında, taban sıra sağda iri. */}
diff --git a/src/features/sihirbaz/components/cta-sira-form.tsx b/src/features/sihirbaz/components/cta-sira-form.tsx index f3a3a96..aedaa2f 100644 --- a/src/features/sihirbaz/components/cta-sira-form.tsx +++ b/src/features/sihirbaz/components/cta-sira-form.tsx @@ -23,7 +23,6 @@ import { authClient } from "@/lib/auth-client"; import { olay, siraKovasi } from "@/lib/analitik"; import { cn } from "@/lib/utils"; import { CtaBandi } from "@/components/cta-bandi"; -import { PikselZemin } from "@/components/piksel-zemin"; import { onbellekliJsonGetir } from "@/lib/istek-cache"; import { useTercihProfili } from "@/features/liste/hooks/use-tercih-profili"; import type { SihirbazFacetleri } from "@/types/yokatlas"; @@ -374,11 +373,10 @@ export function CtaSiraForm({
-
- +

24 tercihlik listen hazır

diff --git a/src/features/sihirbaz/components/sira-gerekli.tsx b/src/features/sihirbaz/components/sira-gerekli.tsx index 4a0d25d..bd827e9 100644 --- a/src/features/sihirbaz/components/sira-gerekli.tsx +++ b/src/features/sihirbaz/components/sira-gerekli.tsx @@ -4,7 +4,6 @@ // sayfayı tazele (URL değişmez); yoksa kapıyı aç. Sıra bilgisi localStorage'daki // TercihProfili ile tüm uygulamada ortak, sunucu tablosu çerezden okur. -import { PikselZemin } from "@/components/piksel-zemin"; import { useEffect } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; @@ -43,8 +42,7 @@ export function SiraGerekli() { } return ( -
- +

Önce sıralamanı gir