'Vera Photography — Portfolio' is a fast, content‑driven single‑page site for Vera — an acclaimed French photographer working across Europe. The site highlights her work and services through an elegant hero, curated portfolio slider, pricing packages, FAQ, and a streamlined booking flow.
The project is built with TypeScript, SCSS, Nunjucks, Webpack and GitHub Actions, following the Atomic Design methodology (atoms → molecules → organisms → templates → pages). All copy, meta tags, and media configuration are centralized in src/data/pages/index.json, which is injected into Nunjucks templates at build time. The result is a maintainable, scalable, and SEO‑ready static site with high Lighthouse Perfomance Scoring (90+).
- TypeScript 5, strict typed UI logic
- Nunjucks templating via
html-bundler-webpack-plugin - SCSS with PostCSS Preset Env
- Webpack 5 toolchain (dev server, production build)
- ESLint, Stylelint, Prettier, Husky
git clone https://github.com/elrouss/portfolio.git— clone projectnpm ci— install dependenciesnpm run dev— start dev server (http://localhost:8080)
- Adaptive and responsive layout (380 px, 768 px, 1440 px+)
- Accessible header with hamburger + drawer, smooth in‑page navigation
- Custom portfolio slider
- Desktop: hover areas trigger smooth auto‑scroll with
requestAnimationFrame - Mobile & Tablet: swipe interactions
- Desktop: hover areas trigger smooth auto‑scroll with
- FAQ accordion with persisted open state (LocalStorage) and smart first‑visit default
- Pricing card list with booking dialog
- Content‑driven templating (JSON → Nunjucks) for clean separation of content and layout
- SEO‑ready meta: Open Graph + Twitter cards, favicons, theme color
- Atomic Design structure:
atoms/,molecules/,organisms/,templates/,pages/
- Responsive images (
<picture>) with WebP and multiple resolutions - Lazy media loading where supported (slider data is marked as lazy)
- Critical CSS extraction (
src/assets/styles/_critical.scss) - Minified, hashed assets for long‑term caching
- PostCSS preset env and Browserslist targeting for cross‑browser support
- Event throttling and
requestAnimationFramefor smooth, jank‑free interactions
- Semantic landmarks and headings for better screen reader navigation
- Keyboard‑friendly navigation
- ARIA attributes
- Respect for user motion preferences and clear focus styles on interactive controls
src/
assets/
styles/ # SCSS (variables, mixins, critical, themes)
images/ fonts/ icons # optimized static assets
components/
atoms/ # button, icon, input, picture, etc.
molecules/ # nav, drawer, pricing-card, etc.
organisms/ # header, hero, portfolio slider, faq, contacts
templates/ # page templates (home)
data/
pages/index.json # all page copy + meta + media config
utils/ # throttle, styles utils
services/ # local-storage, touch-device adapters
constants/ # breakpoints, transitions
npm run dev— start development servernpm run build:dev— development buildnpm run build:prod— production buildnpm run tsc— check TypeScript typesnpm run eslint/npm run eslint:fix— lint TypeScriptnpm run stylelint/npm run stylelint:fix— lint stylesnpm run prettier:check/npm run prettier— format
Hosted on GitHub Pages: https://elrouss.github.io/portfolio (see homepage in package.json).
Build with npm run build:prod and publish the dist/ folder (e.g., via CI or manual upload). CI is configured with GitHub Actions to run linting and produce artifacts on push.
ISC © 2025 Boris Zashliapin