adrianhajdin/portfolio
adrianhajdin/portfolio hiện có 3.7k sao trên GitHub, viết chủ yếu bằng TypeScript. Modern & Minimal JS Mastery Portfolio
Tóm tắt dựng từ metadata GitHub của chính dự án — chưa có bài review TopGit. Trang sẽ tự động cập nhật khi bài review đầy đủ được xuất bản.
TopGit viết bài đầy đủ cho repo có nhiều sao nhất và được yêu cầu nhiều nhất. Trang này là snapshot trong thời gian chờ — xem README gốc ở tab READ ME.
Snapshot
Cộng tác viên hàng đầu
Xem cộng tác viên hàng đầu
A Modern Next.js Portfolio
📋 Table of Contents
- 🤖 Introduction
- ⚙️ Tech Stack
- 🔋 Features
- 🤸 Quick Start
- 🕸️ Code to Copy
- 🔗 Assets
- 🚀 More
🚨 Tutorial
This repository contains the code corresponding to an in-depth tutorial available on our YouTube channel, JavaScript Mastery.
If you prefer visual learning, this is the perfect resource for you. Follow our tutorial to learn how to build projects like these step-by-step in a beginner-friendly manner!
🤖 Introduction
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.
If you're getting started and need assistance or face any bugs, join our active Discord community with over 34k+ members. It's a place where people help each other out.
⚙️ Tech Stack
- Next.js
- Three.js
- Framer Motion
- Tailwind CSS
🔋 Features
👉 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
🤸 Quick Start
Follow these steps to set up the project locally on your machine.
Prerequisites
Make sure you have the following installed on your machine:
- Git
- Node.js
- npm (Node Package Manager)
Cloning the Repository
git clone https://github.com/adrianhajdin/portfolio.git
cd portfolio
Installation
Install the project dependencies using npm:
npm install
Running the Project
npm run dev
Open http://localhost:3000 in your browser to view the project.
🕸️ Snippets
data/index.ts
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/adrianhajdin?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/adrianhajdin/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/adrianhajdin/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/adrianhajdin/iphone",
},
];
export const testimonials = [
{
quote:
"Collaborating with Adrian was an absolute pleasure. His professionalism, promptness, and dedication to delivering exceptional results were evident throughout our project. Adrian's enthusiasm for every facet of development truly stands out. If you're seeking to elevate your website and elevate your brand, Adrian is the ideal partner.",
name: "Michael Johnson",
title: "Director of AlphaStream Technologies",
},
{
quote:
"Collaborating with Adrian was an absolute pleasure. His professionalism, promptness, and dedication to delivering exceptional results were evident throughout our project. Adrian's enthusiasm for every facet of development truly stands out. If you're seeking to elevate your website and elevate your brand, Adrian is the ideal partner.",
name: "Michael Johnson",
title: "Director of AlphaStream Technologies",
},
{
quote:
"Collaborating with Adrian was an absolute pleasure. His professionalism, promptness, and dedication to delivering exceptional results were evident throughout our project. Adrian's enthusiasm for every facet of development truly stands out. If you're seeking to elevate your website and elevate your brand, Adrian is the ideal partner.",
name: "Michael Johnson",
title: "Director of AlphaStream Technologies",
},
{
quote:
"Collaborating with Adrian was an absolute pleasure. His professionalism, promptness, and dedication to delivering exceptional results were evident throughout our project. Adrian's enthusiasm for every facet of development truly stands out. If you're seeking to elevate your website and elevate your brand, Adrian is the ideal partner.",
name: "Michael Johnson",
title: "Director of AlphaStream Technologies",
},
{
quote:
"Collaborating with Adrian was an absolute pleasure. His professionalism, promptness, and dedication to delivering exceptional results were evident throughout our project. Adrian's enthusiasm for every facet of development truly stands out. If you're seeking to elevate your website and elevate your brand, Adrian is the ideal partner.",
name: "Michael Johnson",
title: "Director of AlphaStream Technologies",
},
];
export const companies = [
{
id: 1,
name: "cloudinary",
img: "/cloud.svg",
nameImg: "/cloudName.svg",
},
{
id: 2,
name: "appwrite",
img: "/app.svg",
nameImg: "/appName.svg",
},
{
id: 3,
name: "HOSTINGER",
img: "/host.svg",
nameImg: "/hostName.svg",
},
{
id: 4,
name: "stream",
img: "/s.svg",
nameImg: "/streamName.svg",
},
{
id: 5,
name: "docker.",
img: "/dock.svg",
nameImg: "/dockerName.svg",
},
];
export const workExperience = [
{
id: 1,
title: "Frontend Engineer Intern",
desc: "Assisted in the development of a web-based platform using React.js, enhancing interactivity.",
className: "md:col-span-2",
thumbnail: "/exp1.svg",
},
{
id: 2,
title: "Mobile App Dev - JSM Tech",
desc: "Designed and developed mobile app for both iOS & Android platforms using React Native.",
className: "md:col-span-2", // change to md:col-span-2
thumbnail: "/exp2.svg",
},
{
id: 3,
title: "Freelance App Dev Project",
desc: "Led the dev of a mobile app for a client, from initial concept to deployment on app stores.",
className: "md:col-span-2", // change to md:col-span-2
thumbnail: "/exp3.svg",
},
{
id: 4,
title: "Lead Frontend Developer",
desc: "Developed and maintained user-facing features using modern frontend technologies.",
className: "md:col-span-2",
thumbnail: "/exp4.svg",
},
];
export const socialMedia = [
{
id: 1,
img: "/git.svg",
},
{
id: 2,
img: "/twit.svg",
},
{
id: 3,
img: "/link.svg",
},
];
tailwind.config.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(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="100" height="100" fill="none" stroke="${value}"><path d="M0 .5H31.5V32"/></svg>`
)}")`,
}),
"bg-grid-small": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="8" height="8" fill="none" stroke="${value}"><path d="M0 .5H31.5V32"/></svg>`
)}")`,
}),
"bg-dot": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="16" height="16" fill="none"><circle fill="${value}" id="pattern-circle" cx="10" cy="10" r="1.6257413380501518"></circle></svg>`
)}")`,
}),
},
{ 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
@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%);
}
}
Linear Gradient
style={{
// add these two
// you can generate the color from here https://cssgradient.io/
background: "rgb(4,7,29)",
backgroundColor:
"linear-gradient(90deg, rgba(4,7,29,1) 0%, rgba(12,14,35,1) 100%)",
}}
🔗 Assets
Assets used in the project can be found here
🚀 More
Advance your skills with Next.js Pro Course
Enjoyed creating this project? Dive deeper into our PRO courses for a richer learning experience. They're packed with detailed explanations, cool features, and exercises to boost your skills. Give it a go!
Repo liên quan
Next.js is a React framework from Vercel for building full-stack web applications, with file-based routing, server rendering, and static generation built in. Instead of wiring a router, bundler, and rendering strategy onto plain React yourself, you get those decisions made for you and pick a rendering mode per route.
Master programming by recreating your favorite technologies from scratch.
freeCodeCamp is a free, self-paced curriculum for learning to code, published as open source at freeCodeCamp/freeCodeCamp. It's a 501(c)(3) nonprofit funded by donor support, structured around six certifications in its Full-Stack Developer Curriculum, each gated by required projects instead of open-book quizzes. The repository also carries beta language certifications for developers, interview-prep resources, and the code that runs the live freecodecamp.org platform.
Hermes Agent (NousResearch/hermes-agent) is an open-source, self-improving AI agent from Nous Research, written in Python and released under the MIT license. It has 229,888 stars and 45,421 forks on GitHub. The README describes a closed learning loop, a terminal UI, and a messaging gateway spanning Telegram, Discord, Slack, WhatsApp, and Signal, plus support for running the agent on a VPS, a GPU cluster, or serverless infrastructure.
Trả lời nhanh
adrianhajdin/portfolio có bao nhiêu sao?
adrianhajdin/portfolio có 3.7k sao GitHub — tải lại trang để xem số mới nhất, hoặc xem trực tiếp github.com/adrianhajdin/portfolio. TopGit phản chiếu số sao của GitHub nhưng không cam kết đến từng phút.
adrianhajdin/portfolio có những chủ đề gì?
GitHub topics của adrianhajdin/portfolio: "aceternity", "nextjs". TopGit xếp repo vào nhóm Frontend.
adrianhajdin/portfolio còn đang phát triển không?
Commit gần nhất trên adrianhajdin/portfolio là 1.8 năm trước (theo timestamp GitHub). Repo có 801 fork — một chỉ báo về mức độ quan tâm của cộng đồng.
adrianhajdin/portfolio là gì?
adrianhajdin/portfolio (adrianhajdin/portfolio) là dự án TypeScript trên GitHub. Theo mô tả gốc: Modern & Minimal JS Mastery Portfolio
adrianhajdin/portfolio so với các dự án Frontend khác thế nào?
adrianhajdin/portfolio được TopGit xếp vào nhóm Frontend, với 3.7k sao GitHub và viết bằng TypeScript. Xem trang chủ đề Frontend trên TopGit để so sánh với các dự án tương tự theo số sao và mức độ hoạt động.
adrianhajdin/portfolio viết bằng ngôn ngữ gì?
adrianhajdin/portfolio chủ yếu viết bằng TypeScript. Trường "language" của GitHub dựa trên phần lớn byte ở nhánh mặc định.
Vì sao adrianhajdin/portfolio được xếp vào nhóm Frontend?
TopGit xếp adrianhajdin/portfolio vào nhóm Frontend dựa trên GitHub topics và mô tả của repo (gắn thẻ: "aceternity", "nextjs"). Việc phân loại dựa trên metadata thật của repo, không phải đoán theo cảm tính biên tập.
Đọc đầy đủ README ở tab phía trên.
Chưa chắc portfolio có hợp với bạn?
Để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm bên dưới và xem AI nói gì về portfolio.