diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..7ca7731 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,26 @@ +# Development Guide + +## Commands +- **Start dev server**: `npm run dev` +- **Build for production**: `npm run build` +- **Lint code**: `npm run lint` +- **Preview production build**: `npm run preview` + +## Code Style Guidelines +- **React Components**: Use functional components with hooks +- **Imports**: Group imports by: React/libraries, components, styles/assets +- **Formatting**: Use 2-space indentation, semicolons, single quotes +- **Naming**: + - Components: PascalCase (e.g., `Header.jsx`) + - Functions/variables: camelCase + - Files: Component files use .jsx extension +- **CSS**: Use Tailwind utility classes with component-specific CSS when needed +- **Error Handling**: Use try/catch blocks and provide user-friendly error messages +- **Props**: Use destructuring for component props +- **State Management**: Use React hooks (useState, useEffect) for component state + +## Tech Stack +- React 18 w/ functional components +- React Router for navigation +- Tailwind CSS for styling +- Vite for build tool \ No newline at end of file diff --git a/src/components/About.jsx b/src/components/About.jsx index 7e30865..27dda44 100644 --- a/src/components/About.jsx +++ b/src/components/About.jsx @@ -1,12 +1,168 @@ -const About = () => ( -
-

- About Us -

-

- Do Tech Bro is dedicated to helping minorities, mainly African Americans, pivot into the tech field. -

-
-); +import React from 'react'; +import { Link } from 'react-router-dom'; + +const About = () => { + return ( +
+ {/* Hero Section */} +
+
+
+

Our Mission

+

+ DoTechBro is dedicated to empowering minorities, particularly African Americans, to + successfully transition into the tech industry and thrive in their careers. +

+
+
+
+ + {/* Vision Section */} +
+
+
+
+

Our Vision

+

+ We envision a tech industry that reflects the diversity of our society, where + minorities have equal opportunities to innovate, lead, and succeed. Our goal is to + bridge the gap by providing targeted resources, mentorship, and community support. +

+

+ By creating comprehensive roadmaps, curating high-quality learning materials, and + fostering a supportive community, we aim to give underrepresented individuals the + confidence and skills needed to thrive in technology careers. +

+
+
+

Why We Started

+

+ The tech industry has a well-documented diversity problem. Despite making up 13.4% of the + U.S. population, Black Americans represent only about 7% of the computing workforce. + We believe this isn't due to lack of talent or interest, but rather barriers to entry and lack of tailored resources. +

+

+ DoTechBro was created to address these challenges head-on by providing clear pathways + into tech that acknowledge and overcome the unique obstacles minorities face. +

+
+
+
+
+ + {/* What We Do Section */} +
+
+

What We Do

+ +
+
+
+ + + +
+

Career Roadmaps

+

+ We create tailored roadmaps for various tech career paths, breaking down complex journeys into manageable steps with + clear guidance and resources for each stage. +

+
+ +
+
+ + + +
+

Resource Curation

+

+ We curate high-quality learning resources, from tutorials to practice projects, saving you time and helping you + focus on what actually works to build your skills. +

+
+ +
+
+ + + +
+

Community Building

+

+ We're building a supportive community where you can connect with others on similar journeys, + share experiences, and get guidance from those who've succeeded. +

+
+
+
+
+ + {/* Values */} +
+
+

Our Values

+

+ These core principles guide everything we do at DoTechBro and shape how we serve our community. +

+ +
+
+

Accessibility

+

+ We believe tech education should be accessible to everyone, regardless of background or prior experience. +

+
+ +
+

Authenticity

+

+ We keep it real about the challenges of breaking into tech while providing actionable solutions. +

+
+ +
+

Community

+

+ We believe in the power of community to overcome obstacles and accelerate growth. +

+
+ +
+

Excellence

+

+ We're committed to providing high-quality resources that actually prepare you for success in the industry. +

+
+
+
+
+ + {/* Call to Action */} +
+
+

Ready to Start Your Tech Journey?

+

+ Join our community today and take the first step toward your career in tech. +

+
+ + Explore Roadmaps + + + Join Our Community + +
+
+
+
+ ); +}; export default About; \ No newline at end of file diff --git a/src/components/Accordion.jsx b/src/components/Accordion.jsx index 8a24fe6..b3a43bc 100644 --- a/src/components/Accordion.jsx +++ b/src/components/Accordion.jsx @@ -1,34 +1,75 @@ import React, { useState } from 'react'; const Accordion = ({ items }) => { - const [openIndex, setOpenIndex] = useState(null); + const [openIndex, setOpenIndex] = useState(0); // Start with first item open - const toggleItem = (index) => { - setOpenIndex(openIndex === index ? null : index); - }; + const toggleItem = (index) => { + setOpenIndex(openIndex === index ? null : index); + }; - return ( -
-

Conquering Challenges: Practical Tips for Diverse Talent

- {items.map((item, index) => ( -
- - {openIndex === index && ( -
-

{item.content}

-

Solution:

-

{item.solution}

-
- )} + return ( +
+ {items.map((item, index) => ( +
+ + +
+
+

{item.content}

+ +
+

Our Solution:

+

{item.solution}

+
+ + {item.resources && ( +
+

Helpful Resources:

+
- ))} + )} +
+
- ); + ))} +
+ ); }; export default Accordion; \ No newline at end of file diff --git a/src/components/FeaturedRoadmaps.jsx b/src/components/FeaturedRoadmaps.jsx index ecab9c4..55e105f 100644 --- a/src/components/FeaturedRoadmaps.jsx +++ b/src/components/FeaturedRoadmaps.jsx @@ -3,24 +3,75 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faServer, faProjectDiagram, faCode } from '@fortawesome/free-solid-svg-icons'; const icons = { - "devops-sre": faServer, - "non-technical-tech": faProjectDiagram, - "development": faCode + "devops-sre": faServer, + "non-technical-tech": faProjectDiagram, + "development": faCode }; const FeaturedRoadmaps = ({ roadmaps }) => ( -
-

Featured Roadmaps

-
- {roadmaps.map((roadmap, index) => ( - - -

{roadmap.title}

-

{roadmap.description}

- - ))} -
+
+
+

Featured Roadmaps

+

+ Choose your tech path and follow our step-by-step guidance to build your career +

+ +
+ {roadmaps.map((roadmap, index) => ( + +
+
+
+ +
+

{roadmap.title}

+

{roadmap.description}

+
+ + Explore roadmap + + + + +
+
+
+
+
+ {['Beginner', 'Intermediate', 'Advanced'].map((level, i) => ( + + {level} + + ))} +
+
+ + ))} +
+ +
+ + View All Roadmaps + + + + +
+
); export default FeaturedRoadmaps; \ No newline at end of file diff --git a/src/components/Footer.jsx b/src/components/Footer.jsx index 866072f..ebe25cd 100644 --- a/src/components/Footer.jsx +++ b/src/components/Footer.jsx @@ -1,10 +1,95 @@ // src/components/Footer.jsx import React from 'react'; +import { Link } from 'react-router-dom'; -const Footer = () => ( -
-

