.env.example to .env.local and fill in your Supabase credentials:app/page.tsx — Server Component. Fetches courses from Supabase at request time using getCourses(). No "use client" directive, so it runs only on the server. Supabase keys never reach the browser.components/BentoGrid.tsx — Client Component. Receives courses as props, handles Framer Motion stagger animations.components/Sidebar.tsx — Client Component. Manages active nav state and collapse toggle.components/CourseCard.tsx — Client Component. Handles spring hover animations and animated progress bar.components/HeroTile.tsx — Client Component. Entrance animation.components/ActivityTile.tsx — Client Component. Renders contribution graph.app/loading.tsx is automatically shown by Next.js while page.tsx is fetching data from Supabase. It renders pulsing skeleton cards that match the shape of the real course cards.BentoGrid uses Framer Motion variants with staggerChildren: 0.1whileHover with type: "spring", stiffness: 300, damping: 20motion.divlayoutId for a smooth sliding highlight between nav itemsPosted Jul 30, 2026
Developed a learning dashboard using Next.js, Tailwind CSS, and Framer Motion.
1
0