From e8e2c7352748b2de616c5a93a8699c387dc9c558 Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Fri, 9 Oct 2026 01:39:59 +0300 Subject: [PATCH] =?UTF-8?q?feat(surum-notlari):=20geri=20bildirim=20kutusu?= =?UTF-8?q?=20ve=20aray=C3=BCz=20iyile=C5=9Ftirmeleri=20balonu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dev CTA bandı yerine başlık + metin alanı + buton; mesaj sunucu aksiyonuyla destek kutusuna e-posta olarak gider (IP başına 10 dk'da 3). Başlığın başı sabit, devamı bir kez daktilo gibi yazılır. Co-Authored-By: Claude Opus 5.5 --- src/app/surum-notlari/page.tsx | 151 +++++++----------- src/components/arayuz-bilgisi.tsx | 57 +++++++ .../components/geri-bildirim-formu.tsx | 96 +++++++++++ .../geri-bildirim/geri-bildirim-actions.ts | 82 ++++++++++ src/lib/eposta.ts | 38 ++++- 5 files changed, 330 insertions(+), 94 deletions(-) create mode 100644 src/components/arayuz-bilgisi.tsx create mode 100644 src/features/geri-bildirim/components/geri-bildirim-formu.tsx create mode 100644 src/features/geri-bildirim/geri-bildirim-actions.ts diff --git a/src/app/surum-notlari/page.tsx b/src/app/surum-notlari/page.tsx index 9e80b40..8b0282f 100644 --- a/src/app/surum-notlari/page.tsx +++ b/src/app/surum-notlari/page.tsx @@ -1,147 +1,112 @@ import type { Metadata } from "next"; -import { ArrowRight, Mail } from "lucide-react"; +import { ArayuzBilgisi } from "@/components/arayuz-bilgisi"; import { Parallax } from "@/components/parallax"; -import { PagePixelDivider, SectionEyebrow } from "@/components/pixel-decor"; +import { GeriBildirimFormu } from "@/features/geri-bildirim/components/geri-bildirim-formu"; import { SiteFooter } from "@/components/site-footer"; -import { Kbd } from "@/components/ui/kbd"; import { SURUM } from "@/lib/surum"; import { sayfaMetadata } from "@/lib/seo"; export const metadata: Metadata = sayfaMetadata({ title: "Sürüm notları", description: - "KolayTercih beta sürüm notları: neler değişti, neler geliyor ve geri bildirimini nasıl iletirsin.", + "KolayTercih beta sürüm notları: neler değişti ve geri bildirimini nasıl iletirsin.", path: "/surum-notlari", }); /** * Sürüm günlüğü. En yeni en üstte; her sürüm package.json'daki numarayla * aynı adı taşır (AGENTS.md "Sürümleme"). Yeni bir sürüm çıkarken buraya bir - * kayıt eklenir; "Geliyor" listesi bitenlerden arındırılır. + * kayıt eklenir. Yalnız görünüşü etkileyen değişiklikler `arayuz` alanına + * yazılır: listede tek satır ("Arayüz iyileştirmeleri") olur, ayrıntısı + * yanındaki bilgi düğmesinin balonunda durur. */ const SURUMLER: { surum: string; tarih: string; - baslik: string; maddeler: string[]; + arayuz?: string[]; }[] = [ { surum: "1.1.0", tarih: "7 Ekim 2026", - baslik: "Tema kısayolu ve sürüm notları", - maddeler: [ + maddeler: [], + arayuz: [ "D tuşu açık / koyu temayı değiştirir; geçiş logodan yayılarak yumuşak oynar.", - "Bu sayfa: beta durumu, sürüm günlüğü ve geri bildirim adresi. Header'daki Beta rozeti buraya getirir.", + "Bu sayfa: beta durumu, sürüm günlüğü ve geri bildirim kutusu. Header'daki Beta rozeti buraya getirir.", ], }, { surum: "1.0.0", tarih: "7 Ekim 2026", - baslik: "Beta açılışı", maddeler: [ "Sıralama, alan, il ve devlet/vakıf tercihine göre 24 tercihlik dengeli liste: hayal, dengeli ve güvenli dilimler.", "Her program için YÖK Atlas verisinden taban sıralama, kontenjan ve yıllara göre eğilim.", "Yapay zekâ destekli tercih raporu ve liste üzerinde soru sorabildiğin danışman sohbeti.", "Üniversite ve bölüm kataloğu, üniversite sıralamaları, rehber yazıları.", - "Açık, koyu ve sistem teması.", ], + arayuz: ["Açık, koyu ve sistem teması."], }, ]; -const GELIYOR = [ - "Listeni PDF olarak indirme ve paylaşma.", - "Yerleşme sonuçları açıklandığında listenin gerçekleşme karnesi.", - "Veli görünümü: listeyi birlikte inceleyip not bırakma.", -]; - export default function SurumNotlariPage() { return ( <>
- Beta · v{SURUM} -

Sürüm notları

+

Sürüm notları

+

+ KolayTercih şu an beta sürümünde. Ürün çalışıyor ve gerçek YÖK + Atlas verisiyle liste üretiyor; ama hâlâ her gün bir şeyler + düzeltiyor, eksik gördüğümüz yerleri tamamlıyoruz. Her sürümde + neyin değiştiği aşağıda. +

- -
-

- KolayTercih şu an beta sürümünde -

-

- Ürün çalışıyor ve gerçek YÖK Atlas verisiyle liste üretiyor; ama - hâlâ her gün bir şeyler düzeltiyor, eksik gördüğümüz yerleri - tamamlıyoruz. Bir hata, yanlış bir sayı, anlaşılmayan bir ekran - ya da “keşke şöyle olsa” dediğin bir şey görürsen bize yaz: her - geri bildirim okunur ve çoğu bir sonraki sürüme girer. -

- - - Geri bildirim gönder - - -

- destek@kolaytercih.com · Hangi sayfada, hangi sıralamayla ne - gördüğünü yazarsan daha hızlı çözeriz. Kart bilgini asla e-postayla - paylaşma. -

-
- -
-

- Neler değişti -

-
    - {SURUMLER.map((s) => ( -
  1. + {/* Zaman çizgisi: her sürümün piksel karesi solda durur, kareleri + ince bir çizgi birbirine bağlar (karenin ortasından bir sonraki + karenin ortasına). En eski sürümde çizgi biter. */} +
      + {SURUMLER.map((s, i) => ( +
    1. + {i < SURUMLER.length - 1 && ( -
      -

      - v{s.surum} -

      - - {s.baslik} + )} + +
      +

      + v{s.surum} +

      + + {s.surum === SURUM && ( + + Şu anki sürüm - -
      -
        - {s.maddeler.map((m) => ( -
      • {m}
      • - ))} -
      -
    2. - ))} -
    -
+ )} + +
    + {s.maddeler.map((m) => ( +
  • {m}
  • + ))} + {s.arayuz && ( +
  • + + Arayüz iyileştirmeleri + + +
  • + )} +
+ + ))} + -
-

- Sırada ne var -

-
    - {GELIYOR.map((m) => ( -
  • {m}
  • - ))} -
-

- Sıra geri bildirimle değişir; en çok istenen öne alınır. -

-
- -

- İpucu: D açık / koyu temayı değiştirir, - ⌘ - K aramayı açar. -

+
diff --git a/src/components/arayuz-bilgisi.tsx b/src/components/arayuz-bilgisi.tsx new file mode 100644 index 0000000..fc1c261 --- /dev/null +++ b/src/components/arayuz-bilgisi.tsx @@ -0,0 +1,57 @@ +"use client"; + +import { useRef, useState } from "react"; +import { Info } from "lucide-react"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +/** + * Sürüm notlarında "Arayüz iyileştirmeleri" satırının yanındaki bilgi düğmesi. + * Düğme ve balon, danışman sohbetindeki "Danışmanın bildikleri" düğmesiyle + * birebir aynıdır (`sohbet-client.tsx`). Fark: dokunmatikte üzerine gelme + * olmadığı için dokununca da açılıp kapanır. + */ +export function ArayuzBilgisi({ maddeler }: { maddeler: string[] }) { + const [acik, setAcik] = useState(false); + // Basış anındaki durum: Radix basışta balonu kapatır, tık ona göre çevirir. + const basistaAcikti = useRef(false); + + return ( + + + + + + +

Bu sürümdeki arayüz iyileştirmeleri:

+
    + {maddeler.map((m) => ( +
  • {m}
  • + ))} +
+
+
+
+ ); +} diff --git a/src/features/geri-bildirim/components/geri-bildirim-formu.tsx b/src/features/geri-bildirim/components/geri-bildirim-formu.tsx new file mode 100644 index 0000000..dfe7931 --- /dev/null +++ b/src/features/geri-bildirim/components/geri-bildirim-formu.tsx @@ -0,0 +1,96 @@ +"use client"; + +// Sürüm notları sayfasının altındaki geri bildirim kutusu: başlık, metin +// alanı, buton. Mesaj geriBildirimGonder sunucu aksiyonuyla destek kutusuna +// e-posta olarak gider. + +import { useState } from "react"; +import { ArrowRight } from "lucide-react"; +import { toast } from "sonner"; +import { Button } from "@/components/ui/button"; +import { Textarea } from "@/components/ui/textarea"; +import { TypingAnimation } from "@/components/ui/typing-animation"; +import { geriBildirimGonder } from "@/features/geri-bildirim/geri-bildirim-actions"; + +const BASLIK = "Bir hata mı gördün?"; +const DEVAM = "Yalın üretim metodunu benimsiyor ve fikirlerine önem veriyoruz."; + +export function GeriBildirimFormu({ className = "" }: { className?: string }) { + const [mesaj, setMesaj] = useState(""); + const [pending, setPending] = useState(false); + + async function gonder(e: React.FormEvent) { + e.preventDefault(); + setPending(true); + try { + const sonuc = await geriBildirimGonder(mesaj); + if (sonuc.ok) { + toast.success("Geri bildirimin ulaştı, teşekkürler."); + setMesaj(""); + } else { + toast.error(sonuc.error); + } + } catch { + toast.error("Beklenmeyen bir hata oluştu, tekrar dener misin?"); + } finally { + setPending(false); + } + } + + // Dış kart yok: başlık sayfadaki sürüm başlıklarıyla aynı ölçekte durur, + // altında tek yüzey var — metin alanı kenarlıksız, buton aynı yüzeyin + // içinde (sohbet kutusuyla aynı kalıp, DESIGN.md §4.6). + return ( +
+
+ {/* Başlığın başı sabit; devamı bir kez daktilo gibi yazılır ve kalır + (döngü yok). Görünmez tam metin aynı hücrede yer tutar ki yazı + ilerlerken kutu aşağı kaymasın. Ekran okuyucu tam metni okur. */} +

+ + {BASLIK} {DEVAM} + + + {BASLIK} {DEVAM} + + + {BASLIK}{" "} + + {DEVAM} + + +

+
+