import { RiArrowRightLine, RiHeart3Line, RiRestaurantLine, RiShoppingBasket2Line, RiWallet3Line } from "@remixicon/react"; import Link from "next/link"; import { RotatingPreview, type PreviewSet } from "./components/RotatingPreview"; import { Logo, SiteHeader } from "./components/SiteHeader"; import { PANTRY_STAPLE_IDS } from "./lib/catalog"; import { buildGroceryList } from "./lib/grocery"; import { CUISINES } from "./lib/plan"; import { RECIPES } from "./lib/recipes"; import { formatUsd } from "./lib/units"; import { buttonStyles } from "@/components/base/buttons/button"; import { cx } from "@/utils/cx"; // Landing page (server component, fully static). Preview menus are priced from the // real recipe & store catalog at build time, so no catalog ships to the client. const PREVIEW_THEMES: { theme: string; blurb: string; meals: [slot: string, recipeId: string][] }[] = [ { theme: "Comfort classics", blurb: "Cozy & thrifty", meals: [["Mon · Dinner", "chicken-pot-pie"], ["Tue · Lunch", "chicken-noodle-soup"], ["Tue · Dinner", "beef-stroganoff"]] }, { theme: "Shared spice rack", blurb: "High overlap", meals: [["Mon · Dinner", "chicken-curry"], ["Tue · Lunch", "red-lentil-dal"], ["Tue · Dinner", "pad-thai"]] }, { theme: "Weeknight seafood", blurb: "Budget catch", meals: [["Mon · Dinner", "garlic-butter-shrimp-and-rice"], ["Tue · Lunch", "tuna-chickpea-pitas"], ["Tue · Dinner", "baja-fish-tacos"]] }, { theme: "Dorm & studio kitchen", blurb: "Microwave + rice cooker", meals: [["Mon · Breakfast", "berry-banana-smoothie"], ["Mon · Lunch", "microwave-buffalo-chicken-rice-bowls"], ["Mon · Dinner", "rice-cooker-arroz-con-pollo"]] }, { theme: "Plant-forward week", blurb: "Meatless & filling", meals: [["Mon · Breakfast", "shakshuka"], ["Mon · Lunch", "chana-masala"], ["Mon · Dinner", "black-bean-enchiladas"]] }, { theme: "Sunday batch prep", blurb: "Cook once, eat well", meals: [["Breakfasts", "baked-oatmeal-squares"], ["Lunches", "slow-cooker-salsa-chicken"], ["Dinners", "chicken-burrito-bowls"]] }, { theme: "Korean pantry week", blurb: "One tub of gochujang", meals: [["Mon · Dinner", "bulgogi-beef-bowls"], ["Tue · Lunch", "kimchi-fried-rice"], ["Tue · Dinner", "dakgalbi-spicy-chicken-stir-fry"]] }, ]; const PREVIEW_SETS: PreviewSet[] = PREVIEW_THEMES.map(({ theme, blurb, meals }) => { const options = { householdSize: 2, onHandItems: PANTRY_STAPLE_IDS }; const recipe = (id: string) => { const found = RECIPES.find((r) => r.id === id); if (!found) throw new Error(`Landing preview: unknown recipe id "${id}"`); return found; }; const cart = buildGroceryList(meals.map(([, id]) => id), options); return { theme, blurb, meals: meals.map(([slot, id]) => ({ slot, title: recipe(id).title, cost: formatUsd(buildGroceryList([id], options).usedTotal) })), total: formatUsd(cart.checkoutTotal), sharedItems: cart.sharedItemCount, itemCount: cart.lines.length, }; }); const STEPS = [ { icon: RiWallet3Line, title: "Tell us your budget", body: "How much you want to spend, how many people you're feeding, and which days you're cooking. We'll do the crunching for you.", }, { icon: RiRestaurantLine, title: "Pick meals you'll love", body: "Fill the week in one tap or choose dish by dish. We only suggest recipes your kitchen can actually make.", }, { icon: RiShoppingBasket2Line, title: "Shop with one list", body: "Get a single grocery list sorted by aisle, priced the way the store really rings it up (based on averages from October 2026, Central USA).", }, ]; const FAMILY_COUNT = RECIPES.filter((r) => r.styles.includes("caydens_corner")).length; const ctaClass = "h-11 gap-1.5 rounded-xl px-5 text-body-medium"; export default function LandingPage() { return (
{/* Hero */}

Good food all week, tailored to your budget.

Plan My Meals takes the guesswork out of dinner. Build an entire week of meals around what’s already in your pantry, instantly price out missing ingredients, and explore over 400 high-quality recipes—100% free.

Plan my week Browse recipes
{/* How it works */}

Three easy steps

    {STEPS.map(({ icon: Icon, title, body }) => (
  1. {title}

    {body}

  2. ))}
{/* What's cooking */}

{RECIPES.length} recipes from {CUISINES.length} cuisines

Quick weeknight bowls, cozy weekend braises, and everything in between.

    {CUISINES.map((c) => (
  • {c.label}
  • ))}

Cayden's Corner

{FAMILY_COUNT} favorite family recipes, from holiday sides to Sunday bakes, ready to drop into your week.

Open the family cookbook
); }