Stronę da się dziś zrobić z AI w kilka minut, tylko że model, któremu nikt nie powiedział, jak ma wyglądać, bierze to, co widział najczęściej. Dlatego tyle stron z AI ma ten sam krój i te same zaokrąglone kafelki na fioletowym tle.
Tu jest osiem stylów i do każdego przepis dla agenta. Przepis zmienia wygląd strony, którą już masz, i zostawia jej treść słowo w słowo. Jeśli strony jeszcze nie masz, agent zbuduje ją od razu w wybranym stylu.
Przepisy to jeden wycinek pracy z AI. Całego warsztatu, od budowania wizerunku marki przez zdjęcia i filmy AI po strony i pracę z klientami jako freelancer, uczę w kursie.
Jak z nich korzystać
- Agent. Otwórz Claude Code, Codexa albo innego agenta, który ma dostęp do plików twojej strony.
- Przepis. Skopiuj przepis wybranego stylu albo pobierz plik i daj go agentowi z jednym zdaniem: przebudowujesz stronę czy robisz nową.
- Plan. Agent najpierw napisze, co zmieni, i poczeka na zgodę, a po pracy pokaże porównanie tekstu przed i po, w którym nie może być różnic.
- Szkic. Przepis to szkic stylu i nie trzeba się go trzymać sztywno. Kolory i kroje możesz zmieniać wedle uznania, wystarczy napisać agentowi, co chcesz mieć inaczej.
Klinika
Do gabinetów i kancelarii.
Kremowe tło, głęboka śliwka w pasach u góry i u dołu, jeden cienki krój szeryfowy z kursywą i usługi w rozwijanych wierszach z cienkim plusem.
KrojeNewsreader · Archivo
# Przepis na styl KLINIKA
Styl do stron gabinetów lekarskich, klinik, kancelarii i biur rachunkowych, czyli tam, gdzie klient musi najpierw zaufać, a dopiero potem się umówić. Kremowe tło, głęboka śliwka w pasach u góry i u dołu strony, jeden cienki krój szeryfowy z kursywą i usługi w rozwijanych wierszach z cienkim plusem.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
Strona ma wyglądać jak papier firmowy dobrej kancelarii: kremowe tło, jeden ciemny kolor i duże, bardzo cienkie litery. Cała strona stoi na jednym kroju szeryfowym, od menu po formularz. Mocne miejsca są tylko trzy: pasy w kolorze śliwki u góry i u dołu, ogromny nagłówek z kursywą w hero i znak firmy z paskiem z czterech odcinków pod nazwą. Reszta jest cicha. Zaufanie budują konkrety (nazwiska, ceny, godziny, numery wpisów), więc styl podaje je w tabelach z cienkimi liniami, a nie w kartach.
## Kroje
- Wszystko, co się czyta: **Newsreader** z osią rozmiaru optycznego (`font-optical-sizing: auto`). Nagłówki mają wagę 200, tekst, menu i przyciski 300, wartości w tabelach 400. Kursywa 200 w nagłówkach według zasady z części „Typografia”.
- Nazwa firmy w nawigacji i w stopce (kiedy strona nie ma logo w pliku) oraz małe etykiety sekcji: **Archivo** w szerokości 125 % (`font-stretch: 125%`, plik zmienny z osią wdth), waga 500, wersaliki. Archivo nie pojawia się nigdzie indziej.
- Dane firmy drobnym drukiem pod stopką (NIP, KRS, siedziba, dopiski prawne): krój systemowy `Helvetica, Arial, sans-serif`, 12 px. To jedyne miejsce bez szeryfu i ma wyglądać jak stopka urzędowego pisma.
- Ceny, godziny i numery: `font-variant-numeric: lining-nums tabular-nums`.
## Kolory
```css
:root {
--krem: #f6f2ef; /* główne tło strony */
--bez: #eeeae4; /* sekcja z listą usług, cennik, pas z danymi firmy */
--bez-2: #dbd5cb; /* rozwinięty wiersz listy, panel w miejscu brakującego zdjęcia */
--biel: #ffffff; /* jedna sekcja z ciemnym zdjęciem */
--sliwka: #2d012b; /* pas górny, pas pod hero, stopka, przycisk główny, H1 */
--wrzos: #b8a7b1; /* pas kontaktu, drugorzędny tekst na śliwce */
--fiolet: #7f4666; /* numery sekcji */
--tekst: #14080f;
--tekst-2: #5e4a58; /* opisy, podpisy, nazwy w tabelach, etykiety */
--linia: #d3c8cc; /* linie w tabelach i pod nawigacją */
}
```
Pasek pod znakiem firmy ma cztery równe odcinki w kolorach `#9b7b8f`, `#7f4666`, `#7f2e57` i `#4a0e4c`, od lewej. Na śliwce tekst ma kolor `--krem`, a drugorzędny `--wrzos`. Śliwka to jedyny mocny kolor na stronie: duże powierzchnie w niej mają tylko pas górny, pas pod hero i stopka. Kolor `#7c2343` pojawia się wyłącznie jako warstwa przy najechaniu na przycisk główny.
## Siatka i odstępy
- 12 kolumn, treść najwyżej 1280 px szerokości, odstęp między kolumnami 24 px, margines boczny 80 px od 1200 px szerokości okna, 48 px na tablecie i 22 px na telefonie.
- Sekcje oddziela zmiana tła, a nie linia: krem, beż, krem, biel i tak dalej. Tylko dwie sąsiednie sekcje na tym samym tle oddziela linia 1 px `--linia` na całą szerokość okna.
- Odstęp w sekcji: 128 px u góry i na dole na laptopie, 80 px na telefonie.
- Każda sekcja zaczyna się etykietą z numerem i nazwą („01 Zabiegi”), a pod nią stoi nagłówek. Etykieta i nagłówek zajmują kolumny 1–9, treść stoi pod nimi na całej szerokości albo w układzie opisanym przy elemencie.
## Typografia
- H1: `clamp(50px, 7.2vw, 108px)`, waga 200, interlinia 1.02, odstęp liter −0.02em, kolor `--sliwka`, wyśrodkowany.
- H2: `clamp(38px, 4.6vw, 68px)`, waga 200, interlinia 1.06, odstęp liter −0.015em.
- H3: w liście usług `clamp(28px, 3.3vw, 48px)`, w zespole 26 px, waga 200.
- Tekst: 19 px, waga 300, interlinia 1.55, akapit najwyżej 60 znaków szerokości.
- Akapit w pasie pod hero: `clamp(22px, 2.2vw, 31px)`, waga 300, interlinia 1.38, wyśrodkowany, najwyżej 36 em szerokości.
- Etykiety: Archivo 500, szerokość 125 %, 11 px, wersaliki, odstęp liter 0.16em, kolor `--tekst-2`, numer sekcji w `--fiolet`.
- Kursywa: w H1 kursywą idzie słowo albo fragment, który treść już wyróżnia, i stoi w osobnym wierszu. Jeśli w H1 nic nie jest wyróżnione, kursywą idzie druga część nagłówka (po przecinku albo po „i”) i zaczyna nowy wiersz. W H2 sekcji ze zdjęciem obok kursywą idzie druga część zdania, jeśli zdanie ma dwie części. Gdzie indziej kursywy nie ma, a słowa zostają te same.
## Elementy
- **Pas górny:** na ekranie pierwszy element strony, tło `--sliwka`, wysokość 72 px na laptopie i 56 px na telefonie, przewija się razem ze stroną. Po prawej stoi przycisk do umówienia wizyty (ten sam, który był w nawigacji) jako sam tekst w kolorze `--krem`, Newsreader 300 24 px, na telefonie 18 px, z długą strzałką. Nic więcej w pasie nie ma. W kodzie pas zostaje w elemencie nawigacji, za linkami, czyli tam, gdzie przycisk był wcześniej, a nad nawigację przenosi go CSS (`display: flex; flex-direction: column` na nawigacji i `order: -1` na pasie). Nawigacja przykleja się wtedy z `top` równym minus wysokości pasa, więc pas wyjeżdża za ekran, a nawigacja zostaje. Dzięki temu kolejność tekstu na stronie się nie zmienia.
- **Nawigacja:** pod pasem górnym, tło `--krem`, wysokość 96 px na laptopie i 72 px na telefonie. Przykleja się do góry przy przewijaniu i dostaje wtedy linię 1 px `--linia` na dole, bez cienia i bez rozmycia. Po lewej znak firmy, po prawej linki Newsreader 300 18 px co 36 px, podkreślenie 1 px pojawia się po najechaniu. Poniżej 1100 px zamiast linków stoi ikona menu: trzy poziome kreski 1,5 px, dwie po 26 px i dolna 18 px, wyrównane do prawej. Jeśli przycisk menu miał napis, napis zostaje w przycisku ukryty wizualnie (jako jego nazwa dla czytników ekranu), a widać ikonę.
- **Znak firmy:** nazwa wersalikami w Archivo 500 125 %, 21 px na laptopie i 16 px na telefonie, odstęp liter 0.14em. Pod nią pasek wysoki na 4 px z czterech odcinków, który zaczyna się 0,8 em przed nazwą i kończy 0,8 em za nią, 14 px pod literami (12 px na telefonie). Jeśli strona ma logo w pliku, logo zostaje bez zmian, a pasek stoi pod nim tak samo.
- **Strzałka:** długa i cienka: linia 30 px i grot z dwóch kresek po 7 px, grubość 1,25 px, w kolorze tekstu obok. Ta sama w przyciskach, w pasie górnym i w menu. Po najechaniu przesuwa się o 4 px w prawo. Jeśli w tekście przycisku stoi znak „→”, zostaje w kodzie, a zamiast niego widać tę strzałkę, rysowaną maską SVG na tym znaku.
- **Przyciski:** prostokąt bez zaokrągleń, wysokość 56 px, odstęp 0 28 px, Newsreader 400 18 px, strzałka 14 px za tekstem. Główny ma tło `--sliwka` i napis `--krem`, a po najechaniu nad tłem pojawia się warstwa `#7c2343` (przejrzystość od 0 do 1). Na tle `--sliwka` główny ma odwrócone kolory: tło `--krem`, napis `--sliwka`, warstwa po najechaniu `#ffffff`. Drugi przycisk to sam tekst z podkreśleniem 1 px odsuniętym o 6 px, bez ramki.
- **Hero:** trzy części jedna pod drugą. Najpierw na kremie etykieta i H1, wyśrodkowane, z odstępem 80 px u góry i na dole (64 px na telefonie), tak żeby w pierwszym ekranie laptopa było już widać górę zdjęcia. Potem zdjęcie na całą szerokość okna, bez marginesów, w proporcji 21:9 na laptopie i 4:5 na telefonie. Na końcu pas `--sliwka` z akapitem, przyciskami, informacją „dziś przyjmujemy” i faktami, wszystko wyśrodkowane, odstęp 112 px u góry i na dole (72 px na telefonie). Fakty stoją w rzędzie trzech kolumn oddzielonych pionową linią 1 px `--wrzos` o przejrzystości .35: liczba w Newsreader 200 `clamp(44px, 5vw, 76px)` w kolorze `--krem`, pod nią podpis Newsreader 300 16 px w `--wrzos`. Informacja „dziś przyjmujemy” ma przed sobą kropkę 7 px w `--wrzos`. Bez zdjęcia w hero zostają pierwsza i trzecia część.
- **Lista usług:** sekcja na tle `--bez`. Każda usługa to wiersz z nazwą jako H3 po lewej i plusem po prawej: dwie kreski 1 px, 44 na 44 px. Między wierszami nie ma linii, tylko odstęp 30 px u góry i na dole wiersza. Kliknięcie w wiersz rozwija opis (Newsreader 300 `clamp(20px, 1.9vw, 27px)`, najwyżej 52 znaki szerokości), wiersz dostaje tło `--bez-2` na całą szerokość okna, a pionowa kreska plusa znika i zostaje minus. Otwarty jest jeden wiersz naraz, na starcie pierwszy. Nazwa usługi jest przyciskiem z `aria-expanded`, a bez JavaScriptu wszystkie opisy są widoczne.
- **Zdjęcie i opis obok siebie:** zdjęcie w kolumnach 1–5 w proporcji 4:5, opis w kolumnach 7–12, a w kolejnej takiej sekcji strony się zamieniają. Pod opisem tabela faktów: nazwa po lewej w `--tekst-2`, wartość po prawej w `--tekst` i wadze 400, linia 1 px `--linia` między wierszami.
- **Zespół:** trzy kolumny, nazwisko jako H3 26 px, pod nim specjalizacja w `--tekst-2`, a numer prawa wykonywania zawodu albo numer wpisu na listę w Archivo 500 125 %, 11 px, wersalikami. Linia 1 px `--linia` nad każdą osobą.
- **Cennik:** sekcja na tle `--bez`, tabela zamiast kart. Nazwa usługi Newsreader 300 24 px, opis pod nią 16 px w `--tekst-2`, cena po prawej Newsreader 300 26 px, wyrównana do prawej, z cyframi tabelarycznymi. Wiersz ma co najmniej 84 px wysokości i linię 1 px na dole.
- **Certyfikaty i członkostwa:** „pieczęcie” z samego tekstu: nazwa w Archivo 500 125 %, 10,5 px, wersalikami, w ramce 1 px `--tekst-2`, a pod ramką rok w Newsreader 300 15 px. Bez kolorowych logotypów.
- **Kontakt:** sekcja zaczyna się pasem `--wrzos` na całą szerokość okna, w którym stoją etykieta, H2 i akapit. Na wrzosie etykieta, numer i nagłówek mają kolor `--sliwka`, a akapit `--tekst`, bo `--tekst-2` i `--fiolet` mają na nim za mały kontrast. Po prawej stronie pasa stoi długa cienka strzałka skierowana w dół (48 px), która pokazuje formularz. Formularz i godziny stoją pod pasem na tle `--krem`.
- **Formularz:** pola z samą dolną linią 1 px `--tekst-2`, etykieta nad polem Newsreader 300 15 px, wpisany tekst 19 px. Przy aktywnym polu linia robi się 2 px w kolorze `--sliwka`. Błąd pola pokazujesz kolorem `#a2412f`. Bez zaokrągleń i bez tła pól.
- **Stopka:** tło `--sliwka`, tekst `--krem`. Po lewej znak firmy w `--krem` (pasek zostaje w swoich kolorach), obok w dwóch kolumnach adres i kontakt Newsreader 300 19 px. Pod stopką pas `--bez` z danymi firmy drobnym drukiem w kroju systemowym. Godzin, które stoją już w kontakcie, stopka nie powtarza.
- **Menu na telefonie:** panel wysuwany z prawej, szeroki na `min(420px, 88vw)`, tło `--krem`. Linki Newsreader 300 32 px jeden pod drugim, zamknięcie to cienki krzyżyk 22 px w prawym górnym rogu. Na dole panelu blok `--sliwka` z przyciskiem do umówienia wizyty. Strona pod panelem dostaje warstwę `--wrzos` o przejrzystości .55, a Escape i kliknięcie w warstwę zamykają menu.
## Zdjęcia
- Naturalne światło z okna i ciepłe złamane biele: rozmowa z lekarzem przy stole, dłonie przy badaniu, wnętrze gabinetu. Bez uśmiechniętych modelek ze stocku i bez zbliżeń skóry jak z reklamy kremu.
- Bez zaokrągleń i kształtów. Na wszystkie zdjęcia nakładasz ten sam filtr `filter: saturate(.92) contrast(1.02)`, żeby zdjęcia z różnych źródeł wyglądały jak z jednej sesji.
- Jedno ciemne zdjęcie, na przykład portret na czarnym tle, może stać w sekcji na tle `--biel` jako kontrapunkt.
- Gdy zdjęcia brakuje, w jego miejscu stoi panel `--bez-2` z numerem sekcji w Newsreader 200 kursywą, wysokim na połowę panelu.
## Ruch
Ruch jest spokojny i nigdy nie przeszkadza w czytaniu.
- Nagłówki wchodzą wierszami przy pierwszym pojawieniu się na ekranie: z 14 px niżej i od przejrzystości 0 do 1, 800 ms, `cubic-bezier(.2, .7, .2, 1)`, kolejne wiersze nagłówków, tabel i list z opóźnieniem 70 ms. Akapity wchodzą w całości.
- Pasek pod znakiem firmy po wczytaniu strony rysuje się od lewej odcinek po odcinku (skala w poziomie od 0 do 1, 500 ms na odcinek, kolejne co 90 ms).
- Zdjęcia odsłaniają się od dołu maską: `clip-path: inset(100% 0 0 0)` do `inset(0)`, 1200 ms, a zdjęcie w hero w tym samym czasie przechodzi ze skali 1.06 do 1.
- Rozwijany wiersz listy usług: wysokość opisu przez `grid-template-rows` od `0fr` do `1fr`, 500 ms, ta sama krzywa, a pionowa kreska plusa skaluje się do zera w 300 ms.
- Liczby w pasie pod hero przy pierwszym wejściu odliczają od zera do swojej wartości w 900 ms. Lata (rok otwarcia) nie odliczają, tylko wchodzą jak tekst.
- Bez paralaksy, bez ruchu za kursorem i bez animacji w pętli. Wejścia uruchamia `IntersectionObserver`, a animujesz tylko `transform`, `opacity`, `clip-path` i wysokość rozwijanego opisu.
## Telefon
- Pas górny 56 px, nawigacja 72 px ze znakiem po lewej i ikoną menu po prawej.
- Hero: H1 wyśrodkowany, od 50 px, zdjęcie na całą szerokość w proporcji 4:5, w pasie pod hero przyciski jeden pod drugim na całą szerokość, a fakty po dwa w rzędzie (trzeci pod nimi na całą szerokość).
- Lista usług: plus 32 na 32 px, nazwy od 28 px, odstęp w wierszu 26 px.
- Pieczęcie jedna pod drugą, bo szeroki krój w dwóch wąskich kolumnach łamie długie słowa.
- Cennik zostaje tabelą: nazwa i opis po lewej, cena po prawej, bez przewijania w bok.
- Kiedy hero zniknie z ekranu, przycisk do umówienia wizyty przykleja się do dołu ekranu na całą szerokość (56 px, tło `--sliwka`), a chowa się, kiedy na ekranie jest formularz.
## Czego nie robić
- Gradientów, cieni, rozmytych teł i szkła.
- Zaokrąglonych rogów, przycisków w kształcie pastylki i kolorowych kart.
- Ikon w kółkach, emoji i ilustracji ze stetoskopami.
- Drugiego mocnego koloru obok śliwki, „medycznego” błękitu #007bff i jaskrawej zieleni.
- Krojów Inter, Roboto, Poppins i Montserrat oraz grubych nagłówków: najgrubsza waga na stronie to Newsreader 400.
- Karuzel z opiniami.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Wszystkie ceny w cenniku stoją w jednej równej kolumnie po prawej.
- Pas górny i stopka mają tło `--sliwka`, a poza pasem pod hero nie ma na stronie innych dużych powierzchni w tym kolorze.
- Wiersze listy usług rozwijają się z klawiatury (Enter i spacja), a bez JavaScriptu wszystkie opisy są widoczne.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-klinika.md. Jak zbudować markę, którą da się poznać nawet bez logo, opowiadam w lekcji o brandingu.
Bistro
Do kawiarni i piekarni.
Nazwa lokalu na całą szerokość ekranu, sekcje w kolorze masła i cały tekst w kobalcie zamiast czerni, a menu złożone jak papierowa karta.
KrojeGloock · Familjen Grotesk
# Przepis na styl BISTRO
Styl do stron kawiarni, piekarni, bistro i restauracji. Nazwa lokalu na całą szerokość ekranu, kremowe tło, sekcje w kolorze masła i cały tekst w kobalcie zamiast czerni, a menu złożone jak papierowa karta, z kropkami między daniem a ceną.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
Strona ma wyglądać jak szyld i karta dobrego lokalu: pewna siebie, apetyczna i czytelna z daleka. Całą robotę robią trzy kolory i jeden krój o dużym kontraście kreski. Menu jest najważniejszą częścią strony, więc czyta się je jak papierową kartę: nazwa, opis, cena i nic więcej.
## Kroje
- Nagłówki, nazwa lokalu i nazwy dań: **Gloock**, waga 400. Przy bardzo dużych stopniach odstęp liter −0.02em.
- Tekst, opisy, nawigacja, przyciski i etykiety: **Familjen Grotesk**, wagi 400 i 600.
## Kolory
```css
:root {
--krem: #fff7e3; /* tło główne */
--maslo: #f5d46a; /* pełne sekcje */
--kobalt: #1f33c7; /* CAŁY tekst, linie i przyciski */
--kobalt-2: rgba(31, 51, 199, .76); /* opisy dań i podpisy na kremie; na maśle pełny kobalt */
}
```
Na stronie nie ma czerni ani szarości. Tekst, linie, obramowania i drobne znaki są kobaltowe. Sekcje idą na przemian: krem, masło, krem. Hero i menu mogą razem tworzyć jedną kremową strefę. Rezerwacja i stopka mogą tworzyć na dole jeden kobaltowy blok z tekstem w kolorze kremu.
## Siatka i odstępy
- Treść najwyżej 1400 px szerokości, margines boczny 48 px na laptopie i 20 px na telefonie.
- Odstęp w sekcji: 110 px u góry i na dole na laptopie, 64 px na telefonie.
- Między sekcją kremową a maślaną nie ma linii ani fal, tylko prosta krawędź koloru.
## Typografia
- Nazwa lokalu w hero: Gloock tak duży, żeby słowo zajęło całą szerokość treści, interlinia 0.86. Rozmiar wynika z długości słowa i liczysz go skryptem z obrysu liter, a nie z ich szerokości w składzie, bo na przykład M w Gloock wystaje w lewo i nazwa nie stanęłaby równo z marginesem. Nazwa nie łamie się na dwa wiersze.
- H2: `clamp(44px, 6vw, 104px)`, interlinia 0.95.
- Nazwy dań: Gloock 26 px na laptopie, 22 px na telefonie.
- Tekst: Familjen Grotesk 18 px, interlinia 1.55. Opisy dań 15 px w kolorze `--kobalt-2`.
- Etykiety: Familjen Grotesk 600, 12 px, wersaliki, odstęp liter 0.12em.
## Elementy
- **Pasek godzin:** nad nawigacją, wysoki na 36 px, tło `--kobalt`, napis w kolorze kremu. Mówi, czy lokal jest teraz otwarty, na podstawie godzin z treści strony i bieżącej godziny w strefie Europe/Warsaw, na przykład „Otwarte do 16:00”, „Otwieramy dziś o 8:30” albo „Otwieramy jutro o 7:30”.
- **Nawigacja:** przyklejona u góry, na kremowym tle, nazwa lokalu po lewej w Gloock 24 px, linki w Familjen 16 px, po prawej przycisk rezerwacji.
- **Przyciski:** prostokąt bez zaokrągleń, obramowanie 1.5 px `--kobalt`, kobaltowy napis, wysokość 50 px. Po najechaniu tło wypełnia się kobaltem od dołu do góry w 220 ms, a napis zmienia kolor na krem.
- **Hero:** nazwa lokalu na całą szerokość, pod nią w dwóch kolumnach krótki opis lokalu oraz adres z godzinami, niżej zdjęcie na całą szerokość treści w proporcji 16:9.
- **Menu:** jedna długa karta, a kategorie jako tekstowe zakładki w rzędzie (Gloock 22 px), które przewijają do kategorii i podkreślają linią 2 px tę, którą akurat widać. Każda pozycja to wiersz: nazwa dania po lewej, cena po prawej, a między nimi kropkowana linia (1.5 px, kropki) na wysokości linii pisma ostatniego wiersza nazwy. Najpewniej zrobić ją pseudoelementem za nazwą w kontenerze z `overflow: hidden`, wyrównanym do ostatniej linii pisma, bo kropki z `border-bottom` na osobnym elemencie psują się przy nazwie w dwóch wierszach. Opis dania pod nazwą. Przy daniach wegetariańskich mała litera „V” w kółku z linii 1 px, bez kolorowych ikonek.
- **Zdjęcia w menu:** na laptopie obok listy stoi jedna ramka ze zdjęciem (4:5, przyklejona przy przewijaniu), która pokazuje zdjęcie dania najbliższego środkowi ekranu albo tego, nad którym jest kursor. Na telefonie zdjęcia stoją w liście, nad nazwą dania, w proporcji 3:2, a dania bez zdjęcia stoją bez pola zastępczego.
- **Danie sezonu:** sekcja w kolorze masła z dużym zdjęciem po jednej stronie i nazwą dania w Gloock `clamp(48px, 7vw, 120px)` po drugiej.
- **Godziny i adres:** duża tabela w Gloock 28 px, dni po lewej, godziny po prawej, dzisiejszy dzień podkreślony.
- **Stopka:** tło kobaltowe, nazwa lokalu w kolorze kremu na całą szerokość, jak w hero.
## Zdjęcia
- Ciepłe, jasne zdjęcia jedzenia i wnętrza, bez filtrów i winiet, z prostymi rogami.
- Jedzenie z bliska, jedno danie w kadrze. Zdjęcia z różnych źródeł wyrównujesz tym samym kadrem, a nie filtrem.
- Gdy zdjęcia brakuje, stoi pole w kolorze masła z nazwą dania w Gloock na środku.
## Ruch
- Nagłówki wchodzą wierszami spod maski: każdy wiersz w kontenerze z `overflow: hidden`, tekst przesuwa się z `translateY(105%)` do zera, 800 ms, `cubic-bezier(.2, .8, .2, 1)`, kolejne wiersze co 80 ms. Maska potrzebuje w środku około .2em zapasu u dołu (wyrównanego ujemnym marginesem), bo przy interlinii 0.95 ucina ogonki liter g, y i ę.
- Zdjęcia w trakcie przewijania przez ekran zmieniają skalę z 1.08 do 1.0 (powiązane z pozycją przewijania, nie z czasem).
- Ramka ze zdjęciem dania przy menu zmienia zdjęcie przenikaniem w 300 ms.
- Na górze sekcji z daniem sezonu przesuwa się poziomy pas z nazwami dań, jak napis na szyldzie: jedna linia Gloock 40 px, około 60 px na sekundę, zatrzymany, gdy karta przeglądarki jest w tle.
- Ruch tylko na `transform` i `opacity`, z jednym wyjątkiem: kolor napisu przycisku przy najechaniu.
- Przy ograniczonym ruchu pas z nazwami dań stoi i może zawinąć się do dwóch wierszy.
## Telefon
- Nawigacja: nazwa i linki w jednym rzędzie (linki 15 px, poniżej 380 px 14 px), bez przycisku rezerwacji, bo jego rolę przejmuje przycisk na dole ekranu.
- Nazwa lokalu dalej na całą szerokość ekranu, mniejsza, ale w jednym wierszu.
- Zakładki menu w jednym rzędzie przewijanym w poziomie, przyklejone pod nawigacją, kiedy przewijasz menu.
- Kiedy hero zniknie z ekranu, przycisk rezerwacji przykleja się do dołu ekranu na całą szerokość.
## Czego nie robić
- Brązów, „kawowego” beżu, czerni i szarości.
- Zdjęć ziaren kawy, ilustracji filiżanek, krojów odręcznych i stylizacji na tablicę kredową.
- Kart z cieniem, przycisków w kształcie pastylki, ikon sztućców i gwiazdek opinii.
- Okrągłych naklejek z obracającym się napisem.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Na stronie nie ma ani jednego czarnego albo szarego tekstu.
- Kropki w menu kończą się tuż przed ceną i stoją na linii pisma nazwy dania.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-bistro.md. Lokal potrzebuje nowych zdjęć przy każdej zmianie karty i co sezon, więc jedno zlecenie może przejść w stałą współpracę.
Portfolio
Do fotografów i grafików.
Ogromna nazwa w wąskim kroju szeryfowym, reszta drobnym krojem maszynowym, a prace stoją w kolumnach, które przy przewijaniu jadą z różną prędkością.
KrojeInstrument Serif · Fragment Mono
# Przepis na styl PORTFOLIO
Styl do portfolio fotografów, grafików, ilustratorów i małych studiów. Ogromna nazwa w wąskim kroju szeryfowym, reszta złożona drobnym krojem maszynowym, a prace stoją w kolumnach, które przy przewijaniu jadą z różną prędkością.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
Pierwsze skrzypce grają prace. Typografia jest cicha, drobna i maszynowa, z jednym wyjątkiem: nazwa autora albo studia jest ogromna i stoi na całą szerokość ekranu. Strona cały czas żyje, ale ruch wynika z przewijania, więc działa tak samo na telefonie, bez najeżdżania kursorem.
## Kroje
- Nazwa, tytuły prac i duże zdania: **Instrument Serif**, 400 i kursywa.
- Wszystko inne (menu, opisy, metadane, przyciski, stopka): **Fragment Mono**, 400, 13 px.
## Kolory
```css
:root {
--tlo: #f1f1ef;
--tekst: #111111;
--tekst-2: #6d6d66; /* 4,6:1 na tle */
--linia: #d6d6d0;
}
```
Strona nie ma własnego koloru akcentu, bo kolor dają prace. Jedyny wyjątek to sekcja z pojedynczą pracą na cały ekran: jej tło ma kolor tła zdjęcia (mediana pikseli przy krawędziach zdjęcia), więc praca zlewa się z sekcją.
## Siatka i odstępy
- Margines boczny 32 px na laptopie i 16 px na telefonie. Treść rozlewa się na całą szerokość okna, bez wąskiej kolumny pośrodku.
- Odstęp między pracami 24 px w pionie i w poziomie.
- Siatka prac ma trzy kolumny na laptopie, dwie na tablecie i jedną na telefonie.
## Typografia
- Nazwa w hero: Instrument Serif tak duży, żeby litery stały od marginesu do marginesu, interlinia 0.8, odstęp liter −0.02em. Rozmiar wynika z długości nazwy i liczysz go skryptem z obrysu liter.
- Tytuły prac pod pracą na cały ekran: Instrument Serif 28 px, nazwa klienta kursywą. Pod pracami w siatce stoi sama linia mono.
- Metadane i opisy: Fragment Mono 13 px, interlinia 1.5. Wersaliki tylko w etykietach, z odstępem liter 0.06em.
- Numery prac zawsze trzycyfrowe: 001, 002, 003.
## Elementy
- **Nawigacja:** na laptopie jedna linia mono na samej górze, na telefonie dwie (nazwa i licznik, pod nimi linki). Nazwa po lewej, linki po prawej, a pośrodku licznik pracy widocznej na ekranie („007 / 024”), który zmienia się przy przewijaniu. Bez tła, biały tekst z `mix-blend-mode: difference`, żeby był czytelny na każdym zdjęciu.
- **Hero:** ogromna nazwa na dole pierwszego ekranu, nad nią jedna linijka mono o tym, czym zajmuje się autor i skąd jest. Nad nazwą płynie w pętli poziomy pas miniatur prac, wysoki na 28vh.
- **Siatka prac:** zdjęcia w oryginalnych proporcjach, bez przycinania do jednego formatu. Pod każdym w jednej linii mono: numer, tytuł, klient i rok. Kolumny przy przewijaniu jadą z różną prędkością (wartości w części „Ruch”). Krótsze kolumny stoją na środku wysokości najdłuższej, żeby pod nimi nie zostawała pustka, a sekcja ma u góry i u dołu około 120 px zapasu na przesunięcie kolumn.
- **Indeks:** po lewej wąska tabela mono ze wszystkimi pracami (numer, tytuł, klient, rok; każdy wiersz w jednej linii, linia 1 px między wierszami), obok na resztę szerokości pionowa galeria tych samych prac. Sekcja przykleja się do ekranu (`position: sticky`) na czas przewijania galerii: tor sekcji ma wysokość ekranu plus 36% wysokości ekranu na każdą pracę poza pierwszą. Przewijanie przesuwa galerię o jedną pracę na krok, a w tabeli ciemnieje wiersz pracy, która stoi na środku galerii. Praca na środku stoi płasko, w swoich proporcjach, najwyżej na 56% wysokości i 72% szerokości galerii. Nad nią i pod nią widać po dwie kolejne prace, pochylone jak na wewnętrznej ściance bębna: krawędź dalej od środka jest bliżej oka, więc pochylona praca wygląda jak trapez szerszy od zewnątrz. Prace nie nachodzą na siebie, bo położenia liczysz na ekranie od środka na zewnątrz: bliższa krawędź każdej pracy stoi 12 px od dalszej krawędzi poprzedniej. Przy prawej krawędzi galerii, na wysokości jej środka, stoją jedna nad drugą dwie kwadratowe strzałki 40 px (w górę i w dół, ramka 1 px w kolorze linii, bez tła), które przewijają stronę o jeden krok. Kliknięcie w wiersz tabeli albo w pochyloną pracę przewija do tej pracy.
- **Praca na cały ekran:** co kilka prac jedna sekcja z pojedynczą pracą na środku, na tle w kolorze tła zdjęcia, z tytułem w Instrument Serif pod spodem. Ta praca nie powtarza się w siatce, a krawędzie zdjęcia wtapiasz w tło miękką maską na około 9% szerokości, bo winieta w zdjęciu inaczej odcina prostokąt.
- **Studio i kontakt:** krótki tekst o autorze w Instrument Serif 40 px (na telefonie 32 px), a niżej klikany adres e-mail dopasowany do szerokości treści, na telefonie łamany po @.
## Zdjęcia
- Bez zaokrągleń, ramek i cieni.
- Każde zdjęcie w swoich proporcjach. Prac na różnych tłach nie ujednolicasz filtrem.
- Zanim zdjęcie się wczyta, jego miejsce ma kolor tła zdjęcia, a nie szary prostokąt.
## Ruch
- Kolumny siatki przesuwają się w pionie zależnie od przewijania: środkowa o `scroll × 0.12` (zostaje w tyle, czyli jedzie wolniej), prawa o `scroll × −0.06` (jedzie trochę szybciej). Przesunięcie wynosi zero, kiedy góra siatki stoi na górze ekranu, i jest wygładzone w `requestAnimationFrame` (zbliżanie do celu o 0.1 odległości na klatkę przy 60 kl./s). Na tablecie dwie kolumny: 0 i 0.12.
- Wejście zdjęcia: maska od dołu `clip-path: inset(100% 0 0 0)` do `inset(0)` i jednocześnie skala obrazu w masce z 1.12 do 1.0, 1200 ms, `cubic-bezier(.16, 1, .3, 1)`.
- Pas miniatur w hero płynie w pętli bez szwu (lista zdublowana), około 40 px na sekundę. Przewijanie strony przyspiesza go na chwilę, a po 600 ms wraca do zwykłej prędkości.
- Galeria w indeksie: pierwszy sąsiad pochylony o 80°, dalsi o 84°, a kąt narasta miękko (smoothstep). Pierwszy sąsiad cofa się w głąb o wysokość pracy ze środka, każdy kolejny o 1,1 tej wysokości, a `perspective` galerii wynosi pięć wysokości pracy ze środka. Położenie galerii idzie za przewijaniem z wygładzeniem jak kolumny siatki (0.12 odległości na klatkę), a w każdym kroku praca na środku chwilę stoi: przez pierwsze i ostatnie 18% kroku galeria się nie rusza, pomiędzy jedzie miękko. Prace dalej niż dwie od środka gasną, od trzeciej znikają, a górna i dolna krawędź galerii przechodzi w tło maską na 7% wysokości.
- Licznik w nawigacji pokazuje ostatnią pracę, której środek minął środek ekranu, a w indeksie pracę na środku galerii.
- Przy ograniczonym ruchu kolumny i pas stoją, zdjęcia są widoczne od razu, a galeria w indeksie przeskakuje o całą pracę, bez wygładzenia.
## Telefon
- Jedna kolumna prac, bez różnych prędkości.
- Hero bez pustych pól: pas prac stoi tuż pod nawigacją i wypełnia miejsce aż do linijki o autorze, a nazwa zostaje na dole pierwszego ekranu.
- Nazwa w hero dalej na całą szerokość.
- W indeksie (do 899 px szerokości, czyli też na tablecie) galeria stoi na górze przyklejonej sekcji, na całą szerokość, a praca na środku może zająć 86% szerokości. Pod galerią tabela działa jak bęben wyboru: widać trzy wiersze, aktywny zawsze w środku, i przesuwają się razem z galerią. Tytuł i klient stoją w jednej linii, klient dostaje wielokropek, jeśli się nie mieści. Strzałki stoją w linii z etykietą sekcji, po prawej.
## Czego nie robić
- Kursora w kształcie kółka z napisem „view” i ruchu, który działa tylko po najechaniu myszą.
- Siatki równych kwadratów i kart z cieniem. W 3D obraca się tylko galeria w indeksie.
- Nagłówka „Cześć, jestem…”, pasków umiejętności w procentach i rzędu szarych logotypów klientów.
- Krojów Inter, Space Grotesk i Syne.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Na telefonie kolumny nie przesuwają się względem siebie, a strona przewija się płynnie.
- Nazwa w hero mieści się w jednym wierszu na każdej szerokości od 360 px.
- Prace w galerii indeksu nie nachodzą na siebie przy żadnym położeniu przewijania, także w połowie kroku, a galerię przesuwa zwykłe przewijanie strony, bez przechwytywania kółka myszy i gestów.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-portfolio.md. W kursie pokazuję, jak z AI pracować jako freelancer: od wyboru niszy i portfolio zrobionego w jeden intensywny dzień po pierwszą wiadomość do marki, z którą chcesz pracować.
Sklep
Do sklepów z ubraniami i dodatkami.
Cała strona jednym drobnym krojem, rzeczy stoją w siatce bez odstępów na jednakowym jasnoszarym tle, a pod każdą jest tylko nazwa, cena i szary stan, jak w butikach z Kopenhagi.
KrojeZalando Sans · Zalando Sans Expanded
# Przepis na styl SKLEP
Styl do sklepu z ubraniami i dodatkami. Cała strona jest jednym drobnym krojem w jednym rozmiarze, rzeczy stoją w siatce na jednakowym jasnoszarym tle, a podpis pod każdą to nazwa, cena i najwyżej jedna szara linijka stanu, jak w butikach z Kopenhagi.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
Sklep, który nie krzyczy. Typografia jest drobna, czarna i wszędzie taka sama, więc całą robotę robią zdjęcia: każda rzecz sama, na tym samym jasnoszarym tle, w tym samym świetle. Siatka produktów to ciągły szary pas z kafli dosuniętych do siebie bez odstępów, a podpisy stoją pod nim na białym. Między siatkami wchodzą kadry na całą szerokość z jednym małym napisem na środku. Nie ma kolorowych przycisków, plakietek, gwiazdek ani ikon. Ważniejsze od mniej ważnego oddziela miejsce w układzie i szarość tekstu, nigdy wielkość liter.
## Kroje
- Wszystko w jednej rodzinie: **Zalando Sans**, waga 400, a 500 tylko w przyciskach.
- Znak sklepu w nawigacji: **Zalando Sans Expanded**, waga 600, wersaliki, odstęp liter 0.06em, 13 px na laptopie i 12 px na telefonie. Jeśli sklep ma własne logo w pliku, zostaje logo.
- Nie ma drugiego kroju i nie ma dużych nagłówków. H1 i H2 strony wyglądają jak etykiety (opis w „Typografii”), a ich miejsce w kodzie zostaje to samo.
## Kolory
```css
:root {
--bialy: #ffffff; /* tło strony, pasek nad nawigacją, podpisy pod zdjęciami */
--szary: #efefef; /* tło każdego zdjęcia produktu i każdego kafla */
--linia: #e3e3e3; /* linie 1 px: pod nawigacją, w tabeli, w stopce */
--tekst: #000000;
--tekst-2: #737373; /* stan produktu, numery sekcji, podpowiedzi w polach (4,7:1 na bieli) */
}
```
Strona ma tylko te kolory. Napisy na zdjęciach na całą szerokość są czarne albo białe, zależnie od jasności zdjęcia pod nimi (kontrast co najmniej 4,5:1, sprawdzany w miejscu napisu). Jeśli sklep ma kolor marki, wolno go użyć w jednym miejscu, w pasku nad nawigacją, jako tło pod czarnym albo białym tekstem.
## Siatka i odstępy
- Strona na całą szerokość okna, bez kontenera z marginesami. Tekst przy krawędziach ma margines 14 px na laptopie i 12 px na telefonie.
- Siatka produktów: 4 kolumny na laptopie, 3 od 900 px w dół, 2 na telefonie (od 600 px w dół). Kafle dosunięte do siebie bez odstępów, zdjęcie w proporcji 3:4.
- Podpis pod zdjęciem: margines wewnętrzny 12 px z boku, 12 px u góry i 32 px u dołu.
- Między siatką a kadrem na całą szerokość nie ma odstępu. Sekcje z tekstem (o marce, newsletter) mają 120 px odstępu u góry i u dołu, na telefonie 72 px.
## Typografia
- Jeden stopień na całą stronę: 11 px, interlinia 1.45, odstęp liter 0.02em. Wersalikami: nawigacja, nazwy i ceny produktów, etykiety, przyciski, napisy na zdjęciach, nagłówki sekcji.
- Akapity piszesz normalnie (bez wersalików), 12 px, interlinia 1.5, najwyżej 52 znaki w wierszu (w tym kroju to około `30em`).
- Na telefonie wszystko o 1 px większe: 12 px i akapity 13 px.
- Ceny z twardą spacją przed „zł” i liczbami o stałej szerokości (`font-variant-numeric: tabular-nums`).
## Elementy
- **Pasek nad nawigacją:** wysokość 30 px, jedno krótkie zdanie na środku, po prawej druga informacja (dostawa, zwroty). Bez rabatu za zapis i bez krzyżyka, jeśli pasek nie ma czego zamykać.
- **Nawigacja:** wysokość 34 px, linia 1 px pod spodem. Po lewej działy, na środku znak sklepu, po prawej wyszukiwarka, konto i koszyk z liczbą w nawiasie: „Koszyk (0)”. Nawigacja jest przyklejona do góry (`position: sticky`) razem z paskiem i ma białe tło. Na telefonie: „Menu” po lewej, znak na środku, sama liczba koszyka „(0)” po prawej.
- **Hero:** zdjęcie na całą szerokość, wysokie na ekran bez paska i nawigacji. Na zdjęciu napisy ułożone w siatce 3 × 4: w pierwszym wierszu liczba, nazwa marki, liczba; w drugim nazwa kolekcji; w trzecim liczba, miasto, liczba; w czwartym wezwanie do zakupu. Kolumny z liczbami stoją na 20% i 80% szerokości, napisy w środkowej kolumnie są wyśrodkowane, wiersze rozłożone równo na środkowych 60% wysokości. Jeśli sklep nie ma liczb ani nazwy kolekcji, zostaje sam znak i wezwanie, w tych samych miejscach.
- **Siatka produktów:** kafel to zdjęcie na tle `--szary`, pod nim na białym nazwa w pierwszej linii i cena w drugiej. Trzecia linia jest tylko wtedy, gdy sklep ją ma, i zawsze w `--tekst-2`: „Wyprzedane”, „Zostały 4 sztuki”, „2 kolory”. Wyprzedana rzecz zostaje na swoim miejscu w siatce, z tym samym zdjęciem, bez szarzenia i bez przekreślenia. Numer produktu (01, 02…) stoi przed nazwą, jeśli sklep numeruje rzeczy.
- **Kadry na całą szerokość:** między siatkami, w proporcji około 16:9, z jednym albo dwoma wierszami napisu na środku. Dwa kadry obok siebie (pół na pół, proporcja 4:5) z napisem na środku każdego to wejścia do działów.
- **Sekcja z numerami:** informacje o marce, materiałach, rozmiarach, dostawie i kontakcie jako wiersze 01, 02, 03… Każdy wiersz: linia 1 px u góry, numer w `--tekst-2`, tytuł wersalikami, pod nim akapit. Na laptopie dwie kolumny: po lewej etykieta sekcji i jeden akapit wstępu, po prawej wiersze. Na stronie głównej wiersze są rozwinięte. Jeśli sklep ma te informacje w akordeonie, akordeon zostaje, a zamiast strzałki stoi znak „+” w tym samym kroju.
- **Tabela rozmiarów:** wersalikami 11 px, linia 1 px pod każdym wierszem, liczby wyrównane do lewej w równych kolumnach, nagłówek w `--tekst-2`.
- **Przyciski:** tekst wersalikami w prostokącie z ramką 1 px w kolorze tekstu, wypełnienie 10 × 16 px, ostre rogi, bez tła. Wezwania na zdjęciach i linki w tekście to sam tekst wersalikami, bez ramki.
- **Pola formularza:** etykieta wersalikami po lewej, pole po prawej, samo podkreślenie 1 px w kolorze `--tekst-2`, bez ramki i bez tła. Po wysłaniu formularz zostaje na miejscu, a pod przyciskiem pojawia się jedna linijka odpowiedzi.
- **Stopka:** trzy kolumny oddzielone pionowymi liniami 1 px, każda z nagłówkiem nad linią poziomą i listą pod spodem. Dolny wiersz z walutą i krajem, zapisem i prawami autorskimi, nad nim linia 1 px.
## Karta produktu i koszyk
Te części opisują resztę sklepu, jeśli strona je ma.
- **Karta produktu:** po lewej zdjęcia jedno pod drugim na tle `--szary`, na całą wysokość ekranu każde, po prawej przyklejona kolumna szerokości około 30%: nazwa, cena, kolor, rozmiary, przycisk i wiersze 01–04 (opis, szczegóły, dostawa i zwroty, kontakt).
- **Rozmiary:** w jednym rzędzie jako zwykły tekst („XS S M L XL” albo „46/S 48/M”), wybrany podkreślony, niedostępny w `--tekst-2` i przekreślony. Obok tekstowy link „Tabela rozmiarów”.
- **Przycisk zakupu:** prostokąt z ramką na całą szerokość kolumny, z liczbą sztuk w środku, kiedy zostało ich mało: „Zostały 4 sztuki · Dodaj do koszyka”. Przy wyprzedanej rzeczy przycisk zmienia się w „Powiadom o dostawie”.
- **Koszyk:** wysuwa się z prawej jako kolumna szerokości 400 px na białym tle, a strona pod nim przygasa półprzezroczystą bielą (70%). U góry „Dodano do koszyka”, niżej rzeczy jako miniatura na `--szary`, nazwa, rozmiar i cena, na dole suma i przycisk z ramką.
## Zdjęcia
- Każde zdjęcie produktu: sama rzecz z przodu, bez człowieka, na jednolitym tle dokładnie w kolorze `--szary`, z miękkim cieniem tylko przy krawędziach rzeczy. Tło zdjęcia i tło kafla muszą się zlewać, bez widocznej granicy.
- Rzeczy na zdjęciach stoją na środku kafla i są w podobnej skali: ubrania zajmują około 70% szerokości kafla, dodatki (czapka, komin, biżuteria) około 40%, buty i torby około 55–65%.
- Jeśli zdjęcia sklepu mają różne tła albo różne skale, nie wolno ich podmieniać (zasady w „Treść zostaje”). Wolno je przyciąć i ustawić tak, żeby rzecz stała na środku kafla, a kafel dostaje kolor tła zmierzony na zdjęciu (mediana pikseli przy krawędziach), zamiast `--szary`.
- Kadry na całą szerokość: martwa natura albo ludzie w szarym studiu, prawie bez koloru. Kolorowe zdjęcia lifestyle z kawiarni i plaży nie pasują do tego stylu. Jeśli sklep ma tylko takie, zostają, ale trafiają na koniec strony, a nie do hero.
## Ruch
- Liczby w hero co 1,2 s zmieniają się na inne dwucyfrowe, każda o innej porze (przesunięcie 300 ms między nimi), bez przenikania, jak cyfry na tablicy przylotów. Przy pierwszym wejściu przez 800 ms losują się szybko co 60 ms i stają na wartości startowej.
- Zdjęcie hero przy wejściu oddala się ze skali 1.04 do 1 w 1,6 s, `cubic-bezier(.2, .7, .2, 1)`.
- Kafle produktów pojawiają się przy przewijaniu: z krycia 0 i przesunięcia 16 px w dół do swojego miejsca w 600 ms, kolejne w rzędzie co 70 ms. Zdjęcie w kaflu wchodzi w tym samym czasie ze skali 1.04.
- Kadry na całą szerokość przesuwają się przy przewijaniu wolniej od strony: zdjęcie ma 12% zapasu wysokości i przesuwa się o ten zapas w czasie, gdy kadr przejeżdża przez ekran.
- Ruch nie zależy od myszki: nie ma zmian po najechaniu ani kursora w kształcie ręki nad elementami, które nic nie robią.
- Przy ograniczonym ruchu liczby stoją na wartościach startowych, kafle i zdjęcia są od razu na miejscu.
## Telefon
- Pasek nad nawigacją z jednym zdaniem na środku, bez prawej części.
- Hero na wysokość ekranu bez paska i nawigacji (`100svh` minus ich wysokość), zdjęcie przycięte do pionu na środku rzeczy, liczby na 12% i 88% szerokości.
- Siatka w 2 kolumnach. Dwa kadry obok siebie stają jeden pod drugim, każdy w proporcji 4:5. Kadry na całą szerokość w proporcji 4:5, przycięte na środku rzeczy.
- Sekcja z numerami w jednej kolumnie, stopka w jednej kolumnie z poziomymi liniami między grupami.
## Czego nie robić
- Okna z rabatem za zapis, okna wyboru kraju na pół ekranu, serduszek przy produktach, gwiazdek opinii, plakietek „-30%” i „Nowość”, zegarów odliczających promocję.
- Ikon płatności, ciężarówek i tarcz przy dostawie. Wystarczy tekst.
- Zaokrąglonych rogów, cieni pod kaflami, kolorowych przycisków i dużych nagłówków nad siatką („Nasze bestsellery”).
- Karuzel z kropkami i strzałkami. Kolejne rzeczy widać w siatce albo przy przewijaniu.
- Zdjęć produktów na różnych tłach w jednej siatce i rzeczy w różnych skalach obok siebie.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Tło każdego zdjęcia w siatce ma ten sam kolor co kafel: piksel w rogu zdjęcia różni się od tła kafla najwyżej o 2 w każdym kanale.
- Na zrzucie siatki rzeczy stoją na środku kafli i są w podobnej skali (ubrania razem, dodatki razem).
- Napisy na zdjęciach na całą szerokość mają kontrast co najmniej 4,5:1 z tłem pod nimi, także po przycięciu na telefonie.
- Cała strona używa tylko krojów Zalando Sans i Zalando Sans Expanded, a stopień 11 px (12 px na telefonie) mają wszystkie elementy poza akapitami.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-sklep.md. Kampanię modową robię w kursie bez sesji, a ubranie wygląda w niej tak samo w każdym kadrze, także w filmie do rolek.
Startup
Do aplikacji i usług internetowych.
Jedna żywa, ciemna zieleń na całej stronie, na niej jasne okno produktu z danymi, które zmieniają się na oczach odwiedzającego, jaskrawa zieleń jako jedyny akcent i czarno-białe zdjęcia z miejsc, w których produkt pracuje.
KrojeRadio Canada Big · Spline Sans Mono
# Przepis na styl STARTUP
Styl do stron aplikacji i usług internetowych. Cała strona stoi na jednej żywej, ciemnej zieleni, na niej jasne okno produktu z danymi, które zmieniają się na oczach odwiedzającego, jeden jaskrawy zielony sygnał i czarno-białe zdjęcia z prawdziwych miejsc pracy, jak u startupów ze Sztokholmu.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
To strona firmy, która robi konkretną robotę w prawdziwym świecie, a nie strona kolejnego asystenta do wszystkiego. Od góry do stopki jest jedna płaszczyzna ciemnej zieleni, wyraźnie zielonej, a nie czarnej, więc strona nie wygląda jak ciemny tryb edytora kodu. Na niej stoją cztery rzeczy: duży, ciasno złożony nagłówek w jednym kroju bezszeryfowym, jasne okno produktu narysowane w HTML z danymi, które żyją, czarno-białe zdjęcia dokumentalne z miejsca, w którym produkt pracuje, i jeden kolor sygnałowy, jaskrawa zieleń jak lampka „wolne” przy bramie. Sygnał oznacza tylko to, co żyje, co zrobił produkt albo co jest najważniejsze do kliknięcia. Drobny krój maszynowy niesie etykiety, godziny i dane, nigdy nagłówki. Strukturę budują odstępy i linie 1 px, bez kart, ikon i cieni.
## Kroje
- Nagłówki, tekst, przyciski i menu: **Radio Canada Big** (plik zmienny 400–700). Nagłówki i przyciski mają wagę 600, duże zdanie z liczbami i pytania 500, tekst 400. Grubszej wagi niż 600 nie używasz, poza znakiem firmy. Krój jest zwarty, więc nagłówki składasz ciasno, ale bez stykania się liter.
- Etykiety sekcji, godziny, dane w oknie produktu, miary przy funkcjach i drobna linijka pod przyciskami: **Spline Sans Mono** (plik zmienny 300–700), wagi 400, 500 i 600. Ten krój nie wchodzi do nagłówków ani akapitów.
- Znak firmy, kiedy strona nie ma logo w pliku: nazwa małymi literami w Radio Canada Big 700, 25 px (23 px na telefonie), odstęp liter −0.045em, a przed nią kwadrat 10 × 10 px w kolorze `--sygnal`. Logo z pliku zostaje bez zmian i bez kwadratu. Jeśli znak to litera w HTML (monogram w kółku albo kwadracie), litera zostaje, a jej tło zmienia się w kwadrat 22 × 22 px w kolorze `--sygnal`, bez zaokrągleń, z literą w kolorze `--tusz`. Kwadratu 10 px wtedy już nie dodajesz.
- Cyfry tabelaryczne (`font-variant-numeric: tabular-nums`) mają tylko dane w oknie produktu i ceny. W dużym zdaniu, w rzędzie liczb i w zwykłym tekście cyfry zostają proporcjonalne, bo w Radio Canada Big kropka i przecinek przy cyfrach tabelarycznych odstają od nich („1,2” wygląda jak „1 ,2”, a „6 godz.” jak „6 godz .”).
## Kolory
```css
:root {
--zielen: #0b4f36; /* tło całej strony */
--zielen-ciemna: #073d29; /* pasek nad nawigacją, menu na telefonie, stopka, tło pól formularza */
--linia: #2e6a52; /* linie 1 px na zieleni */
--tekst: #eef5ef; /* tekst na zieleni (8,7:1) */
--tekst-2: #a8c9b6; /* drugorzędny tekst na zieleni (5,3:1) */
--sygnal: #4cf59a; /* jedyny akcent */
--okno: #f5f7f2; /* tło okna produktu i wyróżnionego planu w cenniku */
--okno-2: #e4ebe5; /* zakończone pozycje i wybrana zakładka w oknie */
--okno-linia: #d5ded7; /* linie w oknie */
--tusz: #0a2a1d; /* tekst na jasnym i na sygnale */
--tusz-2: #55695f; /* drugorzędny tekst w oknie (5,4:1) */
--blad: #ffb199; /* tylko komunikat błędu pola formularza (5,5:1) */
}
```
Sygnał pojawia się wyłącznie w tych miejscach: kwadrat znaku firmy, pulsujący kwadrat przy etykiecie „na żywo” i przy stanie usługi w stopce, numery sekcji w etykietach, liczby w dużym zdaniu, godziny, kwadraty i linia postępu na osi „jak to działa”, miary przy funkcjach, kwadraciki w listach cennika, przycisk główny, duże linki w stopce po najechaniu, obwódka fokusu i zaznaczenie tekstu, w oknie produktu jako wypełnienie pozycji zmienionej przez produkt albo napis na pozycji wymagającej uwagi, i jako tło pasa z wezwaniem na końcu strony. Na jasnym tle (okno, wyróżniony plan) sygnał nigdy nie jest kolorem tekstu, bo ma tam za mały kontrast: tekst na nim zawsze ma kolor `--tusz`. Wszystkie zdjęcia są czarno-białe, więc sygnał zostaje jedynym kolorem na stronie. Bez gradientów i bez poświaty wokół sygnału.
## Siatka i odstępy
- 12 kolumn, treść najwyżej 1600 px szerokości, margines boczny `clamp(20px, 4.4vw, 64px)`, odstęp między kolumnami 30 px (24 px na tablecie, 16 px na telefonie).
- Sekcje nie mają własnych teł. Oddziela je odstęp 150 px u góry (120 px na tablecie, 88 px na telefonie), a wewnątrz sekcji linie 1 px `--linia`. Własne tło mają tylko pasek nad nawigacją, okno produktu, pas wezwania i stopka.
- Każda sekcja zaczyna się etykietą, pod nią stoi H2 (odstęp 26 px), a treść sekcji zaczyna się 64–80 px niżej.
- Wszystko jest wyrównane do lewej. Wyśrodkowanych sekcji nie ma.
## Typografia
- H1: `clamp(46px, 7.4vw, 112px)`, waga 600, interlinia 0.95, odstęp liter −0.04em. Dzielisz go na wiersze w miejscu przecinka albo naturalnej pauzy (każdy wiersz w osobnym elemencie, do animacji), bez zmiany słów. Na laptopie ma dwa, najwyżej trzy wiersze. H1 dłuższy niż około 35 znaków zmniejszasz tak, żeby na szerokości 1440 px stał w dwóch wierszach (zwykle 80–90 px), dzielisz go w pauzie i dodajesz `text-wrap: balance`.
- H2: `clamp(36px, 4.6vw, 70px)`, waga 600, interlinia 1, odstęp liter −0.035em, najwyżej 13em szerokości, `text-wrap: balance`.
- Duże zdanie z liczbami: `clamp(30px, 3.75vw, 56px)`, waga 500, interlinia 1.1, odstęp liter −0.025em, najwyżej 23.5em szerokości.
- H3: 22–24 px, waga 600, odstęp liter −0.02em.
- Tekst: 18 px, interlinia 1.5, akapit najwyżej 34em szerokości. Akapit w hero 19 px.
- Etykieta sekcji: Spline Sans Mono 500, 12 px, wersaliki, odstęp liter 0.08em, kolor `--tekst-2`, numer sekcji przed nazwą w `--sygnal` („01 Jak działa”). Numer dodajesz tylko przed nazwami sekcji, które strona już ma, a przy przebudowie wstawiasz go w CSS (licznik i `::before`), zgodnie z częścią „Treść zostaje”.
- Drobna linijka pod przyciskami i podpisy danych: Spline Sans Mono 400, 12,5 px, `--tekst-2`, bez wersalików.
- Twarde spacje po jednoliterowych słowach (w, z, i, a, o, u) i między liczbą a jednostką.
## Elementy
- **Pasek nad nawigacją:** tylko jeśli strona ma krótką wiadomość albo nowość. Tło `--zielen-ciemna`, 14 px, wyśrodkowany, tekst `--tekst-2`, link podkreślony w `--tekst`. Przewija się razem ze stroną.
- **Nawigacja:** wysokość 72 px, tło `--zielen`, przyklejona do góry (`position: sticky`). Po przewinięciu dostaje linię 1 px `--linia` na dole. Po lewej znak firmy, zaraz za nim (56 px dalej) linki 15 px, waga 500, co 32 px. Po prawej link tekstowy (logowanie) i mały przycisk główny (40 px wysokości). Podkreślenie linku rośnie od lewej po najechaniu.
- **Hero:** etykieta, H1, a 40 px niżej rząd: akapit w kolumnach 1–6 (najwyżej 32em), przyciski w kolumnach 7–12 wyrównane do dołu akapitu, odstęp 12 px między przyciskami, pod nimi (16 px) drobna linijka. Pulsujący kwadrat 8 px w `--sygnal` stoi przed etykietą tylko wtedy, gdy etykieta mówi o stanie (na żywo, działa, dostępne teraz), a nie przy zwykłym opisie produktu. Kolejność słów i elementów w kodzie zostaje taka jak na stronie.
- **Okno produktu:** najważniejszy element stylu. Stoi 56 px pod hero, na całą szerokość treści: jasny prostokąt `--okno` bez zaokrągleń, cienia i ramki przeglądarki. U góry pasek 52 px z linią 1 px na dole: znak produktu, nazwa konta albo miejsca, zakładki (wybrana na `--okno-2`), data, a po prawej napis „na żywo” i zegar w kroju maszynowym. Środek: główny widok produktu (tablica, tabela, lista) i kolumna 30% szerokości z dziennikiem zdarzeń, najnowsze na górze. Dół: trzy liczby w równych komórkach, podpis 13 px `--tusz-2`, liczba 26 px 600. Stany pozycji pokazujesz wypełnieniem: zakończone `--okno-2` z tekstem `--tusz-2`, trwające `--zielen` z tekstem `--tekst`, nadchodzące białe z linią 1 px `--zielen`, oczekujące na ruch użytkownika białe z linią 2 px `--tusz`, opóźnione białe z przerywaną linią 1 px `--tusz`, zmienione przez produkt `--sygnal` z tekstem `--tusz`, wymagające uwagi `--tusz` z tekstem `--sygnal`. Numery, godziny i stany piszesz krojem maszynowym 11–13 px, a zdania w dzienniku krojem głównym 13–14 px. Żaden napis nie może się uciąć wielokropkiem.
- Nową stronę budujesz z przykładowymi danymi od użytkownika i ożywiasz je (opis w „Ruchu”), z dopiskiem przy oknie albo w stopce, że dane są przykładowe.
- Przy przebudowie okno dostaje tylko to, co strona już ma: zrzut ekranu albo film produktu stoi w oknie na tle `--okno`, bez dorysowanego paska i bez wymyślonych danych. Jeśli strona nie ma żadnego obrazu produktu, okna nie ma, a hero kończy się przyciskami.
- Zrzut z własnymi mocnymi kolorami (fiolet, gradienty, kolorowe karty) gryzie się z zielenią, więc dostaje filtr dwutonowy: cienie w kolorze `--tusz`, światła w kolorze `--okno`. Filtr wstawiasz raz w HTML jako SVG i podpinasz w CSS (`filter: url(#dwuton)`). W planie dla użytkownika pytasz, czy woli zostawić zrzut w oryginalnych kolorach.
```html
<svg width="0" height="0" aria-hidden="true" style="position:absolute">
<filter id="dwuton" color-interpolation-filters="sRGB">
<feColorMatrix type="saturate" values="0"/>
<feComponentTransfer>
<feFuncR type="table" tableValues="0.039 0.961"/>
<feFuncG type="table" tableValues="0.165 0.969"/>
<feFuncB type="table" tableValues="0.114 0.949"/>
</feComponentTransfer>
</filter>
</svg>
```
- Na telefonie zrzut przycinasz do najważniejszego fragmentu (ten sam obraz, inny kadr przez `object-fit: cover` i `object-position`), tak żeby najmniejszy napis na zrzucie miał na ekranie co najmniej 9 px.
- Pętla, zegar i zatrzymywanie animacji z części „Ruch” dotyczą tylko okna w HTML. Zrzut wchodzi razem z oknem po 400 ms i dalej stoi.
- Przepisanie zrzutu na okno w HTML z tymi samymi danymi możesz zaproponować w planie, ale robisz je tylko za zgodą użytkownika.
- **Duże zdanie z liczbami:** jeśli strona ma akapit z liczbami o firmie albo produkcie, stoi on sam w sekcji jako duże zdanie, a liczby są w `--sygnal`. Jeśli liczby stoją osobno (liczba i podpis), układasz je w rzędzie po trzy albo cztery: liczba Radio Canada Big 500 `clamp(44px, 5vw, 76px)` w `--sygnal`, podpis 15 px `--tekst-2` pod nią, linia 1 px `--linia` nad rzędem.
- **Mozaika zdjęć:** trzy zdjęcia w rzędzie: kwadrat w kolumnach 1–4, pion 3:4 w kolumnach 5–9 i pion 3:4 w kolumnach 10–12, obniżony o 240 px. Podpis pod każdym zdjęciem 15 px `--tekst-2`, 14 px odstępu. Przy dwóch zdjęciach kwadrat stoi w kolumnach 1–5, a pion 3:4 w kolumnach 7–12, obniżony o 120 px. Przy jednym zdjęcie stoi w kolumnach 5–12. Kolejne zdjęcia powtarzają ten układ w następnym rzędzie.
- **Oś „jak to działa”:** kroki stoją obok siebie na poziomej linii 1 px `--linia` (najwyżej pięć w rzędzie). Nad każdym krokiem na linii kwadrat 10 px z obwódką `--tekst-2`, pod linią godzina albo numer kroku (Spline Sans Mono 500 13 px w `--sygnal`), H3 22 px i opis 16 px `--tekst-2`. Linia postępu 2 px w `--sygnal` wypełnia oś przy przewijaniu, a kwadraty, do których doszła, zmieniają się na pełne w `--sygnal`. Godziny wstawiasz tylko wtedy, gdy kroki je mają, inaczej numery 01, 02… Poniżej 1100 px oś staje pionowo: linia po lewej, kwadraty na niej, kroki jeden pod drugim (najwyżej 40em szerokości), linia postępu rośnie w dół.
- **Zdjęcie na całą szerokość okna:** bez marginesów, w proporcji 12:5 (4:3 na telefonie), podpis pod nim w kroju maszynowym 12 px wersalikami `--tekst-2`.
- **Funkcje:** wiersze zamiast kart. Wiersz ma linię 1 px `--linia` u góry (ostatni także na dole) i 28 px odstępu: nazwa H3 w kolumnach 1–4, opis 18 px w kolumnach 5–9, a w kolumnach 10–12 miara w kroju maszynowym 13 px w `--sygnal` (liczba, zasięg, limit). Bez ikon. Jeśli funkcja nie ma miary, opis zajmuje kolumny 5–12.
- **Opinia:** zdjęcie 3:4 w kolumnach 1–5, cytat w kolumnach 7–12 wyrównany do dołu zdjęcia: Radio Canada Big 500 `clamp(26px, 2.65vw, 40px)`, interlinia 1.18, cudzysłów otwierający wysunięty na margines (`text-indent: -0.42em`). Oba cudzysłowy owijasz w osobny element (tekst się nie zmienia) i składasz krojem Spline Sans Mono 500 z marginesem −0.16em z obu stron, bo zamykający cudzysłów w Radio Canada Big w dużym stopniu wygląda jak znak cala. Pod cytatem imię i nazwisko 600 16 px, niżej funkcja w `--tekst-2`. Bez zdjęcia cytat zajmuje kolumny 1–9. Klienci: etykieta i nazwy jako zwykły tekst 21 px 500 w jednym rzędzie, z linią 1 px nad rzędem. Jeśli etykieta jest całym zdaniem, a nie dwoma, trzema słowami, stoi nad rzędem nazw, a nie w nim. Logotypy z plików zostają, ale w jednym kolorze `--tekst` (`filter: brightness(0) invert(1)` i przejrzystość .85), w tym samym rzędzie.
- **Cennik:** plany jako kolumny oddzielone pionowymi liniami 1 px, z liniami nad i pod całym cennikiem. Nazwa planu 20 px 600, cena 600 `clamp(46px, 4.8vw, 72px)`, odstęp liter −0.05em, pod ceną jednostka w kroju maszynowym 12,5 px. Lista zawartości z kwadracikami 6 px w `--sygnal` i liniami 1 px między pozycjami, przycisk przyklejony do dołu kolumny. Wyróżniony plan stoi na jasnym tle `--okno` z tekstem `--tusz` (kwadraciki w `--zielen`, przycisk ciemny) i to jest całe wyróżnienie. Napis typu „Najpopularniejszy”, jeśli strona go ma, zostaje jako mała etykieta w górnym odstępie kolumny, nad nazwą planu, a nazwy, ceny i listy wszystkich planów i tak zaczynają się na tej samej wysokości (miejsce na etykietę zarezerwowane w każdej kolumnie albo `subgrid`). Cena bez liczby (na przykład „Indywidualnie”) dostaje stopień dobrany do szerokości kolumny: kolumna ma `container-type: inline-size`, cena `font-size: min(clamp(46px, 4.8vw, 72px), 15cqi)`, a jej dół stoi na tej samej linii co dół cen z liczbami (blok ceny o wysokości ceny liczbowej, wyrównany do dołu).
- **Pytania:** H2 w kolumnach 1–4, przyklejony przy przewijaniu (`position: sticky`, 112 px od góry), lista w kolumnach 6–12. Pytanie to przycisk 22 px 500 z `aria-expanded`, a obok cienki plus 18 px z kresek 1,5 px. Otwarte jest jedno pytanie naraz, a pionowa kreska plusa znika. Na nowej stronie na starcie otwarte jest pierwsze, przy przebudowie stan startowy zostaje taki, jak był. Linia 1 px między pytaniami. Bez JavaScriptu wszystkie odpowiedzi są widoczne.
- **Wezwanie na końcu:** pas na całą szerokość okna w kolorze `--sygnal` z tekstem `--tusz`, 150 px odstępu u góry. H2 600 `clamp(44px, 6.6vw, 104px)`, interlinia 0.95, odstęp liter −0.04em, pod nim akapit 20 px w kolumnach 1–5 i przycisk ciemny w kolumnach 7–12. To jedyne miejsce, gdzie sygnał jest płaszczyzną. Jeśli strona nie ma sekcji z wezwaniem, pasa nie ma.
- **Przyciski:** prostokąt bez zaokrągleń, wysokość 52 px, odstęp 0 22 px, Radio Canada Big 600 16 px. Główny: tło `--sygnal`, napis `--tusz`, po najechaniu biała warstwa o przejrzystości .35. Drugi: przezroczysty z wewnętrzną linią 1 px `--tekst-2`, po najechaniu linia `--tekst`. Ciemny (na sygnale i na jasnym planie): tło `--tusz`, napis `--okno`, po najechaniu warstwa `--zielen`. Bez strzałek dorysowanych w przyciskach.
- **Pola formularza:** etykieta nad polem w kroju maszynowym 12 px wersalikami, pole 52 px na tle `--zielen-ciemna` z dolną linią 1 px `--tekst-2`, wpisany tekst 18 px. Aktywne pole dostaje dolną linię 2 px `--sygnal`. Błąd: linia i komunikat w `--blad`. Na pasie wezwania (tło `--sygnal`) pole jest przezroczyste, z dolną linią 1 px `--tusz`, a wpisany tekst, etykieta i podpowiedź mają kolor `--tusz`. Na nowej stronie odpowiedź po wysłaniu stoi w miejscu przycisku, przy przebudowie formularz zostawia swoje komunikaty.
- **Emoji i znaki używane jak ikony** (iskierki, gwiazdki, strzałki, ptaszki, plusy): jeśli strona je ma, zostają w kodzie, ale wyciszone: `filter: grayscale(1)`, przejrzystość .5, wielkość 0.9em. Plus albo strzałka przy pytaniach, które są znakiem w tekście, zostają w kodzie, ale są przezroczyste (`color: transparent`), a widać plus rysowany kreskami. W planie dla użytkownika pytasz, czy usunąć emoji.
- **Stopka:** tło `--zielen-ciemna`. Po lewej duże linki do sekcji (Radio Canada Big 500 `clamp(32px, 3.4vw, 50px)`, interlinia 1.12), po prawej trzy kolumny z etykietami w kroju maszynowym i listami 15 px. Na dole, za linią 1 px, stan usługi z kwadratem w `--sygnal` (jeśli strona go ma), prawa autorskie i drobny druk 13 px `--tekst-2`.
## Zdjęcia
- Czarno-białe zdjęcia dokumentalne w płaskim, pochmurnym świetle: miejsca i przedmioty z branży produktu (rampa, magazyn, gabinet, plac budowy, dokument na biurku), najlepiej z góry albo prosto z przodu, symetrycznie. Bez ludzi przy laptopach, bez uśmiechów ze stocku, bez renderów 3D, mózgów, robotów, sieci neuronowych i świecących kul.
- Na wszystkie zdjęcia nakładasz `filter: grayscale(1) contrast(1.04)`, żeby obrazy z różnych źródeł wyglądały jak jedna seria. Zrzuty ekranu produktu dostają zamiast niego filtr dwutonowy opisany przy oknie produktu, a logotypy klientów jednolity kolor `--tekst`.
- Zdjęcia bez zaokrągleń i ramek, przycięte `object-fit: cover`. W miejscu brakującego zdjęcia nie stawiasz pustej ramki: układ przechodzi na wariant z mniejszą liczbą zdjęć.
## Ruch
Ruch ma pokazywać, że produkt pracuje, a nie ozdabiać stronę.
- Hero przy wejściu: wiersze H1 wysuwają się z maski od dołu (`translateY(105%)` do 0, 1000 ms, `cubic-bezier(.2, .7, .2, 1)`, drugi wiersz 80 ms później). Etykieta wchodzi razem z nagłówkiem z 18 px niżej i od przejrzystości 0, akapit i przyciski tak samo po 250 ms, okno produktu po 400 ms. Całość kończy się przed upływem 1,5 s.
- Etykiety sekcji przy pierwszym pojawieniu się składają się jak na terminalu: znaki od lewej zamieniają się z przypadkowych liter i cyfr na właściwe w 620 ms. Na końcu tekst jest identyczny z oryginałem.
- Pozostałe elementy wchodzą z 22 px niżej i od przejrzystości 0, 800 ms, ta sama krzywa, kolejne w tym samym rzędzie co 70 ms (najwyżej sześć opóźnień).
- Zdjęcia odsłaniają się od dołu (`clip-path: inset(100% 0 0 0)` do `inset(0)`, 1100 ms), a obraz w środku przechodzi ze skali 1.08 do 1 w 1500 ms. Podpis pojawia się 400 ms później.
- Liczby w dużym zdaniu odliczają od zera w 1100 ms, z hamowaniem na końcu. Lata nie odliczają.
- Linia postępu na osi „jak to działa” idzie za przewijaniem strony, bez opóźnienia.
- Okno produktu zbudowane w HTML żyje w pętli: zegar i pionowa linia „teraz” idą szybciej niż czas prawdziwy (minuta symulacji na około sekundę), co kilka sekund dzieje się jedno zdarzenie: w dzienniku pojawia się wpis (z 10 px wyżej, 600 ms), pozycje zmieniają stan przenikaniem koloru w 400 ms, a pozycja przestawiona przez produkt przelatuje na nowe miejsce w 900 ms i świeci w `--sygnal` przez kilka sekund. Pierwsze takie zdarzenie dzieje się w ciągu 2 sekund od wejścia na stronę. Po ostatnim zdarzeniu jest 3 s przerwy, okno gaśnie na 350 ms i scenariusz rusza od początku. Pętla stoi, kiedy okno jest poza ekranem albo karta jest ukryta.
- Kwadrat „na żywo” pulsuje (przejrzystość od 1 do .3 i z powrotem, 1,6 s).
- Zmiany po najechaniu mają tylko przyciski i linki. Animujesz `transform`, `opacity`, `clip-path`, kolory tła i wysokość odpowiedzi w pytaniach.
- Przy ograniczonym ruchu wszystko jest widoczne od razu, kwadrat nie pulsuje, a okno produktu w HTML pokazuje jeden stały kadr zaraz po pierwszym zdarzeniu (z pozycją w `--sygnal` i wpisem w dzienniku).
## Telefon
- Nawigacja 60 px: znak po lewej, po prawej napis „Menu”. Menu otwiera się na cały ekran na tle `--zielen-ciemna`, linki 38 px 500 z liniami między nimi, na dole logowanie i przycisk główny. Escape i wybór linku zamykają menu. Linki i przyciski z nawigacji chowają się już poniżej 900 px.
- H1 `clamp(40px, 11.6vw, 58px)`, interlinia 0.98. Okno produktu stoi zaraz pod H1, przed akapitem i przyciskami, na całą szerokość ekranu bez marginesów, tak żeby żywe dane było widać na pierwszym ekranie (kolejność w kodzie się nie zmienia, przestawia ją CSS).
- W oknie zostają: znak, nazwa miejsca i zegar u góry, cztery wiersze głównego widoku z wycinkiem około dwóch godzin wokół linii „teraz”, dziennik pod spodem (trzy wpisy) i trzy liczby w rzędzie.
- Przyciski jeden pod drugim na całą szerokość.
- Mozaika: pierwsze zdjęcie na całą szerokość, dwa następne obok siebie. Na tablecie (761–900 px) dwie kolumny: kwadrat i pod nim trzecie zdjęcie po lewej, wysokie zdjęcie po prawej.
- Funkcje, opinia, cennik i pytania w jednej kolumnie. Wyróżniony plan sięga do krawędzi ekranu.
## Czego nie robić
- Fioletu, gradientów, poświaty wokół jaskrawej zieleni, szkła i rozmytych teł.
- Czarnego, grafitowego albo granatowego tła strony. Zieleń ma być wyraźnie widoczna jako kolor.
- Kafelków z ikonami w siatce trzech kolumn, zaokrąglonych rogów, cieni pod kartami i przycisków w kształcie pastylki.
- Ramki przeglądarki z trzema kropkami, makiet laptopów i telefonów, przechylonych w 3D zrzutów interfejsu.
- Ilustracji robotów, mózgów, sieci neuronowych, ikonek iskierek przy słowie „AI” i emoji.
- Kroju maszynowego w nagłówkach i akapitach.
- Ściany szarych logotypów, karuzeli opinii, gwiazdek ocen.
- Przekreślonych cen i plakietek z rabatem.
- Drugiego mocnego koloru obok sygnału.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Na zrzucie górnego ekranu laptopa (1440 × 900) widać H1 i co najmniej górną część okna produktu z danymi, a na telefonie okno stoi na pierwszym ekranie.
- Każde użycie `--sygnal` na stronie należy do listy z części „Kolory”.
- Wszystkie zdjęcia poza zrzutami produktu i logotypami są czarno-białe.
- W oknie produktu na szerokości 1440 px i 390 px żaden napis nie jest ucięty wielokropkiem ani nie wychodzi poza swoją pozycję.
- Okno produktu w HTML zatrzymuje animację, kiedy jest poza ekranem, a przy ograniczonym ruchu pokazuje jeden stały kadr. Zrzut w oknie ma filtr dwutonowy (albo zgodę użytkownika na oryginalne kolory), a na telefonie najmniejszy napis na nim ma co najmniej 9 px.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-aplikacja.md. Stronę dla producenta saun stawiam z agentem od zera w lekcji o budowie strony i na nagraniu tłumaczę, dlaczego wygląda tak, a nie inaczej.
Kolor
Do napojów i kosmetyków.
Każdy wariant dostaje sekcję w swoim nasyconym kolorze, wziętym z jego zdjęcia (z tła albo z samego produktu), a sekcje łączą krótkie przejścia gradientem.
KrojeUnbounded · Onest
# Przepis na styl KOLOR
Styl do marek, które mają kilka wariantów: smaków, zapachów, kolorów albo kolekcji. Każdy wariant dostaje pełną sekcję w swoim nasyconym kolorze, wziętym z jego zdjęcia (z tła albo z samego produktu), a sekcje łączą krótkie przejścia gradientem.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
Głośno i soczyście, ale porządnie. Każdy wariant ma sekcję na cały ekran w kolorze wziętym z jego zdjęcia. Zdjęcie na kolorowym tle zlewa się z sekcją, wycięty przedmiot stoi wprost na kolorze, a zdjęcie, którego nie da się wtopić (biały packshot, wnętrze, plener), stoi jako wyraźny blok przy krawędzi ekranu. Nagłówki są grube i szerokie, tekst prosty, a poza kolorem nie ma ozdób.
## Kroje
- Nagłówki, nazwy wariantów i ceny: **Unbounded**, wagi 700 i 900.
- Tekst i przyciski: **Onest**, 400 i 600.
## Kolory
Kolor sekcji wariantu bierze się z jego zdjęcia (część „Zdjęcia”). Różnice kolorów liczysz w OKLab razy 100 (ΔE): przy 2 kolory obok siebie ledwo da się odróżnić, przy 10 to wyraźnie inny odcień.
- Tekst: biały albo ciemny w barwie sekcji (OKLCH L 0,25, chroma 0,04–0,09, w razie potrzeby L 0,20), ten, który ma kontrast co najmniej 4,5:1.
- Kolor wzięty z przedmiotu ma jasność L 0,70–0,85 pod ciemny tekst albo 0,35–0,50 pod biały.
- Sąsiednie warianty różnią się co najmniej o ΔE 10. Gdy wypadają bliżej, zmieniasz jasność jednego o 0,06–0,10 i wyrównujesz jego zdjęcie do nowego koloru, bez zmiany kolejności sekcji.
- `--ciemny` (o marce, stopka): OKLCH L 0,20, chroma 0,05, barwa pierwszego wariantu.
```css
:root {
--wariant-1: #f99aa7; /* róż z tła zdjęcia 1 */
--wariant-2: #e35b04;
--wariant-3: #d5bea3;
--wariant-4: #79bbbc;
--ciemny: #2a0a10;
}
```
Strona nie ma białego tła. Hero stoi na kolorze pierwszego wariantu, a inne sekcje bez zdjęcia (zestawy, opinie, miejsca sprzedaży) na kolorze jednego z wariantów albo na `--ciemny`.
## Siatka i odstępy
- Treść najwyżej 1440 px, margines boczny 40 px na laptopie i 18 px na telefonie.
- Sekcja wariantu ma `min-height: 100svh`.
- Między wariantami stoi pas przejścia wysoki na 28vh: `linear-gradient(in oklch, …)` od koloru jednej sekcji do następnej, z punktami na 30% (18% drugiego koloru) i 70% (82%). Pas stawiasz tylko, gdy barwy różnią się o mniej niż około 120°, bo inaczej gradient przechodzi przez fiolet albo zieleń. Odleglejsze barwy (turkus i róż, turkus i pomarańcz) i sekcje, które nie są wariantami, łączy twarde cięcie.
- Przy ponad 6 wariantach sekcja ma `min-height: 75svh`, a pas 16vh. Przy ponad 10 warianty stoją na laptopie parami: dwie sekcje po pół szerokości, każda w swoim kolorze, bez pasa między nimi.
## Typografia
- Nazwa marki w hero: Unbounded 900 na całą szerokość treści, interlinia 0.85, około 0.3em zapasu pod spodem na ogonek Ą i kropkę Ż.
- Nazwa wariantu: Unbounded 900 wersalikami, `clamp(56px, 10vw, 180px)`, interlinia 0.88, odstęp liter −0.02em, nigdy szersza niż miejsce na nią. Kontener ma `overflow: clip` i zapas na przesuw o 8%.
- H2: Unbounded 700, `clamp(32px, 4vw, 64px)`. Tekst: Onest 18 px, interlinia 1.5.
- Cena: Unbounded 900. Skład i pojemność: Onest 600 wersalikami 13 px, odstęp liter 0.08em.
## Elementy
- **Nawigacja:** pełne tło w kolorze sekcji pod nią, w pasach przejścia mieszane na bieżąco (`color-mix(in oklch, …)`). Marka Unbounded 900 20 px, linki Onest 15 px, po prawej licznik koszyka w kółku z obramowaniem 1.5 px.
- **Hero:** na całą szerokość nazwa marki, a gdy jej nie ma, główny nagłówek hero w tym samym kroju. Pod nim pas kolorów wariantów jako menu: pionowe paski z nazwą wariantu u dołu, kliknięcie przewija do sekcji. Bez nazw wariantów w hero paski mają numery 01, 02…, a nazwę dla czytników ekranu dostają przez `aria-labelledby` z nagłówka sekcji wariantu. Pasek w kolorze hero ma u góry linię 1.5 px. Ponad 8 wariantów: dwa rzędy.
- **Nagłówek nad listą wariantów** („Nasze kremy”): krótki pas na kolorze pierwszego wariantu.
- **Sekcja wariantu:** numer i ogromna nazwa, zdjęcie według jego drogi, skład, pojemność, cena i przycisk, a zdjęcie co sekcję zmienia stronę. Przy bloku nazwa stoi na laptopie nad nim na całą szerokość treści albo w kolumnie tekstu, najwyżej na 84% jej szerokości.
- **Przyciski:** zaokrąglenie 999 px, tło w kolorze tekstu sekcji, napis w kolorze sekcji, wysokość 54 px, Onest 600 16 px.
- **O marce:** sekcja na `--ciemny` z tekstem w kolorze pierwszego wariantu.
- **Listy:** linie 1.5 px w kolorze tekstu sekcji.
## Zdjęcia
Każde zdjęcie mierzysz na pasie szerokim na 5% krótszego boku wzdłuż krawędzi i przypisujesz do drogi. Pierwszy spełniony warunek rozstrzyga:
| Warunek | Droga |
|---|---|
| Plik ma kanał alfa, a co najmniej 5% pikseli pasa ma krycie poniżej 250 | wycięty przedmiot |
| Szczegóły zajmują ponad 8% pasa albo na zdjęciu widać miejsce, a nie przedmiot na tle | scena |
| Mediana pasa ma chromę poniżej 0,03 (biel, szarość, czerń) | białe tło |
| Wszystko inne | kolorowe tło |
Szczegóły to piksele pasa, w których rozmycie gaussem o sigmie 1,5 px różni się od rozmycia o sigmie 8 px o więcej niż 4 (w skali 0–255) w którymkolwiek kanale. Rozrzut to największa różnica ΔE między medianami 16 odcinków pasa (po 4 na krawędź, bez przeciętych przez przedmiot); powyżej 15 tło ma gradient albo linię stołu i wyrównanie wymaga maski z modelu. W planie podajesz przy każdym wariancie drogę, kolor sekcji i to, co zrobisz ze zdjęciem.
### Kolorowe tło
- Kolor sekcji to mediana całego pasa.
- Tło zdjęcia wyrównujesz do koloru sekcji według dodatku. Przedmiot zostaje bez zmian, a oryginał w kopii; to traktowanie dopuszcza część „Treść zostaje”.
- Zdjęcie stoi bez ramki i bez maski. Maskę 6–12% dostaje tylko bok, przez który przedmiot wychodzi z kadru (ręka z boku, podstawka ucięta dołem). Zdjęcia poziome dochodzą do krawędzi ekranu, pionowe stoją w siatce.
- Odmiana: gdy barwa każdej mediany odcinka różni się od barwy sekcji najwyżej o 30°, wolno zostawić gradient tła. Zdjęcie dochodzi wtedy do krawędzi ekranu bokiem, na którym tło najbardziej odbiega od sekcji, a pozostałe boki wtapiasz maską 10–26%.
### Białe tło
- Kolor sekcji bierzesz z przedmiotu.
- Zdjęcie stoi jako blok: ostre krawędzie, bez maski i zaokrągleń, proporcja 4:5 albo 1:1, przy krawędzi ekranu, na całą wysokość sekcji.
- Czyste tło (rozrzut poniżej 3, szczegóły poniżej 1%) zostawiasz bez zmian, a winietę, szare rogi albo blat wyrównujesz do mediany tła według dodatku.
- Przemalowanie tła na kolor sekcji albo wycięcie przedmiotu tylko za zgodą użytkownika, po pokazaniu jednego zdjęcia przed i po.
### Wycięty przedmiot
- Stoi wprost na kolorze sekcji, bez ramki i dorysowanego cienia (cień z pliku zostaje).
- Kolor sekcji z przedmiotu. Gdy jego największa grupa różni się od sekcji o mniej niż ΔE 12, przesuwasz jasność sekcji co 0,04 w zakresie 0,70–0,85 (w dół przy jasnym przedmiocie, w górę przy ciemnym), a gdy to nie wystarcza, bierzesz L 0,50 pod biały tekst.
### Scena
- Zdjęcia nie wtapiasz, a kolor sekcji bierzesz z przedmiotu albo głównej rzeczy w kadrze.
- Zdjęcie stoi jako blok: na laptopie pełna połowa sekcji od krawędzi ekranu, na całą wysokość (`object-fit: cover`), na telefonie cała szerokość w proporcji 4:5. Krawędź od strony treści jest ostra.
### Kolor z przedmiotu
Piksele przedmiotu (alfa maski albo pliku co najmniej 0,98, w scenie bez maski środkowe 60% kadru) przeliczasz na OKLab i dzielisz metodą k-średnich na 5 grup. Odrzucasz grupy o chromie poniżej 0,02 i mniejsze niż 10% pikseli przedmiotu, z reszty bierzesz największą (przy różnicy wielkości poniżej 25% bardziej nasyconą). Sekcja dostaje jej barwę, L 0,78 i chromę co najmniej 0,10 albo najwyższą możliwą w sRGB, także gdy grupa jest pastelowa (chroma 0,02–0,04). Gdy żadna grupa nie zostaje (biały kubek, czarne słuchawki), kolor podaje użytkownik albo proponujesz go z nazwy wariantu.
### Brak zdjęcia i mieszane drogi
- Bez zdjęcia w sekcji stoi sama nazwa wariantu, jeszcze większa. Przy nowej stronie możesz zaproponować opis do generatora: „[przedmiot] na gładkim tle studyjnym w kolorze #F99AA7, ten sam kolor na ścianie i blacie, bez linii horyzontu, miękkie światło z boku, miękki cień kontaktowy, bez gradientu i winiety, przedmiot na najwyżej 60% kadru, kadr 4:5”. Bez zgody niczego nie generujesz.
- Gdy co najmniej połowa zdjęć to bloki (białe tło, scena), blokami stoją wszystkie, żeby warianty wyglądały jak jedna seria.
## Ruch
- Nazwa wariantu przesuwa się z przewijaniem sekcji od `translateX(8%)` do `translateX(-8%)` (procent jej szerokości), a w połowie sekcji stoi w spoczynku.
- Zdjęcie wtopione i wycięty przedmiot przy wejściu obracają się z −3° do 0° i rosną ze skali 0.94 do 1.0, 900 ms, `cubic-bezier(.2, .8, .2, 1)`. Blok się nie obraca, tylko odsłania od krawędzi ekranu (`clip-path` od `inset(0 0 0 100%)` albo z drugiej strony do `inset(0)`).
- Nawigacja przejmuje kolory sekcji pod sobą w 300 ms.
- Pasek w hero najechany albo dotknięty rozszerza się kosztem pozostałych (`flex-grow` z 1 do 2.2, 450 ms).
## Telefon
- Nawigacja w dwóch wierszach: marka i koszyk, pod nimi linki.
- Hero: pas kolorów jako poziome paski jeden pod drugim.
- Sekcja wariantu: nazwa, zdjęcie, skład, cena i przycisk jeden pod drugim. Zdjęcie na całą szerokość, blok 4:5. Linia przycięcia kadru wypada na wyrównanym tle, nie na przedmiocie ani cieniu.
- Pasy przejścia na 18vh.
## Czego nie robić
- Białych i szarych sekcji, także pod packshoty na białym tle.
- Maski na zdjęciu, którego tło ma inny kolor niż sekcja albo jest sceną: zostaje po niej miękki prostokąt innego koloru.
- Poprawiania przedmiotu przy wyrównaniu tła, a bez zgody wycinania, przemalowywania tła i generowania zdjęć.
- Gradientów z kolorów spoza zdjęć, cieni pod zdjęciami, ramek i ilustracji owoców czy kropli.
## Dodatek: wyrównanie tła
Cel: tło ma przy krawędziach dokładnie kolor docelowy (sekcji albo bieli), a przedmiot i jego cień kontaktowy zostają bez zmian. Pracujesz na oryginale w pełnej rozdzielczości, w RGB 0–255 na liczbach zmiennoprzecinkowych (na przykład Python z numpy, scipy i Pillow). Rozmycia to gauss, podane wartości to sigma.
1. **Maska przedmiotu** z lokalnego modelu do wycinania tła (na przykład `rembg` z `birefnet-general`): sama maska z miękką krawędzią, zdjęcia nie wycinasz. Przedmiot to alfa co najmniej 0,98. Bez modelu (tylko przy rozrzucie do 15) przedmiotem jest piksel różny od pola tła (krok 2) o ponad ΔE 9, który nie jest cieniem (ciemniejszy od tła, z różnicą barwy poniżej połowy różnicy jasności plus 5); potem wypełniasz dziury i usuwasz plamki poniżej 1500 px.
2. **Pole tła:** piksele spoza maski powiększonej o 8 px rozmywasz splotem znormalizowanym (rozmyte zdjęcie razy wagi, przez rozmyte wagi) z sigmą 3% krótszego boku, a większe dziury wypełniasz tak samo z sigmą 10% i 30%. Pięć przebiegów, w każdym odrzucasz piksele różne od pola o ponad ΔE 4,5 (cienie, odbicia).
3. **Linia stołu:** pole liczysz osobno nad linią ściany i blatu (najsilniejszy poziomy skok jasności poza przedmiotem, dopasowany prostą) i pod nią, przejście bierzesz z profilu w poprzek linii, a resztkowy ślad usuwasz, uśredniając resztę wzdłuż linii (sigma 20 px, pas ±24 px).
4. **Reszta** to zdjęcie minus pole, rozmyta z sigmą 2,5 px tylko po tle: cienie i odbicia zostają, znika ziarno, z którego WebP robi w płaskim tle kratkę.
5. **Tło** to kolor docelowy plus reszta razy k. k = 1 tam, dokąd sięga cień kontaktowy (zwykle 4–8% krótszego boku), i łagodnie spada do 0 przy 15–25% od przedmiotu oraz na ostatnich 10% przy krawędziach. Reszta słabsza niż 2 poziomy dostaje 0, mocniejsza niż 6 zostaje cała. Cień rzucony daleko na ścianę usuwasz.
6. **Składanie:** do 4 px od maski wynik = zdjęcie + (1 − alfa) × (kolor docelowy − pole), więc miękka krawędź nie zostawia obwódki. Dalej bierzesz tło z kroku 5, które na ostatnich 2,5% przy krawędziach przechodzi płynnie w dokładny kolor docelowy.
7. **Sprawdzenie:** przed kompresją piksele przedmiotu są identyczne z oryginałem. Po zapisie do WebP (jakość 80) mediana pasa 2% przy każdej krawędzi różni się od koloru docelowego najwyżej o 2 w każdym kanale, poza bokiem, przez który przedmiot wychodzi z kadru. Wynik oglądasz w pełnej rozdzielczości na prostokącie w kolorze sekcji i z różnicą wzmocnioną sześć razy.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Każde zdjęcie ma przypisaną drogę, a użytkownik dostał ją w planie razem z kolorem sekcji.
- Na zrzutach laptopa i telefonu w pełnej rozdzielczości nie widać granicy wtopionego zdjęcia ani plamy innego koloru wokół przedmiotu, także przy przycięciu kadru. Blok ma ostre krawędzie i dochodzi do krawędzi ekranu.
- Sąsiednie warianty różnią się co najmniej o ΔE 10, a każdy tekst ma kontrast co najmniej 4,5:1 do swojej sekcji.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-kolor.md. Przy zdjęciach na białym tle agent bierze kolor sekcji z samego produktu, a zdjęcie stawia jako wyraźny blok przy krawędzi ekranu.
Galeria
Do architektów i marek modowych.
Duże zdjęcia, cienki krój i dużo pustego miejsca, a przez wybrany projekt przechodzi się w poziomie, przewijając stronę w dół.
KrojeEpilogue
# Przepis na styl GALERIA
Styl do stron pracowni architektury, projektantów wnętrz i marek, które sprzedają obrazem. Duże zdjęcia, cienki krój i dużo pustego miejsca, a przez wybrany projekt przechodzi się w poziomie, przewijając stronę w dół.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
Cisza i światło. Zdjęcie jest bohaterem, a tekst jest jego podpisem. Układ jest asymetryczny i rytmiczny: duże zdjęcie, potem mniejsze z szerokim marginesem, podpis daleko od krawędzi. Puste miejsce nie jest tu stratą, tylko częścią stylu.
## Kroje
- Wszystko w jednej rodzinie: **Epilogue**.
- Duże nagłówki: waga 200, odstęp liter −0.02em.
- Tekst: waga 400, 15 px.
- Etykiety i podpisy: waga 500, 11 px, wersaliki, odstęp liter 0.16em.
## Kolory
```css
:root {
--tlo: #f2f2f0;
--tekst: #1a1a18;
--tekst-2: #6b6b66; /* drobny tekst, 4,8:1 na tle */
--linia: #d9d9d4;
}
```
Koloru akcentu nie ma, bo kolor dają zdjęcia.
## Siatka i odstępy
- 12 kolumn, margines boczny 48 px na laptopie i 20 px na telefonie, odstęp między kolumnami 20 px.
- Duże odstępy w pionie: 160–220 px między projektami na laptopie, 96 px na telefonie.
- Zdjęcia stoją w różnych miejscach siatki według rytmu: pełna szerokość, potem para w jednym rzędzie (kolumny 2–7 i 8–12, drugie zdjęcie niżej o 120 px), potem znowu pełna szerokość. Hero liczy się jako pierwsza pełna szerokość, a to samo zdjęcie nie stoi dwa razy w pełnej szerokości tuż po sobie.
## Typografia
- Nazwa pracowni w nawigacji: Epilogue 500, 14 px, wersaliki, odstęp liter 0.16em.
- H1: Epilogue 200, `clamp(48px, 7vw, 128px)`, interlinia 0.95.
- Nazwy projektów: Epilogue 200, `clamp(32px, 3.6vw, 60px)`.
- Podpisy projektów: miejsce, rok i powierzchnia w kroju etykiety, rozdzielone szerokim odstępem zamiast kropek.
- Tekst: 15 px, interlinia 1.7, najwyżej 46 znaków w wierszu (w Epilogue to około `23em`, a nie `46ch`).
## Elementy
- **Nawigacja:** nazwa pracowni po lewej, trzy linki po prawej, sam tekst bez tła. Chowa się przy przewijaniu w dół i wraca przy przewijaniu w górę. Nad ciemnym zdjęciem tekst zmienia kolor na jasny, tak żeby zawsze miał kontrast 4,5:1, bez nakładek na zdjęcie. To samo dotyczy podpisu na hero.
- **Hero:** jedno zdjęcie na cały ekran, a na nim w lewym dolnym rogu nazwa projektu i miejsce drobnym drukiem. Nagłówek z nazwą pracowni i jednym zdaniem stoi dopiero pod zdjęciem.
- **Lista projektów:** zdjęcie, a pod nim w jednej linii nazwa projektu po lewej oraz miejsce i rok po prawej. Kliknięcie w zdjęcie albo nazwę prowadzi do projektu, jeśli projekt ma swoją podstronę albo sekcję. Bez niej projekt zostaje bez linku.
- **Przejazd w poziomie:** jeden wybrany projekt pokazany jako pas zdjęć. Sekcja jest przyklejona do ekranu, a przewijanie strony w dół przesuwa pas w lewo, aż pokaże się ostatnie zdjęcie. Pod pasem cienka linia postępu.
- **Pracownia:** krótki tekst o pracowni w Epilogue 200 `clamp(26px, 2.6vw, 40px)` w kolumnach 4–10, a pod nim lista osób z rolami jako zwykły tekst.
- **Kontakt:** adres e-mail w Epilogue 200 na pół szerokości ekranu (na telefonie na całą), telefon i adres pracowni w kroju etykiety.
- **Przyciski:** sam tekst z linią 1 px pod spodem. Po najechaniu linia skraca się do zera i rośnie z powrotem z drugiej strony (cały efekt 400 ms).
## Zdjęcia
- Bez zaokrągleń, ramek, cieni i filtrów. Zdjęcia w oryginalnych proporcjach, poziome i pionowe na zmianę, jeśli są jedne i drugie.
- Pod zdjęciem zawsze podpis, a na zdjęciu nigdy tekst, z wyjątkiem hero.
- Gdy zdjęć brakuje, zamiast zdjęcia stoi sama nazwa projektu w Epilogue 200, wielkości połowy ekranu.
## Ruch
- Wolny i ciężki. Zdjęcia odsłaniają się maską od dołu w 1400 ms, `cubic-bezier(.65, 0, .35, 1)`, a obraz w masce zaczyna od skali 1.15. Odsłanianie startuje, kiedy widać 20–25% zdjęcia.
- Przejazd w poziomie: przesunięcie pasa liczone z postępu przewijania przyklejonej sekcji i wygładzone (zbliżanie do celu o 0.08 odległości na klatkę przy 60 kl./s, na szybszych ekranach przeliczone z czasu klatki), a pas staje na całych pikselach, żeby podpisy się nie rozmywały.
- W trakcie przewijania zdjęcia przesuwają się w swojej ramce o 6% wysokości, a sama ramka stoi.
- Podpisy wchodzą 200 ms po zdjęciu, samą przejrzystością.
## Telefon
- Jedna kolumna, zdjęcia na całą szerokość ekranu bez marginesów, podpisy z marginesem.
- Przejazd w poziomie zamienia się w pas zdjęć przewijany palcem w bok, z przyciąganiem do zdjęcia (`scroll-snap`); zdjęcia zajmują od 56% do 84% szerokości ekranu, zależnie od proporcji.
- Nawigacja: nazwa pracowni i „Menu”, które otwiera pełny ekran z linkami w Epilogue 200 48 px.
## Czego nie robić
- Kart, zaokrągleń, cieni i kolorowych przycisków z tłem.
- Tekstu na zdjęciach (poza hero) i ciemnych nakładek na zdjęcia.
- Ikon mediów społecznościowych w kółkach, liczników „lat doświadczenia” i rzędu nagród w logotypach.
- Pogrubionych nagłówków. Najgrubsza waga na stronie to 500 w etykietach.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Przejazd w poziomie kończy się dokładnie na ostatnim zdjęciu i odkleja się bez skoku.
- Na laptopie żadne dwa kolejne zdjęcia nie stoją w tym samym miejscu siatki.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-galeria.md. W tym stylu zdjęcia robią prawie całą robotę, więc najlepiej wygląda seria w jednym świetle i kolorze, bez mieszania zdjęć z różnych sesji.
Oferta
Do landingu jednej usługi, produktu albo marki osobistej.
Każda sekcja to arkusz z dużym zaokrągleniem w jednym z pięciu pełnych kolorów, a przy przewijaniu następny wjeżdża na poprzedni jak kartka kładziona na kartkę.
KrojeYoung Serif · Schibsted Grotesk
# Przepis na styl OFERTA
Styl do landingu jednej usługi, jednego produktu albo marki jednej osoby. Każda sekcja to osobny arkusz z dużym zaokrągleniem, w jednym z pięciu pełnych kolorów, leżący na ciepłym szarym tle. Przy przewijaniu następny arkusz wjeżdża na poprzedni jak kartka kładziona na kartkę. Nagłówki w ciężkim, miękkim szeryfie, zdjęcia przedmiotów na jednolitym tle dochodzą do krawędzi arkusza.
Ten plik to przepis na wygląd strony internetowej dla agenta, który pisze kod: Claude Code'a, Codexa, Cursora albo podobnego. Nie ma w nim treści, tylko wygląd: kroje, kolory, siatka, elementy, zdjęcia i ruch.
## Jak z niego korzystasz
Przeczytaj cały przepis, zanim cokolwiek zmienisz. Potem sprawdź, w której sytuacji jesteś:
- **Strona już istnieje.** Zmieniasz wyłącznie wygląd. Treść i działanie strony zostają nietknięte, a zasady są niżej, w części „Treść zostaje”.
- **Strony jeszcze nie ma.** Budujesz ją od razu w tym stylu. Teksty, zdjęcia, ceny i dane kontaktowe bierzesz od użytkownika. Jeśli czegoś brakuje, wstawiasz tekst zastępczy w nawiasie kwadratowym, na przykład [adres], i nie zmyślasz faktów.
Zanim zaczniesz, napisz użytkownikowi w kilku krótkich punktach, co zmienisz, i poczekaj na zgodę. Liczby w przepisie (stopnie pisma, odstępy, czasy ruchu) są ustawione pod typowy landing. Przy bardzo długich tekstach albo nietypowych sekcjach dopasuj je tak, żeby styl dalej był rozpoznawalny. Przepis to szkic stylu, a nie sztywna instrukcja: jeśli użytkownik chce innych kolorów albo innego kroju, zmieniasz je tak, jak prosi, a resztę przepisu stosujesz dalej.
## Treść zostaje
Te zasady obowiązują zawsze, kiedy przebudowujesz stronę, która już istnieje.
- Każde słowo zostaje takie samo: nagłówki, akapity, ceny, przyciski, menu, stopka, teksty alternatywne zdjęć, tytuł strony i opisy dla wyszukiwarek. Nie poprawiasz, nie skracasz, nie tłumaczysz i niczego nie dopisujesz.
- Sekcje zostają w tej samej kolejności. Linki, formularze, koszyk, skrypty analityczne, piksele reklamowe i wtyczki działają tak samo jak wcześniej.
- Zdjęcia zostają te same. Wolno je przyciąć, zmienić proporcje kadru i nałożyć traktowanie opisane w tym przepisie, ale nie podmieniasz ich na inne i nie generujesz nowych.
- Zmieniasz krój, kolory, odstępy, rozmieszczenie elementów wewnątrz sekcji, wygląd przycisków, kart i pól formularzy oraz ruch.
- Jeśli jakiś element stylu wymaga treści, której na stronie nie ma (na przykład styl przewiduje liczby w nagłówku, a strona ich nie ma), pomijasz ten element zamiast dopisywać treść. Treści nie przenosisz też między sekcjami, żeby wypełnić element stylu.
- Jeśli na stronie jest coś, czego styl zakazuje (na przykład emoji albo strzałki w przyciskach), to zostaje, bo jest treścią. Możesz to wyciszyć wyglądem, a o usunięcie pytasz użytkownika.
- Numery porządkowe sekcji (01, 02…) wolno dodać jako element wyglądu, w CSS (licznik i `::before`), a nie w HTML. Wolno też dodać napisy sterujące, których wymaga obsługa strony na telefonie, na przykład „Menu” i „Zamknij”. Nazw sekcji, etykiet pól ani innych słów, których na stronie nie było, nie dodajesz.
- Działanie strony też zostaje: rozwijane pytania startują w tym samym stanie co wcześniej, formularz wysyła się tak samo i pokazuje te same komunikaty. Opisane w przepisie komunikaty i stany startowe stosujesz tylko przy nowej stronie.
- Przed zmianami zrób kopię plików strony obok jej folderu, a nie w nim, żeby nie zepsuć ścieżek względnych. Po zmianach wyciągnij cały widoczny tekst z wersji przed i po (najprościej skryptem, który zbiera tekst ze wszystkich podstron) i porównaj obie wersje. Przy porównaniu wyłącz `text-transform`, zamień twarde spacje na zwykłe i zwiń wszystkie odstępy do pojedynczych spacji, bo inaczej wersaliki i spacje z przepisu wyjdą jako fałszywe różnice. Różnica ma wynosić zero znaków, a wynik porównania pokazujesz użytkownikowi.
## Kroje: skąd je wziąć
Wszystkie kroje z tego przepisu są darmowe, także do użytku komercyjnego, i mają polskie znaki. Pobierz je z Google Fonts w formacie WOFF2, razem z zestawem znaków latin-ext, i podepnij z serwera strony zamiast ładować z serwerów Google. Strona otwiera się wtedy szybciej, a przeglądarka odwiedzającego nie wysyła jego adresu IP do Google, co w Unii bywa problemem przy RODO. Przy krojach ze zmienną wagą albo szerokością pobierz plik zmienny, a przy krojach z rozmiarem optycznym wariant z osią opsz, bo inaczej część wag i ustawień z przepisu nie zadziała.
## Charakter
Landing, który da się przejrzeć jak plik kartek na stole. Każda sekcja jest arkuszem: ma pełny kolor, duży promień na wszystkich czterech rogach i wąski margines, przez który widać tło strony. Arkusze przyklejają się pod nawigacją, a następny wjeżdża na poprzedni, który w tym czasie lekko się cofa i ciemnieje. Zaokrąglone są tylko arkusze, przyciski i pola formularza. Wszystko wewnątrz arkusza jest proste: linie, kolumny, duże cyfry, a zdjęcie nie ma własnych rogów, tylko dochodzi do krawędzi arkusza i dostaje jego zaokrąglenie przez przycięcie. Wezwanie do głównego celu strony ma jeden wygląd od nawigacji po formularz na końcu.
## Kroje
- Nagłówki, nazwa firmy w nawigacji, ceny, duże cyfry kroków i faktów, cytaty z opinii i pytania: **Young Serif**, jedyna waga 400. Kroju nie pogrubiasz sztucznie i nie pochylasz (nie ma kursywy).
- Wszystko inne (akapity, menu, przyciski, etykiety, pola formularza, podpisy): **Schibsted Grotesk**, plik zmienny z wagami 400–900. Tekst 400, menu i etykiety 500, przyciski 600.
- Ceny, godziny i numery: `font-variant-numeric: lining-nums tabular-nums`, twarda spacja przed „zł”.
## Kolory
```css
:root {
--rama: #dcd6ca; /* tło strony: margines dookoła arkuszy i pasek nawigacji */
--kosc: #f4eddd; /* arkusz jasny (hero), pola formularza, menu na telefonie */
--filc: #a3141b; /* arkusz czerwony, arkusz z formularzem, przycisk na jasnych arkuszach */
--ochra: #efb22f; /* arkusz żółty, przycisk na arkuszach zielonym i ciemnym */
--sukno: #163f2a; /* arkusz zielony */
--heban: #18130f; /* tekst na jasnych arkuszach, arkusz z cennikiem, stopka */
--promien: clamp(24px, 2.8vw, 44px); /* jedyny promień na stronie, 0 wyłącza wszystkie zaokrąglenia */
--ramka: 12px; /* margines dookoła arkuszy, 8 px poniżej 700 px szerokości */
}
```
Każdy arkusz ma swój kolor tekstu i przycisku:
| Arkusz | Tekst | Przycisk (tło / napis) |
|---|---|---|
| `--kosc` | `--heban` | `--filc` / `--kosc` |
| `--filc` | `--kosc` | `--kosc` / `--filc` |
| `--ochra` | `--heban` | `--heban` / `--ochra` |
| `--sukno` | `--kosc` | `--ochra` / `--heban` |
| `--heban` | `--kosc`, ceny w `--ochra` | `--ochra` / `--heban` |
Tekst drugorzędny (opisy pod nazwami, podpisy, dopiski) to kolor tekstu arkusza zmieszany w 78% z kolorem arkusza (`color-mix(in srgb, tekst 78%, arkusz)`), linie w 28%. Tak dobrane pary mają co najmniej 4,5:1. Czerwonego tekstu nie stawiasz na ochrze (4,1:1).
**Kolejność kolorów.** Pierwszy arkusz (hero) jest `--kosc`. Kolejne idą w stałej kolejce `--filc`, `--ochra`, `--sukno`, `--kosc` i od nowa. Poza kolejką są trzy arkusze: cennik (albo sekcja z najważniejszymi liczbami, jeśli cennika nie ma) i stopka dostają `--heban`, a arkusz z formularzem albo ostatnim wezwaniem `--filc`. Arkusz poza kolejką nie przesuwa kolejki. Jeśli dwa sąsiednie arkusze wyszłyby w tym samym kolorze, drugi bierze następny kolor z kolejki. Przykłady:
- 5 sekcji (hero, oferta, cennik, formularz, stopka): kość, filc, heban, filc, heban.
- 10 sekcji jak na stronie pokazowej: kość, filc, ochra, sukno, heban (cennik), kość, filc, ochra, filc (formularz), heban (stopka).
- 12 sekcji: kość, filc, ochra, sukno, kość, filc, heban (cennik), ochra, sukno, kość, filc (formularz), heban (stopka).
- Bez cennika i formularza: `--heban` dostaje tylko stopka.
Jeśli firma ma własny kolor marki, zastępuje on `--filc` (arkusz i przyciski), pod warunkiem że `--kosc` ma na nim co najmniej 4,5:1. Pozostałe kolory zostają, bo bez nich styl przestaje być rozpoznawalny.
## Siatka i odstępy
- **Rama:** tło strony `--rama`. Arkusze mają `--ramka` marginesu z boków i taki sam odstęp między sobą. Arkusz jest blokiem na całą szerokość okna minus rama, bez kontenera o stałej szerokości.
- **Wnętrze arkusza:** odstęp od krawędzi `clamp(22px, 4vw, 64px)` z boków i 1,2 raza tyle u góry i na dole. Treść w 12 kolumnach z odstępem 24 px, najwyżej 1320 px szerokości, wyśrodkowana w arkuszu. Poniżej 900 px arkusz z połówkami zmienia się w jedną kolumnę (`grid-template-columns: minmax(0, 1fr)`, zdjęcie nad tekstem). Treść w środku arkusza ma własne progi, opisane w części „Telefon”.
- **Wysokość:** na laptopie każdy arkusz ma co najmniej wysokość ekranu pod nawigacją (`calc(100svh - nawigacja - ramka)`), więc jeden ekran to zawsze jeden arkusz. Nagłówek sekcji stoi u góry arkusza, a treść spływa do dołu (`display: flex; flex-direction: column; justify-content: space-between`, między nimi co najmniej 56 px). Wyjątki: hero (opis niżej) i stopka, która ma wysokość treści. Na telefonie arkusz ma wysokość treści.
- **Początek sekcji:** w lewym górnym rogu arkusza numer i nazwa sekcji („02 W cenie wizyty”), pod nimi 24 px odstępu i H2 w kolumnach 1–8. Numer to element wyglądu, wolno go dodać, najlepiej licznikiem CSS w `::before`, żeby nie wszedł do tekstu strony. Nazwę bierzesz z treści strony (z menu albo z nadtytułu), a jeśli sekcja nie ma nazwy albo nazwa brzmi tak samo jak H2 („Cennik” nad „Cennik”), zostaje sam numer.
- **Zdjęcie obok tekstu:** zdjęcie zajmuje połowę arkusza (kolumny 7–12 albo 1–6, w kolejnych arkuszach na zmianę) i dochodzi do górnej, dolnej i bocznej krawędzi arkusza bez marginesu, a tekst stoi w drugiej połowie. **Pas zdjęcia:** w arkuszu z krokami albo z treścią w kilku kolumnach zdjęcie leży u góry na całą szerokość arkusza, w proporcji 21:9, ale najwyżej na 45% wysokości ekranu, dochodzi do górnej krawędzi i boków, a treść stoi pod nim.
- **Arkusz bez zdjęcia:** etykieta i nagłówek w kolumnach 1–8, treść na całej szerokości albo w dwóch połowach (1–6 i 7–12). W miejsce brakującego zdjęcia nie wstawiasz ikon, ilustracji ani kształtów. Kolor arkusza wystarczy. Strona, która nie ma żadnych zdjęć, też działa w tym stylu: hero dostaje układ bez zdjęcia, a rytm robią kolory arkuszy, duże cyfry i ceny.
## Typografia
- H1: Young Serif `clamp(46px, 5.9vw, 100px)`, interlinia 0.98, odstęp liter −0.02em, najwyżej 11 em szerokości. Krótki nagłówek mieści się przy tym stopniu w połowie arkusza w trzech, czterech wierszach. Długie polskie słowa łamią ten rachunek, więc wiersze wyrównujesz `text-wrap: balance`, bez dzielenia wyrazów i bez samotnego słowa w ostatnim wierszu, a jeśli najdłuższe słowo nie mieści się w połowie arkusza, zmniejszasz stopień, aż się zmieści. W hero bez zdjęcia 1,25 raza większy i do 16 em.
- H2: Young Serif `clamp(36px, 4.2vw, 64px)`, interlinia 1.02, odstęp liter −0.015em, najwyżej 14 em.
- H3 (nazwy w listach, kroki, pozycje cennika, pytania): Young Serif `clamp(22px, 2vw, 30px)`, interlinia 1.12.
- Liczby: ceny Young Serif `clamp(44px, 4.4vw, 68px)`, cyfry kroków `clamp(64px, 7vw, 112px)`, fakty `clamp(40px, 3.6vw, 56px)`, wszystkie z interlinią 1. Słowo przy liczbie („około”, „od”) w faktach ma 0.36 wielkości liczby i stoi przed nią w tym samym wierszu.
- Akapit wstępu: Schibsted Grotesk 400 `clamp(18px, 1.45vw, 21px)`, interlinia 1.45, najwyżej 32 em.
- Tekst: Schibsted Grotesk 400 17 px (16 px na telefonie), interlinia 1.55, najwyżej 34 em.
- Etykiety (numer i nazwa sekcji, nazwy pól, podpisy pod liczbami): Schibsted Grotesk 500 15 px, bez wersalików, numer z cyframi tabelarycznymi i 12 px odstępu przed nazwą.
- Wezwanie na nowej stronie: zdaniem, z wielkiej litery, bez wykrzyknika i bez strzałki. Przy przebudowie napis zostaje taki, jaki był.
- Wiersze dzielisz tak, żeby na końcu wiersza nie zostały jednoliterowe spójniki i przyimki (twarda spacja po „w”, „z”, „i”, „a”, „o”, „u”), a w nagłówkach `text-wrap: balance`.
## Elementy
- **Nawigacja:** pasek na tle `--rama`, wysokość 64 px (56 px na telefonie), przyklejony do góry, bez linii i bez cienia. Po lewej nazwa firmy Young Serif 26 px (22 px na telefonie) albo logo z pliku, na środku linki Schibsted Grotesk 500 15 px co 32 px (po najechaniu podkreślenie 1,5 px rysowane od lewej), po prawej przycisk główny w mniejszym wariancie (44 px wysokości, 15 px, odstęp 0 20 px). Poniżej 900 px zamiast linków i przycisku jest napis „Menu” (Schibsted Grotesk 600 15 px) po prawej.
- **Arkusz:** `border-radius: var(--promien)`, `overflow: hidden`, `position: sticky` i `top` równe wysokości nawigacji. Arkusz wyższy niż ekran przykleja się dopiero wtedy, kiedy jego dół dojdzie do dołu ekranu: `top` liczysz skryptem jako `innerHeight − wysokość arkusza − ramka` (wartość ujemna) i przeliczasz po wczytaniu krojów, przy zmianie rozmiaru okna i przy zmianie wysokości arkusza (`ResizeObserver`, bo rozwinięte pytanie wydłuża arkusz). Arkusz niższy niż 60% wysokości ekranu (na telefonie zdarza się to często) w ogóle się nie przykleja, tylko przewija zwyczajnie, bo przyklejony krótki arkusz zostawia pod sobą pół ekranu przyciemnionego poprzedniego. Bez skryptu arkusze stoją jeden pod drugim bez przyklejania, bo inaczej następny zasłoniłby koniec długiego.
- **Wspólny rodzic:** `position: sticky` działa tylko w obrębie rodzica, więc wszystkie arkusze i stopka muszą być rodzeństwem. Jeśli sekcje stoją w `<main>`, a stopka poza nim, nadajesz `<main>` `display: contents` (znacznik zostaje w kodzie, znika tylko jego pudełko).
- **Koniec stosu:** arkusz tuż przed stopką i sama stopka się nie przyklejają, tylko przewijają zwyczajnie. Inaczej krótka stopka zostaje na stałe na ostatnim arkuszu i zasłania formularz z przyciskiem. Arkusz chowasz (`visibility: hidden`), kiedy arkusze leżące nad nim, czyli późniejsze, razem zakrywają całą jego widoczną część, i kiedy pierwszy nieprzyklejany arkusz nad nim minął nawigację. Arkusz, na który właśnie wjeżdża następny, zostaje widoczny, bo jego kolor w rogach nadjeżdżającego pokazuje, że to stos. Bez tej reguły przez szczeliny ramy i rogi (między formularzem a stopką, przy krótkich arkuszach na telefonie) prześwituje przyciemniony arkusz sprzed kilku ekranów.
- **Kotwice:** linki z menu prowadzą do pustych znaczników przed arkuszami (`display: block; height: 0`), nie do samych arkuszy, bo przewijanie do przyklejonego elementu bywa niedokładne, z `scroll-margin-top` równym wysokości nawigacji. Płynne przewijanie do kotwic robisz skryptem i tylko przy włączonym ruchu. `scroll-behavior: smooth` na całej stronie odpada, bo psuje przewijanie sterowane skryptem (podglądy, testy, stronę w ramce).
- **Hero:** pierwszy arkusz, `--kosc`, wysoki na ekran pod nawigacją minus 44 px (`calc(100svh - 64px - 2 * var(--ramka) - 44px)`, co najmniej 540 px), tak żeby u dołu pierwszego ekranu wystawała górna krawędź następnego arkusza z zaokrąglonymi rogami. Od pierwszego ekranu widać, że strona to stos arkuszy. Po lewej w kolumnach 1–6: etykieta u góry, a na dole H1, akapit wstępu, przycisk i pod nim jedna linijka stanu (najbliższy termin, godziny otwarcia, termin wysyłki) Schibsted Grotesk 500 15 px w kolorze drugorzędnym. Po prawej zdjęcie na pół arkusza, dochodzące do trzech krawędzi. Bez zdjęcia: H1 na całą szerokość, a pod nim akapit i przycisk w kolumnach 1–6.
- **Przyciski:** prostokąt z promieniem `calc(var(--promien) / 2)`, wysokość 56 px, odstęp 0 28 px, Schibsted Grotesk 600 17 px, kolory z tabeli w „Kolorach”, bez ramki, cienia i strzałki. Po najechaniu nad tłem pojawia się warstwa w kolorze napisu z kryciem 0.12, po naciśnięciu przycisk zjeżdża o 1 px. Drugi przycisk (każde inne wezwanie niż główne) to sam tekst Schibsted Grotesk 600 17 px z podkreśleniem 1,5 px odsuniętym o 5 px. Wygląd przycisku głównego dostaje każde wezwanie prowadzące do tego samego celu (formularz, zakup, zapis). Na nowej stronie wszystkie mają jedno brzmienie. Przy przebudowie brzmienie zostaje takie, jakie było, a jednolity jest wygląd: kształt, krój i wielkość, kolor z tabeli dla arkusza, na którym przycisk stoi.
- **Lista powodów albo sytuacji** („z czym przychodzą ludzie”): wiersze z linią 1 px na górze, nazwa jako H3 po lewej (kolumny 1–5), jedno zdanie po prawej (kolumny 6–12), odstęp 22 px u góry i na dole wiersza. Ostatni wiersz ma też linię na dole. Obok zdjęcia na pół arkusza nazwa i zdanie stoją jedno pod drugim.
- **Lista „co dostajesz”:** dwie kolumny par nazwa (H3) i opis pod nią, z linią 1 px nad każdą parą, bez ikon i bez numerów.
- **Kroki:** w rzędzie po cztery (przy trzech po trzy, przy pięciu i więcej po trzy w dwóch rzędach), oddzielone pionowymi liniami 1 px, 24 px od linii. W każdym duża cyfra Young Serif, 20 px pod nią H3 i dwa, trzy zdania w kolorze drugorzędnym. Cyfry, nazwy i opisy w sąsiednich krokach stoją na tych samych liniach, także kiedy nazwy mają różną liczbę wierszy (`grid-template-rows: subgrid`). Na telefonie jeden pod drugim, cyfra 64 px w kolumnie 72 px po lewej, tekst po prawej.
- **Cennik:** arkusz `--heban`. Pozycje w kolumnach oddzielonych pionową linią 1 px (najwyżej cztery w rzędzie, przy pięciu i więcej tabela wierszy z ceną wyrównaną do prawej). W kolumnie: nazwa H3 w `--kosc`, 28 px niżej cena Young Serif w `--ochra`, 16 px pod nią opis w kolorze drugorzędnym. Wszystkie ceny stoją w jednej linii, nawet kiedy nazwy mają po jednym i po trzy wiersze (`subgrid`, jak w krokach). Pod kolumnami linia 1 px, a pod nią w jednym rzędzie dopisek po lewej i jeden przycisk główny po prawej, jeśli strona ma taki dopisek albo wezwanie. Na nowej stronie nie dajesz przycisku w każdej kolumnie. Przy przebudowie przyciski z kolumn zostają, ale jako drugi przycisk (tekst z podkreśleniem) pod opisem. Żadna kolumna nie jest wyróżniona tłem, ramką ani powiększeniem. Jeśli strona ma plakietkę „najczęściej wybierany”, zostaje jako etykieta Schibsted Grotesk 500 15 px w kolorze `--ochra` nad nazwą pakietu, bez tła. Bez przekreślonych cen.
- **Kto za tym stoi:** zdjęcie na pół arkusza, obok H2, akapit i rząd faktów: liczba Young Serif, 10 px pod nią podpis Schibsted Grotesk 500 15 px w kolorze drugorzędnym, kolumny oddzielone pionową linią 1 px. Na telefonie fakty jeden pod drugim, liczba po lewej, podpis obok.
- **Opinie:** cytaty Young Serif `clamp(24px, 2.2vw, 34px)`, interlinia 1.2, w cudzysłowie polskim „…”. Pod cytatem podpis Schibsted Grotesk 500 15 px, a pod nim w kolorze drugorzędnym, czego dotyczy opinia. Cytaty jeden pod drugim z linią między nimi albo w trzech kolumnach z pionowymi liniami. Bez gwiazdek, zdjęć klientów i karuzeli.
- **Pytania:** wiersze z linią 1 px na górze, pytanie H3 po lewej i plus po prawej: dwie kreski 1,5 px, 22 na 22 px, przycisk z odstępem 20 px u góry i na dole. Odpowiedź rozwija się pod pytaniem (Schibsted Grotesk 17 px w kolorze drugorzędnym, najwyżej 40 em). Pytanie jest przyciskiem z `aria-expanded`, otwarte może być kilka naraz. Na nowej stronie na start otwarte jest pierwsze, przy przebudowie stan startowy zostaje taki, jaki był. Bez JavaScriptu wszystkie odpowiedzi są widoczne, a plusów nie ma.
- **Formularz:** arkusz `--filc`. Pola to płytki w kolorze `--kosc` z napisem `--heban`, wysokość 56 px, promień `calc(var(--promien) / 2)`, bez ramki, etykieta nad polem Schibsted Grotesk 500 15 px w kolorze tekstu arkusza. Aktywne pole ma obwódkę 2 px w kolorze `--heban` odsuniętą o 2 px. Wybór z dwóch, trzech opcji to rząd takich płytek, a wybrana ma tło `--heban` i napis `--kosc`. Na nowej stronie błąd pokazujesz pod polem napisem „Uzupełnij to pole” w kolorze `--kosc` Schibsted Grotesk 600 14 px i obwódką 2 px `--kosc`, a po wysłaniu formularz zostaje i pod przyciskiem pojawia się jedna linijka odpowiedzi. Przy przebudowie obsługa formularza (wymagane pola, komunikaty, okienka po wysłaniu) zostaje taka, jaka była, a zmieniasz tylko wygląd pól, napisów i przycisku.
- **Arkusz z samymi liczbami** (sekcja, w której są tylko fakty liczbowe): liczby w siatce 2 × 2, Young Serif `clamp(64px, 8.6vw, 148px)`, pod każdą podpis Schibsted Grotesk 500 15 px w kolorze drugorzędnym, między polami linie 1 px (pionowa i pozioma). Przy trzech liczbach trzecia zajmuje cały dolny wiersz. Rząd małych liczb na arkuszu wysokim na cały ekran wygląda jak pusty kolorowy ekran, dlatego liczby są duże. Na telefonie jedna pod drugą, 64 px, z poziomymi liniami.
- **Galeria:** zdjęcia w jednym rzędzie na dole arkusza, w jednakowej proporcji (najlepiej 4:5), dochodzą do dolnej i bocznych krawędzi arkusza. Między nimi szczelina szerokości `--ramka` w kolorze arkusza, bez własnych rogów. Nagłówek sekcji stoi nad nimi jak w każdym arkuszu. Na telefonie zdjęcia w siatce 2 × 2 z tą samą szczeliną.
- **Karta z oceną w hero** (pływająca ramka typu „4,9 ★ z 180 opinii”): zostaje, ale jako wycięcie w rogu zdjęcia, czyli prostokąt w kolorze `--kosc` przyklejony do dolnego rogu zdjęcia od strony tekstu, bez cienia, ramki i własnych zaokrągleń. W środku ten sam odstęp co w arkuszu, liczba Young Serif `clamp(36px, 3.4vw, 52px)`, podpis Schibsted Grotesk 500 15 px w kolorze drugorzędnym.
- **Emoji, symbole i inicjały** (treść, która zostaje przy przebudowie): emoji dostają `filter: grayscale(1)`, krycie 0.6 i wielkość 0.8 em. Symbole ★, ✕ i ✓ mają kolor drugorzędny arkusza. Inicjały w kółkach zamiast zdjęć klientów stają się samą literą Young Serif w stopniu H3, bez kółka i bez tła.
- **Stopka:** ostatni arkusz `--heban`, wysoki na swoją treść. U góry nazwa firmy Young Serif w stopniu H2, pod nią kolumny z linią 1 px u góry, nagłówkiem Schibsted Grotesk 500 15 px w kolorze drugorzędnym i treścią 17 px w `--kosc`. Dane firmy drobnym drukiem 13 px na dole.
- **Menu na telefonie:** arkusz `--kosc` zjeżdża z góry pod nawigację, z promieniem tylko na dolnych rogach, na szerokość ekranu minus ramka. Linki Young Serif 34 px jeden pod drugim, na dole przycisk główny na całą szerokość. Strona pod spodem dostaje warstwę `--rama` z kryciem 0.7. Zamyka je napis „Zamknij” w miejscu „Menu”, Escape i dotknięcie warstwy.
## Zdjęcia
Pierwsze dwa punkty (co pokazują zdjęcia i para kolorów) dotyczą nowej strony. Przy przebudowie obowiązują tylko kadr, filtr i krawędzie z dwóch kolejnych punktów, a kolejkę kolorów zostawiasz bez zmian, nawet jeśli któreś zdjęcie wypadnie na arkuszu w kolorze swojego tła.
- Przedmioty i materiały, z którymi pracuje firma, jako martwa natura na jednolitym, nasyconym tle, z góry albo na wprost, w miękkim świetle dziennym, bez połysku i bez snopów światła. Ludzie tylko przy pracy, z profilu albo od tyłu, nie uśmiechnięci do obiektywu.
- **Para kolorów:** tło zdjęcia ma inny kolor niż arkusz, na którym leży (czerwone zdjęcie na jasnym albo zielonym arkuszu, żółte na czerwonym). Zdjęcie nie zlewa się z arkuszem, tylko leży na nim jak druga kartka.
- Zdjęcie nie ma ramki, cienia ani własnych zaokrągleń. Dochodzi do krawędzi arkusza i dostaje jego promień przez `overflow: hidden`. `object-fit: cover`, kadr ustawiony na środku przedmiotu (`object-position`).
- Jeśli strona ma zdjęcia z różnych sesji, nakładasz na wszystkie `filter: saturate(1.05) contrast(1.03)` i dobierasz im arkusze według reguły pary kolorów. Zdjęcia biurowe albo stockowe nie dostają połowy arkusza: stoją jako pas 21:9 u góry arkusza.
## Ruch
- **Nakładanie arkuszy:** kiedy następny arkusz wjeżdża na przyklejony, przyklejony cofa się ze skali 1 do 0.94 i ciemnieje: warstwa nad nim ma gradient od przezroczystości u góry do `rgb(0 0 0 / .32)` u dołu, a jej krycie rośnie od 0 do 1. Postęp liczysz z położenia następnego arkusza: 0, kiedy jego góra jest u dołu ekranu, 1, kiedy dojdzie pod nawigację. Środek skalowania to środek widocznej części arkusza. Animujesz tylko `transform` i `opacity`, w jednym `requestAnimationFrame` na przewinięcie, i tylko dla arkuszy widocznych na ekranie.
- **Zdjęcie w arkuszu:** w czasie wjeżdżania arkusza od dołu ekranu do miejsca przyklejenia zdjęcie zmniejsza się ze skali 1.08 do 1.
- **Wejście treści:** kiedy góra arkusza minie 75% wysokości ekranu, etykieta, wiersze H2 i kolejne bloki treści wchodzą z 24 px niżej i od krycia 0 do 1, 700 ms, `cubic-bezier(.2, .7, .2, 1)`, kolejne co 70 ms. Akapity wchodzą w całości.
- **Hero po wczytaniu:** wiersze H1 wysuwają się spod maski (z przesunięcia 110% do 0), 900 ms, kolejne co 80 ms, a zdjęcie przechodzi ze skali 1.08 do 1 w 1400 ms, ta sama krzywa. Maska ma zapas 0.06 em u góry i 0.14 em u dołu (ujemny margines), żeby nie ucinała ogonków ą, ę, ł i akcentów nad wielkimi literami. Etykieta, akapit, przycisk i linijka stanu wchodzą z 16 px niżej w 700 ms, po kolei z opóźnieniem 100, 350, 450 i 550 ms. Po skończonej animacji wiersze wracają do zwykłego tekstu, żeby nagłówek łamał się dobrze po zmianie szerokości okna. Wysokość nagłówka w czasie animacji i po niej ma być identyczna, inaczej na końcu nagłówek podskakuje: kontener wierszy ustawiasz jako `display: flex; flex-direction: column`, bo ujemne marginesy sąsiednich bloków by się zlały, a jeśli wiersze są `inline-block` z `overflow: clip`, dostają `vertical-align: top`, bo bez tego linia bazowa przenosi się na dół bloku i nagłówek skacze o kilkanaście pikseli. Sprawdzasz to pomiarem wysokości nagłówka przed końcem animacji i po nim.
- **Pytania:** wysokość odpowiedzi przez `grid-template-rows` od `0fr` do `1fr`, 400 ms, a pionowa kreska plusa skaluje się do zera w 300 ms.
- Ruch nie zależy od myszki: bez efektów za kursorem i bez treści, którą widać dopiero po najechaniu.
- Przy ograniczonym ruchu arkusze dalej przyklejają się i nachodzą na siebie (to zwykłe przewijanie), ale bez skali, przyciemnienia i powiększenia zdjęć, a cała treść i H1 są widoczne od razu.
## Telefon
- Rama 8 px, promień 24 px (dolna granica `--promien`), wnętrze arkusza 22 px z boków i 26 px u góry i na dole, nawigacja 56 px z nazwą i „Menu”, tekst 16 px.
- Hero: zdjęcie na górze arkusza na całą szerokość, w proporcji 4:3, dochodzi do górnej krawędzi i boków. Pod nim etykieta, H1 od 46 px, akapit, przycisk na całą szerokość i linijka stanu. Hero ma co najmniej wysokość ekranu pod nawigacją minus 36 px, żeby przy krótkiej treści wystawała krawędź następnego arkusza.
- Zdjęcie obok tekstu staje nad tekstem, na całą szerokość arkusza, w proporcji 4:3, dochodzi do górnej krawędzi i boków. Pas zdjęcia ma proporcję 4:3.
- Progi treści w arkuszu: od 1199 px do 700 px kroki i cennik stoją po dwa w rzędzie (`repeat(2, minmax(0, 1fr))`), a pary „co dostajesz” w jednej kolumnie. Od 699 px w dół listy, kroki, cennik, fakty, liczby i opinie są w jednej kolumnie (`minmax(0, 1fr)`), z poziomymi liniami zamiast pionowych. Pola formularza i przyciski na całą szerokość.
- Arkusze przyklejają się tak samo jak na laptopie, długie dopiero na swoim końcu, a krótsze niż 60% ekranu wcale.
## Czego nie robić
- Drugiego poziomu zaokrągleń: kart z promieniem wewnątrz arkusza, zdjęć z własnymi rogami, plakietek i przycisków-pigułek z promieniem 999 px.
- Siatek kart z ikonami po trzy w rzędzie, ikon w kółkach, emoji, ilustracji 3D i plakietek nad nagłówkiem („Nowość”, „Najlepszy wybór”).
- Gradientów między kolorami, fioletu, neonów, szkła, rozmytych teł i cieni pod arkuszami. Jedyny gradient na stronie to przyciemnienie arkusza, na który wjeżdża następny.
- Fal, skosów i ząbków między sekcjami: arkusze oddziela rama, nic więcej.
- Gwiazdek przy opiniach, logotypów „zaufali nam”, liczników odliczających promocję i okien z rabatem.
- Na nowej stronie: kilku różnych wezwań jako przycisków głównych obok siebie („Zadzwoń”, „Kup teraz” i „Zapisz się” na jednym ekranie) i strzałek w przyciskach.
- Czarnego tła całej strony: `--heban` to tylko kolor arkusza, rama zostaje jasna.
- Krojów Inter, Roboto, Poppins i Montserrat, pogrubiania Young Serif i nagłówków wersalikami.
## Kontrola na koniec
- Obejrzyj stronę na szerokości 390 px (telefon) i 1440 px (laptop), od góry do dołu, z przewijaniem. Nic nie wystaje poza ekran w poziomie, a żaden tekst nie nachodzi na inny.
- Polskie znaki w nagłówkach są w tym samym kroju co reszta słowa. Jeśli „ą” albo „ł” wygląda inaczej, plik kroju nie ma zestawu latin-ext.
- Przy systemowym ustawieniu „ogranicz ruch” animacje się wyłączają, a cała treść jest widoczna od razu.
- Zwykły tekst ma kontrast co najmniej 4,5:1 do tła, a duże nagłówki co najmniej 3:1. Kolory z przepisu są dobrane pod te progi, ale jeśli na stronie stoją na innym tle niż w przepisie, sprawdź je jeszcze raz.
- Nawigacja, która stoi nad treścią, nie liczy się jako tekst nachodzący na inny, o ile w każdym miejscu jest czytelna.
- Po ustawieniu `--promien: 0` na stronie nie zostaje żadne zaokrąglenie, a układ dalej wygląda porządnie.
- Żadne dwa sąsiednie arkusze nie mają tego samego koloru, a `--heban` mają tylko cennik i stopka.
- Długi arkusz da się przeczytać do końca, zanim wjedzie na niego następny, także na telefonie.
- Wszystkie wezwania do tego samego celu wyglądają jak przycisk główny, a ich kolory zgadzają się z tabelą dla arkusza, na którym stoją.
- Na końcu strony i przy krótkich arkuszach na telefonie przez szczeliny ramy widać tło `--rama` albo arkusz, na który właśnie wjeżdża następny, a nie przyciemnione arkusze sprzed kilku ekranów.
- Na nowej stronie żadne zdjęcie nie stoi na arkuszu w kolorze swojego tła.
- Przy przebudowie porównanie tekstu przed i po daje zero różnic.Przepis możesz albo pobrać ↓ jako plik przepis-oferta.md. Na przykładzie marki serum pokazuję w kursie, jak z AI dojść od pustej kartki do projektu opakowania, serii zdjęć i filmów reklamowych gotowych do oddania klientowi.
Dalej
Czego uczę w kursie
- 01Oko
Uczę patrzeć na obraz jak fotograf i myśleć jak marketingowiec, żeby przed generowaniem wiedzieć, co ma poczuć odbiorca.
- 02Produkcja
Zdjęcia z prawdziwym produktem, filmy reklamowe i rolki robię bez planu zdjęciowego, a strony stawiam z agentem bez programisty.
- 03Narzędzia
Kanony™ piszą prompty jak fotograf i reżyser, a Korpus™ to biblioteka nazw detali, które musi znać każdy dyrektor kreatywny.
- 04Klienci
Pokazuję, jak znaleźć markę, której brakuje dobrych materiałów, jak do niej napisać i jak wycenić pracę bez zaniżania stawki.
Kurs „Anatomia nowoczesnego AI designera”: lekcje wideo w czterech częściach, Kanony™, Korpus™ i HVMBAK Effects™, zamknięta grupa i aktualizacje bez dopłaty. Płacisz raz, dostęp masz bez limitu czasu.
Pre-order do 4 listopada 999 zł
Zobacz kurs AIPo pre-orderze cena rośnie do 1199 zł
Do 4 listopada trwa pre-order i kurs kosztuje 999 zł. Potem cena rośnie do 1199 zł.
Powstaje w kursie
/Made with AI
/Made with AI
/Made with AI







