diff --git a/next.config.ts b/next.config.ts
index 13db92c..81c097a 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -27,6 +27,12 @@ const nextConfig: NextConfig = {
port: "",
pathname: "/**"
},
+ {
+ protocol: "http",
+ hostname: "localhost",
+ port: "3001",
+ pathname: "/**"
+ }
]
},
};
diff --git a/public/assets/avatars/profile.JPG b/public/assets/avatars/profile.JPG
new file mode 100644
index 0000000..64ec9a8
Binary files /dev/null and b/public/assets/avatars/profile.JPG differ
diff --git a/public/assets/avatars/profile.webp b/public/assets/avatars/profile.webp
new file mode 100644
index 0000000..a31ff4d
Binary files /dev/null and b/public/assets/avatars/profile.webp differ
diff --git a/src/app/(web)/(home)/page.tsx b/src/app/(web)/(home)/page.tsx
index b9184f3..245e37e 100644
--- a/src/app/(web)/(home)/page.tsx
+++ b/src/app/(web)/(home)/page.tsx
@@ -5,6 +5,7 @@ import { metadata as meta } from './data/meta';
import { AboutTimeline } from './sections/timeline';
import { Footer } from '@/components/ui/footer';
import { AboutMeSection } from './sections/home-aboutme';
+import { ContactBar } from './sections/contact-bar';
export const metadata: Metadata = meta
@@ -19,7 +20,6 @@ export default function HomePage() {
-
>
);
diff --git a/src/app/(web)/(home)/sections/contact-bar.tsx b/src/app/(web)/(home)/sections/contact-bar.tsx
new file mode 100644
index 0000000..d71ee2a
--- /dev/null
+++ b/src/app/(web)/(home)/sections/contact-bar.tsx
@@ -0,0 +1,34 @@
+"use client";
+import { FacebookIcon } from '@/components/icons/facebook';
+import { FigmaIcon } from '@/components/icons/figma';
+import { GitHubIcon } from '@/components/icons/github';
+import { motion } from 'framer-motion';
+import Link from 'next/link';
+
+export const ContactBar = () => {
+
+ const headlineVariants = {
+ hidden: { opacity: 0, y: -10 },
+ visible: { opacity: 1, y: 0, transition: { duration: 0.4, delay: 0.3 } }
+ };
+
+ return (
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/(web)/(home)/sections/hero-section.tsx b/src/app/(web)/(home)/sections/hero-section.tsx
index 4e1b041..35b5345 100644
--- a/src/app/(web)/(home)/sections/hero-section.tsx
+++ b/src/app/(web)/(home)/sections/hero-section.tsx
@@ -1,13 +1,11 @@
"use client";
import React, { useEffect, useRef, useState, useCallback, forwardRef, useImperativeHandle, useMemo, } from 'react';
-import { Announcing } from '@/app/(web)/(home)/sections/announcing';
import { motion, AnimatePresence, useScroll, useMotionValueEvent, type Transition, type VariantLabels, type TargetAndTransition, type Variants, } from 'framer-motion';
import { Profile } from '@/app/(web)/(home)/sections/profile';
-import { MagneticArea } from '@/components/magnetic-aria';
import { cn } from '@/lib/utils';
-import Image from 'next/image';
import { ThemeToggle } from '@/components/ui/theme-switch';
import TechStack from '@/components/tech-stack';
+import { ContactBar } from './contact-bar';
interface RotatingTextRef {
next: () => void;
@@ -445,6 +443,7 @@ const HomeHeroSection: React.FC = () => {
<>
+
{/*
*/}
@@ -536,9 +535,9 @@ const HomeHeroSection: React.FC = () => {
-
+
diff --git a/src/app/(web)/(home)/sections/profile.tsx b/src/app/(web)/(home)/sections/profile.tsx
index 45559a1..cfb21f8 100644
--- a/src/app/(web)/(home)/sections/profile.tsx
+++ b/src/app/(web)/(home)/sections/profile.tsx
@@ -1,41 +1,42 @@
"use client";
import { motion, type Variants } from 'framer-motion';
-import { useCallback } from 'react';
import { RainbowGlow } from './rainbow-glow';
+import Image from 'next/image';
export const Profile = () => {
- const loadImage = (src: string): Promise
=> new Promise(resolve => {
- const img = new Image();
- img.onload = () => resolve(img);
- img.src = src;
- });
+ // const loadImage = (src: string): Promise => new Promise(resolve => {
+ // const img = new Image();
+ // img.onload = () => resolve(img);
+ // img.src = src;
+ // });
- const renderCanvas = useCallback((canvas: HTMLCanvasElement | null): void => {
- if (!canvas) return;
+ // const renderCanvas = useCallback((canvas: HTMLCanvasElement | null): void => {
+ // if (!canvas) return;
- const ctx = canvas.getContext('2d');
- if (!ctx) return;
+ // const ctx = canvas.getContext('2d');
+ // if (!ctx) return;
- canvas.width = 500;
- canvas.height = 500;
+ // canvas.width = 500;
+ // canvas.height = 500;
- Promise.all([
- loadImage('/assets/gallery/WEBP/IMG_1915.webp'),
- loadImage('/assets/masks/mask.webp')
- ]).then(([img, mask]) => {
- const scale = Math.max(canvas.width / img.width, canvas.height / img.height);
- const x = (canvas.width - img.width * scale) / 2;
- const y = (canvas.height - img.height * scale) / 2;
+ // Promise.all([
+ // loadImage('/assets/avatars/profile.JPG'),
+ // // loadImage('/assets/gallery/WEBP/IMG_1915.webp'),
+ // loadImage('/assets/masks/mask.webp')
+ // ]).then(([img, mask]) => {
+ // const scale = Math.max(canvas.width / img.width, canvas.height / img.height);
+ // const x = (canvas.width - img.width * scale) / 2;
+ // const y = (canvas.height - img.height * scale) / 2;
- // Draw image with object-cover behavior
- ctx.drawImage(img, x, y, img.width * scale, img.height * scale);
+ // // Draw image with object-cover behavior
+ // ctx.drawImage(img, x, y, img.width * scale, img.height * scale);
- // Apply mask
- ctx.globalCompositeOperation = 'destination-in';
- ctx.drawImage(mask, 0, 0, 500, 500);
- });
- }, []);
+ // // Apply mask
+ // ctx.globalCompositeOperation = 'destination-in';
+ // ctx.drawImage(mask, 0, 0, 500, 500);
+ // });
+ // }, []);
const contentDelay = 0.3;
const bannerVariants: Variants = {
@@ -48,11 +49,9 @@ export const Profile = () => {
variants={bannerVariants}
initial="hidden"
animate="visible"
- className="max-w-sm w-full h-full relative max-sm:border inline-flex mt-2 items-center justify-center"
+ className="max-w-sm w-full h-full relative max-sm:border inline-flex items-center justify-center xl:p-7"
>
-
-
-
+
);
diff --git a/src/app/(web)/(home)/sections/projects.tsx b/src/app/(web)/(home)/sections/projects.tsx
index 7724086..1735e4e 100644
--- a/src/app/(web)/(home)/sections/projects.tsx
+++ b/src/app/(web)/(home)/sections/projects.tsx
@@ -4,12 +4,13 @@ import React from "react";
import ProjectCard from "@/components/ui/project-card";
import { motion } from 'framer-motion';
import { useProjects } from "@/hooks/projects";
+import { Badge } from "@/components/ui/badge";
const Projects: React.FC = () => {
const { projects, loading, error } = useProjects();
return (
-
+
{loading &&
Loading projects...
}
{error &&
Error: {error}
}
@@ -36,8 +37,7 @@ export const ProjectsSection = () => {
}}
initial="hidden"
animate="visible" className='mx-auto w-full'>
-
+
{
animate="visible"
className="w-full py-3 max-sm:px-0 px-4 mb-10 mx-auto text-start max-w-6xl z-50 font-sans">
+ Projects
Featured Projects
diff --git a/src/app/(web)/(home)/sections/timeline.tsx b/src/app/(web)/(home)/sections/timeline.tsx
index 03f6895..2ff228c 100644
--- a/src/app/(web)/(home)/sections/timeline.tsx
+++ b/src/app/(web)/(home)/sections/timeline.tsx
@@ -7,10 +7,11 @@ import { motion } from 'framer-motion';
import { cn } from "@/lib/utils";
import { NextJSIcon } from "@/components/icons/nextjs";
import { CompaniesProps } from "@/lib/interfaces/skills";
+import { Badge } from "@/components/ui/badge";
export const AboutTimeline = () => {
- const experiences: CompaniesProps[] = [
+ const experiences: CompaniesProps[] = [
{
title: "TURBOTECH CO., LTD",
logo: "assets/brands/org/turbotech.png",
@@ -78,7 +79,7 @@ export const AboutTimeline = () => {
{ title: "Sass", image: "assets/brands/language/sass.svg" },
{ title: "Bootstrap", image: "assets/brands/language/bootstrap.svg" },
{ title: "React", image: "assets/brands/language/react.svg" },
- { title: "Next.js", icon: },
+ { title: "Next.js", icon: },
{ title: "Nuxt.js", image: "assets/brands/language/nuxtjs.svg" },
{ title: "EJS", image: "assets/brands/language/ejs.svg" },
{ title: "PHP", image: "assets/brands/language/php.svg" },
@@ -116,6 +117,8 @@ export const AboutTimeline = () => {
className='z-50 relative max-sm:py-0 bg-gradient-to-b from-background to-transparent backdrop-blur-[2px] w-full py-10'>
+
+
Experience
Work Experience
diff --git a/src/app/globals.css b/src/app/globals.css
index 8eb003c..d825619 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -156,10 +156,10 @@
}
.dark {
- --background: 0 0% 6%;
+ --background: 0 0% 5%;
--foreground: 0 0% 95%;
- --card: 240 10% 3.9%;
+ --card: 0 0% 10%;
--card-foreground: 0 0% 98%;
--popover: 240 10% 3.9%;
--popover-foreground: 0 0% 98%;
diff --git a/src/components/ui/avatar-circles.tsx b/src/components/ui/avatar-circles.tsx
index 6263d11..d2efce2 100644
--- a/src/components/ui/avatar-circles.tsx
+++ b/src/components/ui/avatar-circles.tsx
@@ -36,6 +36,7 @@ const AvatarCircles: React.FC
= ({
className="rounded-full object-cover max-sm:rounded-none border-2 border-foreground/10"
src={url.imageUrl}
fill
+ sizes="40px"
alt={`Avatar ${url?.title ?? ''} ?? ""`}
/>
diff --git a/src/components/ui/project-card.tsx b/src/components/ui/project-card.tsx
index 45e621c..78e199a 100644
--- a/src/components/ui/project-card.tsx
+++ b/src/components/ui/project-card.tsx
@@ -19,7 +19,7 @@ const ProjectCard: React.FC<{ project: Project, className?: string }> = ({ proje
return (