Personal portfolio site built with Next.js, Tailwind, and Storybook to showcase my freelance React/Node.js developer activity.
The site is a localized (English + French) Next.js application with a lightweight design system, animated interactions, and a modular component library that powers the hero, project cards, testimonials, and contact flows. It also exposes each component story in Storybook so interactions can be previewed alongside the Next.js pages.
- Light / dark theming powered by DaisyUI tokens and global gradients/backgrounds.
- Storybook stories for atoms, molecules, and organisms so each UI building block can be inspected in isolation.
- Contact form with Mailjet + reCAPTCHA protection.
- Internationalized content served via
next-intlwith message files for English and French undermessages/*. - Accessibility-minded buttons, gradients, and glassmorphism treatments across cards, hero, and call-to-action sections.
- Next.js 16 (App Router) & React 19
- Tailwind CSS 4 + DaisyUI for theming helpers
- Storybook 10 for component demos
next-intlfor localization- Mailjet +
react-google-recaptchafor inbound form handling - Biome for linting + formatting
- Sonner for toast notifications
- Node >= 24 (matches the
.nvmrc/workflow tooling) pnpm>= 10 (required by theenginesfield)
pnpm installpnpm devRuns the Next.js app locally on port 3055. Open http://localhost:3055 in your browser after the server starts.
pnpm storybookStarts Storybook on port 6007 so atoms, molecules, and organisms can be reviewed independently of the shell app.
pnpm build
pnpm startBuilds the optimized production bundle and starts the Next.js server.
pnpm lint: runs Biome to catch formatting and static analysis issues.pnpm lint:fix: lets Biome rewrite formatting and import order automatically.pnpm i18n-check: validates the localized message files used bynext-intl.
src/app: Next.js App Router entries, global CSS, and manifest/SEO helpers.src/app/components: atomic/molecular/organism UI primitives (GlassCard, Hero, Contact, etc.).src/app/lib: shared constants, routes, and the customNextIntlProvider.messages: English (en/) and French (fr/) JSON blobs that power navigation, projects, testimonials, and testimonials.public: static assets, including flags and site imagery used by cards.
The app loads translations via next-intl using the messages/* files. The ThemeSwitcher toolbar in Storybook and the global CSS gradients (grid for light mode, glow accents for buttons) keep both themes synchronized.
- Follow the component patterns under
src/app/components/*when adding new cards or sections. - Storybook stories live next to each component to make visual regression easy.
- If you touch localization keys, run
pnpm i18n-checkbefore committing. - Husky hooks (via
pnpm prepare) ensure Biome runs on staged files.
MIT © Adrien Guesnel