Thursday, August 6, 2026

120-Day CSS Tailwind CSS Study Plan

 

As a front-end developer, I highly approve of this utility-first approach to learning CSS. Tailwind CSS completely changes how you think about styling by moving you away from context-switching between HTML and CSS files, allowing you to build layouts directly in your markup.

Because this is a massive 120-day curriculum, I will break down Phase 1 (Days 1–30) and Phase 2 (Days 31–60) in this response. I’ve added detailed developer goals and specific technical instructions for every single topic.

Phase 1: Foundations (Days 1–30)

The focus here is memorizing Tailwind's naming conventions for the CSS properties you already know.

Day 1: Install Tailwind in a plain HTML project

Define Goal: Understand the build process. Tailwind isn't a traditional stylesheet; it's a PostCSS plugin that scans your HTML and generates only the CSS classes you actually use.
Instructions:

  1. Initialize a new project: npm init -y.

  2. Install Tailwind via npm: npm install -D tailwindcss.

  3. Generate the config file: npx tailwindcss init.

  4. Configure your tailwind.config.js to scan your HTML: content: ["./src/**/*.{html,js}"].

  5. Add the Tailwind directives (@tailwind base; @tailwind components; @tailwind utilities;) to your src/input.css file and run the CLI build command to output your compiled CSS.

Days 2–3: Colors (Text & Background)

Define Goal: Master Tailwind's default color palette and numbering system (50-950), where 50 is the lightest and 950 is the darkest.
Instructions:

  • Day 2 (Text): Create an <h1> and apply text-blue-700. Create a <p> tag and apply text-gray-600.

  • Day 3 (Backgrounds): Wrap your text in a <div> and apply bg-green-100. Notice how backgrounds map 1:1 with text colors using the bg- prefix.

Days 4–7: Typography Hierarchy & Readability

Define Goal: Control the text styling—size, weight, kerning, and line-height—without leaving your HTML.
Instructions:

  • Day 4 (Size): Apply text-3xl to a heading and text-sm to a footer note.

  • Day 5 (Weight): Apply font-bold to your heading and font-light to a subtitle.

  • Day 6 (Letter Spacing): Use tracking-wide or tracking-tight on uppercase headings to improve modern UI aesthetics.

  • Day 7 (Line Height): Apply leading-relaxed (line-height: 1.625) to paragraph tags so long blocks of text are readable.

Days 8–9: The Box Model (Margin & Padding)

Define Goal: Learn Tailwind's spacing scale (where 1 unit = 0.25rem or 4px) to control layout breathing room.
Instructions:

  • Day 8 (Margin): Add m-4 (1rem all around) to a card <div>. Use mx-auto on a fixed-width container to center it horizontally.

  • Day 9 (Padding): Add px-6 (left/right 1.5rem) and py-2 (top/bottom 0.5rem) to an <a> tag to form the click area of a button.

Days 10–12: Borders, Corners, & Shadows

Define Goal: Create UI depth and define boundaries for interactive elements like cards and buttons.
Instructions:

  • Day 10 (Borders): Add border border-gray-300 to a container. Notice that border enables a 1px border, and the color class colors it.

  • Day 11 (Radius): Apply rounded-md to a card, and rounded-full to a profile picture <img> to make it a perfect circle.

  • Day 12 (Shadows): Apply shadow-md to your card <div> to lift it off the background.

Days 13–15: Sizing & Containers

Define Goal: Dictate how much physical space an element occupies using fixed, fluid, and responsive maximums.
Instructions:

  • Day 13 (Width): Create a two-column layout manually by giving two divs w-1/2.

  • Day 14 (Height): Use h-screen (100vh) on a <section> to ensure it takes up the exact height of the browser window.

  • Day 15 (Max-Width): Instead of fixed widths, apply max-w-screen-lg mx-auto to a wrapper div to create a centered, responsive website container.

Days 16–18: Flexbox Core

Define Goal: Utilize the Flexbox model via utility classes to align and distribute items in 1D layouts.
Instructions:

  • Day 16 (Flex): Apply flex items-center justify-between to a header to push the logo to the left and nav links to the right.

  • Day 17 (Direction): Apply flex-col to a card to stack an image, title, and button vertically.

  • Day 18 (Wrap): Create a row of badges. Add flex flex-wrap gap-2 so they automatically wrap to the next line on smaller screens.

Days 19–21: CSS Grid Core

