Skip to content

Commit 3bf6dbe

Browse files
Add pages and SEO metadata
1 parent bd83ff1 commit 3bf6dbe

11 files changed

Lines changed: 314 additions & 15 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
# misc
2424
.DS_Store
2525
*.pem
26+
.history
2627

2728
# debug
2829
npm-debug.log*

public/og.svg

Lines changed: 29 additions & 0 deletions
Loading

src/app/about/page.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Link from "next/link";
2+
import { cookies } from "next/headers";
3+
import { copy } from "@/lib/i18n";
4+
5+
export default function AboutPage() {
6+
const cookieStore = cookies();
7+
const language = cookieStore.get("lang")?.value === "en" ? "en" : "tr";
8+
const t = copy[language].pages.about;
9+
10+
return (
11+
<main className="simple-page">
12+
<section className="simple-card">
13+
<p className="eyebrow">{t.eyebrow}</p>
14+
<h1>{t.title}</h1>
15+
<p className="simple-text">{t.body}</p>
16+
<div className="simple-actions">
17+
<Link className="button primary" href="/">
18+
{t.primary}
19+
</Link>
20+
<Link className="button ghost" href="/projects">
21+
{t.secondary}
22+
</Link>
23+
</div>
24+
</section>
25+
</main>
26+
);
27+
}

src/app/contact/page.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import Link from "next/link";
2+
import { cookies } from "next/headers";
3+
import ContactForm from "@/components/ContactForm";
4+
import { copy } from "@/lib/i18n";
5+
6+
export default function ContactPage() {
7+
const cookieStore = cookies();
8+
const language = cookieStore.get("lang")?.value === "en" ? "en" : "tr";
9+
const t = copy[language].pages.contact;
10+
11+
return (
12+
<main className="simple-page">
13+
<section className="simple-card">
14+
<p className="eyebrow">{t.eyebrow}</p>
15+
<h1>{t.title}</h1>
16+
<p className="simple-text">{t.body}</p>
17+
<div className="contact-card">
18+
<ContactForm labels={t.form} />
19+
</div>
20+
<div className="simple-actions">
21+
<Link className="button ghost" href="/">
22+
{t.primary}
23+
</Link>
24+
</div>
25+
</section>
26+
</main>
27+
);
28+
}