© {new Date().getFullYear()} Do Tech Bro. All rights reserved.

-
-); +const Footer = () => { + const currentYear = new Date().getFullYear(); + + return ( +
+
+
+ {/* Logo and About */} +
+ + DoTechBro.org + +

+ Empowering minorities to succeed in tech through community support and targeted resources. +

+
+ + {/* Quick Links */} +
+

Quick Links

+
    +
  • + Home +
  • +
  • + About +
  • +
  • + Roadmaps +
  • +
+
+ + {/* Roadmaps */} +
+

Popular Roadmaps

+
    +
  • + Web Development +
  • +
  • + Data Science +
  • +
  • + UI/UX Design +
  • +
+
+ + {/* Get in Touch */} +
+

Get in Touch

+ +
+
+ +
+

+ © {currentYear} DoTechBro.org. All rights reserved. +

+
+
+
+ ); +}; export default Footer; \ No newline at end of file diff --git a/src/components/Header.css b/src/components/Header.css index 32725b0..6d923fc 100644 --- a/src/components/Header.css +++ b/src/components/Header.css @@ -1,50 +1,50 @@ - /* src/components/Header.css */ - .link-underline { - position: relative; - display: inline-block; +/* src/components/Header.css */ +.link-underline { + position: relative; + display: inline-block; + font-weight: 500; + padding: 0.25rem 0; +} + +.link-underline::after { + content: ''; + position: absolute; + width: 100%; + height: 2px; + bottom: 0; + left: 0; + background-color: var(--color-primary); + transform: scaleX(0); + transform-origin: bottom right; + transition: transform 0.3s ease; +} + +.link-underline:hover::after { + transform: scaleX(1); + transform-origin: bottom left; +} + +/* Animations */ +@keyframes dropdown { + from { + opacity: 0; + transform: translateY(-8px); } - - .link-underline::after { - content: ''; - position: absolute; - width: 100%; - height: 2px; - bottom: -2px; - left: 0; - background-color: #38a169; - /* Darker green color */ - transform: scaleX(0); - transform-origin: bottom right; - transition: transform 0.3s ease-out; + to { + opacity: 1; + transform: translateY(0); } +} - .link-underline:hover::after { - transform: scaleX(1); - transform-origin: bottom left; - } +.animate-dropdown { + animation: dropdown 0.3s ease; +} - /* Header.css */ - @keyframes dropdown { - from { - opacity: 0; - transform: translateY(-10px); - } +/* Responsive layout adjustments */ +.page-content { + transition: margin-top 0.3s ease; +} - to { - opacity: 1; - transform: translateY(0); - } - } - - .animate-dropdown { - animation: dropdown 0.5s ease-in-out; - } - - .page-content { - transition: margin-top 0.5s ease-in-out; - } - - .page-content.dropdown-active { - margin-top: 150px; - /* Adjust based on the height of the dropdown menu */ - } \ No newline at end of file +.page-content.dropdown-active { + margin-top: 12rem; +} \ No newline at end of file diff --git a/src/components/Header.jsx b/src/components/Header.jsx index fa1c240..fdc8aaf 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -7,31 +7,48 @@ const Header = ({ onMenuToggle }) => { const toggleMenu = () => { setIsOpen(!isOpen); - onMenuToggle(!isOpen); + if (onMenuToggle) onMenuToggle(!isOpen); }; return ( -
-
- DoTechBro.org +
+
+ + DoTechBro.org +
+
-
-
diff --git a/src/components/Home.css b/src/components/Home.css index d981a81..7251728 100644 --- a/src/components/Home.css +++ b/src/components/Home.css @@ -1,23 +1,60 @@ /* Home.css */ .page-content { - transition: margin-top 0.5s ease-in-out; + transition: margin-top 0.3s ease; } .page-content.dropdown-active { - margin-top: 150px; - /* Adjust based on the height of the dropdown menu */ + margin-top: 12rem; } @keyframes fadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } } .animate-fade-in { - animation: fadeIn 1s ease-in-out forwards; + animation: fadeIn 0.8s ease-out forwards; +} + +/* Gradient text effect for headings */ +.gradient-text { + background-clip: text; + -webkit-background-clip: text; + color: transparent; + background-image: linear-gradient(to right, var(--color-primary), var(--color-secondary)); +} + +/* Hover effects for cards */ +.feature-card { + transition: all 0.3s ease; +} + +.feature-card:hover { + transform: translateY(-5px); + box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3); +} + +/* Button hover effects */ +.hover-scale { + transition: transform 0.3s ease; +} + +.hover-scale:hover { + transform: scale(1.05); +} + +/* Image effects */ +.image-hover { + transition: all 0.5s ease; +} + +.image-hover:hover { + transform: rotate(2deg) scale(1.02); + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3); } \ No newline at end of file diff --git a/src/components/Home.jsx b/src/components/Home.jsx index f8de9ce..cd8040c 100644 --- a/src/components/Home.jsx +++ b/src/components/Home.jsx @@ -1,4 +1,5 @@ import React, { useState, useEffect, useRef } from "react"; +import { Link } from "react-router-dom"; import FeaturedRoadmaps from "./FeaturedRoadmaps"; import MailingListDialog from "./MailingListDialog"; import roadmaps from "../roadmaps.json"; @@ -50,74 +51,150 @@ const Home = () => { return (
-
-
(sectionsRef.current[0] = el)} - > -
-

- Pivot into tech. + {/* Hero Section */} +
(sectionsRef.current[0] = el)} + > +
+
+

