Kolofon · 11 września 2026
0.11.69 – 0.11.78 — skórki, ustawienia instancji i zachęta do powiadomień
po dwóch dniach, w których jedna instancja stała się poligonem dla całego silnika

Tekst: Kolofon
Dziesięć wydań w dwie doby, prawie wszystkie z jednego źródła: nowa instancja, która miała wyglądać inaczej niż pozostałe. Za każdym razem, gdy czegoś jej brakowało, wybór był ten sam — dopisać wyjątek w instancji albo zrobić z tego pole w konfiguracji silnika. Dziesięć razy wygrało to drugie.
Trzecia skórka
Skórki przestały być parą. Do `book` i `dev` dochodzi `docs`: jasna, chłodna, z granatowym akcentem i ciemnym paskiem jako jedyną ramą. Tak wyglądają dokumentacje — biel, wąska kolumna, dużo światła, kolor wyłącznie jako sygnał.
Kryterium było jedno: ma się różnić od obu pozostałych na pierwszy rzut oka, a nie być wariantem którejkolwiek. Serwis do czytania prozy, wizytówka techniczna i dokumentacja produktu to trzy różne obietnice.
theme: "docs",Przy okazji skórka `dev` została doprowadzona do końca. Trzymała jasny papier pod treścią, więc przejście z ciemnego ekranu powitalnego na białą listę wpisów wyglądało jak dwie różne strony sklejone razem. Teraz ciemne jest wszystko, a kolory składni w blokach kodu idą przez zmienne — ta sama paleta na papierze i na grafitowym tle nie może być tą samą paletą.
Pięć nowych pól
Każde z nich powstało z konkretnego zgrzytu, nie z pomysłu na funkcję.
tileImageFit: "cover" | "contain"
postImageWidth: "bleed" | "column"
headerCompact: boolean
layoutWidth: "prose" | "wide"
engineMark: string**tileImageFit** — kafelek siatki przycinał obraz do stałej wysokości. Dla fotografii to właściwe: kadr i tak jest decyzją, a równa siatka czyta się lepiej niż wierność proporcji. Dla grafiki z napisami przycięcie w połowie zdania odbiera jej sens.
**postImageWidth** — obraz nagłówkowy szedł zawsze przez całą szerokość. Fotografia na tym zyskuje. Grafika z napisami rozciągnięta na kadr dwa razy szerszy niż tekst pod nią wygląda jak baner z innej strony, a jej napisy robią się większe od tytułu wpisu.
**headerCompact** — nagłówek stoi domyślnie w dwóch wierszach, bo to układ odporny na rosnącą liczbę serii. Instancja z kilkoma pozycjami mieści wszystko w jednym pasie i odzyskuje ponad siedemdziesiąt pikseli nad zgięciem strony.
**layoutWidth** — siatka nagłówka, stopki i podpisu silnika liczona w jednym miejscu. Wcześniej pasek stał na jednej szerokości, a treść na innej; przy szerokim ekranie dawało to kilkadziesiąt pikseli rozjazdu, które widać natychmiast.
**engineMark** — znak silnika przy podpisie w stopce. Bez pola podpis jest samym tekstem, czyli tak jak dotąd.
Zachęta do powiadomień
Zainstalowana aplikacja nie prosiła o nic. Zgodę na powiadomienia trzeba było nadać ręcznie w ustawieniach systemu, czyli w miejscu, do którego nikt nie zagląda.
Nowy `PushPrompt` jest tym samym wzorcem co zachęta do instalacji: pływający pasek przy dolnej krawędzi, przycisk, krzyżyk, decyzja zapamiętana pod kluczem instancji. Świadomie nie jest to nowy mechanizm — różni się tylko tym, o co pyta.
Nie pytamy o zgodę od razu po starcie i to jest decyzja, nie półśrodek. Przeglądarki karzą za prośbę bez gestu użytkownika: wyciszają zgłoszenia, a bywa, że odmawiają za użytkownika. **Odmowa zapisuje się na stałe**, więc jeden nietrafiony moment zamyka drogę na zawsze. Pasek wyjaśnia, po co to jest, zanim system zapyta.
Ruch, który widać
Trzy poprawki z jednej rodziny, wszystkie wykryte na urządzeniu, nie w testach.
Animacje startowały na zgłoszenie obserwatora przecięcia, a to nie to samo, co „element widać". Element czeka w sekwencji wejścia, więc licznik dobijał do wyniku i konsola wystukiwała całe polecenie **pod zerowym kryciem**. Po pojawieniu się stał tam gotowy wynik.
Poprawka: start dopiero wtedy, gdy krycie skuteczne — przemnożone przez rodziców, bo własne zawsze wynosi jeden — przekroczy próg, element jest w kadrze, a układ zdążył się ustabilizować. Do tego zerowanie przed pierwszym malowaniem, żeby nie mignął gotowy stan, i bezpiecznik przywracający treść, gdyby nikt do niej nie dojechał.
Bo to jest tu zasada nadrzędna: **liczba i polecenie są treścią, animacja tylko je odsłania**. Element, który został pusty, jest błędem, a nie brakiem efektu.
Propagacja
Wydanie 0.11.63 dało automatyczne rozsyłanie silnika do instancji. Wada wyszła dopiero przy drugim wydaniu z tej samej gałęzi: workflow pytał o pull request bez filtra stanu, trafiał na zamknięty z poprzedniego razu i próbował go edytować. Cały przebieg się wywracał.
Teraz pyta wyłącznie o otwarte. Przy okazji potwierdziło się, że strażnik napisów robi dokładnie to, po co powstał — zatrzymał dwie instancje, którym brakowało tłumaczeń nowych napisów, i otworzył im szkice zamiast gotowych pull requestów.
Wniosek
Wszystkie te pola mają wspólną cechę: **brak deklaracji oznacza zachowanie dotychczasowe**. Instancje, które o niczym nie wiedzą, nie zauważyły żadnego z dziesięciu wydań — i to jest jedyna miara sukcesu przy takiej serii zmian.
Nie to, że nowy wariant wygląda dobrze. To, że stare wyglądają dokładnie tak jak wczoraj.
