This is a portfolio project built using React and TailwindCSS. The project showcases various sections including a hero section, skills, about, and projects. It is designed to be responsive and visually appealing.
Online Live: https://webdev-portfolio-arnob.netlify.app/
Follow these steps to set up the project with Vite and TailwindCSS.
Setup Vite Project
Follow the Tailwind Docs for detailed instructions.
npm create vite@latest my-project -- --template react
cd my-project
Add TailwindCSS
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
Configure TailwindCSS
Rename tailwind.config.js
to tailwind.config.cjs and add the following content:
/** @type {import('tailwindcss').Config} */
export default {
content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
theme: {
extend: {},
},
plugins: [],
};
Remove Unnecessary Files
App.css
Add Tailwind Directives
Add the Tailwind directives to your CSS in index.css:
@tailwind base;
@tailwind components;
@tailwind utilities;
Start the Project
npm run dev
The project structure is as follows:
.gitignore
index.html
package.json
postcss.config.js
public/
vite.svg
README.md
src/
App.jsx
assets/
about.svg
hero.svg
react.svg
components/
About.jsx
Hero.jsx
Navbar.jsx
Projects.jsx
ProjectsCard.jsx
SectionTitle.jsx
Skills.jsx
SkillsCard.jsx
data.jsx
index.css
main.jsx
tailwind.config.cjs
vite.config.js
The Navbar component displays the navigation links.
import { links } from "../data";
const Navbar = () => {
return (
<nav className="bg-emerald-100">
<div className="align-element py-4 flex flex-col sm:flex-row sm:gap-x-16 sm:items-center sm:py-8">
<h2 className="text-3xl font-bold">
Web<span className="text-emerald-600">Dev</span>
</h2>
<div className="flex gap-x-3">
{links.map((link) => {
const { id, href, text } = link;
return (
<a
key={id}
href={href}
className="capitalize text-lg tracking-wide hover:text-emerald-600 duration-300"
>
{text}
</a>
);
})}
</div>
</div>
</nav>
);
};
export default Navbar;
The Hero component displays the main introduction section.
import heroImg from "../assets/hero.svg";
import { FaGithubSquare, FaLinkedin, FaTwitterSquare } from "react-icons/fa";
const Hero = () => {
return (
<div className="bg-emerald-100 py-24">
<div className="align-element grid md:grid-cols-2 items-center gap-8">
<article>
<h1 className="text-7xl font-bold tracking-wider">I'm Arnob</h1>
<p className="mt-4 text-3xl text-slate-700 capitalize tracking-wide">
Front-End Developer
</p>
<p className="mt-2 text-lg text-slate-700 capitalize tracking-wide">
turning ideas into interactive reality
</p>
<div className="flex gap-x-4 mt-4">
<a href="#">
<FaGithubSquare className="h-8 w-8 text-slate-500 hover:text-black duration-300" />
</a>
<a href="#">
<FaLinkedin className="h-8 w-8 text-slate-500 hover:text-black duration-300" />
</a>
<a href="#">
<FaTwitterSquare className="h-8 w-8 text-slate-500 hover:text-black duration-300" />
</a>
</div>
</article>
<article className="hidden md:block">
<img src={heroImg} className="h-80 lg:h-96" />
</article>
</div>
</div>
);
};
export default Hero;
The Skills component displays the list of skills.
import { skills } from "../data";
import SectionTitle from "./SectionTitle";
import SkillsCard from "./SkillsCard";
const Skills = () => {
return (
<section className="py-20 align-element" id="skills">
<SectionTitle text="tech stack" />
<div className="py-16 grid gap-8 md:grid-cols-2 lg:grid-cols-3">
{skills.map((skill) => {
return <SkillsCard key={skill.id} {...skill} />;
})}
</div>
</section>
);
};
export default Skills;
The About component displays information about the developer.
import aboutSvg from "../assets/about.svg";
import SectionTitle from "./SectionTitle";
const About = () => {
return (
<section className="bg-white py-20" id="about">
<div className="align-element grid md:grid-cols-2 items-center gap-16">
<img src={aboutSvg} className="w-full h-64" />
<article>
<SectionTitle text="code and coffee" />
<p className="text-slate-600 mt-8 leading-loose">
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Sint
maiores itaque doloribus asperiores dolorum quas voluptates
distinctio, porro beatae quam provident libero animi totam,
praesentium voluptatem corrupti dignissimos ipsum accusantium!
</p>
</article>
</div>
</section>
);
};
export default About;
The Projects component displays the list of projects.
import ProjectsCard from "./ProjectsCard";
import { projects } from "../data";
import SectionTitle from "./SectionTitle";
const Projects = () => {
return (
<section className="py-20 align-element" id="projects">
<SectionTitle text="web creations" />
<div className="py-16 grid lg:grid-cols-2 xl:grid-cols-3 gap-8">
{projects.map((project) => {
return <ProjectsCard key={project.id} {...project} />;
})}
</div>
</section>
);
};
export default Projects;
The data for the links, skills, and projects is stored in data.jsx.
import { nanoid } from "nanoid";
import { FaHtml5, FaJs, FaReact } from "react-icons/fa";
export const links = [
{ id: nanoid(), href: "#home", text: "home" },
{ id: nanoid(), href: "#skills", text: "skills" },
{ id: nanoid(), href: "#about", text: "about" },
{ id: nanoid(), href: "#projects", text: "projects" },
];
export const skills = [
{
id: nanoid(),
title: "HTML&CSS",
icon: <FaHtml5 className="h-16 w-16 text-emerald-500" />,
text: "Highly skilled in HTML & CSS, adeptly crafting visually appealing and responsive websites for optimal user experiences.",
},
{
id: nanoid(),
title: "Javascript",
icon: <FaJs className="h-16 w-16 text-emerald-500" />,
text: "Expertise in JavaScript, building interactive and dynamic web applications with a focus on seamless user interactions and functionality",
},
{
id: nanoid(),
title: "React",
icon: <FaReact className="h-16 w-16 text-emerald-500" />,
text: "Advanced proficiency in React, developing efficient and interactive front-end applications with a strong emphasis on component-based architecture.",
},
];
export const projects = [
{
id: nanoid(),
img: "https://images.pexels.com/photos/326503/pexels-photo-326503.jpeg?auto=compress&cs=tinysrgb&w=800",
url: "https://react-projects.netlify.app/",
github: "https://github.com/john-smilga",
title: "first project",
text: "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores aperiam porro impedit tenetur quo hic omnis doloribus dolores enim deleniti.",
},
{
id: nanoid(),
img: "https://images.pexels.com/photos/2148222/pexels-photo-2148222.jpeg?auto=compress&cs=tinysrgb&w=800",
url: "https://react-projects.netlify.app/",
github: "https://github.com/john-smilga",
title: "second project",
text: "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores aperiam porro impedit tenetur quo hic omnis doloribus dolores enim deleniti.",
},
{
id: nanoid(),
img: "https://images.pexels.com/photos/12883026/pexels-photo-12883026.jpeg?auto=compress&cs=tinysrgb&w=800",
url: "https://react-projects.netlify.app/",
github: "https://github.com/john-smilga",
title: "third project",
text: "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores aperiam porro impedit tenetur quo hic omnis doloribus dolores enim deleniti.",
},
];
The project uses the following additional libraries:
nanoid
for generating unique IDs.react-icons
for using icons in the project.Install these libraries using the following command:
npm i nanoid react-icons
The assets used in this project are from Undraw.