import { CalendarDays, HeartPulse, Sparkles, Users } from "lucide-react"; import type { ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import "./landing-page.scss"; /** * Public marketing page shown at `/` to a logged-out visitor (see * `RequireAuth` for how it's wired in without touching the route table). * All copy comes from i18next under the `landing.*` namespace — no * hardcoded JSX text, same convention as every other page. * * Deliberately dependency-free for visuals: the hero illustration is an * inline stroke-drawn SVG in the same visual language as `lucide-react` * (the icon set already used everywhere), not an imported illustration * library or an external asset — same choice `TechStepCorrectionPopover` * made for its own hand-drawn icons. The three preview images are real * app screenshots served statically from `public/landing/` (see that * folder's README); a missing file just falls back to its `alt` text and * never breaks the build. */ export function LandingPage() { const { t } = useTranslation(); const features: { icon: ReactNode; key: "planning" | "import" | "health" | "household" }[] = [ { icon: , key: "planning" }, { icon: , key: "import" }, { icon: , key: "health" }, { icon: , key: "household" }, ]; const shots: { src: string; key: "planning" | "recipe" | "cookingSession" }[] = [ { src: "/landing/planning.png", key: "planning" }, { src: "/landing/recipe.png", key: "recipe" }, { src: "/landing/cooking-session.png", key: "cookingSession" }, ]; return (

batchCooking

{t("landing.hero.title")}

{t("landing.hero.lede")}

{t("landing.hero.ctaSignup")} {t("landing.hero.ctaLogin")}

{t("landing.features.title")}

    {features.map(({ icon, key }) => (
  • {icon}

    {t(`landing.features.${key}.title`)}

    {t(`landing.features.${key}.body`)}

  • ))}

{t("landing.preview.title")}

{shots.map(({ src, key }) => (
{t(`landing.preview.${key}Alt`)}
{t(`landing.preview.${key}Caption`)}
))}

{t("landing.finalCta.title")}

{t("landing.finalCta.button")}
); } /** * Hero illustration — a week grid with a simmering pot, drawn in the same * 2px round-stroke `currentColor` language as the lucide icon set so it * sits visually with the rest of the app. No external asset. */ function HeroIllustration() { return ( {/* week grid */} {/* a couple of "planned" chips */} {/* simmering pot, front-right */} ); }