Define Goal: Use Tailwind to build 2D grid systems quickly without complex CSS math.
Instructions:

  • Day 19 (Grid & Cols): Add grid grid-cols-2 to a wrapper div to instantly split its children into a 50/50 layout.

  • Day 20 (Gap): Add gap-6 to the grid container to inject gutters between your columns and rows.

  • Day 21 (Rows): Apply grid-rows-3 to a sidebar container to evenly distribute three widgets vertically.

Days 22–24: Positioning & Overflow

Define Goal: Break elements out of the standard document flow safely and handle excess content.
Instructions:

  • Day 22 (Position): Give a parent div relative. Inside it, give a badge absolute top-0 right-0 to pin it to the top right corner.

  • Day 23 (Z-Index): Add z-50 to a sticky header so it slides over the top of z-10 page content.

  • Day 24 (Overflow): Apply overflow-hidden to a card so the square corners of a child image don't bleed out of the rounded-lg parent.

Days 25–29: State, Visibility, & Interaction

Define Goal: Handle element display states and user mouse interactions using pseudo-class modifiers.
Instructions:

  • Day 25-26 (Display/Visibility): Toggle hidden (display: none) vs invisible (visibility: hidden - keeps physical space) on an element.

  • Day 27 (Cursor): Apply cursor-not-allowed to a disabled button.

  • Day 28 (Opacity): Apply opacity-50 to a secondary icon.

  • Day 29 (Hover): Combine utilities. Add bg-blue-500 hover:bg-blue-600 to a button so it darkens on mouseover.

Day 30: Review Phase 1 Deliverable

Define Goal: Synthesize your core utility knowledge.
Instructions: Build a single-page landing page (Hero, Features Grid, Footer) using only the classes learned above. Do not write a single line of custom CSS.

Phase 2: Configuration, Animation, & Plugins (Days 31–60)

The focus shifts to extending Tailwind to match a specific brand, adding animations, and working with complex UI components.

Days 31–33: Customizing the tailwind.config.js

Define Goal: Escape the default design system. Teach Tailwind your brand's specific colors, fonts, and spacing.
Instructions:

  • Day 31 (Colors): In tailwind.config.js, open the theme.extend.colors object. Add a custom key: brand: '#FF5733'. Now you can use text-brand and bg-brand in your HTML.

  • Day 32 (Fonts): Add a Google Font to your HTML. In your config theme.extend.fontFamily, add sans: ['"Inter"', 'sans-serif'].

  • Day 33 (Spacing): Add custom spacing values (e.g., 128: '32rem') to theme.extend.spacing if the default scale isn't large enough.

Days 34–35: The Container & Hero Section

Define Goal: Standardize layout boundaries and practice building high-impact top-of-page sections.
Instructions:

  • Day 34 (Container): In your config, set container: { center: true, padding: '2rem' }. Now, adding .container to a div automatically centers it with built-in padding.

  • Day 35 (Hero): Build a Hero with min-h-[80vh], a background image, a dark overlay (bg-black/50), and centered flex text.

Days 36–40: Advanced Positioning & Scrolling

Define Goal: Build modern UI behaviors like sticky navs and horizontal swipeable sections.
Instructions:

  • Day 36-37 (Fixed & Insets): Create a navbar and apply fixed top-0 left-0 w-full. Ensure the main content has pt-20 (padding-top) so it doesn't hide behind the navbar.

  • Day 38 (Layering): Manage complex z-indexes (dropdowns z-40, modals z-50).

  • Day 39-40 (Scrollable Component): Create a horizontal row of cards. Add flex overflow-x-auto snap-x to the parent to create a mobile-friendly swipeable carousel.

Days 41–44: Transitions & Dropdowns

Define Goal: Smooth out UI state changes so elements don't just "snap" instantly when hovered or clicked.
Instructions:

  • Day 41-43 (Transitions): Add transition-all duration-300 ease-in-out to a button, along with hover:bg-blue-600. Watch the color fade smoothly.

  • Day 44 (Dropdown): Build a menu. Use opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all to make it fade in when the parent is hovered.

Days 45–49: Transforms & Keyframe Animations

Define Goal: Utilize the GPU for performant visual effects and utilize Tailwind's native keyframes.
Instructions:

  • Day 45-46 (Transform): On an image wrapper, add overflow-hidden. On the image itself, add transition-transform hover:scale-110 for a slick zoom effect.

  • Day 47-49 (Animations): Add animate-pulse to skeleton loading screens. In tailwind.config.js, define a custom keyframes rotation for a custom loading spinner component.

Days 50–54: Form Styling & Advanced States

