feat: alan eşlemesine fakülte sinyali + il adımında tüm iller

Sihirbazın alan çipleri artık YÖK Atlas'ın kendi verisiyle süzülüyor:
kategoriBul program adı kurallarını fakülte kurallarıyla kesiştiriyor
(Siber Güvenlik Müh. artık Hukuk değil, Siyaset Bilimi artık Fen değil).
Aşırı geniş isim regexleri sıkılaştırıldı (bilim/güvenlik/programcı/çevre
+ gastronomi'nin içindeki "astronomi" tuzağı) — sayısalda Hukuk & Siyasal,
sözelde Mühendislik çipi tamamen kalktı.

İl adımındaki .slice(0,15) kırpması kaldırıldı: penceresinde programı olan
TÜM iller listelenir; KKTC/yurtdışı kampüsler ayrı çip grubunda. Haritanın
15-limit yüzünden yanlış "program yok" grilemesi kendiliğinden düzeldi.

Öncelik çiplerine şeffaflık notu eklendi (listeyi daraltmaz, AI'ya yön
verir). /meraklisina şeması ve anlatımı aynı davranışla senkronlandı.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-08-09 00:11:36 +03:00
parent ea85a053c5
commit 34c8f90e26
7 changed files with 176 additions and 36 deletions

View File

@@ -93,6 +93,16 @@ export function SihirbazAdimlar({
() => [...canliFacetler.iller].sort((a, b) => b.adet - a.adet),
[canliFacetler.iller],
);
// Türkiye illeri ana çip grubu; KKTC/yurtdışı kampüsler haritada olmadığı
// için ayrı alt grupta listelenir.
const turkiyeIlleri = useMemo(
() => siraliIller.filter((i) => HARITA_ILLERI.has(i.il)),
[siraliIller],
);
const disIller = useMemo(
() => siraliIller.filter((i) => !HARITA_ILLERI.has(i.il)),
[siraliIller],
);
const haritaIlleri = useMemo(
() => canliFacetler.iller.filter((i) => HARITA_ILLERI.has(i.il)),
[canliFacetler.iller],
@@ -258,13 +268,14 @@ export function SihirbazAdimlar({
{/* Çipler birincil seçim yolu (haritadaki küçük iller mobilde
güvenilir dokunma hedefi değil); iller seçili kategorilere göre
süzülmüş, program sayısına göre sıralı listelenir. */}
süzülmüş, program sayısına göre sıralı listelenir. Penceresinde
programı olan TÜM iller görünür (kırpma yok). */}
<div
className={`mt-4 flex flex-wrap gap-2 ${
className={`mt-4 flex max-h-56 flex-wrap gap-2 overflow-y-auto sm:max-h-none sm:overflow-visible ${
facetYukleniyor ? "animate-pulse opacity-60" : ""
}`}
>
{siraliIller.map((i) => (
{turkiyeIlleri.map((i) => (
<Cip
key={i.il}
secili={iller.includes(i.il)}
@@ -276,6 +287,30 @@ export function SihirbazAdimlar({
))}
</div>
{disIller.length > 0 ? (
<div className="mt-4">
<p className="mb-2 text-xs font-semibold tracking-wide text-slate-400 uppercase">
KKTC & Yurt Dışı
</p>
<div
className={`flex flex-wrap gap-2 ${
facetYukleniyor ? "animate-pulse opacity-60" : ""
}`}
>
{disIller.map((i) => (
<Cip
key={i.il}
secili={iller.includes(i.il)}
onClick={() => listeDegistir(iller, setIller, i.il, 5)}
>
{trBaslikDuzeni(i.il)}
<span className="ml-1.5 text-xs opacity-70">{i.adet}</span>
</Cip>
))}
</div>
</div>
) : null}
{iller.length > 0 ? (
<div className="mt-3 flex flex-wrap items-center gap-2">
<span className="text-xs font-semibold text-slate-400">
@@ -359,6 +394,10 @@ export function SihirbazAdimlar({
</Cip>
))}
</div>
<p className="mt-2 text-xs text-slate-500">
Öncelikler yapay zekânın gerekçelerine ve program seçimine yön
verir; listeyi daraltmaz.
</p>
</div>
</div>
</TransitionPanel>