Opis projektu
Portfolio v2 to kompletny redesign mojej strony osobistej, zbudowany od zera w Next.js 16 z App Routerem. Projekt wykracza poza proste portfolio — wprowadza trzy autorskie systemy definiujace doswiadczenie uzytkownika: silnik motywow, pelna internacjonalizacja oraz interaktywny ptaszek-przewodnik.
Architektura
Aplikacja wykorzystuje App Router z grupami tras
(landing) i (main)/[lang],
Server Components do poczatkowego ladowania danych oraz
CSS Modules do izolacji stylow. Kazdy tekst jest przechowywany
w typowanych slownikach, co utrzymuje pelna tlumaczalnosc UI.
Follower System — interaktywny ptaszek-przewodnik
Animowany ptaszek podazajacy za kursorem, pelniacy role przewodnika po stronie. System jest oparty na useReducer z osmoma typami akcji sterujacymi maszyna stanow:
- Stany: spawning → following → goingToNest → inNest → despawning
- Sledzenie: pozycja myszy throttlowana co 100 ms, wygladzana przez
requestAnimationFramez konfigurowalnym easingiem - Kierunek: automatyczne odbicie lewo/prawo na podstawie wektora ruchu
- Sprite'y:
bird-fly.gif(lot) ibird-idle.gif(spoczynek)
Komponenty sa rozdzielone na Spawn (punkt wejscia +
wiadomosc powitalna), Follower (petla animacji) i
Nest (pozycja domowa z wiadomosciami).
FollowerProvider opakowuje glowny layout, dzieki czemu
kazda strona ma dostep do kontekstu ptaszka.
Theme System — jasny / ciemny z persistencja
W pelni autorski silnik motywow oparty na React Context z priorytetowym lancuchem rozwiazywania:
- Parametr URL (
?mode=light) - Wartosc localStorage
- Preferencja systemowa (
prefers-color-scheme) - Fallback z ciasteczka po stronie serwera (SSR)
Inline'owy ThemeScript wykonuje sie przed hydracja
Reacta, zapobiegajac blysnieciu nieostylowanej tresci (FOUC).
Wybrany motyw jest zapisywany zarowno w localStorage,
jak i w ciasteczku, dzieki czemu serwer renderuje wlasciwa
palete juz przy pierwszej odpowiedzi.
Zmienne CSS przelaczaja miedzy dwoma paletami: ciemna (granat #0b1e3d) i jasna (zielen #10b981), kazda z opcjonalnym wariantem o wysokim kontrascie.
i18n System — pelna dwujezycznosc PL / EN
Kazdy string w aplikacji jest opakowany typem Localized<T>, gwarantujacym bezpieczenstwo kompilacyjne dla obu jezykow. System sklada sie z:
- Middleware — odczytuje
Accept-Languagei przekierowuje na/pllub/en - Warstwa slownikow — oddzielne moduly dla
common,navigation,sectionsi poszczegolnych stron, ladowane zReact.cache - Rewrite URL —
next.config.tsmapuje polskie slugi na wewnetrzne angielskie trasy - SEO —
hreflanggenerowane per strona, dwujezyczne metadane OpenGraph
Podejscie slownikowe trzyma tlumaczenia blisko funkcjonalnosci,
ktorej dotycza, a generyk Localized uniemozliwia
pomiecie tlumaczenia na poziomie typow.
Pozostale wyrozniki
- Paralaksa hero — warstwowe SVG gor, mgly i chmur animowane przy scrollu
- Formularz kontaktowy — server action z walidacja, dwujezyczne komunikaty bledow
- Filtrowanie projektow — po statusie, kategorii i technologii z logika AND/OR
- Rekomendacje — dwujezyczne referencje PDF
- SEO — per-projektowe meta, hreflang, OpenGraph, kanoniczny URL