+ Pivot into tech
- with a head start -

-

+ with a head start +

+

Empowering minorities to overcome barriers and succeed in the tech - industry with confidence. + industry with confidence and community support.

- +
+ + + Explore Roadmaps + +
Tech illustration
+ -
(sectionsRef.current[1] = el)} - > - + {/* Features Section */} +
(sectionsRef.current[1] = el)} + > +
+
+

Why Choose Our Roadmaps

+

+ Our carefully designed roadmaps will guide you through your tech journey with clear steps and resources. +

+
+ +
+
+
+ + + +
+

Curated Resources

+

+ Hand-picked learning resources tested and approved by industry professionals. +

+
+ +
+
+ + + +
+

Community Support

+

+ Join a community of like-minded individuals on similar journeys. +

+
+ +
+
+ + + +
+

Clear Progression

+

+ Step-by-step guidance from basics to advanced topics with practical challenges. +

+
+
+
-
(sectionsRef.current[2] = el)} - > -

Testimonials

-

Coming soon...

+ {/* Featured Roadmaps Section */} +
(sectionsRef.current[2] = el)} + > + +
+ + {/* Testimonials (Coming Soon) */} +
(sectionsRef.current[3] = el)} + > +
+

Success Stories

+
+

+ "Testimonials from our successful community members coming soon... Join us and become one of our success stories!" +

