- {/* start */}
-
-
-
-
- {/* socials */}
-
-
- {socialLinks.map(({ href, src, alt }) => (
-
-
-
- ))}
-
-
-
- {/* end */}
-
-
- {dict.website.homePage.top.greeting}
-
-
- {dict.website.homePage.top.name}
-
-
- {dict.website.homePage.top.profession}
-
-
- {dict.website.homePage.top.roll}
-
-
- {dict.website.homePage.top.descriptionAboutMe}
-
- {/*
*/}
-
+
);
}
diff --git a/src/app/(routes)/(website)/components/aboutMe/AboutMeContent.tsx b/src/app/(routes)/(website)/components/aboutMe/AboutMeContent.tsx
new file mode 100644
index 0000000..71a72c9
--- /dev/null
+++ b/src/app/(routes)/(website)/components/aboutMe/AboutMeContent.tsx
@@ -0,0 +1,113 @@
+"use client";
+
+import React from "react";
+import Image from "next/image";
+import { motion } from "framer-motion";
+import { AboutMeDataType } from "@/app/types/types";
+
+interface AboutMeContentProps {
+ data: AboutMeDataType;
+}
+
+const CATEGORIES = {
+ "Core Tech": ["React", "Next.js", "TypeScript", "JavaScript"],
+ "Backend & Tools": ["Laravel", "PHP", "MySQL", "Node.js", "Docker", "Git"],
+ "Architecture & Others": ["REST API", "TDD", "UI/UX Design", "Clean Architecture"],
+};
+
+export default function AboutMeContent({ data }: AboutMeContentProps) {
+ const categorizedSkills = {
+ "Core Tech": [],
+ "Backend & Tools": [],
+ "Architecture & Others": [],
+ "Other": [],
+ };
+
+ data.skills.forEach((skill) => {
+ let matched = false;
+ for (const [cat, skills] of Object.entries(CATEGORIES)) {
+ if (skills.some((s) => skill.title.toLowerCase().includes(s.toLowerCase()))) {
+ categorizedSkills[cat].push(skill.title);
+ matched = true;
+ break;
+ }
+ }
+ if (!matched) categorizedSkills["Other"].push(skill.title);
+ });
+
+ const isRTL = typeof document !== "undefined" && document.dir === "rtl";
+
+ return (
+
+ {/* Text Section */}
+
+
+ {data.title}
+
+
+ {data.description}
+
+
+
+ {Object.entries(categorizedSkills).map(([category, skills]) => (
+ skills.length > 0 && (
+
+
+ {category}
+
+
+ {skills.map((skill, idx) => (
+
+ {skill}
+
+ ))}
+
+
+ )
+ ))}
+
+
+
+ {/* Image Section */}
+
+
+
+
+ );
+}
diff --git a/src/app/(routes)/(website)/components/aboutMe/aboutMe.tsx b/src/app/(routes)/(website)/components/aboutMe/aboutMe.tsx
index 48d0f6d..cdfa056 100644
--- a/src/app/(routes)/(website)/components/aboutMe/aboutMe.tsx
+++ b/src/app/(routes)/(website)/components/aboutMe/aboutMe.tsx
@@ -3,47 +3,26 @@ import { cookies } from "next/headers";
import React from "react";
import Skeleton from "react-loading-skeleton";
import "react-loading-skeleton/dist/skeleton.css";
+import AboutMeContent from "./AboutMeContent";
export default async function AboutMe() {
const aboutMeData: AboutMeDataType = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/website/about-me/1/translation/${(await cookies()).get("selectedLocale")?.value ? (await cookies()).get("selectedLocale")?.value : (await cookies()).get("defaultLocale")?.value}`,
).then((res) => res.json());
- return (
-
-
-
- {aboutMeData?.title || }
-
-
- {aboutMeData?.description || }
-
-
- {aboutMeData.skills.map((skill, index) => (
- -
-
{skill.title}
-
-
-
-
- ))}
-
+ if (!aboutMeData) {
+ return (
+
-
-

-
-
- );
+ );
+ }
+
+ return
;
}
diff --git a/src/app/(routes)/(website)/components/contact/contact.tsx b/src/app/(routes)/(website)/components/contact/contact.tsx
index 6069056..e79d795 100644
--- a/src/app/(routes)/(website)/components/contact/contact.tsx
+++ b/src/app/(routes)/(website)/components/contact/contact.tsx
@@ -1,4 +1,8 @@
-import React from "react";
+"use client";
+
+import React, { useState } from "react";
+import { motion } from "framer-motion";
+import { Send } from "lucide-react";
interface ContactProps {
dict: {
@@ -16,32 +20,85 @@ interface ContactProps {
}
export default function Contact({ dict }: ContactProps) {
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [submitted, setSubmitted] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ setIsSubmitting(true);
+ // Simulate API call
+ await new Promise((resolve) => setTimeout(resolve, 2000));
+ setIsSubmitting(false);
+ setSubmitted(true);
+ setTimeout(() => setSubmitted(false), 5000);
+ };
+
return (
-
+
+
+
+
+
);
}
diff --git a/src/app/(routes)/(website)/components/footer/footer.tsx b/src/app/(routes)/(website)/components/footer/footer.tsx
index a6d8bed..9c896a5 100644
--- a/src/app/(routes)/(website)/components/footer/footer.tsx
+++ b/src/app/(routes)/(website)/components/footer/footer.tsx
@@ -6,104 +6,76 @@ import Link from "next/link";
export default async function Footer() {
const dict = await getDictionary(await getDefaultLocale());
+
+ const footerLinks = [
+ { href: "/#home", label: dict.website.footer.Home },
+ { href: "/#about-me", label: dict.website.footer.AboutMe },
+ { href: "/#services", label: dict.website.footer.Services },
+ { href: "/#projects", label: dict.website.footer.Projects },
+ { href: "/#testimonials", label: dict.website.footer.Testimonials },
+ { href: "/#contact", label: dict.website.footer.Contact },
+ { href: "/blog", label: dict.website.footer.Blog },
+ ];
+
+ const socialLinks = [
+ { src: "/images/icons/facebook.svg", alt: "facebook" },
+ { src: "/images/icons/twitter.svg", alt: "twitter" },
+ { src: "/images/icons/instagram.svg", alt: "instagram" },
+ { src: "/images/icons/linkedin.svg", alt: "linkedin" },
+ ];
+
return (
-
-
-
-
-
+