Define Goal: Override ugly browser-default form elements and handle accessibility states.
Instructions:

  • Day 50-51 (Forms): Style an <input> with border rounded px-4 py-2 outline-none.

  • Day 52-53 (Focus/Disabled): Add focus:ring-2 focus:ring-blue-500 to your input. Add disabled:opacity-50 disabled:cursor-not-allowed to the submit button.

  • Day 54 (Validation): Combine focus and colors: focus:invalid:border-red-500 focus:invalid:ring-red-500.

Days 55–57: Tailwind Plugins

Define Goal: Leverage official Tailwind plugins for complex use cases like markdown styling and video embeds.
Instructions:

  • Day 55 (Typography): Run npm i @tailwindcss/typography. Add it to your config's plugins array. Wrap a blog post in <div class="prose"> and watch it automatically style the raw HTML/Markdown.

  • Day 56-57 (Aspect Ratio): Build a gallery. Apply aspect-video (16:9) or aspect-square (1:1) to images/iframes so they scale perfectly responsively without strict heights.

Days 58–60: Reusable Utilities & Phase 2 Deliverable

Define Goal: Keep your HTML clean by extracting repeating component classes and wrapping up Phase 2.
Instructions:

  • Day 58 (Custom Utilities): Use the @layer components directive in your main CSS file to extract .btn { @apply px-4 py-2 bg-blue-500 rounded text-white; }.

  • Day 59 (Card Component): Build a highly polished, reusable card with hover scaling and an aspect-ratio image.

  • Day 60 (Review): Deliver a full Blog Layout combining custom config brand colors, the Typography plugin for the post body, and responsive CSS grids for the sidebar.

Days 61–62: Install Tailwind in a React Project

Define Goal: Integrate Tailwind into a modern JavaScript build tool. (Note: The industry has moved from Create React App to Vite, so we will use Vite for better performance). Instructions:

  1. Initialize a new project: npm create vite@latest my-app -- --template react.

  2. Navigate into the folder, run npm install, then install Tailwind: npm install -D tailwindcss postcss autoprefixer.

  3. Run npx tailwindcss init -p to generate both tailwind.config.cjs and postcss.config.cjs.

  4. Configure the content array in your Tailwind config to include "./src/**/*.{js,jsx,ts,tsx}". Add the Tailwind directives to index.css.

  5. Open App.jsx, delete the boilerplate, and build a simple <button className="bg-blue-500 text-white px-4 py-2 rounded"> to verify it works.

Days 63–64: Conditional Classes (clsx and tailwind-merge)

Define Goal: Handle dynamic UI states (like active/inactive, success/error) cleanly without writing messy string concatenations in JSX. Instructions:

  1. Install utility libraries: npm install clsx tailwind-merge.

  2. Create a utility function: const cn = (...inputs) => twMerge(clsx(inputs));.

  3. Build a Button component that accepts an intent prop (primary vs secondary).

  4. Use the utility to conditionally apply styles: className={cn("px-4 py-2 rounded", intent === 'primary' ? 'bg-blue-500' : 'bg-gray-200')}.

Days 65–66: Dark Mode Configuration

Define Goal: Allow the UI to invert colors based on user system preferences or a manual toggle using Tailwind's dark: modifier. Instructions:

  1. In tailwind.config.js, set darkMode: 'class'. This allows you to toggle dark mode manually by appending a .dark class to the <html> element.

  2. Build a card with classes like bg-white dark:bg-gray-800 text-black dark:text-white.

  3. Create a React state [isDark, setIsDark] linked to a toggle switch button. When true, add the dark class to document.documentElement.

Days 67–68: Advanced Grid Layouts (Dashboard)

Define Goal: Construct complex, asymmetrical application layouts using CSS Grid. Instructions:

  1. Build a dashboard shell. Use grid-cols-12 on the main wrapper.

  2. Make a Sidebar component span 3 columns (col-span-3) and the Main Content area span 9 columns (col-span-9).

  3. Add responsive prefixes so it stacks on mobile: grid-cols-1 md:grid-cols-12 and col-span-1 md:col-span-3.

Days 69–70: Flex Grow/Shrink & Pricing Tables

Define Goal: Master how elements claim available space in a flex container. Instructions:

  1. Build a flex container for a Pricing Table with 3 cards.

  2. Apply flex-1 to the outer cards so they take equal space.

  3. Apply flex-none md:scale-105 to the middle "Pro" tier card to make it pop out visually while the others shrink around it.

Days 71–74: Responsive Images & Object Fit