+
+ + Learn more about our mission → + +
+
+
-
(sectionsRef.current[3] = el)} - > -

Join Our Community

-

- Connect with like-minded individuals, share your journey, and get - support from our community. + {/* Call to Action */} +

(sectionsRef.current[4] = el)} + > +
+

Ready to Start Your Tech Journey?

+

+ Join our community today and get access to all our roadmaps, resources, and supportive network.

+
- -
+
); }; -export default Home; - +export default Home; \ No newline at end of file diff --git a/src/components/MailingListDialog.jsx b/src/components/MailingListDialog.jsx index b1340c8..73191a8 100644 --- a/src/components/MailingListDialog.jsx +++ b/src/components/MailingListDialog.jsx @@ -6,6 +6,50 @@ import DialogContentText from "@mui/material/DialogContentText"; import DialogTitle from "@mui/material/DialogTitle"; import Button from "@mui/material/Button"; import TextField from "@mui/material/TextField"; +import { createTheme, ThemeProvider } from '@mui/material/styles'; + +// Create a custom theme that matches our design system +const theme = createTheme({ + palette: { + primary: { + main: '#22c55e', // primary-600 color + }, + secondary: { + main: '#6366f1', // secondary-500 color + }, + background: { + default: '#0f172a', // dark-900 color + paper: '#1e293b', // dark-800 color + }, + text: { + primary: '#f8fafc', + secondary: '#94a3b8', + }, + }, + typography: { + fontFamily: 'Inter, system-ui, sans-serif', + }, + shape: { + borderRadius: 8, + }, + components: { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none', + fontWeight: 500, + }, + }, + }, + MuiDialog: { + styleOverrides: { + paper: { + borderRadius: 12, + }, + }, + }, + }, +}); const MailingListDialog = ({ open, onClose }) => { const [name, setName] = useState(""); @@ -18,6 +62,19 @@ const MailingListDialog = ({ open, onClose }) => { setError(""); setSuccess(""); + // Basic validation + if (!name.trim() || !email.trim()) { + setError("Please fill in all fields"); + return; + } + + // Email validation + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) { + setError("Please enter a valid email address"); + return; + } + const form = document.createElement("form"); form.action = "https://tech.us9.list-manage.com/subscribe/post"; form.method = "POST"; @@ -45,63 +102,141 @@ const MailingListDialog = ({ open, onClose }) => { setSuccess("Thank you for subscribing!"); setName(""); setEmail(""); - onClose(); + + // Close the dialog after a short delay to allow user to see the success message + setTimeout(() => { + onClose(); + }, 1500); }; return ( - - Join Our Mailing List - - - Stay updated with the latest news and updates from Do Tech Bro. - - setName(e.target.value)} - /> - setEmail(e.target.value)} - /> - - We promise not to sell your information or email you more than once or - twice a month. - - {error && ( - - {error} + + + + Join Our Community + + + + + Get exclusive access to roadmaps, resources, and updates to accelerate your tech journey. - )} - {success && ( - - {success} + + setName(e.target.value)} + sx={{ + mb: 2, + '& .MuiOutlinedInput-root': { + '& fieldset': { + borderColor: 'rgba(148, 163, 184, 0.2)', + }, + '&:hover fieldset': { + borderColor: 'primary.main', + }, + }, + '& .MuiInputLabel-root': { + color: 'text.secondary', + }, + '& .MuiInputBase-input': { + color: 'text.primary', + } + }} + /> + + setEmail(e.target.value)} + sx={{ + mb: 2, + '& .MuiOutlinedInput-root': { + '& fieldset': { + borderColor: 'rgba(148, 163, 184, 0.2)', + }, + '&:hover fieldset': { + borderColor: 'primary.main', + }, + }, + '& .MuiInputLabel-root': { + color: 'text.secondary', + }, + '& .MuiInputBase-input': { + color: 'text.primary', + } + }} + /> + + + We promise not to sell your information or email you more than once or + twice a month. - )} - - - - - - + + {error && ( + + {error} + + )} + + {success && ( + + {success} + + )} + + + + + + + + + ); }; -export default MailingListDialog; - +export default MailingListDialog; \ No newline at end of file diff --git a/src/components/NotFound.jsx b/src/components/NotFound.jsx index 0093105..79a7d3e 100644 --- a/src/components/NotFound.jsx +++ b/src/components/NotFound.jsx @@ -1,15 +1,47 @@ import { Link } from 'react-router-dom'; const NotFound = () => { - return ( -
-

