Changelog

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

0.11.69 – 0.11.78 — skórki, ustawienia instancji i zachęta do powiadomień

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",
Cała deklaracja po stronie instancji

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
site.config.ts — wszystkie opcjonalne, brak = zachowanie dotychczasowe

**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.