Project: A Landing Page

Time to put the whole course together. In this project you'll style a complete product landing page: a sticky header, a hero section, a feature grid, a pricing table with a highlighted plan, a testimonial, and a footer — responsive, themeable, accessible and animated with restraint.

The finished page

Edit the CSS and watch the page change. Try different values for --hue at the top to re-theme everything at once.

Try it yourself
Result

What this page uses

TechniqueWhereLesson
Cascade layersreset → tokens → base → components → utilities45
Design tokens, light-dark(), oklch()tokens layer10, 13, 46
Fluid type and spacing with clamp()Headings, --space14
Sticky header with backdrop blur.header24, 39
NestingEvery component44
Grid with a breakpoint; auto-fit gridsHero, features, pricing29, 32
:has() to highlight a planarticle:has(.badge)43
aspect-ratio + object-fitHero image41
Gradients, shadows, transitionsHero, buttons12, 18, 37
Focus styles, reduced motion, visually hidden textbase, utilities48

Challenges

  1. Re-theme it — change --hue, then switch your system to dark mode.
  2. Mobile navigation — below 480px, hide the nav links and show a button that opens them in a popover.
  3. Container queries — make each pricing card switch to a horizontal layout when its container is wide (lesson 33).
  4. Scroll animation — fade the feature cards in as they scroll into view with animation-timeline: view(), respecting reduced motion (lesson 38).
  5. Theme toggle — add a light/dark/system switch using :has() (lesson 46).
  6. Audit — run Lighthouse and fix any contrast or accessibility issues it reports.

What next?