404

-

Oops! The page you're looking for doesn't exist.

- - Go Back Home - + return ( +
+
+

404

+ +

Page Not Found

+ +

+ Oops! The page you're looking for doesn't exist or has been moved to a different location. +

+ +
+ + Return Home + + + + Explore Roadmaps +
- ); + +
+

+ Think this is a mistake? Let us know! +

+ + support@dotechbro.org + +
+
+
+ ); }; export default NotFound; \ No newline at end of file diff --git a/src/components/Roadmap.jsx b/src/components/Roadmap.jsx index 4d26941..73c9cdd 100644 --- a/src/components/Roadmap.jsx +++ b/src/components/Roadmap.jsx @@ -1,61 +1,145 @@ import { Outlet, useLocation, Link } from 'react-router-dom'; import challenges from '../challenges'; -import roadmaps from '../roadmaps.json'; // Import the roadmaps data -import Accordion from './Accordion'; // Import the Accordion component +import roadmaps from '../roadmaps.json'; +import Accordion from './Accordion'; const Roadmap = () => { - const location = useLocation(); - const isRootPath = location.pathname === '/roadmap'; + const location = useLocation(); + const isRootPath = location.pathname === '/roadmap'; - return ( -
-

- Roadmaps -

-

- Dive into our comprehensive roadmaps designed to illuminate your path into the tech industry. Each roadmap offers step-by-step guidance, tailored resources, and practical tips to help you navigate challenges and seize opportunities. Whether you’re just starting out or looking to advance your career, these roadmaps are your essential tools for success. Let’s chart your course together! -

