Grafika:
- silueta lesa přes celou šířku nad patičkou
- terč v hlavičce mezi značkou a navigací, s červeným středem
Obojí je vložené jako CSS maska. Zdrojová PNG byla černá kresba na bílém
bez alfa kanálu, takže by z nich koukal bílý obdélník a v tmavém motivu
by to bylo nepoužitelné. Převedená maska nese jen průhlednost a barvu
řídí CSS. Skyline se tím zmenšil z 856 kB na 245 kB.
Assety patří do public/, ne do media/ — media je v produkci Docker volume
mimo image, takže by tam soubory nebyly.
Slug se navíc normalizuje sdíleným helperem: vedoucí lomítko vyrábělo
odkaz //kontakt, což prohlížeč čte jako jméno cizího serveru.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Menu bylo napsané natvrdo a odkazovalo na /kontakt bez ohledu na to,
jestli stránka s tím slugem existuje — odtud 404. Stránky založené
v administraci se naopak neobjevily nikde.
Hlavička teď vypisuje stránky z kolekce, řazené podle názvu. Layout
kvůli tomu musí být force-dynamic, jinak by se při buildu předgenerovala
stránka 404, která tenhle layout používá taky, a build by sáhl do
databáze.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Payload skládá URL uploadů absolutně podle serverURL. next/image to
vyhodnotí jako externí zdroj a bez images.remotePatterns odmítne
s HTTP 400 "url parameter is not allowed" — samotný soubor se přitom
servíruje správně, takže se to projevilo až s nahraným obrázkem.
Do next/image proto posíláme jen cestu (helper cestaKSouboru). Soubor
leží na stejném originu jako web, takže je to korektní, a navíc na tom
nezávisí doména: remotePatterns se zapékají při buildu, ale tentýž image
běží na stagingu i v produkci pod jiným jménem.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
SQLite si adresář sám nevytvoří, takže `payload migrate` i integrační
testy padaly na SQLITE_CANTOPEN (kód 14). Lokálně se to neprojevilo,
protože adresář existoval z dřívějška; v CI po čerstvém checkoutu ne.
Adresáře data/ a media/ proto drží v repu .gitkeep, samotný obsah
zůstává ignorovaný. Řeší to i onboarding — po `git clone` teď projde
postup z README bez ručního mkdir.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kostra prezentace s vlastní administrací pro Martina Reinera.
Obsah:
- kolekce Products (obrázky, volné parametry, cena, dostupnost, skrytí),
Media se zmenšeninami, Pages, Users bez veřejné registrace
- veřejná část: výpis nabídky, detail položky, statické stránky
- /api/health pro Docker HEALTHCHECK
Provoz:
- Dockerfile, docker-compose.yml (vývoj) a docker-compose.prod.yml
(nasazení z Gitea registry)
- CI v Gitea Actions: lint -> testy -> build -> push image
- úvodní migrace databáze
Stránky jsou force-dynamic, aby se úprava položky projevila hned;
schéma se za běhu nedomýšlí (push: false), migrace se commitují.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>