Personal site built as an editorial portfolio for John Herrera.
The project presents two practices under one signature: premium culinary direction and digital product craft from Medellin, Colombia.
- Next.js 16.2.1 (App Router, React Compiler)
- React 19 with Server Components + Client Component islands
- TypeScript (strict mode)
- Tailwind CSS 4
- Lucide React (single icon library)
npm install
npm run devOpen http://localhost:3000.
- Premium editorial reading over explicit "tech UI" treatment
- Black base, lime/cyan/blue section tones, grain overlay,
backdrop-blur-xl font-headlinefor expressive section titles andfont-monofor data, labels, and body copy- Shared section chrome and intro heroes so internal pages echo the home without duplicating it
Set these optional environment variables to enable Google tracking globally:
NEXT_PUBLIC_GTM_ID=GTM-XXXXXXX
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXXNEXT_PUBLIC_GTM_ID: enables Google Tag ManagerNEXT_PUBLIC_GA_ID: enables direct GA4 installation- If your GA4 property is already firing through GTM, leave
NEXT_PUBLIC_GA_IDempty to avoid duplicate page views.
npm run lint
npm run build
npm start/— minimal hero statement and brand entry point/works— editorial intro + chapter split for gastronomy and digital work/about— editorial intro + profile section/contact— large-format email CTA and social links
PageIntroHero.tsxprovides the shared editorial hero used onworksandaboutSectionChrome.tsxhandles section index, label, meta, and the shared CTA treatmentGastronomySection.tsxis now a restrained image-led grid with hover response, not a glitch-heavy feature blockDevelopmentSection.tsxusesWorksList.tsxfor a cleaner editorial project listContactSection.tsxfocuses on the email lockup and social linksprimitive.tsxcontainsSectionPrimitive,CardPrimitive, andcx()
page.tsxremains a Server Component- Internal pages reuse the same visual grammar through shared primitives instead of cloning layouts
- Interactive pieces stay isolated as Client Components and are composed through
ErrorBoundary - OG imagery is generated dynamically in
opengraph-image.tsx - Background terminal stays off on mobile and motion respects
prefers-reduced-motion
See CONTEXT.md for a comprehensive AI-readable reference covering architecture, visual system, narrative flow, component conventions, and performance decisions.
- This is a portfolio/marketing site, not a reusable package
- Analytics env vars are optional
- Domain: johnherrerachef.com