+ return ( +
+ {isRootPath ? ( + <> + {/* Hero Section */} +
+
+
+

Tech Career Roadmaps

+

+ Structured pathways to help you navigate your journey into tech, with step-by-step guidance + and curated resources tailored for minorities entering the industry. +

+ +
+
+
- {isRootPath && ( - <> - + {/* Challenges Section */} +
+
+
+

Common Challenges

+

+ We understand the unique obstacles minorities face when entering tech. + Here's how our roadmaps address these challenges. +

+ +
+
+
-
-
-

Available Roadmaps

-
- {roadmaps.map((roadmap, index) => ( - -

{roadmap.title}

-

{roadmap.description}

- - ))} -
+ {/* Roadmaps Section */} +
+
+

Available Roadmaps

+

+ Select a roadmap that aligns with your interests and goals. Each provides a clear path + from beginner to professional. +

+ +
+ {roadmaps.map((roadmap, index) => ( + +
+
+

+ {roadmap.title} +

+

{roadmap.description}

+
+ {['Beginner-Friendly', 'Step-by-Step', 'Resource Links'].map((tag, i) => ( + + {tag} + + ))}
+
- -
-

More Roadmaps Coming Soon

-

- We’re excited to share that we’re actively developing additional roadmaps to guide you on your tech journey. These resources are designed to empower you, providing clear paths and actionable steps tailored to your goals. Keep an eye out for updates—your future in tech is bright, and we’re here to support you every step of the way! -

+
+ View Roadmap + + +
+ + ))} +
+
+
-
-

Open Source Collaboration

-

- These roadmaps are open source and we welcome collaboration from the community. Feel free to contribute and help us improve these resources. -

- + {/* Coming Soon Section */} +
+
+
+

More Roadmaps Coming Soon

+
+
+

+ We're actively developing additional roadmaps for various tech roles including: +

+
    +
  • Cloud Engineering
  • +
  • Machine Learning & AI
  • +
  • Product Management
  • +
  • Cybersecurity
  • +
  • Mobile App Development
  • +
+

+ Subscribe to our newsletter to get notified when new roadmaps are released. +

+
+
+
+ + +
- - )} +
+
+
+
+
- {!isRootPath && } -
- ); + {/* Contribute Section */} +
+
+

Open Source Collaboration

+

+ These roadmaps are open source and we welcome contributions from the community. + Help us improve these resources for everyone. +

+
+ +
+
+
+ + ) : ( + + )} +
+ ); }; export default Roadmap; \ No newline at end of file diff --git a/src/components/RoadmapDetail.jsx b/src/components/RoadmapDetail.jsx index 83b3204..8c4113b 100644 --- a/src/components/RoadmapDetail.jsx +++ b/src/components/RoadmapDetail.jsx @@ -1,16 +1,243 @@ // src/components/RoadmapDetail.jsx -import React from 'react'; -import { useParams } from 'react-router-dom'; +import React, { useState, useEffect } from 'react'; +import { useParams, Link } from 'react-router-dom'; +import roadmaps from '../roadmaps.json'; const RoadmapDetail = () => { - const { id } = useParams(); + const { id } = useParams(); + const [roadmap, setRoadmap] = useState(null); + const [activeStep, setActiveStep] = useState(0); + useEffect(() => { + // Find the roadmap with the matching id + const foundRoadmap = roadmaps.find(r => r.id === id); + if (foundRoadmap) { + setRoadmap(foundRoadmap); + } + }, [id]); + + if (!roadmap) { return ( -
-

Roadmap Detail: {id}

-

Details for roadmap {id} will be displayed here.

-
+
+

Roadmap Not Found

+

We couldn't find the roadmap you're looking for.

+ + View All Roadmaps + +
); + } + + // Mock data for steps (this would come from the roadmap data in a real implementation) + const steps = [ + { + title: "Getting Started", + description: "Begin your journey by understanding the fundamentals and setting up your learning environment.", + content: ` +

Welcome to your tech journey! This first phase is all about building a solid foundation. You'll get familiar with key concepts, tools, and start building habits that will serve you throughout your career.

+

Key Objectives:

+
    +
  • Understand the field and career opportunities
  • +
  • Set up your development environment
  • +
  • Learn the fundamental concepts
  • +
  • Build your first small projects
  • +
+ `, + resources: [ + { title: "Free Code Camp", url: "https://www.freecodecamp.org/" }, + { title: "The Odin Project", url: "https://www.theodinproject.com/" }, + { title: "MDN Web Docs", url: "https://developer.mozilla.org/" } + ] + }, + { + title: "Building Skills", + description: "Develop core technical skills and start working on meaningful projects.", + content: ` +

Now that you have the basics down, it's time to deepen your knowledge and start applying what you've learned to more complex problems and projects.

+

Key Objectives:

+
    +
  • Master core programming concepts
  • +
  • Learn industry-standard tools and frameworks
  • +
  • Build a portfolio of projects
  • +
  • Practice problem-solving skills
  • +
+ `, + resources: [ + { title: "LeetCode", url: "https://leetcode.com/" }, + { title: "GitHub Learning Lab", url: "https://lab.github.com/" }, + { title: "Codecademy", url: "https://www.codecademy.com/" } + ] + }, + { + title: "Professional Development", + description: "Prepare for the job market and develop professional skills.", + content: ` +

Technical skills are just one part of a successful tech career. In this phase, you'll focus on the professional aspects of working in tech and prepare for your job search.

+

Key Objectives:

+
    +
  • Create a professional resume and online presence
  • +
  • Develop interview skills (technical and behavioral)
  • +
  • Build your network and find mentors
  • +
  • Learn about industry practices and workflows
  • +
+ `, + resources: [ + { title: "Tech Interview Handbook", url: "https://www.techinterviewhandbook.org/" }, + { title: "LinkedIn Learning", url: "https://www.linkedin.com/learning/" }, + { title: "AngelList", url: "https://angel.co/jobs" } + ] + }, + { + title: "Landing Your First Role", + description: "Strategies for job searching and excelling in your first position.", + content: ` +

