deniz bektaş
This commit is contained in:
264
app/page.tsx
264
app/page.tsx
@@ -1,65 +1,215 @@
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import { getPosts } from "@/lib/posts";
|
||||
import { getActivity } from "@/lib/activity";
|
||||
|
||||
export default function Home() {
|
||||
const blogPosts = getPosts("blog").slice(0, 3);
|
||||
const infosecPosts = getPosts("infosec").slice(0, 3);
|
||||
const notes = getPosts("notebook").slice(0, 3);
|
||||
const activities = getActivity().slice(0, 5);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col flex-1 items-center justify-center bg-zinc-50 font-sans dark:bg-black">
|
||||
<main className="flex flex-1 w-full max-w-3xl flex-col items-center justify-between py-32 px-16 bg-white dark:bg-black sm:items-start">
|
||||
<Image
|
||||
className="dark:invert"
|
||||
src="/next.svg"
|
||||
alt="Next.js logo"
|
||||
width={100}
|
||||
height={20}
|
||||
priority
|
||||
/>
|
||||
<div className="flex flex-col items-center gap-6 text-center sm:items-start sm:text-left">
|
||||
<h1 className="max-w-xs text-3xl font-semibold leading-10 tracking-tight text-black dark:text-zinc-50">
|
||||
To get started, edit the page.tsx file.
|
||||
</h1>
|
||||
<p className="max-w-md text-lg leading-8 text-zinc-600 dark:text-zinc-400">
|
||||
Looking for a starting point or more instructions? Head over to{" "}
|
||||
<a
|
||||
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
className="font-medium text-zinc-950 dark:text-zinc-50"
|
||||
>
|
||||
Templates
|
||||
</a>{" "}
|
||||
or the{" "}
|
||||
<a
|
||||
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
className="font-medium text-zinc-950 dark:text-zinc-50"
|
||||
>
|
||||
Learning
|
||||
</a>{" "}
|
||||
center.
|
||||
</p>
|
||||
<div style={{ maxWidth: "100%" }}>
|
||||
{/* Hero */}
|
||||
<div className="card" style={{ marginBottom: "2rem" }}>
|
||||
<div style={{ display: "flex", alignItems: "center", gap: "0.5rem", marginBottom: "0.75rem" }}>
|
||||
<span style={{ color: "var(--accent)", fontSize: "0.8rem" }}>root@denizbektas.com.tr:~$</span>
|
||||
<span style={{ color: "var(--text)", fontSize: "0.8rem" }}>whoami</span>
|
||||
</div>
|
||||
<div className="flex flex-col gap-4 text-base font-medium sm:flex-row">
|
||||
<a
|
||||
className="flex h-12 w-full items-center justify-center gap-2 rounded-full bg-foreground px-5 text-background transition-colors hover:bg-[#383838] dark:hover:bg-[#ccc] md:w-[158px]"
|
||||
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<Image
|
||||
className="dark:invert"
|
||||
src="/vercel.svg"
|
||||
alt="Vercel logomark"
|
||||
width={16}
|
||||
height={16}
|
||||
/>
|
||||
Deploy Now
|
||||
</a>
|
||||
<a
|
||||
className="flex h-12 w-full items-center justify-center rounded-full border border-solid border-black/[.08] px-5 transition-colors hover:border-transparent hover:bg-black/[.04] dark:border-white/[.145] dark:hover:bg-[#1a1a1a] md:w-[158px]"
|
||||
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Documentation
|
||||
</a>
|
||||
<h1 style={{ fontSize: "1.6rem", fontWeight: 800, color: "var(--accent)", marginBottom: "0.5rem" }}>
|
||||
denizbektas
|
||||
</h1>
|
||||
<p style={{ color: "var(--text-muted)", fontSize: "0.875rem", lineHeight: 1.7, maxWidth: "600px" }}>
|
||||
Siber güvenlik araştırmacısı, red teamer, CTF oyuncusu. Sistemlerin nasıl kırıldığını anlayarak
|
||||
onları nasıl koruyacağımızı öğreniyoruz. Bu site o yolculuğun kayıtlarıdır.
|
||||
</p>
|
||||
<div style={{ display: "flex", gap: "0.5rem", marginTop: "1rem", flexWrap: "wrap" }}>
|
||||
<span className="tag">red team</span>
|
||||
<span className="tag">pentest</span>
|
||||
<span className="tag">CTF</span>
|
||||
<span className="tag">OSINT</span>
|
||||
<span className="tag">malware analysis</span>
|
||||
</div>
|
||||
</main>
|
||||
<div style={{ marginTop: "1rem", display: "flex", gap: "1rem", fontSize: "0.8rem" }}>
|
||||
<Link href="/merhaba" style={{ color: "var(--accent)" }}>→ Merhaba</Link>
|
||||
<Link href="/hakkimda" style={{ color: "var(--text-muted)" }}>Hakkımda</Link>
|
||||
<Link href="/iletisim" style={{ color: "var(--text-muted)" }}>İletişim</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Grid */}
|
||||
<div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))", gap: "1rem" }}>
|
||||
|
||||
{/* Blog Widget */}
|
||||
<WidgetCard title="Personal Blog" href="/blog" icon="✍">
|
||||
{blogPosts.length === 0 ? (
|
||||
<EmptyState text="Henüz yazı yok" />
|
||||
) : (
|
||||
<ul style={{ listStyle: "none", display: "flex", flexDirection: "column", gap: "0.75rem" }}>
|
||||
{blogPosts.map((p) => (
|
||||
<li key={p.slug}>
|
||||
<Link href={`/blog/${p.slug}`} style={{ color: "var(--text)", fontSize: "0.82rem", display: "block", lineHeight: 1.4 }}>
|
||||
{p.title}
|
||||
</Link>
|
||||
<span style={{ fontSize: "0.7rem", color: "var(--text-muted)" }}>{formatDate(p.date)}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</WidgetCard>
|
||||
|
||||
{/* Infosec Widget */}
|
||||
<WidgetCard title="Infosec Posts" href="/infosec" icon="⚔">
|
||||
{infosecPosts.length === 0 ? (
|
||||
<EmptyState text="Henüz yazı yok" />
|
||||
) : (
|
||||
<ul style={{ listStyle: "none", display: "flex", flexDirection: "column", gap: "0.75rem" }}>
|
||||
{infosecPosts.map((p) => (
|
||||
<li key={p.slug}>
|
||||
<Link href={`/infosec/${p.slug}`} style={{ color: "var(--text)", fontSize: "0.82rem", display: "block", lineHeight: 1.4 }}>
|
||||
{p.title}
|
||||
</Link>
|
||||
<div style={{ display: "flex", gap: "0.25rem", flexWrap: "wrap", marginTop: "0.2rem" }}>
|
||||
{p.tags.slice(0, 2).map((t) => <span key={t} className="tag">{t}</span>)}
|
||||
</div>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</WidgetCard>
|
||||
|
||||
{/* Notebook Widget */}
|
||||
<WidgetCard title="Notebook" href="/notebook" icon="◎">
|
||||
{notes.length === 0 ? (
|
||||
<EmptyState text="Henüz not yok" />
|
||||
) : (
|
||||
<ul style={{ listStyle: "none", display: "flex", flexDirection: "column", gap: "0.6rem" }}>
|
||||
{notes.map((p) => (
|
||||
<li key={p.slug}>
|
||||
<Link href={`/notebook/${p.slug}`} style={{ color: "var(--text)", fontSize: "0.82rem" }}>
|
||||
{p.title}
|
||||
</Link>
|
||||
<br />
|
||||
<span style={{ fontSize: "0.7rem", color: "var(--text-muted)" }}>{p.excerpt.slice(0, 60)}...</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</WidgetCard>
|
||||
|
||||
{/* Activity Widget */}
|
||||
<WidgetCard title="Son Aktivite" href="/aktivite" icon="▶">
|
||||
<ul style={{ listStyle: "none", display: "flex", flexDirection: "column" }}>
|
||||
{activities.map((a) => (
|
||||
<li key={a.id} className="terminal-line" style={{ fontSize: "0.75rem" }}>
|
||||
<span className="prompt" style={{ flexShrink: 0, fontSize: "0.65rem" }}>
|
||||
{typeIcon(a.type)}
|
||||
</span>
|
||||
<span style={{ flex: 1 }}>
|
||||
{a.link ? <Link href={a.link}>{a.message}</Link> : a.message}
|
||||
</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</WidgetCard>
|
||||
|
||||
{/* Now Widget */}
|
||||
<WidgetCard title="Şu Anda" href="/su-anda" icon="◉">
|
||||
<div style={{ fontSize: "0.82rem", color: "var(--text-muted)", lineHeight: 1.9 }}>
|
||||
<p>🔴 <strong style={{ color: "var(--text)" }}>Odak:</strong> Red team metodolojileri</p>
|
||||
<p>📖 <strong style={{ color: "var(--text)" }}>Okuma:</strong> The Hacker Playbook 3</p>
|
||||
<p>🎯 <strong style={{ color: "var(--text)" }}>Hedef:</strong> OSCP sertifikası</p>
|
||||
<p>🎵 <strong style={{ color: "var(--text)" }}>Dinleme:</strong> Darksynth</p>
|
||||
</div>
|
||||
</WidgetCard>
|
||||
|
||||
{/* RSS Widget */}
|
||||
<WidgetCard title="RSS Beslemeleri" href="/rss-beslemeleri" icon="◈">
|
||||
<div style={{ display: "flex", flexDirection: "column", gap: "0.5rem" }}>
|
||||
{[
|
||||
{ label: "Tüm İçerikler", href: "/api/rss/all" },
|
||||
{ label: "Blog", href: "/api/rss/blog" },
|
||||
{ label: "Infosec", href: "/api/rss/infosec" },
|
||||
{ label: "Podcast", href: "/api/rss/podcast" },
|
||||
].map((r) => (
|
||||
<a key={r.href} href={r.href} style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.8rem", color: "var(--text-muted)" }}>
|
||||
<span style={{ color: "#f26522", fontSize: "0.7rem" }}>⊞</span>
|
||||
{r.label}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</WidgetCard>
|
||||
|
||||
{/* Statboard Widget */}
|
||||
<WidgetCard title="Statboard" href="/statboard" icon="▦">
|
||||
<div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.5rem" }}>
|
||||
{[
|
||||
{ label: "Blog Yazısı", value: "1" },
|
||||
{ label: "Infosec Yazı", value: "1" },
|
||||
{ label: "CTF Çözümü", value: "47" },
|
||||
{ label: "Çay ☕", value: "∞" },
|
||||
].map((s) => (
|
||||
<div key={s.label} style={{ textAlign: "center", padding: "0.5rem", background: "var(--bg)", borderRadius: "4px", border: "1px solid var(--border)" }}>
|
||||
<div style={{ fontSize: "1.1rem", fontWeight: 700, color: "var(--accent)" }}>{s.value}</div>
|
||||
<div style={{ fontSize: "0.65rem", color: "var(--text-muted)" }}>{s.label}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</WidgetCard>
|
||||
|
||||
{/* Projeler Widget */}
|
||||
<WidgetCard title="Projeler" href="/projeler" icon="◈">
|
||||
<div style={{ display: "flex", flexDirection: "column", gap: "0.6rem" }}>
|
||||
<ProjectItem name="denizbektas.com.tr" desc="Bu site — kişisel alan" status="active" />
|
||||
<ProjectItem name="recon-toolkit" desc="Otomasyon keşif aracı" status="wip" />
|
||||
<ProjectItem name="ctf-writeups" desc="CTF çözüm yazıları" status="active" />
|
||||
</div>
|
||||
</WidgetCard>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function WidgetCard({ title, href, icon, children }: { title: string; href: string; icon: string; children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="card" style={{ display: "flex", flexDirection: "column" }}>
|
||||
<div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "0.75rem" }}>
|
||||
<div style={{ display: "flex", alignItems: "center", gap: "0.4rem", fontSize: "0.75rem", fontWeight: 700, color: "var(--text)", letterSpacing: "0.02em" }}>
|
||||
<span style={{ color: "var(--accent)", fontSize: "0.7rem" }}>{icon}</span>
|
||||
{title}
|
||||
</div>
|
||||
<Link href={href} style={{ fontSize: "0.65rem", color: "var(--text-muted)" }}>tümü →</Link>
|
||||
</div>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function EmptyState({ text }: { text: string }) {
|
||||
return <div style={{ fontSize: "0.8rem", color: "var(--text-muted)", fontStyle: "italic" }}>{text}</div>;
|
||||
}
|
||||
|
||||
function ProjectItem({ name, desc, status }: { name: string; desc: string; status: string }) {
|
||||
const colors: Record<string, string> = { active: "#00d4aa", wip: "#f59e0b", archived: "#64748b" };
|
||||
return (
|
||||
<div style={{ display: "flex", alignItems: "flex-start", gap: "0.5rem" }}>
|
||||
<span style={{ color: colors[status] || "var(--text-muted)", fontSize: "0.5rem", marginTop: "0.3rem", flexShrink: 0 }}>●</span>
|
||||
<div>
|
||||
<div style={{ fontSize: "0.82rem", color: "var(--text)" }}>{name}</div>
|
||||
<div style={{ fontSize: "0.7rem", color: "var(--text-muted)" }}>{desc}</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function typeIcon(type: string) {
|
||||
const icons: Record<string, string> = {
|
||||
post: "✍", notebook: "◎", infosec: "⚔", project: "◈", link: "⊞", update: "▲", system: "⚙",
|
||||
};
|
||||
return icons[type] || "▶";
|
||||
}
|
||||
|
||||
function formatDate(date: string) {
|
||||
return new Date(date).toLocaleDateString("tr-TR", { year: "numeric", month: "short", day: "numeric" });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user