diff --git a/docs/tasarim/DESIGN.md b/docs/tasarim/DESIGN.md
index cc67a8f..86b9659 100644
--- a/docs/tasarim/DESIGN.md
+++ b/docs/tasarim/DESIGN.md
@@ -125,7 +125,7 @@ turuncu **tek tondur: `orange-500`** — CTA butonunun turuncusuyla birebir ayn
## 3. Tipografi
-Dört yazı tipi, her birinin tek bir işi var:
+Dört arayüz yazı tipi (+ yalnız Kur'an metni için bir Arapça yazı tipi), her birinin tek bir işi var:
| Sınıf | Yazı tipi | İş |
|---|---|---|
@@ -133,6 +133,7 @@ Dört yazı tipi, her birinin tek bir işi var:
| `font-sans` (varsayılan) | Clarity City 400–800 | Gövde, buton, form, tablo |
| `font-bricolage` | Bricolage Grotesque (opsz ekseni) | Vurgu: hero'da italik mavi span, logo yazısı, üst çubuktaki sayfa adı (§4.14), küçük etiketler/çipler |
| `font-mono` | Geist Mono | Yalnızca kod/markdown blokları. Arayüzde kullanılmaz |
+| `amiriQuran.className` (`site-footer.tsx`) | Amiri Quran | Yalnızca Kur'an metni: footer'daki âyet (`lang="ar" dir="rtl"`). Arayüz metninde kullanılmaz; önceden yüklenmez, Arapça alt kümesi âyet çizilirken iner. Aşağıdaki "serif yasak" kuralı Latin arayüz metni içindir |
Ölçek (kopyala, uydurma):
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 3eba033..72762f4 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -10,6 +10,7 @@ import { KaydetBannerLazy } from "@/features/liste/components/kaydet-banner-lazy
import { TercihProfiliKapisiLazy } from "@/features/liste/components/tercih-profili-kapisi-lazy";
import { HeaderGate } from "@/components/header-gate";
import { DevPanelMount } from "@/components/dev/dev-panel-mount";
+import { ConsoleAsr } from "@/components/console-asr";
import { JsonLd, organizationJsonLd, webSiteJsonLd, SITE_URL } from "@/lib/seo";
import "./globals.css";
@@ -117,6 +118,8 @@ export default function RootLayout({
{/* İlk "+" için sıra + sihirbaz kapısı */}
+ {/* DevTools'u açan meraklıya piksel kum saati + Asr Sûresi */}
+
{/* Dev süperadmin paneli — prod build'de modül grafiğine bile girmez */}
{process.env.NODE_ENV !== "production" ? : null}
diff --git a/src/components/console-asr.tsx b/src/components/console-asr.tsx
index f20b684..acf4f07 100644
--- a/src/components/console-asr.tsx
+++ b/src/components/console-asr.tsx
@@ -2,31 +2,136 @@
import { useEffect } from "react";
-let hasPlayed = false;
+/**
+ * Konsol sürprizi: DevTools'u açan meraklıya sitenin piksel dilinde bir kum
+ * saati, Asr Sûresi (Arapça + meal) ve tasavvuftan bir vakit sözü. "Asr"
+ * zaman demek; kum saati de onu anlatır. Görünür arayüzde iz bırakmaz; kök
+ * layout'ta bir kez çalışır, sayfa geçişlerinde tekrar basmaz.
+ *
+ * DevTools açık ya da koyu temada olabilir: düz metne renk verilmez
+ * (konsolun kendi rengi kalır), yalnız iki zeminde de okunan marka renkleri
+ * kullanılır.
+ *
+ * Arapça metin Diyanet'in Kur'an-ı Kerim mushafından, meal Diyanet İşleri
+ * mealinden harfi harfine alındı (kuran.diyanet.gov.tr, âyet gruplaması
+ * aynen). Elle düzeltme yapılmaz; değişecekse kaynaktan yeniden kopyalanır.
+ */
-const consoleMessage = [
- "%cبِسْمِ اللَّهِ الرَّحْمٰنِ الرَّحِيمِ",
- "",
- "وَالْعَصْرِۙ اِنَّ الْاِنْسَانَ لَف۪ي خُسْرٍۙ",
- "اِلَّا الَّذ۪ينَ اٰمَنُوا وَعَمِلُوا الصَّالِحَاتِ",
- "وَتَوَاصَوْا بِالْحَقِّ وَتَوَاصَوْا بِالصَّبْرِ",
- "",
+let basildi = false;
+
+// Logodaki üç kare (public/kolay-tercih-mark.svg)
+const MAVI = "#3b82f6";
+const SEFTALI = "#fdc7a7";
+const TURUNCU = "#ff5a00";
+// slate-400: açık ve koyu konsolda okunan silik metin
+const SILIK = "#94a3b8";
+
+// Hero'daki dot-matrix ızgarasıyla kum saati: # çerçeve, g boş cam,
+// o yığılmış kum, p akan kum. Üst hazne boşalıyor, alt hazne doluyor.
+const KUM_SAATI = [
+ "###########",
+ " #ggggggg# ",
+ " #ooooooo# ",
+ " #ooooo# ",
+ " #ooo# ",
+ " #p# ",
+ " #p# ",
+ " #gpg# ",
+ " #ggpgg# ",
+ " #ggooogg# ",
+ " #ooooooo# ",
+ "###########",
+];
+
+const PIKSEL_RENK: Record = {
+ "#": MAVI,
+ g: "rgba(59,130,246,0.16)",
+ o: TURUNCU,
+ p: SEFTALI,
+};
+
+// Piksel = arka planı boyanmış iki boşluk; satır aralığı ve sağ boşluk
+// hero'daki gibi kareler arasında eşit nefes bırakır.
+const HUCRE = "font-size:8px;line-height:14px;margin-right:4px;border-radius:2px";
+
+// Kum saatinin sağında, boğaz hizasında duran satırlar
+const YAN_YAZI: Record = {
+ 5: ["KolayTercih", `font-size:13px;font-weight:700;color:${MAVI}`],
+ 6: ["Asr Sûresi", `font-size:12px;color:${SILIK}`],
+};
+
+const BESMELE = "بِسْمِ اللّٰهِ الرَّحْمٰنِ الرَّح۪يمِ";
+
+const ASR = [
+ "وَالْعَصْرِۙ",
+ "اِنَّ الْاِنْسَانَ لَفٖي خُسْرٍۙ",
+ "اِلَّا الَّذٖينَ اٰمَنُوا وَعَمِلُوا الصَّالِحَاتِ وَتَوَاصَوْا بِالْحَقِّ وَتَوَاصَوْا بِالصَّبْرِ",
+];
+
+const MEAL = [
"Rahmân ve Rahîm olan Allah’ın adıyla.",
"",
- "Asra yemîn olsun ki,",
- "İnsan gerçekten ziyândadır.",
- "Ancak iman edip sâlih ameller yapanlar, birbirlerine hakkı tavsiye",
- "edenler ve birbirlerine sabretmeyi öğütleyenler müstesnâ!",
-].join("\n");
+ "1-2. Andolsun zamana ki, insan gerçekten ziyan içindedir.",
+ "3. Ancak, iman edip de sâlih ameller işleyenler, birbirlerine hakkı tavsiye edenler, birbirlerine sabrı tavsiye edenler başka (Onlar ziyanda değillerdir).",
+];
+
+// Konsol sayfanın web fontlarını görmez; sistemde ne varsa o seçilir.
+const ARAPCA_YAZI_TIPI =
+ "'Amiri Quran','Amiri','Scheherazade New','Noto Naskh Arabic','Geeza Pro','Traditional Arabic',serif";
+
+function mesaj(): string[] {
+ let bicim = "";
+ const stiller: string[] = [];
+ const ekle = (metin: string, stil: string) => {
+ bicim += `%c${metin}`;
+ stiller.push(stil);
+ };
+
+ KUM_SAATI.forEach((satir, i) => {
+ for (const k of satir) {
+ const renk = PIKSEL_RENK[k];
+ ekle(" ", renk ? `${HUCRE};background:${renk}` : HUCRE);
+ }
+ const yan = YAN_YAZI[i];
+ if (yan) ekle(` ${yan[0]}`, `line-height:14px;${yan[1]}`);
+ bicim += "\n";
+ });
+
+ ekle(
+ `\n${BESMELE}\n${ASR.join("\n")}\n`,
+ `font-size:22px;line-height:2;font-family:${ARAPCA_YAZI_TIPI}`,
+ );
+ ekle(`\n${MEAL.join("\n")}\n`, "font-size:13px;line-height:1.7");
+ ekle("Asr Sûresi (103) · Diyanet İşleri meali\n\n", `font-size:11px;color:${SILIK}`);
+ ekle(
+ "«Vakit bir kılıçtır; sen onu kesmezsen o seni keser.»\n",
+ `font-size:13px;font-weight:600;line-height:1.8;color:${TURUNCU}`,
+ );
+ ekle(
+ "İmam Şâfiî’nin sûfîlerden öğrendiğini söylediği söz\n\n",
+ `font-size:11px;color:${SILIK}`,
+ );
+ ekle(
+ `Meraklısına: ${window.location.origin}/meraklisina`,
+ `font-size:11px;color:${SILIK}`,
+ );
+
+ return [bicim, ...stiller];
+}
export function ConsoleAsr() {
useEffect(() => {
- if (hasPlayed) return;
- hasPlayed = true;
+ if (basildi) return;
+ basildi = true;
- window.setTimeout(() => {
- console.log(consoleMessage, "font-size:16px");
- }, 250);
+ // Hidrasyon ve ilk etkileşimle yarışmasın: tarayıcı boşa çıkınca bas.
+ // Safari'de requestIdleCallback yok, orada kısa bir gecikme yeter.
+ const bas = () => console.log(...mesaj());
+ if (typeof window.requestIdleCallback === "function") {
+ window.requestIdleCallback(bas, { timeout: 3000 });
+ } else {
+ window.setTimeout(bas, 1000);
+ }
}, []);
return null;
diff --git a/src/components/site-footer.tsx b/src/components/site-footer.tsx
index 81b4264..689975e 100644
--- a/src/components/site-footer.tsx
+++ b/src/components/site-footer.tsx
@@ -1,6 +1,17 @@
import Image from "next/image";
import Link from "next/link";
+import { Amiri_Quran } from "next/font/google";
+import { PixelMark } from "@/components/pixel-decor";
import { getAllBolumler } from "@/lib/katalog";
+import { cn } from "@/lib/utils";
+
+// Yalnız footer'daki âyet için (DESIGN.md §3). Önceden yüklenmez: Arapça
+// alt kümesi (~45 KB) âyet çizilirken bir kez iner, sonra önbellekten gelir.
+const amiriQuran = Amiri_Quran({
+ weight: "400",
+ subsets: ["arabic"],
+ preload: false,
+});
/**
* Site footer'ı: yasal metin + SEO iç link kolonları. Server component —
@@ -125,6 +136,32 @@ export function SiteFooter() {
+ {/* Hz. Mûsâ'nın göreve çıkarken ettiği dua (Tâhâ 25–26); sınav
+ öncesi okunan dua da budur. "İşimi kolaylaştır" sitenin adıyla
+ aynı dilekten. Arapça Diyanet mushafından, meal Diyanet İşleri
+ mealinden harfi harfine; dua olarak okunduğu gibi baştaki
+ "kâle" (dedi ki) alınmadı. */}
+
+