Website for Bucharest Sculpture Days, a contemporary sculpture festival. Built with Next.js 16 (App Router), React 19, and TypeScript.
Requires Node.js >= 20.9.0 and pnpm.
pnpm install
pnpm dev # Development server on localhost:3000| Command | Description |
|---|---|
pnpm dev |
Start development server |
pnpm build |
Production build (also serves as the type-check) |
pnpm start |
Serve production build |
pnpm typecheck |
tsc --noEmit |
pnpm lint / pnpm lint:fix |
ESLint (./src) |
pnpm format / pnpm format:check |
Biome format (formatting only; linter disabled) |
pnpm images:unused |
Find unused images in public/img/ (add :json for JSON output) |
src/
app/ # App Router
editions/ # Editions index + [year]/ dynamic pages
artists/ # All-artists page
visit/ # Visit page
about/ # About page
partners/ # Partners page
press/ # Press page (media kit across editions)
layout.tsx # Root layout with <Navigation /> and <Footer />
globals.css # Design tokens
sitemap.ts, robots.ts
components/ # One folder per component (TSX + CSS Module)
data/editions/ # Static data files per festival year (2022–2025)
lib/ # Image loader, constants, hooks
types/ # Shared TypeScript types (Edition, ImageData)
scripts/ # Image-optimization utilities
docs/ # Internal specs (e.g., section-scroll-spec)
- Editions — each festival year is a data file in
src/data/editions/exporting anEditionobject. Add a year by creating the file and registering it inindex.ts. - Image system — a custom Next.js image loader appends
-{width}.{ext}to base paths at runtime. UseimageSrc()fromsrc/lib/image-utils.tsto build a src that encodes widths and extension. - Styling — CSS Modules only. Design tokens live in
src/app/globals.css; prefer semantic role tokens (--canvas,--heading,--body,--action, …) over raw--gray-*. Shared typography and section primitives are insrc/components/Shared.module.css. - Fonts — Dela Gothic One (display) and Montserrat (body), loaded via
next/font/google.