https://github.com/darkshadowcoder/3d_nextjs_portfolio
https://github.com/darkshadowcoder/3d_nextjs_portfolio
Last synced: 7 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/darkshadowcoder/3d_nextjs_portfolio
- Owner: DarkShadowCoder
- License: mit
- Created: 2024-10-30T02:23:57.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-01-30T17:36:16.000Z (about 1 year ago)
- Last Synced: 2025-03-12T14:16:09.432Z (about 1 year ago)
- Language: TypeScript
- Size: 18.2 MB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
My Portfolio Created using NextJs , FramerMotion and ThreeJS
A Modern Next.js Portfolio
## π Table of Contents
1. π€ [Introduction](#introduction)
2. βοΈ [Tech Stack](#tech-stack)
3. π [Features](#features)
4. π€Έ [Quick Start](#quick-start)
5. πΈοΈ [Code to Copy](#snippets)
6. π [Assets](#links)
Built with Next.js for handling the user interface, Three.js for rendering 3D elements, Framer motion for beautiful animations, and styled with TailwindCSS, this portfolio demonstrates the developer's skills in a unique manner that creates a lasting impact.
- Next.js
- Three.js
- Framer Motion
- Tailwind CSS
π **Hero**: Captivating introduction featuring a spotlight effect and dynamic background.
π **Bento Grid**: Modern layout presenting personal information using cutting-edge CSS design techniques.
π **3D Elements**: Interactive 3D design elements, such as a GitHub-style globe and card hover effects, adding depth and engagement.
π **Testimonials**: Dynamic testimonials area with scrolling or animated content for enhanced engagement.
π **Work Experience**: Prominent display of professional background for emphasis and credibility.
π **Canvas Effect**: Innovative use of HTML5 canvas to create visually striking effects in the "approaches" section.
π **Responsiveness**: Seamless adaptability across all devices, ensuring optimal viewing experience for every user.
and many more, including code architecture and reusability
Follow these steps to set up the project locally on your machine.
**Prerequisites**
Make sure you have the following installed on your machine:
- [Git](https://git-scm.com/)
- [Node.js](https://nodejs.org/en)
- [npm](https://www.npmjs.com/) (Node Package Manager)
**Cloning the Repository**
```bash
git clone https://github.com/Yvanhajdin/portfolio.git
cd portfolio
```
**Installation**
Install the project dependencies using npm:
```bash
npm install
```
**Running the Project**
```bash
npm run dev
```
Open [http://localhost:3000](http://localhost:3000) in your browser to view the project.
data/index.ts
```typescript
export const navItems = [
{ name: "About", link: "#about" },
{ name: "Projects", link: "#projects" },
{ name: "Testimonials", link: "#testimonials" },
{ name: "Contact", link: "#contact" },
];
export const gridItems = [
{
id: 1,
title: "I prioritize client collaboration, fostering open communication ",
description: "",
className: "lg:col-span-3 md:col-span-6 md:row-span-4 lg:min-h-[60vh]",
imgClassName: "w-full h-full",
titleClassName: "justify-end",
img: "/b1.svg",
spareImg: "",
},
{
id: 2,
title: "I'm very flexible with time zone communications",
description: "",
className: "lg:col-span-2 md:col-span-3 md:row-span-2",
imgClassName: "",
titleClassName: "justify-start",
img: "",
spareImg: "",
},
{
id: 3,
title: "My tech stack",
description: "I constantly try to improve",
className: "lg:col-span-2 md:col-span-3 md:row-span-2",
imgClassName: "",
titleClassName: "justify-center",
img: "",
spareImg: "",
},
{
id: 4,
title: "Tech enthusiast with a passion for development.",
description: "",
className: "lg:col-span-2 md:col-span-3 md:row-span-1",
imgClassName: "",
titleClassName: "justify-start",
img: "/grid.svg",
spareImg: "/b4.svg",
},
{
id: 5,
title: "Currently building a JS Animation library",
description: "The Inside Scoop",
className: "md:col-span-3 md:row-span-2",
imgClassName: "absolute right-0 bottom-0 md:w-96 w-60",
titleClassName: "justify-center md:justify-start lg:justify-center",
img: "/b5.svg",
spareImg: "/grid.svg",
},
{
id: 6,
title: "Do you want to start a project together?",
description: "",
className: "lg:col-span-2 md:col-span-3 md:row-span-1",
imgClassName: "",
titleClassName: "justify-center md:max-w-full max-w-60 text-center",
img: "",
spareImg: "",
},
];
export const projects = [
{
id: 1,
title: "3D Solar System Planets to Explore",
des: "Explore the wonders of our solar system with this captivating 3D simulation of the planets using Three.js.",
img: "/p1.svg",
iconLists: ["/re.svg", "/tail.svg", "/ts.svg", "/three.svg", "/fm.svg"],
link: "https://github.com/Yvanhajdin?tab=repositories",
},
{
id: 2,
title: "Yoom - Video Conferencing App",
des: "Simplify your video conferencing experience with Yoom. Seamlessly connect with colleagues and friends.",
img: "/p2.svg",
iconLists: ["/next.svg", "/tail.svg", "/ts.svg", "/stream.svg", "/c.svg"],
link: "https://github.com/Yvanhajdin/zoom-clone",
},
{
id: 3,
title: "AI Image SaaS - Canva Application",
des: "A REAL Software-as-a-Service app with AI features and a payments and credits system using the latest tech stack.",
img: "/p3.svg",
iconLists: ["/re.svg", "/tail.svg", "/ts.svg", "/three.svg", "/c.svg"],
link: "https://github.com/Yvanhajdin/ai_saas_app",
},
{
id: 4,
title: "Animated Apple Iphone 3D Website",
des: "Recreated the Apple iPhone 15 Pro website, combining GSAP animations and Three.js 3D effects..",
img: "/p4.svg",
iconLists: ["/next.svg", "/tail.svg", "/ts.svg", "/three.svg", "/gsap.svg"],
link: "https://github.com/Yvanhajdin/iphone",
},
];
```
tailwind.config.ts
```ts
import type { Config } from "tailwindcss";
const svgToDataUri = require("mini-svg-data-uri");
const colors = require("tailwindcss/colors");
const {
default: flattenColorPalette,
} = require("tailwindcss/lib/util/flattenColorPalette");
const config = {
darkMode: ["class"],
content: [
"./pages/**/*.{ts,tsx}",
"./components/**/*.{ts,tsx}",
"./app/**/*.{ts,tsx}",
"./src/**/*.{ts,tsx}",
"./data/**/*.{ts,tsx}",
],
prefix: "",
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
colors: {
black: {
DEFAULT: "#000",
100: "#000319",
200: "rgba(17, 25, 40, 0.75)",
300: "rgba(255, 255, 255, 0.125)",
},
white: {
DEFAULT: "#FFF",
100: "#BEC1DD",
200: "#C1C2D3",
},
blue: {
"100": "#E4ECFF",
},
purple: "#CBACF9",
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
secondary: {
DEFAULT: "hsl(var(--secondary))",
foreground: "hsl(var(--secondary-foreground))",
},
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
},
popover: {
DEFAULT: "hsl(var(--popover))",
foreground: "hsl(var(--popover-foreground))",
},
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
keyframes: {
"accordion-down": {
from: { height: "0" },
to: { height: "var(--radix-accordion-content-height)" },
},
"accordion-up": {
from: { height: "var(--radix-accordion-content-height)" },
to: { height: "0" },
},
spotlight: {
"0%": {
opacity: "0",
transform: "translate(-72%, -62%) scale(0.5)",
},
"100%": {
opacity: "1",
transform: "translate(-50%,-40%) scale(1)",
},
},
shimmer: {
from: {
backgroundPosition: "0 0",
},
to: {
backgroundPosition: "-200% 0",
},
},
moveHorizontal: {
"0%": {
transform: "translateX(-50%) translateY(-10%)",
},
"50%": {
transform: "translateX(50%) translateY(10%)",
},
"100%": {
transform: "translateX(-50%) translateY(-10%)",
},
},
moveInCircle: {
"0%": {
transform: "rotate(0deg)",
},
"50%": {
transform: "rotate(180deg)",
},
"100%": {
transform: "rotate(360deg)",
},
},
moveVertical: {
"0%": {
transform: "translateY(-50%)",
},
"50%": {
transform: "translateY(50%)",
},
"100%": {
transform: "translateY(-50%)",
},
},
scroll: {
to: {
transform: "translate(calc(-50% - 0.5rem))",
},
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
spotlight: "spotlight 2s ease .75s 1 forwards",
shimmer: "shimmer 2s linear infinite",
first: "moveVertical 30s ease infinite",
second: "moveInCircle 20s reverse infinite",
third: "moveInCircle 40s linear infinite",
fourth: "moveHorizontal 40s ease infinite",
fifth: "moveInCircle 20s ease infinite",
scroll:
"scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite",
},
},
},
plugins: [
require("tailwindcss-animate"),
addVariablesForColors,
function ({ matchUtilities, theme }: any) {
matchUtilities(
{
"bg-grid": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
``
)}")`,
}),
"bg-grid-small": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
``
)}")`,
}),
"bg-dot": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
``
)}")`,
}),
},
{ values: flattenColorPalette(theme("backgroundColor")), type: "color" }
);
},
],
} satisfies Config;
function addVariablesForColors({ addBase, theme }: any) {
let allColors = flattenColorPalette(theme("colors"));
let newVars = Object.fromEntries(
Object.entries(allColors).map(([key, val]) => [`--${key}`, val])
);
addBase({
":root": newVars,
});
}
export default config;
```
globals.css
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 240 10% 3.9%;
--card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 240 5.9% 10%;
--primary-foreground: 0 0% 98%;
--secondary: 240 4.8% 95.9%;
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%;
--accent: 240 4.8% 95.9%;
--accent-foreground: 240 5.9% 10%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 240 5.9% 90%;
--input: 240 5.9% 90%;
--ring: 240 10% 3.9%;
--radius: 0.5rem;
}
.dark {
--background: 240 10% 3.9%;
--foreground: 0 0% 98%;
--card: 240 10% 3.9%;
--card-foreground: 0 0% 98%;
--popover: 240 10% 3.9%;
--popover-foreground: 0 0% 98%;
--primary: 0 0% 98%;
--primary-foreground: 240 5.9% 10%;
--secondary: 240 3.7% 15.9%;
--secondary-foreground: 0 0% 98%;
--muted: 240 3.7% 15.9%;
--muted-foreground: 240 5% 64.9%;
--accent: 240 3.7% 15.9%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%;
--border: 240 3.7% 15.9%;
--input: 240 3.7% 15.9%;
--ring: 240 4.9% 83.9%;
}
}
@layer base {
* {
@apply border-border !scroll-smooth;
}
body {
@apply bg-background text-foreground;
}
button {
@apply active:outline-none;
}
}
@layer utilities {
.heading {
@apply font-bold text-4xl md:text-5xl text-center;
}
.black-gradient {
background: linear-gradient(90deg, #161a31 0%, #06091f 100%);
}
}
```