!Mediu demonstrativ. Prototip independent cu date exclusiv sintetice. Nu este un serviciu public real și nu reprezintă nicio instituție.
Document de construcție
Galeria de brand
Pagina asta nu descrie sistemul de design, îl consumă. Paleta e citită din blocul :root al fișierului main.css pe care îl servesc toate serviciile, rapoartele de contrast sunt calculate la randare, iar fiecare specimen de mai jos e chiar macroul din macros.html, nu o copie a lui. Dacă un token se schimbă, pagina se schimbă odată cu el.
Se adresează celor care construiesc platforma, nu cetățeanului: e un document de lucru, marcat noindex. Versiunea de activ servită acum:
20260804d.
Cuprins
Paletă
Toți tokenii de culoare declarați pe :root, citiți din activul livrat. Rolul fiecăruia e în docs/brand/tokens.md; aici stau numele și valoarea, adică exact ce se poate verifica.
--bg #EEF2F8
--bg-2 #E3E9F2
--surface #FFFFFF
--line #D5DEEA
--control-line #7285A1
--ink #131C2B
--ink-2 #3D4C63
--ink-3 #546279
--brand #1F4FD8
--brand-600 #183FB0
--brand-50 #E8EEFF
--brand-300 #5A7EE2
--teal #0C6C74
--teal-50 #DBF1F2
--succ #0B7A47
--succ-50 #E1F4EA
--fail #C43314
--fail-50 #FCE9E4
--deny #6A3FC0
--deny-50 #EEE8FA
--neut #47566E
--neut-50 #E9EEF5
--wait #7A5410
--wait-50 #F5E4BD
--on-brand #fff
--ctx #1B3E9E
--ctx-line #C9D6FF
--demo #F5C451
--demo-ink #5A3D00
--demo-50 #FFF6E6
--fail-line #F3C9BF
--fail-wash #FEF7F5
--subsol-bg #0F1B3A
--subsol-ink #B9C7E6
--subsol-ink-2 #8FB4FF
--subsol-ink-3 #7E8FB8
Fără mod întunecat, decizie de founder. Culorile fixe ale subsolului nu sunt tokeni și de aceea nu apar mai sus: trăiesc într-un bloc propriu din main.css și sunt documentate în docs/brand/tokens.md. Nicio valoare nu se transcrie în pagina asta, tocmai ca să nu existe o a doua paletă.
Contrast
Rapoarte calculate la randare cu formula WCAG 2.1, pe perechile pe care fiecare token le are cu adevărat în produs. Prag: 4,5 pentru text normal, 3 pentru limite de componentă și elemente non-text.
Text
Fond
Probă
Raport
Prag
Unde se folosește
--ink
--bg
Aa
15,21
4,5
corpul paginii
--ink
--surface
Aa
17,09
4,5
text în carduri, tabele, câmpuri
--ink
--bg-2
Aa
14,00
4,5
identificatori inline în code
--ink-2
--surface
Aa
8,71
4,5
proză de card, etichete de filtru
--ink-2
--bg-2
Aa
7,13
4,5
pastila de versiune, insigna de administrare
--ink-3
--surface
Aa
6,18
4,5
text estompat, celula fără valoare
--ink-3
--bg
Aa
5,50
4,5
antetele de coloană, nota de panou
--ink-3
--bg-2
Aa
5,06
4,5
amprenta din consemnarea în jurnal, cifra pasului neatins, eticheta cardului „în curând”
--brand
--surface
Aa
6,63
4,5
linkuri, buton secundar, acțiune-iconiță
--brand
--bg
Aa
5,90
4,5
supratitlu, cod de eroare
--brand
--bg
Aa
5,90
3
inelul de focus, bifa activă
--surface
--brand
Aa
6,63
4,5
butonul primar, pasul curent
--surface
--brand-600
Aa
8,84
4,5
butonul primar la survol
--brand
--brand-50
Aa
5,71
4,5
pastila Punții, eticheta de metodă, rând la survol
--brand-600
--brand-50
Aa
7,62
4,5
insigna de rol, poziția în lanțul de audit
--teal
--surface
Aa
6,15
4,5
eticheta de domeniu din card
--teal
--teal-50
Aa
5,24
4,5
pastila Cronicii, pastila implicită de serviciu
--succ
--succ-50
Aa
4,71
4,5
pastila de succes
--succ
--surface
Aa
5,40
4,5
pasul deja făcut
--wait
--wait-50
Aa
5,39
4,5
pastila de așteptare, banda de mediu demonstrativ
--deny
--deny-50
Aa
5,69
4,5
pastila de refuz, pastila Cheii
--fail
--fail-50
Aa
4,68
4,5
pastila de eșec, sumarul de erori
--fail
--surface
Aa
5,48
4,5
eroarea de câmp, avertismentul, butonul de pericol
--neut
--neut-50
Aa
6,38
4,5
pastila neutră, eticheta tehnică fără încărcătură
--line
--surface
Aa
1,36
4,5
separatoare de rând, borduri de card, fieldset: STRUCTURĂ, deci 1.4.11 nu cere 3
--control-line
--surface
Aa
3,76
3
conturul unui câmp în care se scrie, pe card
--control-line
--bg
Aa
3,35
3
conturul unui câmp, pe fundalul paginii
--control-line
--bg-2
Aa
3,08
3
conturul unui câmp, pe zonă secundară
--brand-300
--surface
Aa
3,81
3
conturul butonului secundar și al cardului de alegere
--brand-300
--bg
Aa
3,39
3
același contur, pe fundalul paginii
--brand-300
--bg-2
Aa
3,12
3
același contur, pe zonă secundară
--on-brand
--brand
Aa
6,63
4,5
text pe butonul primar și pe caseta accentuată din diagrame
--ctx
--brand-50
Aa
8,12
4,5
textul benzii de context
--ctx-line
--brand-50
Aa
1,24
3
bordura benzii de context
--demo-ink
--demo
Aa
6,14
4,5
iconița de mediu demonstrativ
--wait
--demo-50
Aa
6,31
4,5
textul benzii de mediu demonstrativ
--fail-line
--fail-50
Aa
1,29
3
bordura sumarului de erori
--fail
--fail-wash
Aa
5,18
4,5
mesajul de eroare pe câmpul greșit
--subsol-ink
--subsol-bg
Aa
9,99
4,5
textul subsolului
--subsol-ink-2
--subsol-bg
Aa
8,19
4,5
avertismentul din subsol
--subsol-ink-3
--subsol-bg
Aa
5,26
4,5
amprenta din subsol
Conturul controalelor a fost reparat pe 1 august (--control-line și --brand-300): înainte era desenat cu --line, la 1,36, adică sub pragul de 3 pe care 1.4.11 îl cere limitei unei componente. Nu s-a înnegrit --line, fiindcă el desenează structura în alte douăzeci și patru de locuri, unde criteriul nu cere nimic: un separator de rând de tabel nu identifică niciun control. Regula încape într-o propoziție: gri unde scrii, albastru unde apeși, --line unde nu operezi nimic.
Rămâne sub prag --ink-3 pe --bg-2, la 4,24, și atinge conținut real: amprenta din consemnarea în jurnal, adică singurul lucru pe care cetățeanul îl copiază ca să verifice. Raportul e calculat la fiecare rulare în crates/ui/tests/contrast.rs, deci nu se poate pierde din vedere.
Două valori scapă din sistemul de tokeni și de aceea sunt măsurate prin echivalentul lor: butonul primar își scrie albul literal, deși e chiar --surface; iar banda de mediu demonstrativ își ia fundalul dintr-o spălare mai deschisă decât --wait-50, tot literală. Amândouă sunt candidate la promovare în :root, altfel rămân în afara oricărei verificări.
Scări
Spațierea și razele, desenate cu chiar tokenul pe care îl numesc. Nicio componentă nu decide singură spațierea față de vecini: ritmul vertical vine din tiparul de secțiune, nu din margini ad-hoc.
O singură familie, Public Sans, self-hosted în trei greutăți. Scara e fluidă pe titlurile mari, deci reflowul de la 320 la desktop e lin. Ce vezi mai jos e randat cu clasele reale: dimensiunile nu sunt transcrise, sunt arătate.
Scara
Supratitlu, clasa .supratitlu, greutate 800
Titlu hero
Introducere hero, clasa .lead: cel mult 54 de caractere pe rând, culoarea cernelii secundare.
Titlu de secțiune
Corp de text, 16px, înălțime de rând 1,55. Cetățeanului i se scrie ca unui om de 15 ani, funcționarului i se scrie precis. Fără englezisme, fără em-dash.
Notă și text estompat, clasa .nota.
1 234 567 cifre tabulare, clasa .num, ca să se citească pe coloană.
Când NU: nu se adaugă o a doua familie de literă și nu se introduce o mărime nouă direct în pagină. O mărime care nu e în scară e o excepție care se cere argumentată, nu un atribut de stil.
Componente
Toate macrourile din crates/ui/templates/macros.html, randate aici, nu descrise. Un macro nou fără specimen pică testul brand_galerie. Textele scurte de mai jos sunt reguli; raționamentul lung stă în docs/brand/componente.md.
badgepunctuală
Când: starea unei entități, niciodată singura purtătoare de sens. Culoarea vine din cheia semantică engleză din depozit, nu din textul afișat.
Când NU: ca decor, ca etichetă de categorie, sau ca singur mijloc prin care se înțelege rezultatul. O familie nu e o nuanță, e un răspuns: două stări care răspund altfel la aceeași întrebare nu au ce căuta în aceeași culoare.
Succes, „e în vigoare sau a ieșit bine?”
reușitpublicatactiv
Așteptare, „cine e la rând?”
ciornăpropusvalidat tehnicavizatsolicitatautorizatîn curs
Refuz, „s-a spus nu?”
refuzatrespins
Eșec, „s-a stricat?”
eșuatfără răspuns
Neutru, „mai e în joc?”
ieșit din uzexpiratrevocatsuspendatretras din uz
Stare necunoscută: text simplu, fără pastilă. Deliberat, nu scăpare: o stare pe care nu o cunoaștem nu primește o culoare inventată.
ceva nou
step_baruniversală
Când: orice flux secvențial cu mai mult de doi pași. Orientarea e universală, deci nu e opțiunea paginii. Etichetele se pasează, ca bara să poată servi și alt flux decât cel al funcționarului.
Când NU: la o coborâre într-un arbore, unde întrebarea e „ce am ales până acum”, nu „cât mai am de mers”. Pastilele nu devin linkuri: ar avea circa 36px, sub ținta tactilă, și un salt înapoi ar invalida tăcut jetonul de pregătire.
Pasul 2 din 4
Instituție
Serviciu
Operațiune
Politică
pasiuniversală
Când: în cele cinci pagini ale fluxului de interogare al funcționarului. Există ca să nu se repete lista de etichete în cinci template-uri.
Când NU: în orice alt flux. Acolo se cheamă step_bar cu etichetele proprii. Bara legată de un singur set de etichete e chiar defectul din care a ieșit separarea celor două macrouri.
Pasul 3 din 5
Proces
Scop
Operațiune
Formular
Rezumat
nav_icouniversală
Când: în butoanele doar-iconiță ale slotului personal din antet. Un simbol per destinație, ales pentru ce face acțiunea. Traseu, nu umplere; currentColor, deci culoarea vine din buton.
Când NU: ca ilustrație în conținut, și niciodată două destinații cu același glif. Două butoane identice care fac lucruri diferite sunt un defect, nu o economie de spațiu.
Compoziția reală din antet, cu tot pachetul obligatoriu: nume accesibil din catalog, iconiță aria-hidden, balon vizibil și la tastatură, țintă de 44 pe 44. În antet balonul e forțat dedesubt, fiindcă acolo nu există pagină deasupra. Fără nume accesibil, un buton fără text nu are voie să existe: se poate vedea, dar nu se poate identifica.
cardpunctuală
Când: card-link editorial din vitrină, cu fir de accent și săgeată animată. Grila pornește de la o coloană și se oprește la trei; exact patru carduri se așază 2 pe 2, ca al patrulea să nu rămână orfan.
Când NU: ca pas de flux în care omul alege. Acolo cardul trebuie să fie el însuși ținta, deci e choice.
broker
Puntea
Brokerul de acces interinstituțional: cere, verifică, consemnează.
Când: rol sau calitate a unei persoane, pe cardurile de identitate. Două forme: rol (tentă de brand) și admin (neutră, cu bordură).
Când NU: pentru starea unei entități. Aceea e badge, și are cinci familii semantice pe care insigna nu le are.
InspectorAdministrator de servicii
Etichetele de mai sus, ale taxonomiei, folosesc chiar acest macro.
banner_contextuniversală
Când: pe orice pagină cu sesiune de funcționar. Răspunde la „unde ești, pentru cine, în ce rol”. Sistemul decide, pagina se supune.
Când NU: pe pagini publice, unde nu există context de mandat. Nu e aria-hidden: e singura indicație de context, deci se aude.
◆Acționezi pentru
Agenția pentru Protecție Socială, ca
Inspector.
banner_statusuniversală
Când: rezultatul unei acțiuni de administrare, sau un fapt despre pagină spus o dată, sus. Tot text simplu.
Când NU: cu marcaj în mesaj. Dacă ai nevoie de accent, e altă componentă: aici HTML-ul ar cere să lași date din context să treacă nefiltrate.
◆Politica a fost publicată. Se aplică de la următoarea interogare.
banner_citizenuniversală
Când: contextul cetățeanului în Cronica. Nu are instituție și nici rol instituțional: identitatea lui nu ține de vreun mandat.
Când NU: pentru un funcționar. Trei compoziții distincte, trei macrouri; unul generic ar fi cerut conținut ca marcaj prin parametru.
◆Ești autentificat ca cetățean (Ana Ionescu), în nume propriu.
choicepunctuală
Când: un pas de flux în care omul alege, iar opțiunea are nume plus cel puțin o fațetă. Cardul e alegerea, deci toată suprafața e ținta, nu titlul.
Când NU: când opțiunea are doar nume (atunci e rând de listă), și niciodată pentru date tehnice: acelea sunt referință, nu alegere. Numele accesibil al linkului rămâne doar titlul, deci meta nu intră în el.
Când: întoarcerea, care e navigare, nu acțiune. Un singur loc: primul element din rândul de acțiuni de sub suprafață, ca buton secundar. Macroul chiar ăsta e felul în care sistemul decide.
Când NU: la primul pas (nu există pas anterior) și pe pagina de rezultat (interogarea s-a consumat, iar „înapoi” ar sugera că poate fi anulată). Niciodată deasupra titlului, niciodată link liber într-un paragraf. O destinație personală nu folosește macroul, chiar dacă stă în același rând.
Când: orice listă fără conținut. Anatomia, în ordinea în care omul are nevoie de informație: ce lipsește, de ce și cine rezolvă, ce face acum.
Când NU: ca element de listă. O stare goală nu e o alegere, deci nu moștenește cadrul de card clicabil. Acțiunea se omite doar când cel care vede starea nu o poate rezolva, iar atunci textul spune cine o rezolvă: o acțiune redundantă e mai rea decât niciuna.
◆
Niciun proces disponibil
Procesele se definesc de administratorul de procese al instituției tale.
Procesele se definesc de administratorul de procese al instituției tale. Până atunci nu ai ce alege de aici.
paginationpunctuală
Când: sub orice tabel paginat, ca subsol intern al panoului. Vocabularul e temporal, „mai noi” și „mai vechi”, fiindcă tabelele sunt descrescătoare în timp. Componenta nu calculează cursoare, le primește gata.
Când NU: pe o listă care încape pe o pagină; fără nicio adresă, nu randează nimic. Nu există „pagina 7”, număr total sau sortare pe coloane, și nu se mimează: cursorul e o cheie, nu un decalaj.
Prima pagină: nu există „mai noi”.
Pagină din mijloc: toate trei.
Capătul listei: în locul butonului lipsă stă explicația, fiindcă un control care dispare fără motiv se citește ca defecțiune.
page_sizepunctuală
Când: în subsolul unui tabel paginat, lângă navigare. Formular de tip GET, fără JavaScript: alegere plus buton de aplicare.
Când NU: cu trimitere automată la schimbare, care ar cere JavaScript și ar declanșa o încărcare la fiecare săgeată apăsată. Filtrele active se repetă ca valori ascunse, dar cursorul se aruncă: o pagină atinsă cu pași de 25 nu are înțeles cu pași de 100.
filterspunctuală
Când: înaintea panoului și în afara lui, pe jurnalele de audit. Componenta primește filtrele ca date, nu le știe pe ale nimănui: cele trei jurnale au seturi diferite.
Când NU: ca antet interior al tabelului. Când un filtru nu întoarce nimic, tabelul e înlocuit de starea goală, iar o bară din interior ar dispărea odată cu el, lăsând omul fără controlul cu care să își retragă filtrul. Un filtru se livrează doar dacă fațeta lui e indexată.
og_localeuniversală
Când: în <head>, pentru eticheta de limbă Open Graph a paginii curente și a alternativelor ei. Codul necunoscut cade pe ro_RO, ca implicitul catalogului.
Când NU: oriunde vede utilizatorul. Nu e copy, e etichetă de protocol: nu trece prin catalog și nu se traduce.
ro ro_RO
hu hu_HU
de de_DE
xx ro_RO
Componentele fără macro sunt tot atâtea decizii: tabelul e un contract, nu un macro; .form-actiuni și .tabel-subsol rămân clase utilitare. Nu extragem ce nu are anatomie proprie.
Folosim un singur cookie, cel de sesiune, necesar funcționării. Nu folosim cookie-uri de analiză sau de urmărire. Află mai multe