Case study

Portfolio dla malarki olejnej

Minimalistyczna przestrzeń, gdzie obrazy mówią same za siebie — bez tłoku, bez dekoratywnych nadmiarów. Strona zaprojektowana pod artystkę, nie pod algorytm.

Wszystkie realizacje
Portfolio artystyczne2026Next.js 16 · Tailwind v4 · WebP

Wyzwanie

Z czym przyszedł klient

Alina Hus maluje powoli, warstwami — pejzaże Wisły, Stare Miasto, cykle emocjonalne. Portfolio miało oddać tę samą poetykę: przestrzeń, spokój, skupienie na obrazie. Problem z portfolio artystycznych stron: albo są zbyt generyczne (WordPress + Elementor = każdy), albo przesadnie ozdobne (efekty zasłaniają dzieła). Wymóg twardy: obrazy muszą wyglądać jak obrazy — pełnoekranowy lightbox z zoom, precyzyjne kadrowanie w miniaturach bez obcinania kompozycji, bardzo szybki czas ładowania żeby artysta mógł pokazywać stronę z telefonu na targach.

Podejście

Jak to rozwiązaliśmy

Next.js 16 z App Routerem i static exportem (output: 'export') — zero runtime serwera, deploy na Cloudflare Pages. Tailwind CSS v4 z @theme {} dla spójnego systemu kolorów (ink/paper/ash/slate/mist). Galeria oparta na yet-another-react-lightbox z pluginami Zoom + Captions — biały lightbox zamiast domyślnego czarnego (CSS custom properties YARL). Obrazy przetworzone przez Pillow: PNG → WebP, pełne 1400px/q85 + thumbnails orientacyjne (640px landscape / 400px portrait). Hero z najważniejszą pracą (Wisła II, 100×140cm) — responsywne srcset 1100w/1400w + imagesrcset na preloadzie w postbuild.mjs, dzięki czemu mobile pobiera 28 KB zamiast 101 KB. Schema.org Person wstrzyknięty przez postbuild do każdego HTML. PSI 91 mobile (bottleneck: React runtime = 27 KB nieusuwalnych, TBT 30ms, CLS 0).

Rezultaty

Co udało się osiągnąć

PSI 91

mobile — bottleneck: React runtime (unavoidable)

28 KB

hero image na mobile (było 101 KB)

CLS 0

zero przesunięć layoutu

TBT 30ms

Total Blocking Time

Zakres prac

Co zbudowaliśmy

Galeria z lightboxem + zoom

yet-another-react-lightbox z Zoom + Captions. Biały motyw przez CSS custom properties. Każdy obraz z tytułem, rokiem, techniką i rozmiarem pod spodem.

Responsywne obrazy WebP

Pillow: PNG → WebP, orientacyjne thumbnails (640px landscape / 400px portrait). Hero z srcset 28 KB / 101 KB — mobile pobiera 3.5× mniej.

Trzy cykle twórcze

Pejzaże polskie / Tożsamość / Varia — każdy z własną podstroną /prace/[slug] generowaną statycznie z gallery-data.ts.

postbuild.mjs — static optimizations

Polyfill stripping, CSS inline, LCP preload z imagesrcset/imagesizes, Schema.org Person injection. Brak runtime serwera.

Tailwind v4 design system

@theme {} z tokenami ink/paper/ash/mist. WCAG AA kontrast (slate #706C69, 4.9:1). Playfair Display + Inter.

SEO full stack

Canonical, sitemap.xml, robots.txt, llms.txt, favicon SVG, meta title 50-60 znaków, description 120-160 znaków, Schema.org Person.

Stack technologiczny

Z czego jest zbudowane

Next.js 16 (App Router)TypeScriptTailwind CSS v4yet-another-react-lightboxPillow (WebP processing)Cloudflare PagesSchema.org JSON-LD

Czas realizacji

ok. tydzień

Twój projekt może być następny. Wyślij brief — przygotujemy konkretną propozycję w jeden dzień roboczy.

Wyceń podobny projekt

Twój projekt może być następny

Masz pomysł? Zrealizujemy go.

Niezależnie czy potrzebujesz nowej strony, sklepu czy modernizacji — wyślij brief i porozmawiajmy.