Zdůvodnění
Příkaz vlastníka z 2026-10-16: majordomus.dev je referencí pro styl produktu a jeho pravidla rozhraní a Cockpit a UI na /ui z něj vycházejí — stejné rozvržení, pixelově shodný navbar — místo aby se druhý design udržoval ručně.
Měřeno toho dne, web a UI sdílely své tokeny (--mj-design byl na obou týž otisk) a nic jiného v horní části stránky. Lišta webu je při šířce 1440 vysoká 73 pixelů a při 390 65, nese značku a release, čtyři menu, hledání, přepínač motivu, produkt, GitHub a výzvu k akci a je sázena 16pixelovým písmem. Lišta UI byla 67pixelová nástrojová lišta vedle 240pixelového postranního panelu s vlastní značkou — 119 pixelů vysoká při 390 — s jiným hledáním, jiným ovládáním motivu a žádnou z otázek webu, 14pixelovým písmem. Lišta Cockpitu byla třetí: 53 pixelů, 13,5pixelové písmo, značka s příponou „Cockpit“, odkazy na Swagger a OpenAPI a textové tlačítko pro motiv. Tři lišty pro jeden produkt, každá udržovaná ručně, a každá místo, kam by další změna ostatních nedorazila.
Pravidlo, které by říkalo „udržujte je podobné“, by ten stav popisovalo, ne ukončovalo. Navigace je už deklarována jednou (project.navigation-is-declared-once) a design je už jedna deklarace (project.design-tokens-declared-once). Chybělo, že samotná lišta — značkování, do něhož se deklarace vykresluje — měla jeden renderer a každý další povrch musel napodobovat jeho výstup.
Požadované chování
- Jeden renderer. Lištu vykresluje partial webu (
site/templates/partials/navbar.html) nad deklarací webu (site/data/nav.toml) a nic jiného.scripts/ui navbar --writeji vyřízne z sestaveného webu — z jeho stránky not-found, jediné stránky, na které žádná položka není aktuální — doapps/majordomus-cli/src/ui/navbar.html, které spustitelný soubor zkompiluje do sebe a které vykreslují UI i Cockpit (ui/navbar.rs). Dvě věci z tohoto buildu se mění v to, co doplňuje spustitelný soubor: release, který odznak pojmenovává, se stává slotem, a odkaz na mapu webu v patě každé stránky vede na úvodní stránku webu, protože obrazovka UI takovou patu nemá. Kopii nikdo needituje. - Stejné styly. Stylesheety UI a Cockpitu kompilují přesně ty utility, které texty jmenují, ze stejného Tailwindu, stejného tématu Flowbite a stejných generovaných designových listů, z nichž je kompiluje
app.csswebu (share/ui/src/ui.cssashare/cockpit/src/cockpit.css, každý@sourcetexty). Lišta si nastavuje vlastní velikost písma, takže stránka, která nastaví jinou na svém body, ji nezmění. - Totéž chování. Menu lišty a přepínač motivu běží na skriptech samotného webu,
site/nav.jsasite/theme.js, servírovaných zshare/ui/ashare/cockpit/jako bajtové kopie, kteréscripts/cockpit-assetszapisuje ascripts/cockpit-assets --checkdrží shodné s originály; stránka nese kontrakt motivu na<html>, kde jej čte skript webu. Tlačítko hledání lišty vede k vlastnímu hledání UI a v Cockpitu k jeho paletě. - O čem rozhoduje program. Verze, kterou odznak uvádí, je verze programu; položka, kterou web vede na publikovaný snímek povrchu obsluhovaného tímto procesem (
data-nav-primaryadata-nav-snapshotznačí částečné zápisy), vede na živý povrch a přestane říkat „snímek“. Každý další odkaz vede na web na jeho vlastní adrese. - Nic vedle toho. Žádný z povrchů nekreslí druhou značku, druhý přepínač motivu ani druhý pruh, který zůstává nahoře; vlastní navigace UI — obrazovky — a Cockpit — jeho sekce — jsou postranní panel pod ním a nástrojová lišta každého — vyhledávání UI a další povrchy procesu, jméno, paleta a odkazy API Cockpit — je řádek pod ním, který na obrazovce nezůstává.
Chování při selhání
scripts/ui navbar (a scripts/ui audit, které ji spouští jako první, jako kontrolu ui-audit úlohy ui) selže s kódem 10 a pojmenuje každý rozdíl:
- kopie není lišta, kterou vykresluje sestavený web — náprava je
scripts/site-build && scripts/ui navbar --write, pakscripts/cockpit-assets; - prvek lišty, kterou web kreslí na úvodní stránce, a ten kreslený na
/uinebo na/cockpitse liší tagem, třídami, textem, vykresleným boxem (nad jeden pixel) nebo kterýmkoli z vypočtených stylů uvedených vscripts/lib/ui-navbar.mjs, při deklarované šířce (site/data/registry/design.jsonviewports), v tématu, se zavřenou lištou nebo s otevřenou nabídkou. Text verze se před měřením nastaví na jednu hodnotu na obou stránkách a poznámka o snímku se vynechá; nic jiného se neomlouvá.
Chybějící build webu je kód 12 a běh bez prohlížeče kód 13 — na CI odmítnutý, protože porovnání, které nikdo neprovedl, není porovnání, které platí.
Náprava jde vždy jedním směrem: změňte partial webu nebo deklaraci, přebuildujte a nechte kopii následovat. Nikdy needitujte kopii a nikdy nestylujte lištu ze stylů UI.
Ověření
scripts/site-build && scripts/ui navbar # the copy, then the browser comparison
scripts/ui test # the cut and the comparison, on fixtures
scripts/cockpit-assets --check # the scripts are the site's bytes
cargo test --manifest-path apps/majordomus-cli/Cargo.toml ui::navbar ui::shell