This is where all your hard work comes together. You'll apply for jobs, go through interviews, and start your professional journey in tech.

+

Key Objectives:

+
    +
  • Develop an effective job search strategy
  • +
  • Prepare for technical and behavioral interviews
  • +
  • Evaluate job offers and negotiate compensation
  • +
  • Plan for success in your first 90 days
  • +
+ `, + resources: [ + { title: "Hired", url: "https://hired.com/" }, + { title: "Glassdoor", url: "https://www.glassdoor.com/" }, + { title: "Blind", url: "https://www.teamblind.com/" } + ] + } + ]; + + return ( +
+ {/* Roadmap Header */} +
+ + + + + Back to Roadmaps + +

{roadmap.title}

+

{roadmap.description}

+
+ + {/* Progress Indicator */} +
+
+
+
+
+
+ {steps.map((step, index) => ( + + ))} +
+
+
+ {steps.map((step, index) => ( +
+

{step.title}

+
+ ))} +
+
+ + {/* Active Step Content */} +
+
+
+

{steps[activeStep].title}

+

{steps[activeStep].description}

+ +
+ +
+

Recommended Resources

+
+ {steps[activeStep].resources.map((resource, index) => ( + + + + + {resource.title} + + ))} +
+
+
+
+
+ + {/* Navigation Buttons */} +
+ + + +
+ + {/* Community Support Section */} +
+

Need Support?

+

+ Join our community to connect with mentors and peers who are on similar journeys. + Get answers to your questions and share your progress. +

+ +
+
+ ); }; export default RoadmapDetail; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 6119ad9..a05d43a 100644 --- a/src/index.css +++ b/src/index.css @@ -4,65 +4,184 @@ font-weight: 400; color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; + color: rgba(255, 255, 255, 0.95); + background-color: #0f172a; font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + + /* Base typography scale */ + --font-size-xs: 0.75rem; + --font-size-sm: 0.875rem; + --font-size-base: 1rem; + --font-size-lg: 1.125rem; + --font-size-xl: 1.25rem; + --font-size-2xl: 1.5rem; + --font-size-3xl: 1.875rem; + --font-size-4xl: 2.25rem; + --font-size-5xl: 3rem; + + /* Spacing scale */ + --spacing-0: 0; + --spacing-1: 0.25rem; + --spacing-2: 0.5rem; + --spacing-3: 0.75rem; + --spacing-4: 1rem; + --spacing-6: 1.5rem; + --spacing-8: 2rem; + --spacing-12: 3rem; + --spacing-16: 4rem; + + /* Colors */ + --color-primary: #22c55e; + --color-primary-dark: #15803d; + --color-primary-light: #4ade80; + --color-secondary: #6366f1; + --color-secondary-dark: #4338ca; + --color-secondary-light: #818cf8; + --color-dark: #0f172a; + --color-dark-lighter: #1e293b; + --color-gray: #64748b; + --color-gray-light: #94a3b8; } a { font-weight: 500; - color: #646cff; + color: var(--color-secondary); text-decoration: inherit; + transition: color 0.2s ease; } + a:hover { - color: #535bf2; + color: var(--color-secondary-light); } body { margin: 0; display: flex; - place-items: center; + flex-direction: column; min-width: 320px; min-height: 100vh; + overflow-x: hidden; + background-color: var(--color-dark); +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + font-weight: 700; + line-height: 1.2; } h1 { - font-size: 3.2em; - line-height: 1.1; + font-size: var(--font-size-4xl); + margin-bottom: var(--spacing-6); +} + +h2 { + font-size: var(--font-size-3xl); + margin-bottom: var(--spacing-4); +} + +h3 { + font-size: var(--font-size-2xl); + margin-bottom: var(--spacing-3); +} + +p { + margin-top: 0; + margin-bottom: var(--spacing-4); } button { - border-radius: 8px; + border-radius: 0.5rem; border: 1px solid transparent; padding: 0.6em 1.2em; font-size: 1em; font-weight: 500; font-family: inherit; - background-color: #1a1a1a; + background-color: var(--color-dark-lighter); cursor: pointer; - transition: border-color 0.25s; + transition: all 0.2s ease; } + button:hover { - border-color: #646cff; + border-color: var(--color-primary); + background-color: rgba(34, 197, 94, 0.1); } + button:focus, button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; + outline: 2px solid var(--color-primary); + outline-offset: 2px; +} + +/* Custom utility classes */ +.container { + width: 100%; + max-width: 1280px; + margin: 0 auto; + padding: 0 1rem; +} + +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.5rem 1.5rem; + font-weight: 500; + border-radius: 0.5rem; + transition: all 0.2s ease; +} + +.btn-primary { + background-color: var(--color-primary); + color: #fff; +} + +.btn-primary:hover { + background-color: var(--color-primary-dark); +} + +.btn-secondary { + background-color: var(--color-secondary); + color: #fff; +} + +.btn-secondary:hover { + background-color: var(--color-secondary-dark); +} + +.btn-outline { + background-color: transparent; + border: 1px solid var(--color-primary); + color: var(--color-primary); +} + +.btn-outline:hover { + background-color: var(--color-primary); + color: #fff; } @media (prefers-color-scheme: light) { :root { - color: #213547; - background-color: #ffffff; + color: #334155; + background-color: #f8fafc; + + --color-dark: #f8fafc; + --color-dark-lighter: #f1f5f9; } - a:hover { - color: #747bff; + + body { + background-color: #f8fafc; } + button { - background-color: #f9f9f9; + background-color: #e2e8f0; + } + + button:hover { + background-color: rgba(34, 197, 94, 0.1); } } diff --git a/tailwind.config.js b/tailwind.config.js index dc2471f..b52f742 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -6,9 +6,116 @@ export default { ], theme: { extend: { + colors: { + primary: { + 50: '#f0fdf4', + 100: '#dcfce7', + 200: '#bbf7d0', + 300: '#86efac', + 400: '#4ade80', + 500: '#22c55e', + 600: '#16a34a', + 700: '#15803d', + 800: '#166534', + 900: '#14532d', + 950: '#052e16', + }, + secondary: { + 50: '#eef2ff', + 100: '#e0e7ff', + 200: '#c7d2fe', + 300: '#a5b4fc', + 400: '#818cf8', + 500: '#6366f1', + 600: '#4f46e5', + 700: '#4338ca', + 800: '#3730a3', + 900: '#312e81', + 950: '#1e1b4b', + }, + dark: { + 50: '#f9fafb', + 100: '#f3f4f6', + 200: '#e5e7eb', + 300: '#d1d5db', + 400: '#9ca3af', + 500: '#6b7280', + 600: '#4b5563', + 700: '#374151', + 800: '#1f2937', + 900: '#111827', + 950: '#030712', + }, + }, fontFamily: { + sans: ['Inter', 'system-ui', 'sans-serif'], inter: ['Inter', 'sans-serif'], }, + fontSize: { + xs: ['0.75rem', { lineHeight: '1rem' }], + sm: ['0.875rem', { lineHeight: '1.25rem' }], + base: ['1rem', { lineHeight: '1.5rem' }], + lg: ['1.125rem', { lineHeight: '1.75rem' }], + xl: ['1.25rem', { lineHeight: '1.75rem' }], + '2xl': ['1.5rem', { lineHeight: '2rem' }], + '3xl': ['1.875rem', { lineHeight: '2.25rem' }], + '4xl': ['2.25rem', { lineHeight: '2.5rem' }], + '5xl': ['3rem', { lineHeight: '1.16' }], + '6xl': ['3.75rem', { lineHeight: '1.16' }], + }, + spacing: { + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '20': '5rem', + '24': '6rem', + '32': '8rem', + '40': '10rem', + '48': '12rem', + '56': '14rem', + '64': '16rem', + '72': '18rem', + '80': '20rem', + '96': '24rem', + }, + borderRadius: { + 'none': '0', + 'sm': '0.125rem', + DEFAULT: '0.25rem', + 'md': '0.375rem', + 'lg': '0.5rem', + 'xl': '0.75rem', + '2xl': '1rem', + '3xl': '1.5rem', + 'full': '9999px', + }, + boxShadow: { + sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)', + DEFAULT: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)', + md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', + lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', + xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', + '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)', + inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)', + none: 'none', + }, + animation: { + 'dropdown': 'dropdown 0.3s ease-in-out', + }, + keyframes: { + dropdown: { + '0%': { opacity: 0, transform: 'translateY(-10px)' }, + '100%': { opacity: 1, transform: 'translateY(0)' }, + }, + }, }, }, plugins: [],