Hunters · dávka 1BADPIECE s.r.o. · pilot Cafe Buddha · 1. 8. 2026
Design systém a stavová knihovna
Šéfkuchař objednává mezi obědem a večeří, na tabletu, mokrýma rukama. Buď je to hotové rychleji než telefonát dodavateli, nebo bude dál volat. Tenhle systém je proto rozhodnutý za něj: jedna komponenta a jedna barva na situaci, nic k výběru.
01
Rozhodnutí, ze kterých vše ostatní plyne
Červená má dvě role a nikdy se nepletou
Červená jako plocha = primární akce (Odeslat objednávku). Červená jako 2px lišta + ikona + text = chyba nebo blokace. Plocha nikdy nenese chybu, lišta nikdy nenese akci.
Stav = barva + ikona + text
Vždy všechny tři. Odznak bez ikony nebo bez slova neexistuje — v odlesku kuchyňského světla a při deuteranopii zbyde jen tvar a slovo.
Offline je provozní stav, ne chyba
Šedočerný pruh s šrafou, nikoli červený alert. Práce pokračuje, změny se řadí do fronty a počítají se viditelně.
48 px na dotyk, 32 px na klávesnici
Táž komponenta, dvě hustoty. Notebook smí být hustší, protože má kurzor a zkratky — ne proto, že se vejde víc dat.
Peníze, jednotky a stav nikdy neschovat
Cena za základní jednotku na 4 desetinná místa je hlavní porovnávací veličina — je vždy v řádku, nikdy v tooltipu ani v rozbalovátku.
Modál jen pro nevratné
Informace jdou inline nebo do toastu s možností vrátit akci. Nic nepřeruší rozpracovaný košík kvůli sdělení.
„Nelze porovnat" není chyba
Když systém nezná převod nebo mapování, přizná to neutrálně a položku nechá objednat. Červená je vyhrazená pro to, co blokuje odeslání — ne pro poctivé „tohle nehádám".
02
Barevné tokeny
Plocha, text, jeden akcent a šest sémantických stavů. Nic jiného v systému není. Každý stav má tón pro text/ikonu a tón pro výplň; poměry jsou měřené na ploše #f3f2f2.
Plocha, linky, text
surface
#f3f2f2 · plocha aplikace
surface-raised
#f8f4f4 · řádky, karty, tabulky
surface-sunken
#eae9e9 · hlavičky, panely, vstupy
border
#7d7979 · 3,9:1 · obrys ovládacích prvků
rule
#201e1d 2px · dělení sekcí
text-primary
#201e1d · 14,9:1
text-secondary
#444141 · 9,0:1 · nikdy světlejší
accent
#ec3013 · 3,8:1 · plochy a ikony, ne drobný text
Sémantické stavy
Potvrzeno
state-ok
#1f6b3a na #e4efe7 · 5,5:1 · text 5,8:1
Nesplněné minimum
state-warning
#7a5a00 na #f5eeda · 5,3:1 · text 5,7:1
Odeslání selhalo
state-danger
#ae1800 na #ffe0d9 · 5,4:1 · text 6,4:1
Nový ceník
state-info
#144e73 na #e3eaf0 · 7,2:1 · text 8,0:1
Koncept
state-neutral
#605d5d na #eae9e9 · 5,2:1 · text 5,8:1
Nesynchronizováno
state-offline
#2d2b2b na #d7d3d3 · 11,3:1 · ikona přeškrtnutého signálu
Čísla vždy font-variant-numeric: tabular-nums, aby se ceny ve sloupci daly srovnat okem. Pod 12 px se v systému nesází nic.
Spacing — 4px grid, 7 kroků
s-1 · 4 px · uvnitř odznaku
s-2 · 8 px · min. mezera dotyk. cílů
s-3 · 12 px · vnitřek řádku
s-4 · 16 px · vnitřek karty
s-5 · 24 px · mezi bloky
s-6 · 32 px · mezi sekcemi
s-7 · 48 px · okraj obrazovky desktop
Radius, elevace, pohyb
elev-0 · plocha
elev-1 · řádek
elev-2 · toast
elev-3 · dialog
radius 0 px všude. Pohyb: 120 ms stisk, 200 ms příchod panelu — nic delšího, nic s pružením. Starší Android tablet nesmí čekat na animaci.
04
Barvoslepost a dotykové cíle
Vlevo odznaky jak jsou, vpravo simulace deuteranopie. Rozlišení nese ikona a slovo; barva je jen zesílení.
Běžné vidění
PotvrzenoVýjimkaZamítnutoOdeslánoKoncept
Deuteranopie (simulace)
PotvrzenoVýjimkaZamítnutoOdeslánoKoncept
Ikony: Lucide, tah 2,4–2,8 px, nejméně 17 × 17 px v odznaku a 20 × 20 px v tlačítku — tenčí a menší se v odlesku ztrácí. Ikona je všude stejná: obrys 20 px v barvě stavu na plné výplni stavu — žádná ploška, destička ani vzorek u jedné jediné varianty. Offline odznak se od ostatních liší ikonou a slovem, ne pozadím; šrafa zůstává jen na celoplošném offline pruhu, kde odlišuje pruh od toastu a od inline hlášení.
Dotyk — mobil / tablet: 48 × 48, mezera 8
Palcem, v rukavici, bez míření.
Kurzor — notebook: 32 px, táž komponenta
Hustší jen tam, kde je klávesnice a zkratky.
05
Tlačítka a vstupy
purchaser · tablet 1024 × 768 · rozhoduje ve 2 s, jestli může odeslat
Primární · sekundární · destruktivní
Popisek je vždy vlevo — oko ho hledá na stejném místě u všech šířek tlačítka.
Disabled — důvod je vždy vidět
Vaše minimum u Dodavatele B není splněné Košík 2 340,00 Kč z vašeho minima 3 000,00 Kč. Chybí 660,00 Kč nebo přesuňte položky k Dodavateli A. Cut-off dnes 14:00.
Zakázané tlačítko bez důvodu v systému neexistuje. Důvod stojí pod tlačítkem, ne v tooltipu.
Vyhledávání — bez diakritiky taky
hovezi kyta
Hovězíkýta bez kosti, chlazená3 dodavatelé
Hovězíkýta s kostí, mražená1 dodavatel
Číslo s jednotkou — psát i klikat
3kg
Krok = balení dodavatele (0,5 kg). Střed je editovatelné pole — na tabletu se dá psát i klikat. Hodnota a jednotka stojí pohromadě uprostřed, aby se číslo dalo přečíst i z ruky na pultu. Jednotka je součást komponenty, ne popisek nad ní.
Zadáno 3,2 kg → zaokrouhleno na 3,5 kg (balení 0,5 kg)
Text, výběr, chybný stav
06
Řádek položky — nejdůležitější komponenta systému
purchaser i chef · tablet na pultu / mobil v ruce · 3 s na jeden řádek, 40 řádků za objednávku
Tablet 1024 — na šířku
Položka
Cena za jednotku
Množství
Celkem
Hovězí kýta bez kosti, chlazená
Dodavatel A · velkoobchod · balení ≈ 4,2 kg · dodání 3. 8. 2026
189,4500
Kč/kg
8,4kg
1 591,38 Kč
2 × balení
Mouka hladká T530, pytel 25 kgNejnižší cena
Dodavatel C · cash & carry · o 2,1160 Kč/kg méně než A
14,3600
Kč/kg
50kg
718,00 Kč
2 × pytel 25 kg
Olej řepkový 10 lCena starší 14 dní
Dodavatel B · ceník ze 17. 7. 2026 · potvrdí se až v objednávce
38,9000
Kč/l
20l
778,00 Kč
2 × kanystr 10 l
Pořadí informací je pevné: co to je → od koho a v jakém balení → za kolik na jednotku → kolik beru → kolik to dělá. Cena za jednotku má vždy 4 desetinná místa (i s nulami — je to porovnávací veličina), cena za balení 2, množství nejvýš 3 bez koncových nul — a cena za jednotku je vždy bez dopravy, aby zůstala porovnatelná. Doprava, minima a cut-off vstupují až do optimalizace a do rekapitulace. Stav řádku nese výplň a odznak s ikonou.
Mobil 360 — jedna ruka
Hovězí kýta bez kosti, chlazená
Dodavatel A · velkoobchod · balení ≈ 4,2 kg
189,4500Kč/kg
1 591,38 Kč
8,4 kg
Olej řepkový 10 l Váš závoz u Dodavatele B v pátek není — nejbližší dodání 3. 8. 2026 místo 31. 7. 2026.
Primární akce je v dosahu palce, ve spodní třetině. Nahoře není nic, co by se muselo mačkat.
07
Datová tabulka na 1280 px — bez vodorovného scrollu
ops_internal · notebook 1280 × 800 · projede 200 řádků fronty za směnu, řádek za 2 s
hovezi
Dodavatel: vše
Jen s výjimkou (12)
3 vybrané
Produkt dodavatele
Dodavatel
Cena / j.
Balení
Cena / bal.
Stav mapování
Hovězí kýta bez kosti chlaz. 1 ks
Dodavatel A
189,4500 Kč/kg
4,2 kg
795,69 Kč
Spárováno 98 %
HOV. KÝTA B/K CHL. VAK
Dodavatel B
193,2000 Kč/kg
3,8 kg
734,16 Kč
Návrh 71 % — ověřit
Mouka pšeničná hladká T530 25 kg
Dodavatel C
14,3600 Kč/kg
25 kg
359,00 Kč
Spárováno 100 %
Olej řepkový rafinovaný kanystr 10 l
Dodavatel B
38,9000 Kč/l
10 l
389,00 Kč
Nelze porovnat — proměnná gramáž
Karton 12 × 0,75 l víno bílé rozlévané
lokální farma
142,6667 Kč/l
9 l
1 284,00 Kč
Čeká na ověření
Zobrazeno 5 z 1 284 řádků · řazení: Produkt A→Z
Procento shody patří výhradně do ops konzole — je to nástroj na řazení práce (nejasné nahoru) a vždy stojí vedle ceny za základní jednotku obou kandidátů, protože právě tam se chytne špatný převodní koeficient. Kuchař ani majitel procento nikdy nevidí: pro ně platí jen porovnáno / bez porovnání. Na 1280 px se vejde 7 sloupců v hustotě 32 px. Když se sloupec nevejde, vypadne z tabulky do detailu řádku — nikdy nevznikne vodorovný scroll. Hlavička je sticky, řazení je vidět v patičce slovy, hromadná akce je v horní liště u počtu vybraných.
08
Odznaky, výjimka, oznámení, dialog
Stavů objednávky je přesně osm (model v0.3). Výhrada dodavatele stav objednávky není — žije na řádcích potvrzení: potvrzeno · změněné množství · změněná cena · nedostupné · nahrazeno. Objednávka s aspoň jedním takovým řádkem je částečně potvrzeno a má otevřenou výjimku.
Potvrzeno je očekávaná cesta — dodavatelé jsou zavedené HoReCa firmy a potvrzení zapisuje ops tým z e-mailu. Objednávka bez potvrzení není rovnocenná varianta, je to termín k dotažení. Osm stavů, žádný devátý. Naléhavost nese počítadlo v odznaku, ne další barva: „Částečně potvrzeno · 3 změny" je jiná situace než jedna změna ceny o 2 %. Přeskočení potvrzení (odesláno → dodáno) i storno nesou povinný důvod a v UI ustupují do pozadí — jsou to východiska, ne volby. U stornování je v odznaku vidět, že důvod existuje — rozklikne se na časovou osu s aktérem a časem.
Není stav objednávky — rozpracovanost a spojení
Předáno ke zpracování· odeslání do 14:00 · stav: konceptVe frontě k odesláníOdeslání selhalo
Objednávka po předání čeká ve frontě ops konzole a je pořád koncept — restaurace o tom ví, práce uživatele skončila. Předání, offline fronta ani chyba odeslání nejsou stavy objednávky — mají proto jiný tvar (šrafa, odpočet, plná destička) a v seznamu stojí vedle stavu, nikdy místo něj.
Odznak má vždy tři nosiče významu: výplň, ikonu, slovo. Na 32 px vysoký odznak se vejde i nejdelší český popisek; při zúžení se láme text, nekrátí se slovem „…".
Karta výjimky — vždy s návrhem řešení
UrgentníZměna cenytermín 31. 7. 2026 10:00 · řeší Petra N.
Dodavatel B potvrdil vyšší cenu hovězí kýty
193,2000 Kč/kg místo 178,5000 Kč/kg · +123,48 Kč na objednávce · blokuje odeslání před cut-off 14:00
Fronta výjimek — devět typů, jedno pořadí pro všechny
1 · Po termínu SLA3
2 · Urgentní2
3 · Blokuje dnešní odeslání (cut-off 14:00)7
4 · Vyžaduje akci · podle nejbližšího termínu18
5 · Informace · nejnovější nahoře24
Frontu obsluhuje ops / support tým Hunters — trvale, ne jen v pilotu. Proto se navrhuje pro notebook 1280 px a pro člověka, který v ní stráví hodiny: hustota, zkratky, hromadné akce. Tablet je čtecí režim. Ops smí filtrovat a přepínat pohled, ne přepsat pořadí. Nad 50 položkách se skupiny 4 a 5 sbalí na počty; první tři zůstávají rozbalené. Automatická výjimka „bez potvrzení déle než 4 h" patří do skupiny 3 — je to hlídač termínu, ne omluva.
Co z toho vidí restaurace — jedna otázka, dvě tlačítka
Toast potvrzuje, že práce skončila, a nabízí jen pohled na výsledek — žádné okno na vrácení. Dokud je objednávka u ops týmu, dá se upravit přes ně; jakmile e-mail odejde, mění se to telefonem. Toast se drží 8 s a nikdy nezakrývá součet.
Offline pruh — trvalý, ne modál
Bez připojení — pracujete dál 4 změny ve frontě · naposledy uloženo 14:07
Šrafa je vyhrazená tomuto jednomu prvku — celoplošnému pruhu — aby se nepletl s toastem ani s inline hlášením; v odznacích se nepoužívá. Pruh sedí pod hlavičkou, nezakrývá obsah a nezmizí sám.
Dialog — jen nevratné akce · elev-3
Odeslat objednávku 4712 Dodavateli A?
E-mail s PDF odejde okamžitě a nedá se vzít zpět — po odeslání už se změny řeší s dodavatelem telefonicky. Zboží za 4 209,07 Kč na pátek 31. 7. 2026, cut-off dnes 14:00. Dvě položky nejsou porovnané.
Dialog je jen pro to, co e-mailem nenávratně opustí systém — proto ho vidí ops při odesílání, ne restaurace při předání. Storno odeslané objednávky se v pilotu nestaví: dokud proces není dojednaný, UI nesmí předstírat zrušení, které se k dodavateli nedostane.
09
Jednotky, porovnatelnost, podmínky vztahu
ops_internal při mapování · purchaser při objednávání · rozhodnutí „porovnat / neporovnat" musí být čitelné do 2 s
Druhy jednotek a povolené převody
Hmotnostg ⇄ kg · převod automatickýObjemml ⇄ l · převod automatickýPočetks · bal · bez automatického převodu
l → kg neexistuje. Napříč druhy se nepřevádí nikdy — systém nezná hustotu a nebude ji hádat.
Balení → základní jednotka = ruční koeficient
Karton 12 × 0,75 l
Koeficient 9 l / bal · cena 142,6667 Kč/l
Koeficient potvrdil ops · 28. 7. 2026
Žádné odvozování z názvu, žádná výchozí 1,0, žádné řetězení převodů. Bez potvrzeného koeficientu položka do optimalizace nevstoupí — zůstane objednatelná, jen neporovnaná.
Když systém nehádá — neutrálně, ne červeně
Nelze porovnat — proměnná gramážBez porovnání — objednáte přímo u dodavateleČeká na ověřeníCena mimo historické pásmo — ke kontrole
První tři jsou neutrální stav, ne chyba, a vždy nechávají položku objednat. Poslední je jediná, která zakládá výjimku — položka se do optimalizace nepoužije potichu.
Podmínky jsou vlastností vztahu, ne dodavatele
„Vaše minimum u Dodavatele A je 3 000 Kč." Vaše závozové dny: po, st, pá · cut-off 14:00 (den předem) · doprava zdarma od 5 000 Kč
„Dodavatel A má minimum 3 000 Kč." Takhle ne — dvě restaurace mají u téhož dodavatele jiné podmínky a jiný cut-off.
Podmínky zadává v pilotu procurement manažer, po MVP si je dodavatel nastaví sám. Je to jeden formulář ve dvou režimech — stejná struktura i pole, jen jiná míra doprovodného textu (interní: rychlost, self-service: vysvětlení). Ne dva různé formuláře.
Doprava a obaly jsou řádky, ne dopočet v patičce
Zboží · 14 položek12 470,86 Kč
Dopravné · Dodavatel B (pod prahem 5 000 Kč)240,00 Kč
Vratné obaly · 4 přepravky0,00 Kč
Celkem bez DPH12 710,86 Kč
Dvě úrovně čísel, které se nikdy nesmí smíchat: cena zboží u řádku (bez dopravy, porovnatelná) a celkem v rekapitulaci a na PDF (s dopravou a poplatky). Optimalizace košíku počítá s dopravou i minimy — práh dopravy zdarma umí obrátit vítěze.
10
Navigace — tři zařízení, jeden model
Mobil 360 — spodní lišta, 4 cíle
Košík směny14 položek
Obsah obrazovky…
KošíkHledatPříjemObjednávky3
Ikona nikdy bez slova. 64 px vysoké cíle, protože se maká palcem a naslepo.
Tablet / notebook — boční panel, sbalitelný na ikony
HUNTERS
Košík směnyKatalog a cenyObjednávkyPříjem zbožíVýjimky12
Košík směny
14 položek · 3 dodavatelé · košík provozovny Dlouhá · odesílá jeden člověk · uloženo 14:07
Zboží 12 470,86 Kč · Dopravné 240,00 Kč
12 710,86 Kč
celkem bez DPH, včetně dopravy
Upraveno týmem Hunters · hovězí kýta přesunuta k Dodavateli A (−41,20 Kč) · aktualizováno před 2 minZobrazit úpravu
Slot pro právní text u úspory — dva řádky, plná velikost písma. Zástupný text: konečné znění se doplní, až bude schválené.
Baseline jsou faktury klienta (OCR) proti aktuální nabídce v katalogu — proto tři čísla vedle sebe, nikdy jedno. Pokrytí stojí vedle částky, ne v poznámce, a nespárované položky se dají rozkliknout: „a co ty zbylé?" je první otázka. Nejistá extrakce se musí poznat na řádku. Pod číslem jsou vyhrazené dva řádky na právní text — zástupný, dokud není schválený.
11
Povinné stavy — vzor na obrazovce Košík směny
Žádná obrazovka není hotová, dokud nemá těchto sedm stavů. Vzor platí pro všechny obrazovky: stejné umístění, stejná typografie, stejné tlačítko dál.
Prázdný
Košík je prázdný
Začněte tím, co objednáváte každý týden.
Načítání
Načítám ceny od 3 dodavatelů…
Do 3 s se ukáže, co už je hotové. Nekonečný skeleton se nepoužívá.
Částečná data
Ceny 2 ze 3 dodavatelů Dodavatel C neodpovídá. Zobrazená úspora je spočítaná bez něj.
Hovězí kýta · 189,4500 Kč/kg Mouka T530 · cena nedostupná
Chyba
Objednávku nešlo odeslat Dodavateli B E-mail odmítnut (chybná adresa příjemce). Ostatní dvě objednávky odešly.
Chyba vždy říká: co se nepovedlo, co platí dál, co udělat teď.
Offline / nesynchronizováno
Bez připojení 4 změny ve frontě
Košík je uložený v zařízení. Odeslání se nabídne, až bude signál — nic se neztratí, i když aplikaci zavřete.
Bez oprávnění
Tuto obrazovku obsluhuje tým Hunters Mapování ceníků a fronta výjimek jsou práce procurement manažera. Vaše objednávka 4712 je u něj ve zpracování, odeslání dnes do 14:00.
Nikdy jen „nemáte oprávnění" — vždy kdo to dělá a co může udělat uživatel. V pilotu má restaurace jednoho odpovědného člověka, takže tento stav odděluje jen zákaznickou část od ops konzole. Data jiné restaurace se neskrývají — ta pro uživatele neexistují (ani počtem výsledků, ani odkazem).
Příliš mnoho dat
1 284 výsledků Zobrazuje se prvních 100. Zužte hledání nebo filtrujte podle dodavatele.
Jen mé oblíbené (28)Jen z minulé objednávky (14)
12
Čísla, formáty a dva jazyky v téže komponentě
Čeština — nejdelší reálná varianta
Olej řepkový rafinovaný, kanystr 10 l
Dodavatel B · velkoobchod · minimální odběr 2 kanystry
38,9000 Kč/l778,00 Kč / 20 l
Vaše minimum u dodavatele není splněné
English — same component, same box
Rapeseed oil, refined, 10 l canister
Supplier B · wholesale · minimum 2 canisters
38.9000 CZK/l778.00 CZK / 20 l
Your minimum with Supplier B is not met
1 234,56 Kč
Peníze · mezera v tisících, čárka desetinná, měna vždy
189,4500 Kč/kg
Cena za základní jednotku · 4 desetinná místa, nikdy zaokrouhleno
8,4 kg · 25 kg
Množství · nejvýš 3 desetinná místa, koncové nuly se nepíšou (25 kg, ne 25,000 kg) · jednotka vždy vidět
31. 7. 2026 · 14:07
Datum a čas · 24h, bez zkratek měsíců
13
Tmavý režim — jen pro příjem zboží ve skladu
chef · mobil v ruce u rampy, tmavý sklad · 20 s na položku, prsty od kartonů
Příjem · PO 4712Dodavatel A
Hovězí kýta bez kosti, chlazená
Objednáno 8,4 kg · 2 × balení
8,4 kg
Mouka T530 — dodáno 25 kg z 50 kg Rozdíl se zapíše do dodacího listu jako manko.
Není to inverze světlého režimu: plocha je teplejší černá #1a1918, text #f8f4f4 (13,9:1), stavové výplně jsou vlastní tmavé tóny s vlastními textovými tóny (žlutá #f5c46b na #2a1c10 · 8,4:1). Akcent zůstává týž — na tmavém pozadí má 5,1:1.
Tmavý režim se zapíná jen na obrazovkách příjmu a jen ručně; nezapíná se podle systému, aby se kuchyňský tablet nepřepnul uprostřed objednávky.