feat(tasarim): katalog sayfası alt CTA kartı funnel yüzeyinde (piksel liste)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -596,7 +596,9 @@ pikseller bir kümede kümeleşmesin, interaktif kreatif olsun."
|
|||||||
- **Yüzey — `PikselCtaYuzeyi`, `src/components/piksel-cta-yuzeyi.tsx`:** arama penceresindeki
|
- **Yüzey — `PikselCtaYuzeyi`, `src/components/piksel-cta-yuzeyi.tsx`:** arama penceresindeki
|
||||||
kartın dili: `rounded-3xl border border-blue-400/20 bg-slate-950 text-white`, altta yazılıp
|
kartın dili: `rounded-3xl border border-blue-400/20 bg-slate-950 text-white`, altta yazılıp
|
||||||
silinen satırlar (`FUNNEL_METINLERI`, `src/lib/funnel-metinleri.ts`), tek turuncu CTA.
|
silinen satırlar (`FUNNEL_METINLERI`, `src/lib/funnel-metinleri.ts`), tek turuncu CTA.
|
||||||
Kullanıldığı yerler: ana sayfa kapanış CTA'sı, `/sonuc`'taki iki sihirbaz paneli. Eski
|
Kullanıldığı yerler: ana sayfa kapanış CTA'sı, `/sonuc`'taki iki sihirbaz paneli, katalog
|
||||||
|
sayfalarının altındaki `CtaSiraForm` kart varyantı (üstteki kompakt satır form olduğu için
|
||||||
|
açık zeminde kalır). Eski
|
||||||
`bg-primary` + köşeye kümelenmiş `PixelField` bu yüzeylerde kullanılmaz.
|
`bg-primary` + köşeye kümelenmiş `PixelField` bu yüzeylerde kullanılmaz.
|
||||||
- **Kreatif — `PikselListe`, `src/components/piksel-liste.tsx`:** 24 kare = 24 tercih, hero'nun
|
- **Kreatif — `PikselListe`, `src/components/piksel-liste.tsx`:** 24 kare = 24 tercih, hero'nun
|
||||||
nokta ölçüsüyle (hücre 10, nokta 7.4, rx 2). Örnek modda liste kendini kurar (5 hayal · 13
|
nokta ölçüsüyle (hücre 10, nokta 7.4, rx 2). Örnek modda liste kendini kurar (5 hayal · 13
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import {
|
|||||||
import { authClient } from "@/lib/auth-client";
|
import { authClient } from "@/lib/auth-client";
|
||||||
import { olay, siraKovasi } from "@/lib/analitik";
|
import { olay, siraKovasi } from "@/lib/analitik";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
|
import { PikselCtaYuzeyi } from "@/components/piksel-cta-yuzeyi";
|
||||||
import { onbellekliJsonGetir } from "@/lib/istek-cache";
|
import { onbellekliJsonGetir } from "@/lib/istek-cache";
|
||||||
import { useTercihProfili } from "@/features/liste/hooks/use-tercih-profili";
|
import { useTercihProfili } from "@/features/liste/hooks/use-tercih-profili";
|
||||||
import type { SihirbazFacetleri } from "@/types/yokatlas";
|
import type { SihirbazFacetleri } from "@/types/yokatlas";
|
||||||
@@ -61,13 +62,35 @@ function turEtiketi(tur: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** "Sayısal · 100.000. sıra" — kayıtlı profilin kısa özeti. */
|
/** "Sayısal · 100.000. sıra" — kayıtlı profilin kısa özeti. */
|
||||||
function KayitliSira({ sira, tur }: { sira: number; tur: string }) {
|
function KayitliSira({
|
||||||
|
sira,
|
||||||
|
tur,
|
||||||
|
koyu = false,
|
||||||
|
}: {
|
||||||
|
sira: number;
|
||||||
|
tur: string;
|
||||||
|
/** Koyu funnel yüzeyinde (PikselCtaYuzeyi) */
|
||||||
|
koyu?: boolean;
|
||||||
|
}) {
|
||||||
return (
|
return (
|
||||||
<span className="inline-flex items-center gap-1.5 text-sm text-slate-600">
|
<span
|
||||||
<Trophy className="size-4 shrink-0 text-primary" aria-hidden />
|
className={cn(
|
||||||
|
"inline-flex items-center gap-1.5 text-sm",
|
||||||
|
koyu ? "text-slate-300" : "text-slate-600",
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<Trophy
|
||||||
|
className={cn("size-4 shrink-0", koyu ? "text-orange-500" : "text-primary")}
|
||||||
|
aria-hidden
|
||||||
|
/>
|
||||||
<span>
|
<span>
|
||||||
Sıralaman kayıtlı:{" "}
|
Sıralaman kayıtlı:{" "}
|
||||||
<strong className="font-semibold tabular-nums text-slate-900">
|
<strong
|
||||||
|
className={cn(
|
||||||
|
"font-semibold tabular-nums",
|
||||||
|
koyu ? "text-white" : "text-slate-900",
|
||||||
|
)}
|
||||||
|
>
|
||||||
{sira.toLocaleString("tr-TR")}.
|
{sira.toLocaleString("tr-TR")}.
|
||||||
</strong>{" "}
|
</strong>{" "}
|
||||||
sıra · {turEtiketi(tur)}
|
sıra · {turEtiketi(tur)}
|
||||||
@@ -424,54 +447,58 @@ export function CtaSiraForm({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kart varyantı sayfa sonundaki funnel CTA'sıdır: arama kartının koyu
|
||||||
|
// yüzeyi + 24'lük piksel liste (DESIGN.md §10.8).
|
||||||
if (profil) {
|
if (profil) {
|
||||||
return (
|
return (
|
||||||
<section className="flex flex-col items-center rounded-2xl border border-primary/20 bg-primary/5 px-6 py-8 text-center sm:px-10 sm:py-10">
|
<PikselCtaYuzeyi metinOfseti={5}>
|
||||||
<h2 className="font-heading text-xl font-bold text-balance text-slate-900 sm:text-2xl">
|
<h2 className="font-heading text-2xl font-bold text-balance sm:text-3xl">
|
||||||
{baslik ?? "Sıralamana yakın programlar hangileri? Saniyede gör."}
|
{baslik ?? "Sıralamana yakın programlar hangileri? Saniyede gör."}
|
||||||
</h2>
|
</h2>
|
||||||
<div className="mt-3">
|
<div className="mt-3">
|
||||||
<KayitliSira sira={profil.sira} tur={profil.tur} />
|
<KayitliSira sira={profil.sira} tur={profil.tur} koyu />
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-2 max-w-xl text-sm leading-6 text-slate-600">
|
<p className="mt-2 max-w-xl text-base leading-relaxed text-slate-300">
|
||||||
Gerçek YÖK Atlas verisiyle hayal, dengeli ve güvenli dilimlerindeki
|
Gerçek YÖK Atlas verisiyle hayal, dengeli ve güvenli dilimlerindeki
|
||||||
programların hazır.
|
programların hazır.
|
||||||
</p>
|
</p>
|
||||||
<PagePixelDivider seed={67} className="mt-6" />
|
<Button
|
||||||
<Button asChild size="lg" className={cn(PROFILLI_CTA_SINIF, "mt-6")}>
|
asChild
|
||||||
|
size="lg"
|
||||||
|
className={cn(PROFILLI_CTA_SINIF, "mt-6 w-full active:scale-[0.97] sm:w-auto")}
|
||||||
|
>
|
||||||
<Link href={sonucHref()}>
|
<Link href={sonucHref()}>
|
||||||
Sıralamana uygun programları gör
|
Sıralamana uygun programları gör
|
||||||
<ArrowRight className="size-4" aria-hidden />
|
<ArrowRight className="size-4" aria-hidden />
|
||||||
</Link>
|
</Link>
|
||||||
</Button>
|
</Button>
|
||||||
</section>
|
</PikselCtaYuzeyi>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section
|
<div ref={formRef}>
|
||||||
ref={formRef}
|
<PikselCtaYuzeyi metinOfseti={9}>
|
||||||
className="rounded-2xl border border-primary/20 bg-primary/5 p-6 sm:p-8"
|
<h2 className="font-heading text-2xl font-bold text-balance sm:text-3xl">
|
||||||
>
|
{baslik ?? "Sıralamana yakın programlar hangileri? Saniyede gör."}
|
||||||
<h2 className="font-heading text-xl font-bold text-slate-900">
|
</h2>
|
||||||
{baslik ?? "Sıralamana yakın programlar hangileri? Saniyede gör."}
|
<p className="mt-3 max-w-xl text-base leading-relaxed text-slate-300">
|
||||||
</h2>
|
{aciklama ??
|
||||||
<p className="mt-2 text-sm leading-6 text-slate-600">
|
"YKS başarı sıralamanı gir; gerçek YÖK Atlas verisiyle sıralamana uygun hayal, dengeli ve güvenli dilimlerindeki programları anında listele. Ücretsiz, üyelik gerekmez."}
|
||||||
{aciklama ??
|
</p>
|
||||||
"YKS başarı sıralamanı gir; gerçek YÖK Atlas verisiyle sıralamana uygun hayal, dengeli ve güvenli dilimlerindeki programları anında listele. Ücretsiz, üyelik gerekmez."}
|
<Button
|
||||||
</p>
|
type="button"
|
||||||
<Button
|
size="lg"
|
||||||
type="button"
|
onClick={() => setAcik(true)}
|
||||||
onClick={() => setAcik(true)}
|
onPointerEnter={preloadSihirbazAdimlar}
|
||||||
onPointerEnter={preloadSihirbazAdimlar}
|
onFocus={preloadSihirbazAdimlar}
|
||||||
onFocus={preloadSihirbazAdimlar}
|
className="mt-6 h-12 w-full cursor-pointer bg-orange-500 px-6 text-white transition-[background-color,transform] duration-200 hover:bg-orange-600 active:scale-[0.97] sm:w-auto"
|
||||||
className="mt-4 h-11 cursor-pointer bg-orange-500 px-6 text-sm font-semibold text-white transition-colors duration-200 hover:bg-orange-600"
|
>
|
||||||
>
|
Sıralamanı gir, programları gör
|
||||||
Sıralamanı gir, programları gör
|
<ArrowRight className="size-4" aria-hidden />
|
||||||
<ArrowRight className="size-4" aria-hidden />
|
</Button>
|
||||||
</Button>
|
</PikselCtaYuzeyi>
|
||||||
|
|
||||||
{cekmece}
|
{cekmece}
|
||||||
</section>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user