diff --git a/app/[locale]/technologies/page.tsx b/app/[locale]/technologies/page.tsx new file mode 100644 index 0000000..c421d0b --- /dev/null +++ b/app/[locale]/technologies/page.tsx @@ -0,0 +1,20 @@ +import { TechnologiesContent } from "@/components/technologies-content"; +import { getStaticPageMetadata } from "@/lib/seo"; + +export async function generateMetadata({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + + return getStaticPageMetadata({ + locale, + page: "technologies", + path: "/technologies", + }); +} + +export default function TechnologiesPage() { + return ; +} diff --git a/app/sitemap.ts b/app/sitemap.ts index 659940e..0c734ec 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -25,6 +25,7 @@ const STATIC_ROUTES = [ { path: "/projects", changeFrequency: "monthly", priority: 0.8 }, { path: "/content", changeFrequency: "weekly", priority: 0.7 }, { path: "/gallery", changeFrequency: "monthly", priority: 0.6 }, + { path: "/technologies", changeFrequency: "monthly", priority: 0.7 }, { path: "/contact", changeFrequency: "yearly", priority: 0.5 }, { path: "/media-kit", changeFrequency: "monthly", priority: 0.6 }, { path: "/links", changeFrequency: "monthly", priority: 0.4 }, diff --git a/components/home-technology-stack.tsx b/components/home-technology-stack.tsx index 17a6ef0..4f28e7d 100644 --- a/components/home-technology-stack.tsx +++ b/components/home-technology-stack.tsx @@ -1,61 +1,62 @@ "use client"; import { Icon } from "@iconify/react"; -import { useLocale, useTranslations } from "next-intl"; -import { Badge, Typography } from "poyraz-ui/atoms"; +import { useTranslations } from "next-intl"; +import { + Button, + ButtonIcon, + ButtonLabel, + Typography, +} from "poyraz-ui/atoms"; import { TECHNOLOGY_STACK } from "@/data/technology-stack"; -import { getLocalizedValue } from "@/lib/locale"; +import { Link } from "@/i18n/routing"; +import { TechnologyBadge } from "@/components/technology-badge"; export function HomeTechnologyStack() { const t = useTranslations("Home"); - const locale = useLocale(); + const technologies = TECHNOLOGY_STACK.flatMap((group) => group.items); return (
- - {t("technologiesTitle")} - +
+ + {t("technologiesTitle")} + -
- {TECHNOLOGY_STACK.map((group) => ( -
- - {t(`technologyCategories.${group.id}`)} - + +
-
- {group.items.map((technology) => ( - - - ))} -
-
- ))} +
+
+ {technologies.map((technology) => ( + + ))} +
+
); diff --git a/components/technologies-content.tsx b/components/technologies-content.tsx new file mode 100644 index 0000000..53c0d94 --- /dev/null +++ b/components/technologies-content.tsx @@ -0,0 +1,59 @@ +"use client"; + +import { useTranslations } from "next-intl"; +import { Card, Typography } from "poyraz-ui/atoms"; +import { TechnologyBadge } from "@/components/technology-badge"; +import { TECHNOLOGY_STACK } from "@/data/technology-stack"; + +export function TechnologiesContent() { + const t = useTranslations("Technologies"); + + return ( +
+
+ + {t("title")} + + + {t("description")} + +
+ +
+ {TECHNOLOGY_STACK.map((group) => ( + + + {t(`categories.${group.id}`)} + + +
+ {group.items.map((technology) => ( + + ))} +
+
+ ))} +
+
+ ); +} diff --git a/components/technology-badge.tsx b/components/technology-badge.tsx new file mode 100644 index 0000000..4253eab --- /dev/null +++ b/components/technology-badge.tsx @@ -0,0 +1,32 @@ +"use client"; + +import { Icon } from "@iconify/react"; +import { useLocale } from "next-intl"; +import { Badge } from "poyraz-ui/atoms"; +import type { TechnologyStackItem } from "@/data/technology-stack"; +import { getLocalizedValue } from "@/lib/locale"; + +export function TechnologyBadge({ + technology, +}: { + technology: TechnologyStackItem; +}) { + const locale = useLocale(); + + return ( + + + ); +} diff --git a/data/technology-stack.ts b/data/technology-stack.ts index 150be11..0e747c1 100644 --- a/data/technology-stack.ts +++ b/data/technology-stack.ts @@ -7,7 +7,7 @@ export type TechnologyStackItem = { }; export type TechnologyStackGroup = { - id: "frontend" | "backend" | "languages" | "designTools"; + id: "frontend" | "backend" | "databases" | "languages" | "designTools"; items: readonly TechnologyStackItem[]; }; @@ -56,7 +56,6 @@ export const TECHNOLOGY_STACK: readonly TechnologyStackGroup[] = [ icon: "simple-icons:jsonwebtokens", }, { id: "prisma", label: "Prisma", icon: "simple-icons:prisma" }, - { id: "mongoose", label: "Mongoose", icon: "simple-icons:mongoose" }, { id: "socket-io", label: "Socket.io", @@ -64,6 +63,24 @@ export const TECHNOLOGY_STACK: readonly TechnologyStackGroup[] = [ }, ], }, + { + id: "databases", + items: [ + { id: "mongodb", label: "MongoDB", icon: "simple-icons:mongodb" }, + { id: "mongoose", label: "Mongoose", icon: "simple-icons:mongoose" }, + { + id: "postgresql", + label: "PostgreSQL", + icon: "simple-icons:postgresql", + }, + { id: "mysql", label: "MySQL", icon: "simple-icons:mysql" }, + { + id: "mssql", + label: "Microsoft SQL Server", + icon: "simple-icons:microsoftsqlserver", + }, + ], + }, { id: "languages", items: [ diff --git a/lib/links.ts b/lib/links.ts index 7285513..3e2eaa1 100644 --- a/lib/links.ts +++ b/lib/links.ts @@ -87,6 +87,21 @@ export const NAV_DROPDOWN_GROUPS = [ external: false, keywords: ["animasyon", "animation", "kaynak", "resource", "motion"], }, + { + id: "technologies", + label: "Teknolojiler", + href: "/technologies", + icon: "mdi:layers-triple-outline", + external: false, + keywords: [ + "teknolojiler", + "technologies", + "tech stack", + "araçlar", + "tools", + "skills", + ], + }, ], }, ] as const; diff --git a/lib/seo.ts b/lib/seo.ts index 73921a4..c8d6da1 100644 --- a/lib/seo.ts +++ b/lib/seo.ts @@ -30,6 +30,7 @@ type StaticSeoPage = | "projects" | "content" | "gallery" + | "technologies" | "links" | "contact"; diff --git a/messages/en.json b/messages/en.json index 2590da8..531a9f8 100644 --- a/messages/en.json +++ b/messages/en.json @@ -13,6 +13,7 @@ "socialLinks": "Social Links", "others": "Others", "animationResources": "Animation Resources", + "technologies": "Technologies", "links": "Links", "mediaKit": "Media Kit", "references": "References", @@ -34,9 +35,11 @@ "reviewsAndReferences": "Reviews & References", "allReferences": "All references", "technologiesTitle": "Technologies I use", + "allTechnologies": "Explore all technologies", "technologyCategories": { "frontend": "Front End", "backend": "Back End", + "databases": "Databases", "languages": "Programming Languages", "designTools": "Design & Tools" }, @@ -216,6 +219,17 @@ "resources": "Resources" } }, + "Technologies": { + "title": "Technologies I Use", + "description": "The front-end, back-end, database, programming language, design, and development tools I use to build products.", + "categories": { + "frontend": "Front End", + "backend": "Back End", + "databases": "Databases", + "languages": "Programming Languages", + "designTools": "Design & Tools" + } + }, "Gallery": { "empty": "No images added to the gallery yet.", "close": "Close", @@ -255,6 +269,10 @@ "title": "Gallery", "description": "Selected images from Poyraz Avsever's events, presentations, projects, and community work." }, + "technologies": { + "title": "Technologies I Use", + "description": "Explore the front-end, back-end, database, programming language, and development tools Poyraz Avsever uses to build products." + }, "links": { "title": "Links", "description": "Access Poyraz Avsever's social profiles, projects, content, and essential links from one page." diff --git a/messages/tr.json b/messages/tr.json index ca62470..c790e80 100644 --- a/messages/tr.json +++ b/messages/tr.json @@ -13,6 +13,7 @@ "socialLinks": "Sosyal Bağlantılar", "others": "Diğerleri", "animationResources": "Animasyon Kaynakları", + "technologies": "Teknolojiler", "links": "Bağlantılar", "mediaKit": "Medya Kiti", "references": "Referanslar", @@ -34,9 +35,11 @@ "reviewsAndReferences": "Yorumlar & Referanslar", "allReferences": "Tüm referanslar", "technologiesTitle": "Ben bu teknolojileri kullanıyorum", + "allTechnologies": "Tüm teknolojileri incele", "technologyCategories": { "frontend": "Ön Yüz", "backend": "Arka Yüz", + "databases": "Veritabanları", "languages": "Programlama Dilleri", "designTools": "Tasarım ve Araçlar" }, @@ -216,6 +219,17 @@ "resources": "Kaynaklar" } }, + "Technologies": { + "title": "Kullandığım Teknolojiler", + "description": "Ürün geliştirirken kullandığım ön yüz, arka yüz, veritabanı, programlama dili, tasarım ve geliştirme araçları.", + "categories": { + "frontend": "Ön Yüz", + "backend": "Arka Yüz", + "databases": "Veritabanları", + "languages": "Programlama Dilleri", + "designTools": "Tasarım ve Araçlar" + } + }, "Gallery": { "empty": "Henüz galeriye görsel eklenmemiş.", "close": "Kapat", @@ -255,6 +269,10 @@ "title": "Galeri", "description": "Poyraz Avsever'in etkinlik, sunum, proje ve topluluk çalışmalarından seçilmiş görseller." }, + "technologies": { + "title": "Kullandığım Teknolojiler", + "description": "Poyraz Avsever'in ürün geliştirirken kullandığı ön yüz, arka yüz, veritabanı, programlama dili ve geliştirme araçlarını inceleyin." + }, "links": { "title": "Bağlantılar", "description": "Poyraz Avsever'in sosyal medya hesaplarına, projelerine, içeriklerine ve hızlı erişim bağlantılarına tek sayfadan ulaşın."