Define Goal: Prevent images from distorting or breaking out of their containers when the browser resizes. Instructions:

  1. Build a Hero Section and an Image Gallery.

  2. Ensure every <img> tag has w-full.

  3. Use object-cover to ensure the image fills its container (cropping if necessary without stretching), or object-contain to show the whole image with letterboxing.

  4. Use h-64 md:h-96 to adjust the container height per device.

Days 75–76: Aspect Ratio for Videos

Define Goal: Maintain strict 16:9 proportions for embedded YouTube/Vimeo iframes regardless of screen width. Instructions:

  1. Ensure the @tailwindcss/aspect-ratio plugin is installed (or use the native aspect-video class in modern Tailwind).

  2. Wrap an <iframe> in a div with w-full aspect-video.

  3. Notice how the video height dynamically calculates based on the browser width without needing JavaScript.

Days 77–78: Scroll Snap & Carousels

Define Goal: Build a native, performant mobile swipe experience. Instructions:

  1. Create a row of horizontal cards. Give the parent flex overflow-x-auto snap-x snap-mandatory gap-4.

  2. Give each child card snap-center shrink-0 w-80.

  3. Test on a mobile device/simulator. The scroll should "snap" perfectly to each card.

Days 79–80: Sticky Positioning

Define Goal: Keep critical navigation or sidebar elements visible while the user scrolls down a long page. Instructions:

  1. On your Dashboard or Blog layout, apply sticky top-0 z-50 to the Navbar.

  2. Apply sticky top-20 to the Sidebar wrapper.

  3. Scroll down the page and watch the sidebar lock into place while the main content continues to scroll.

Days 81–82: Responsive Tables

Define Goal: Handle tabular data that is too wide for mobile screens gracefully without breaking the viewport width. Instructions:

  1. Build a pricing comparison <table>.

  2. Wrap the table in a <div> and apply overflow-x-auto w-full.

  3. Test on mobile view. The page should not scroll horizontally, but the table itself should be swipeable left-to-right.

Days 83–84: Performance Optimization (Purge CSS)

Define Goal: Understand the Tailwind compiler. Ensure your production build is tiny (usually sub-10kb). Instructions:

  1. Run npm run build in Vite.

  2. Inspect the output dist/assets folder. Find the .css file.

  3. Understand that Tailwind automatically purged all the classes you didn't use because of the content array you set up on Day 61.

Days 85–88: Accessibility (A11y) & Focus States

Define Goal: Ensure your application is usable by keyboard navigators and screen readers. Instructions:

  1. Add custom focus rings to all interactive elements: focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2.

  2. Use the sr-only class to hide labels visually but keep them readable by screen readers (e.g., an icon-only search button needs a <span className="sr-only">Search</span>).

  3. Build a modal and ensure ARIA attributes are passed correctly via React props.

Days 89–90: Responsive Nav & Phase 3 Review

Define Goal: Tie React state directly to Tailwind classes to handle mobile interactions. Instructions:

  1. Build a Navbar component. Create a React state: const [isOpen, setIsOpen] = useState(false).

  2. Create the mobile menu div. Use conditional classes: className={cn("md:hidden", isOpen ? "block" : "hidden")}.

  3. Ensure the Phase 3 Deliverable (React Dashboard) incorporates dark mode, sticky sidebars, and accessible form elements.

Phase 4: Mastery, Tokens & Deployment (Days 91–120)

Days 91–92: Design Tokens & Reusable Style Guides