src/app/globals.css

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ textarea {
113113
border-radius: 999px;
114114
border: 1px solid var(--stroke);
115115
background: var(--glass);
116+
-webkit-backdrop-filter: blur(16px);
116117
backdrop-filter: blur(16px);
117118
box-shadow: var(--shadow);
118119
position: sticky;
@@ -121,22 +122,36 @@ textarea {
121122
}
122123

123124
.logo {
125+
display: flex;
126+
align-items: center;
127+
gap: 10px;
128+
flex-wrap: wrap;
129+
}
130+
131+
.logo-mark {
132+
font-family: var(--font-mono), monospace;
133+
font-size: 16px;
134+
color: var(--accent);
135+
border: 1px solid rgba(126, 242, 178, 0.5);
136+
border-radius: 10px;
137+
padding: 4px 8px;
138+
background: rgba(126, 242, 178, 0.08);
139+
box-shadow: 0 0 16px rgba(126, 242, 178, 0.25);
140+
}
141+
142+
.logo-text {
124143
font-family: var(--font-display), sans-serif;
125144
font-size: 18px;
126145
letter-spacing: 0.08em;
127146
text-transform: uppercase;
128-
display: flex;
129-
align-items: center;
130-
gap: 12px;
131147
}
132148

133-
.logo::before {
134-
content: "";
135-
width: 10px;
136-
height: 10px;
137-
border-radius: 50%;
138-
background: var(--accent);
139-
box-shadow: 0 0 12px rgba(126, 242, 178, 0.8);
149+
.logo-sub {
150+
font-family: var(--font-mono), monospace;
151+
font-size: 11px;
152+
letter-spacing: 0.12em;
153+
color: var(--muted);
154+
text-transform: uppercase;
140155
}
141156

142157
.nav-links {
@@ -568,6 +583,35 @@ textarea {
568583
justify-content: center;
569584
}
570585

586+
.simple-page {
587+
min-height: 100vh;
588+
padding: 80px 20px;
589+
display: grid;
590+
place-items: center;
591+
}
592+
593+
.simple-card {
594+
width: min(900px, 92vw);
595+
display: grid;
596+
gap: 18px;
597+
border-radius: 28px;
598+
border: 1px solid var(--stroke);
599+
background: var(--glass);
600+
box-shadow: var(--shadow);
601+
padding: clamp(24px, 4vw, 36px);
602+
}
603+
604+
.simple-text {
605+
color: var(--muted);
606+
line-height: 1.7;
607+
}
608+
609+
.simple-actions {
610+
display: flex;
611+
flex-wrap: wrap;
612+
gap: 12px;
613+
}
614+
571615
.dev-console {
572616
position: fixed;
573617
z-index: 9998;

src/app/layout.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ export const metadata: Metadata = {
3131
description:
3232
"Full-stack developer portfolio with 3D scene, selected projects, and contact form.",
3333
type: "website",
34+
images: [
35+
{
36+
url: "/og.svg",
37+
width: 1200,
38+
height: 630,
39+
alt: "Kinin Code — Yamaç portfolio",
40+
},
41+
],
42+
},
43+
twitter: {
44+
card: "summary_large_image",
45+
images: ["/og.svg"],
3446
},
3547
};
3648

src/app/projects/page.tsx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import Link from "next/link";
2+
import { cookies } from "next/headers";
3+
import { getGithubProjects } from "@/lib/github";
4+
import { copy } from "@/lib/i18n";
5+
import { site } from "@/lib/site";
6+
7+
export default async function ProjectsPage() {
8+
const cookieStore = cookies();
9+
const language = cookieStore.get("lang")?.value === "en" ? "en" : "tr";
10+
const t = copy[language].pages.projects;
11+
const projects = await getGithubProjects();
12+
const github = site.socials.find((item) => item.label === "GitHub");
13+
14+
return (
15+
<main className="simple-page">
16+
<section className="simple-card">
17+
<p className="eyebrow">{t.eyebrow}</p>
18+
<h1>{t.title}</h1>
19+
<p className="simple-text">{t.body}</p>
20+
<div className="projects">
21+
{projects.length > 0 ? (
22+
projects.map((project) => (
23+
<article className="project" key={project.url}>
24+
<span>{new Date(project.updatedAt).getFullYear()}</span>
25+
<h4>
26+
<a href={project.url} target="_blank" rel="noreferrer">
27+
{project.name}
28+
</a>
29+
</h4>
30+
<p>{project.description || t.noDescription}</p>
31+
<div className="tags">
32+
{project.language ? <span className="tag">{project.language}</span> : null}
33+
<span className="tag">{project.stars}</span>
34+
</div>
35+
</article>
36+
))
37+
) : (
38+
<p className="section-subtitle">{t.empty}</p>
39+
)}
40+
</div>
41+
<div className="simple-actions">
42+
<Link className="button ghost" href="/">
43+
{t.primary}
44+
</Link>
45+
{github ? (
46+
<a className="button primary" href={github.href} target="_blank" rel="noreferrer">
47+
{t.secondary}
48+
</a>
49+
) : null}
50+
</div>
51+
</section>
52+
</main>
53+
);
54+
}

src/app/robots.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ export default function robots(): MetadataRoute.Robots {
44
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000";
55

66
return {
7-
rules: {
8-
userAgent: "*",
9-
allow: "/",
10-
},
7+
rules: [
8+
{
9+
userAgent: "*",
10+
allow: "/",
11+
disallow: ["/api", "/503"],
12+
},
13+
],
14+
host: baseUrl,
1115
sitemap: `${baseUrl}/sitemap.xml`,
1216
};
1317
}

src/app/sitemap.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,23 @@ export default function sitemap(): MetadataRoute.Sitemap {
1111
changeFrequency: "weekly",
1212
priority: 1,
1313
},
14+
{
15+
url: `${baseUrl}/about`,
16+
lastModified,
17+
changeFrequency: "monthly",
18+
priority: 0.7,
19+
},
20+
{
21+
url: `${baseUrl}/projects`,
22+
lastModified,
23+
changeFrequency: "weekly",
24+
priority: 0.8,
25+
},
26+
{
27+
url: `${baseUrl}/contact`,
28+
lastModified,
29+
changeFrequency: "monthly",
30+
priority: 0.6,
31+
},
1432
];
1533
}

src/components/HomeClient.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ export default function HomeClient({ projects }: HomeClientProps) {
4444
return (
4545
<main className="site">
4646
<header className="top-nav">
47-
<div className="logo">{site.name} Code</div>
47+
<div className="logo">
48+
<span className="logo-mark">~&gt;</span>
49+
<span className="logo-text">{site.name}</span>
50+
<span className="logo-sub">home / root / console</span>
51+
</div>
4852
<nav className="nav-links">
4953
<a href="#services">{t.nav.services}</a>
5054
<a href="#projects">{t.nav.projects}</a>

0 commit comments

Comments
 (0)