Co se načte poslední, vyhrává
Dva skutečné weby nosí vzhled, který tento engine nikdy nedodával. sh.cynicky.blog je oblečený jako Ghost — úvodní karta přes celou šířku, tečkovaný rámeček, dlaždice místo prostého seznamu. arch-linux.cz je oblečený jako téma pro Hugo, konkrétně Blowfish — kompaktní lišta, blok s profilem, karty rozložené jako úplně jiná domovská stránka. Ani jeden nevytvořil fork enginu. Ani jeden neupravil šablonu. Oba dál přijímají obyčejný git pull.
Jeden stylesheet, načtený jako poslední
site.extra_css v config/site.yml udává cestu nebo seznam cest, které se načtou po vlastních colors.css a site.css enginu. To je celý mechanismus — skin je jeden tvůj soubor, který překresluje, co už na stránce je, a engine do něj nikdy nezapisuje, takže s ním aktualizace nikdy nemůže být v konfliktu.
Jen místní cesty: každá stránka nese style-src 'self' a stylesheet z jiného hostitele by prohlížeč prostě zahodil bez jediné chyby, kterou by kdokoli uviděl — sestavení proto vzdálenou cestu odmítne nahlas, dřív než to ticho nastane.
Jestli ten soubor patří do gitu, je samostatné rozhodnutí — commitni ho a druhý počítač už má tvůj vzhled, vynech ho a veřejný repozitář nikdy nebude nést design, který veřejný být neměl. Ani vlastní .gitignore enginu za tebe nerozhoduje ani jedním směrem.
Pravidlo, ze kterého plyne všechno ostatní
Načtení jako poslední znamená, že tvoje pravidla vyhrávají při stejné specifičnosti — včetně pravidel, která engine napsal pro úzké obrazovky, a to není ta část, u které by někdo čekal, že proti ní bude vyhrávat.
Skin sh.cynicky.blog nechává obsah plout vedle článku a dal mu šířku v procentech, aby odpovídala jeho vlastní šířce sazby. Na desktopu to vypadalo dobře. Pod 700 px má engine vlastní přeskládání: obsah se přesune nad text a pravidlo šířky se změní na auto, protože při takové velikosti už vedle není místo. Procenta ze skinu o tom nevěděla a platila dál — načtení jako poslední znamená vyhrát vždy, ne jen když se to hodí. Článek vyšel 155 pixelů široký na 390pixelové obrazovce telefonu.
Oprava obalí přepis do rozsahu, kde má skutečně platit:
@media (min-width: 861px) {
.toc { width: 350px; }
}
Pod touto šířkou skin mlčí a přeskládání enginu může dělat tu jedinou práci, kterou už dělalo správně.
Na čem engine spoléhá, aniž to říká
Dvě menší pasti vzešly z druhého skinu, z arch-linux.cz, a obě mají stejný tvar: pravidlo, které vypadá čistě dekorativně, se ukáže být někde jinde nosné.
Zrušit navigační liště enginu přilepení je rozumné přání skinu. Na arch-linux.cz kvůli tomu ale přestalo reagovat na kliknutí i tlačítko pro přepínání motivu — ne proto, že by se tlačítko rozbilo, ale proto, že lišta seděla v CSS gridu, kde z-index funguje i bez position, a odlepená lišta si svou vyšší vrstvu ponechala a neviditelně ležela přes tlačítko. Přišel na to admin toho webu tím, že na přepínač skutečně klikl; na screenshotu by to nebylo vidět nikdy.
Druhá, menší: max-width na flex položce s flex-basis: 100% zmenší hypotetickou šířku položky, místo aby omezila její obsah — a tak jednou tělo článku skončilo vedle vlastního řádku s metadaty místo pod ním. Omezení patří na potomky, ne na box kolem nich.
Jedna stránka výpisu, ne celý feed
Stylesheet neumí číst adresu, takže úvodní stránka a /page/2/ byly pro CSS dřív k nerozeznání — což začalo vadit ve chvíli, kdy kterýkoli skin chtěl úvodní kartu jen na první stránce. Od 1.3.2 říká <body> každého výpisu, o jaký druh jde:
.page-first .post-list-item:first-child { /* úvodní karta */ }
.page-cont .archive-note { /* jen na pokračováních */ }
Dvě třídy místo jedné, záměrně — jediná značka na pokračováních by znamenala napsat vzhled první stránky bezpodmínečně a pak ho vlastnost po vlastnosti rušit, a pravidlo, které ruší jiné pravidlo, je přesně to, které pozdější úprava tiše přestane rušit.

Nahoře je sh.cynicky.blog — úvodní karta přes celou šířku, tečkovaný rámeček, dlaždice místo prostého seznamu a za tím ani jeden upravený soubor enginu. Vyhledávání zůstává polem v liště enginu, ne modálním oknem, které by mu dal sám Ghost, protože přestavět ho na modál by znamenalo vlastnit chování, které engine nikdy neslíbil. Žádný ze skinů, ani tenhle, ani ten z arch-linux.cz, se nikdy nesnažil o kopii k nerozeznání do posledního pixelu. Věrnost nebyla cílem. Cílem bylo patřit do rodiny.
Skin přestane být levným nástrojem ve chvíli, kdy potřebuje značky, které engine nestaví — v tu chvíli je poctivou volbou upravit šablonu, ne stylesheet, který se snaží něco předstírat. Než se k té hranici dojde, žádný systém témat není potřeba: žádné háčky, žádný registr, žádná hierarchie přepsání, kterou by bylo třeba držet v hlavě. Celou funkci nese jediný fakt. Tvůj soubor se načítá poslední.
—
P.S. — sh.cynicky.blog není tam, kde žije samotný cynicky.blog. Skutečný web stále běží na platformě Ghost a je aktualizován téměř každý den; sh.cynicky.blog má stejný vzhled a je udržován jako samostatná funkční instalace. Jeho autor se zabýval skutečnou migrací a rozhodl se zůstat tam, kde už byl – stojí za to to říci na rovinu, místo aby doménové jméno naznačovalo něco jiného.

Komentáře