Define Goal: Translate a Figma file's exact design system (tokens) into your Tailwind configuration to strictly enforce brand guidelines. Instructions:

  1. Open tailwind.config.js. Completely overwrite (don't extend) the default color palette with a strict brand palette (e.g., primary, secondary, neutral, danger).

  2. Overwrite the default breakpoints (sm, md, lg) if the project requires specific container queries (e.g., matching a bootstrap grid system).

Days 93–95: Component Libraries (Tailwind UI / Headless UI)

Define Goal: Accelerate development by utilizing unstyled, accessible UI logic components (Headless UI) and styling them with Tailwind. Instructions:

  1. Install @headlessui/react.

  2. Build a Dropdown Menu or Modal using Headless UI.

  3. Apply Tailwind classes to the headless components. Notice how it handles all the keyboard navigation, focus trapping, and ARIA attributes for you automatically.

Days 96–97: Collaboration & Documentation

Define Goal: Ensure standard practices are documented so other developers don't write bloated utility strings. Instructions:

  1. Write a README.md for your project explaining how to use your custom clsx utility for conditional classes.

  2. Document custom config values (e.g., "Use text-brand instead of text-blue-500").

Days 98–100: Testing Responsiveness & Lighthouse Audit

Define Goal: Guarantee rendering consistency and pass Google's core web vitals. Instructions:

  1. Open your app in Chrome DevTools. Cycle through iPhone, iPad, and 4k Desktop views. Look for overflow issues (horizontal scrolling).

  2. Run a Lighthouse Audit (DevTools > Lighthouse).

  3. Fix contrast ratio warnings using darker text utilities (e.g., changing text-gray-400 to text-gray-600 on a white background).

Days 101–102: SEO Optimization & Semantic HTML

Define Goal: Ensure your rapid utility styling isn't replacing proper HTML structure. Instructions:

  1. Audit your app. Are you using <div className="text-3xl font-bold"> instead of an <h1>? Fix it.

  2. Ensure buttons are <button> and links are <a>. Do not use onClick on a <div> just because you can style it like a button.

Days 103–104: Advanced Build Optimization

Define Goal: Finalize the Vite build pipeline for the absolute smallest asset footprint. Instructions:

  1. Check your postcss.config.cjs to ensure autoprefixer is enabled (this automatically adds -webkit- prefixes to your CSS).

  2. Run a production build and verify the CSS is minified (all whitespace stripped).

Days 105–106: Deployment Basics (Netlify & Vercel)

Define Goal: Implement Continuous Integration/Continuous Deployment (CI/CD). Instructions:

  1. Push your React project to a GitHub repository.

  2. Sign in to Vercel or Netlify with GitHub.

  3. Import the repository. The platform will automatically detect Vite and configure the build settings.

  4. Click Deploy. Verify the live URL looks identical to your local host.

Days 107–108: Shared Configs & Monorepos

Define Goal: Maintain styling consistency across multiple applications (e.g., an Admin app and a Client app). Instructions:

  1. Create a separate .js file for your Tailwind config (e.g., brand-preset.js).

  2. Inside your app's tailwind.config.js, require this file in the presets: [require('./brand-preset.js')] array. This allows you to share design tokens across a monorepo.

Days 109–110: API Integration & Dynamic Styling

Define Goal: Style data that arrives asynchronously without breaking layout while waiting. Instructions:

  1. Build a Weather App UI using React useEffect to fetch data from an API (like OpenWeatherMap).

  2. Build a loading state using animate-pulse (skeleton loaders) while the data fetches.

  3. Dynamically change the background using template literals based on the weather data: className={cn("h-screen w-full", temp > 80 ? 'bg-red-500' : 'bg-blue-500')}.

Days 111–112: Global Context Dark Mode

Define Goal: Persist the user's dark mode preference across page reloads. Instructions:

  1. Create a ThemeContext in React.

  2. Use localStorage.setItem('theme', 'dark') to save the choice.

  3. On application load, read local storage to inject the .dark class into the DOM instantly.

Days 113–114: Advanced Custom Animations

Define Goal: Create highly polished micro-interactions. Instructions:

  1. In tailwind.config.js, build a custom keyframe for a "slide-in-up" animation (opacity 0 to 1, transform Y 20px to 0).

  2. Add it to theme.extend.animation.

  3. Apply animate-slide-in-up to your modal or page transitions.

Days 115–116: Usability Testing & Iteration

Define Goal: Validate touch targets and visual hierarchy. Instructions:

  1. Have a colleague test the app on their physical mobile device.

  2. If they miss buttons with their thumb, increase padding (e.g., px-4 py-2 to px-6 py-3).

  3. If text is hard to read in sunlight, increase the font weight or contrast.

Days 117–118: Component Extraction & Refactoring

Define Goal: Clean up the codebase by identifying repeating UI patterns. Instructions:

  1. Find any HTML structure duplicated 3 or more times (e.g., an avatar badge with specific rounded corners, borders, and rings).

  2. Extract it into a <Avatar src="{...}"/> React component. Do not use @apply in CSS; rely on React for componentization.

Days 119–120: Final Polish & Project Showcase

Define Goal: Deliver the ultimate full-stack-adjacent frontend application. Instructions:

  1. Consolidate your dashboard, dynamic API fetches, and dark mode features into a single, cohesive repository.

  2. Ensure Lighthouse scores are 90+ for Performance, Accessibility, and Best Practices.

  3. Push the final version to GitHub, trigger the Vercel deployment, and add the live URL to your developer portfolio.


No comments:

Post a Comment

What’s the Actual Process of a Social Media Manager When Working with a Client

What’s the Actual Process of a Social Media Manager When Working with a Client? Just because you've been hired doesn't mean you'...