numerologie-platform · sistem de design

The Engraved
Observatory

Extinde limbajul „observatory” din numerologie-web cu un strat ceremonial pe care aplicația nu îl are: colțuri ornamentale, sigilii gravate, un fundal mai adânc și o serifă editorială. Fiecare token moștenit își păstrează valoarea exactă — clientul care trece de la „cumpăr o citire” la „îmi citesc citirea” nu trebuie să simtă nicio cusătură.

1 · Culoare

Trei niveluri, moștenite ca regulă din aplicație: aur = ceremonial și sacru; violet = etichete structurale; text = conținut și date. Textul curent nu primește niciodată aur.

Fond

ink
#04050f
NOU · banda ceremonială
abyss
#07091a
fundalul paginii
deep
#10142e
panouri
nebula
#1b2350
suprafețe ridicate
line
#313a66
linii de contur

Aur — ceremonial și sacru

gold
#c9a84c
7.8:1 pe abyss
gold-bright
#f0e2b6
valori, prețuri
brass
#8a6f2e
NOU · gravură 1px
ember
#ffa62b
NOU · hover pe aur
gilt
gradient
doar titluri & numere

Rece — etichete și conținut

violet
#8a96d4
7.2:1 · micro-etichete · nu se stinge
text
#c6cdec
12.9:1 · corp
text-bright
#eaedfb
titluri, date
text-quiet
α .78
NOU · 8.1:1 · secundar
text-mute
α .65
NOU · 4.9:1 · pragul AA
text-off
α .32
NOU · doar absent/inactiv
chart-blue
#4ea8ff
Destin
chart-red
#ff5c57
Voință

Cosmos — lumină, nu cerneală

Șase culori pentru un singur loc: fundalul benzii de produs. Nu sunt un al patrulea nivel de gilt — nu ating niciodată textul, trăiesc doar în interiorul .cosmos și se adaugă întotdeauna peste fond în screen. Sunt măsurate din cele trei imagini trimise de client, nu alese din intuiție. A șasea, albastrul, e cea care nu se vede și fără de care nu merge: o nebuloasă cu o singură nuanță și luminozitatea dată mai tare rămâne o spălătură de violet. Pătratele de mai jos sunt culorile măsurate; câmpurile din bandă sunt scrise cu o treaptă-două peste ele, pentru că o culoare adunată în screen printr-o mască ce acoperă o parte din suprafață cade înapoi exact pe token.

cos-ground
#07051a
NOU · placa benzii
cos-body
#271351
NOU · corpul norului
cos-violet
#672eb9
NOU · corpul norului
cos-magenta
#9f31ac
NOU · filamentele
cos-rose
#b03060
NOU · marginea caldă
cos-cold
#3454c4
NOU · partea rece

2 · Tipografie

Trei fețe, trei roluri disjuncte. Publicul are 50–60+ ani, așa că fiecare treaptă din scară e urcată cu un pas față de valorile standard — aceeași corecție pe care numerologie-web o are deja și pe care platforma nu o are încă.

Cinzel
ceremonial
Numerologie Karmică
Titluri, numerale romane, etichete de sigiliu, marca. Capitale romane inscripționale — aceeași familie ca afișele clientului. Trebuie încărcată cu subsets: ['latin','latin-ext'] — altfel „ă â î ș ț” cad pe un font de rezervă.
Cormorant
editorial
Harta ta numerologică, citită de oameni — nu de un algoritm.
Introduceri, subtitluri, citate. Prag dur: niciodată sub 20px. Trăsăturile subțiri și înălțimea mică a literelor mici nu rezistă la corp de text pentru acest public.
Hanken
funcțional

Navigație, butoane, prețuri, formulare, tabele și text mărunt. Cifre tabulare pentru coloane numerice aliniate la dreapta.

Neschimbată față de aplicație.

Scara — pragul de lizibilitate

xs · 14px
Etichete structurale, text mărunt (standard: 12px)
sm · 16px
Navigație, butoane, meta (standard: 14px)
base · 18px
Corpul textului (standard: 16px)
lg · 20px
Prețuri, subtitluri de secțiune (standard: 18px)
xl · 22px
Introduceri (standard: 20px)

3 · Sigiliile

Elementul care face designul de nerecunoscut ca șablon. Fiecare citire își are figura ei, gravată în linie de aur — planșe dintr-un tratat astronomic, nu imagini de stoc. Sunt exact cele patru figuri desenate de client în schița lui. Treci cu mouse-ul peste o casetă: sigiliul se desenează singur.

Matricială

pătratul 3×3

Karmică

octogonul · XXII

Numelui

steaua numelui

Grafice

Destin & Voință

Implementare: fiecare traseu poartă pathLength="1", deci o singură regulă de stroke-dashoffset animează orice contur indiferent de geometria reală — fără JavaScript și fără măsurători per traseu.

4 · Primitive

Butoane

Spălarea de aur intră dinspre stânga prin scaleX, nu prin estompare — un gest ceremonial, nu un hover generic.

Placa cu colțuri ornamentale

Toate cele patru colțuri sunt desenate dintr-un singur pseudo-element, prin opt fâșii de gradient de 1px. Fără marcaj suplimentar, fără imagini, iar lungimea brațului e un singur token: --bracket.

Card, insignă, câmp

Curs practic

Matricea Karmică

Patru seri, online pe Zoom.

Se introduce o singură dată și circulă în toată harta.

Preț

490 lei

Linii de aur


5 · Pagina unei analize

Pe pagina principală sigiliul este marca de lângă un nume. Pe pagina analizei devine subiectul: pagina se așază ca un produs — numele, promisiunea și prețul în stânga, figura în dreapta, pe toată înălțimea coloanei de text, într-un bezel gradat, desenată o singură dată la încărcare. Este singurul lucru de pe pagină pe care un concurent nu îl poate reproduce.

Bezelul: 60 de gradații fine la 6° și 8 grele pe vârfurile octogonului, dintr-un singur repeating-conic-gradient mascat inelar. Fix, nu rotit — D18: un gradient conic sub o mască n-are transport gratuit din partea compozitorului, așa că o rotație, oricât de lentă, ținea un nucleu ocupat cât timp fila rămânea deschisă. Alături de text, figura se măsoară altfel: exact cât e de înaltă coloana de text și niciodată mai lată decât propria coloană — min(100cqh, 100cqw), dintr-o celulă declarată container-type: size. Nu mai are plafon de vh: sub text, fiecare pixel al figurii împingea prețul în jos; lângă text, figura nu poate depăși înălțimea textului, deci nu costă nimic.

Corona — fundalul benzii de produs

Cele trei imagini trimise de client sunt de acord între ele mai mult decât par: fond aproape negru, filamente subțiri și luminoase, magenta lângă albastru, roșu doar pe margini, stele prin tot. Două reguli țin banda fundal și nu poster. Structură, nu tușe: culoarea de aici nu are nicio formă a ei — e o cădere moale, plată, iar toată forma vine dintr-o mască de zgomot fractal. Un gradient nu poate arăta cosmic, pentru că un nor e nor prin auto-similaritate (aceeași formă de margine la orice scară), iar un gradient are exact o scară. Figura este miezul: norul nu trece pe sub sigiliu, ci se deschide în jurul lui. Aurul nu e pus niciodată să țină contrast pe magenta.

Lumină, nu vopsea
Fiecare strat e mix-blend-mode: screen. Magenta la 40% alfa peste negru compune un maro-gri noroios; același magenta adunat la negru cade exact pe culoarea din fotografiile de referință — pentru că asta face lumina. O nebuloasă se adaugă întunericului, nu îl acoperă.De aceea banda are isolation: isolate: altfel grupul de amestec urcă până la rădăcină și adună ce se întâmplă să fie desenat dedesubt.
Totul se măsoară în --core
Raza figurii. Fiecare oprire de gradient e un multiplu al ei, deci inelul rămâne sudat de bezel la orice lățime. Lângă text, figura e min(100cqh, 100cqw) — înălțimea coloanei de text — și nicio unitate de viewport nu exprimă asta, așa că --core e măsurat (247px la 1024, 285px la 1440) și oprit acolo unde .shell își atinge plafonul. Stivuit, expresia figurii redevine disponibilă și --core e literal jumătate din ea.
Masca decide ce fel de nor iese
Aceeași înlănțuire de patru primitive pe fiecare strat, cu o singură diferență: tabelul din feFuncA. O rampă (0 0 0 .55 1) păstrează doar vârful zgomotului — mase moi peste goluri negre reale. O bandă (0 0 .15 1 .5 0) păstrează o felie din mijloc, adică o linie de nivel a câmpului fractal, iar linia de nivel a unui câmp fractal este un filament ramificat. Masă pe frecvența joasă, filament pe cea înaltă.Neclaritatea vine înaintea întinderii de alfa. Invers iese praf de televizor, și nu se mai poate înmuia după: în CSS filter rulează înainte de mask, niciodată după.
Fiecare strat cu sămânța lui
Două măști pe aceeași sămânță se suprapun exact, și atunci patru straturi nu mai sunt patru nori, ci un singur nor în patru culori — care e chiar definiția spălăturii. Albastrul a trebuit mutat pe altă mască din exact acest motiv: apărea numai acolo unde era deja magenta.
Golul din jurul figurii nu e cerneală
Prima variantă punea cerneală peste tot centrul, și sigiliul stătea într-o gogoașă neagră cu margine vizibilă. Alungirea căderii până la 2.4·core a ascuns cercul și a stins toată banda — o rampă de cerneală destul de lungă cât să nu se vadă e destul de lungă cât să stingă tot. Acum câmpurile sunt gogoși: goale până pe la 0.8–1·core, fiecare cu centrul și raza lui interioară ușor diferite, fiecare tăiat de masca lui. Cerneala face doar ce e treaba ei — acoperă desenul — și se oprește la 0.28·core dincolo de bezel.Când toate straturile aveau același centru și aceeași rază interioară, marginea reapărea: o mască nu poate ascunde o graniță pe care toate straturile o desenează în același loc.
Ecranul textului e o elipsă
Nu o bandă liniară: liniile de nivel ale unui gradient liniar sunt drepte, iar o muchie dreaptă trasă oblic peste o nebuloasă era singurul lucru din bandă care arăta desenat. Trebuie și să ajungă mai departe decât pare necesar — ultimele litere din titlu se opresc la 60px de figură, exact unde începe lobul interior al coronei, iar aur pe magenta e singurul contrast pe care paleta asta nu îl ține.Prețul: brațul din stânga al inelului se stinge. Merită plătit — norii de referință sunt oricum mai luminoși pe o parte.
Granulația nu e decor
O cădere de 200px de la violet la negru face inele vizibile pe un ecran de 8 biți și nicio ajustare de opriri nu o repară. Zgomot feTurbulence la 5.5% le dizolvă și, în plus, dă praful pe care îl are fiecare referință.
Un singur buton de volum
--cos-gain (astăzi 0.67) se aplică pe grup, nu pe câmpuri. Compoziția — ce nuanță stă unde, cum se echilibrează caldul cu recele, unde se încrucișează filamentele — a fost reglată ca întreg; dacă stingi câmpurile unul câte unul, o desfaci. Pe grup, toate raporturile dinăuntru rămân neatinse și se mișcă doar volumul.Grupul se compune oricum peste propria lui copie de --cos-ground, deci se stinge exact spre fondul pe care banda îl pictează oricum — fără margine și fără schimbare de nuanță.
Nimic nu se mai rotește — și de la D18, nimic nu se mai mișcă deloc
Prima variantă desena brațele ca gradienți conici mascați inelar și rotiți lent — adică exact definiția unei tușe: un semn continuu, de lățime egală, cu direcție. Iar o tușă care se rotește destul de încet cât să nu distragă arată ca un indicator de încărcare. A doua variantă a păstrat două câmpuri care respirau unul împotriva celuilalt, pe 190 și 260 de secunde — dar opacitatea pe un strat mascat, uriaș, costă la fel de mult per cadru ca o rotație: banda ținea un nucleu ocupat cât timp fila rămânea deschisă, oricât de lin arăta. Norul e fix acum, ca cerul, roata și bezelul.Rata de umplere a GPU-ului taxează stratul, nu proprietatea animată — un opacity pe o mască mare nu e mai ieftin decât un transform pe ea.
Doar banda de produs
Aplicat ca modificator (.product-hero--cosmos), nu pe clasa de bază. Prăvălia are voie să fie teatru; frontispiciul analizei livrate rămâne instrument — și el folosește .product-hero. E la o clasă distanță dacă clientul vrea altfel.

Blocurile paginii

Antetul în două coloane
Textul în stânga, figura în dreapta, pe toată înălțimea lui (.hero-split). Una peste alta, figura și prețul se certau pe același centimetru vertical — unul dintre ele pierdea mereu. Alături, figura crește cu ~a treia parte (509 → 569px la 1440) și prețul urcă la mijlocul primului ecran. Coloana figurii e cea lată: un cerc nu poate fi mai înalt decât e de lat.Titlul se măsoară în cqw, nu în vw: la 6.2vw cuvântul „Numerologie”, care nu se poate rupe, iese din jumătatea lui de rând. Sub 960px se așază pe verticală, figura prima.
Banda ceremonială
Pe pagina analizei, banda înghite cromul: meniul și firimiturile stau în interiorul plăcii de cerneală, fără fundal și fără linie proprie (.topbar--ghost, .crumbs--tight). Placa începe din marginea de sus a ferestrei. Câștig: ~55px de înălțime și, mai important, dispar cele două linii orizontale care tăiau pagina deasupra figurii.Pe pagina principală cromul rămâne cum era — acolo bara are rolul ei.
Placa componentelor
Opt casete cu numerale romane pe o singură placă, cu rânduri egale (grid-auto-rows: 1fr) ca liniile interioare estompate să cadă exact pe fronturi.Aici vor intra componentele reale de calcul, când le stabilim.
Specimenul
Matricea gravată plus un fragment de interpretare în Cormorant, tăiat cu o mască la 56% — atât cât să se vadă că în spatele cifrelor e o voce, nu cât să înlocuiască analiza.
Condiții & întrebări
Fișa „ce primești” într-un card, întrebările în <details> native — fără JavaScript, deschise la tastatură, tipărite corect.
Banda de comandă
A doua ocazie de a cumpăra, după ce pagina a spus tot ce avea de spus.
Trio-ul înrudit
Aceeași placă, în trei coloane. Sub 1100px se așază pe verticală: la o treime din lățime, pragul de 112px al sigiliului începe să mănânce titlul.

6 · Afișul evenimentului

Materialul clientului pentru evenimente este deja un afiș: un singur cadru orizontal care ține titlul, figura, ce conține cursul, patru promisiuni, datele, cei doi oameni care îl țin, prețul și adresa de înscriere — totul odată, nimic după un clic. Forma e cea bună, și nu doar fiindcă așa desenează clientul. Faptele unui eveniment sunt puține, fixe și repetitive: când, unde, cât ține, cât costă, cu ce rămâi. O pagină care întinde cinci fapte pe trei ecrane pune cititorul să muncească pentru ceva ce încape într-o privire. Deci afișul nu e reclama paginii de eveniment — el este pagina de eveniment, iar lista e un perete de afișe. Aici nu există „vezi detalii”, fiindcă nu există detalii ținute deoparte.

Atelier Ultimele locuri

Numerologia Numelui

Rangul II: aceleași fapte, fără lista de conținut, cu figura retrogradată la marcă.

  • 12 septembrie sâmbătă · 10:00–14:00
  • Zoom online, link cu 24 h înainte
  • 20 de locuri au mai rămas 3
  • Înregistrare acces 6 luni
  • Fișă de lucru PDF, 12 pagini
Investiție 350 lei Rezervă loc
Un component, două ranguri
.poster--afis — evenimentul care urmează: cadru întreg, figura și lista de conținut. .poster--sheet — restul calendarului: aceleași fapte, fără listă, figura devine marcă în stânga, pe toată înălțimea. Același element, aceiași copii, același CSS: rangul e o clasă.Nu există al doilea șablon de ținut în sincron — partea care putrezește prima.
Se măsoară în el însuși
Un afiș e o compoziție fixă: tipografia lui e o fracțiune din propriul cadru, nu din fereastră. container-type: inline-size plus cqi dau exact asta, deci proporțiile supraviețuiesc oricărei lățimi îi dă peretele.Capcană: container-type face elementul container pentru descendenți, niciodată pentru el însuși. Un cqi scris pe propria margine a afișului cade tăcut înapoi pe viewport, iar cadrul începe să urmărească fereastra în loc de hârtie.
Cadrul cedează, nu textul
aspect-ratio: 7/5 e o țintă, nu o cușcă: afișul e element de grilă, deci minimul lui automat e înălțimea de conținut și, când tipografia atinge podeaua de lizibilitate pe o fereastră mică, cutia crește peste raport în loc să-și taie propriul conținut. Fiecare cqi e prins într-un clamp: podeaua din §3 bate compoziția. Un afiș care se micșorează până la corp de 12px a încetat să mai servească publicul acesta ca să rămână frumos.Lățimea e legată de înălțimea ferestrei (100svh), ca afișul dinaintea peretelui să încapă întreg deasupra pliului pe un laptop: la 1440×900 iese 946×678, cu prețul și butonul încă vizibile.
Banda de fapte
Cel mai bun lucru din afișul clientului: cinci fapte repetitive se citesc mai repede ca rang decât ca fraze. Celulele sunt despărțite de reguli care se sting la ambele capete, ca orice altă linie din sistem, iar icoanele sunt gravate la grosimea sigiliilor. Data ia prima celulă, mai lată, și singurul aur — e faptul pe care cititorul chiar îl caută.Icoanele stau aliniate sus: o etichetă care are nevoie de două rânduri nu are voie să-și scoată propria icoană din rând cu celelalte patru.
Creditul nu costă numele
Perechea de ovaluri apare în ambele afișe ale clientului — e identitate, nu decor. Numele stau sub fețe, nu lângă ele: alături, creditul se lățea la 330px, lua o treime din cadru și rupea titlul în două.
Stările sunt desenate
„Ultimele locuri” în ember — singura culoare de urgență din sistem, cheltuită doar pe un fapt care expiră, niciodată pe o categorie. „Locuri epuizate” păstrează toate faptele (cine a ratat vrea să știe ce a ratat) și pierde doar căldura: figura se stinge, prețul nu mai e aur, butonul devine listă de așteptare.
Arhiva nu e afiș
La un eveniment trecut nu mai poate veni nimeni, deci nu mai merită un cadru. Rămân două fapte: când a fost și dacă înregistrarea se mai poate cumpăra — un registru de rânduri, nu un perete.
Peretele are cerul benzii
.product-hero--wall reia corona din §5, reglată altfel: nu există figură de care să o sudezi, așa că --core ajunge cam la jumătatea afișului, iar golul din centrul câmpurilor cade exact acolo unde hârtia îl acoperă. Rămâne doar corona din jurul afișului — adică exact ce se vede la un afiș pus pe perete. --cos-gain scade la 0.5, fiindcă banda nu mai e cel mai tare lucru din bandă.
Stelele afișului nu se rotesc
Un afiș e tipărit. Fundalul lui e o singură dală din același câmp de stele pe care restul sitului îl învârte, așezată o dată — deci hârtia e din aceeași noapte, iar un perete de patru afișe nu costă nicio animație.

7 · Raftul de cărți

Douăsprezece titluri, deci nicio paginare — și, dacă nu există paginare, nu există niciun motiv să ascunzi o copertă în spatele unui rând de listă. Aici coperta este produsul: e singura pagină a sitului ale cărei imagini nu le-am desenat noi și merită văzute la dimensiune. Compoziția e un raft, nu o grilă de carduri, iar din decizia asta ies trei consecințe.

Înălțime comună, lățime proprie
Cărțile stau pe aceeași linie de bază, ca pe un raft, în loc să fie tăiate la un dreptunghi comun. Zece coperte sunt 205×317 și două sunt 200×274; o casetă cu raport fix le-ar fi tăiat titlul exact celor două care ies din rând.Garanție: object-fit: contain. Cu înălțime explicită, o coloană îngustă ar fi întins coperta clientului în loc să o încadreze.
Blatul e o linie care se stinge
Sub fiecare copertă trece regula obișnuită a sistemului, doar puțin mai aprinsă — trebuie citită ca o suprafață pe care stă ceva, nu ca un despărțitor. Sub carte, o elipsă moale de umbră: altfel cartea plutește deasupra raftului.
Cotorul și luciul
Două gradiente de un pixel peste copertă: muchia care prinde lumina și o dâră oblică de tipar. Fără ele, un JPEG plat pe fond întunecat arată a autocolant, nu a obiect.
Cât de mari pot fi, sincer
Sursele au 205px lățime. Raftul le urcă la 285px înălțime — o ușoară micșorare pentru zece dintre ele și o mărire de 1.09× pentru două. Mai mari de atât cer fișiere mai mari, nu CSS mai bun: dacă se vor coperte de 600px, clientul trebuie să le ceară editurii.
Epuizat ≠ dispărut
Cartea rămâne pe raft cu tot cu descriere — cine află de ea acum vrea să știe că există — și pierde doar căldura: coperta se răcește, prețul dispare, iar în locul lui apare numărul de cititori care cer reeditarea. Acela e cel mai util număr de pe pagină și e chiar data clientului.
O singură acțiune în aur
Douăsprezece butoane de aur ar transforma raftul într-un rând de butoane. Acțiunea e o legătură de text aurită cu săgeata în afară; butonul ceremonial se cheltuie o singură dată, în banda de la piciorul paginii.
Prețul citat spune când
Prețurile și stocul sunt citite din magazinul altcuiva, așa că pagina scrie data la care le-a citit, în loc să se poarte ca și cum le-ar ști în timp real.
Pe telefon cade descrierea
La două coloane, decizia e coperta, titlul și prețul; un paragraf de cinci rânduri sub fiecare ar face din raft un zid de text. Descrierea se ascunde, restul rămâne.

8 · Registrul jurnalului

Posts.cover este opțional, deci o arhivă construită pe coperte e o arhivă care se rupe în ziua în care un editor sare peste una. Iar coperta după care ar întinde mâna un sit de numerologie e exact fotografia cosmică interschimbabilă pe care o folosește fiecare referință din sample-imgs/. Așa că registrul nu are nicio imagine: fiecare articol e ștampilat cu numărul despre care vorbește, desenat de aceeași mână ca sigiliile. Douăsprezece pe pagină, trei pe rând — arhiva se citește ca un perete de numere, adică exact forma de pagină pe care numai practica asta o poate avea.

Numărul e coperta
Un articol de numerologie e aproape întotdeauna despre un număr, iar numărul e singura imagine pe care o avem deja și pe care nimeni altcineva nu o poate copia. Cere colecției Posts un câmp nou, number, și îl cere opțional: articolul fără număr primește marca, în același loc și la aceeași greutate optică.Starea fără număr nu e o rezervă, e o stare desenată. Un editor care nu completează niciodată câmpul trebuie să obțină tot o pagină întreagă.
Nu un component nou
Ștampila e .numen--struckacelași component ca inelul din analiza livrată, doar bătut în loc de luminat: fond întunecat, a doua linie de un pixel pentru muchie, mărime fluidă. În analiză inelul e un rezultat și strălucește; aici e un indice, și douăsprezece rezultate strălucitoare pe o pagină ar țipa. Variantele stau lângă bază, nu lângă registru, ca să nu poată apărea niciodată un al doilea lucru care înseamnă „un număr într-un cerc de aur”.
Rând, nu casetă
Douăsprezece carduri cu chenar cântăresc mai mult decât scrisul pe care îl țin. Fiecare intrare are doar o linie deasupra — aceeași regulă care se stinge la ambele capete — și grila devine un index tipărit, în care ritmul îl dau numerele.Linia stă pe ::after, fiindcă .plate deține ::before, iar rangul I e și intrare, și placă. Două reguli pe același pseudo-element merg perfect până în ziua în care componentul e compus.
Aliniere prin construcție
Un registru ale cărui titluri încep la înălțimi diferite e o grilă de carduri fără chenare. Și chiar încep diferit: o categorie mai lungă sau un autor cu nume dublu rupe rândul de deasupra. Deci fiecare intrare ocupă patru rânduri ale registrului și le preia cu grid-template-rows: subgrid — eticheta, titlul, rezumatul și proveniența se dimensionează pe tot rândul, iar oricare dintre ele poate trece pe două rânduri fără să miște pe celelalte.Unde subgrid lipsește, intrarea cade pe rândurile ei automate: neregulată, niciodată stricată.
Inelul ține două rânduri
Ștampila acoperă eticheta și titlul. Ținută doar în primul rând, ea îi impunea rândului 68px de înălțime și deschidea o gaură între o etichetă și titlul de care aparține; pe două rânduri, e marginea comună a celor două linii.
Ce se citește înainte, ce se citește după
Linia de sus ține categoria (hasMany, deci uneori două) și cât durează — ambele se citesc înainte de a intra în articol. Linia de jos ține data și autorul: proveniență. Timpul de citit se calculează din body, nu se stochează, altfel devine greșit la prima corectură.Prima variantă avea data sus, lângă categorie: se rupea pe două rânduri la jumătate dintre intrări, și un rând rupt sus coboară titlul sub vecinii lui.
Rangul I e tot o intrare
Cel mai nou articol primește colțurile de placă, inelul gradat ca un instrument, rezumatul în serifă și singurul portret de pe pagină. Nimic nu se schimbă ca înțeles — aceleași câmpuri, alt rang. Portretul repetat de douăsprezece ori ar transforma registrul într-o planșă de fotografii.
Douăsprezece pe pagină
12 = 3×4 fix, deci pagina se închide pe un rând întreg, nu pe o coadă de două intrări. Pe prima pagină, rangul I ia locul unei intrări: unu plus unsprezece. Săgeata inactivă rămâne în rând — controlul nu are voie să se recentreze între pagina 1 și pagina 2 — iar sub numere scrie în clar la ce te uiți: pagina, totalul, câte pe pagină.
Bara de categorii poartă numere
Cititorul alege un raft după cât e pe el, nu după nume. Bara e îngustată sub lățimea paginii ca ruperea să cadă 4 + 3, echilibrat, în loc de 6 + 1, care se citește a greșeală. Ar fi încăput pe un rând cu 66px câștigați din spațiere, dar acela e un rând care se rupe la prima redenumire de categorie.Cu hasMany, sumele categoriilor nu trebuie să dea totalul: un articol cu două etichete se numără de două ori. Asta e corect, nu e o eroare de afișaj.
Abonarea e aceeași peste tot
Trei pagini au ajuns acum să ceară o adresă de e-mail: „anunță-mă” la evenimente, „anunță-mă la reeditări” la cărți, „un articol pe lună” aici. Sunt același mecanism și trebuie să fie o singură colecție cu o preferință per om — altfel clientul are trei liste care nu se dezabonează una pe alta.

9 · Pupitrul de scris

ContactSubmissions primește patru câmpuri publice — nume, e-mail, subiect, mesaj — și macheta nu adaugă niciunul. O pagină de contact la scara practicii ăsteia nu are o problemă de colectare, are una de credibilitate: un formular singur pe pagină nu se deosebește de o cutie de sugestii, iar singurul lucru pe care îl vinde afacerea e că îți citește harta un om. Deci pagina scrie cine deschide căsuța și în cât timp răspunde, iar asta stă lângă formular, nu în subsol.

Despre ce scrii
CT

Cristian Terran Calculele, comenzile și evenimentele.

CD

Clarissa Damian Partea karmică și programarea ședințelor.

Adresa de e-mail nu pare completă.

Firma
Terran Consult S.R.L.
CUI · Reg. Com.
RO 41 235 908 · J40/8912/2019
Sediu social
Str. Cercului 14, sector 2, București
Cine citește, lângă formular
Două ovale, două nume, două rânduri despre ce ține fiecare. Ovalul e deja al practicienilor — apare în ambele afișe ale clientului — deci chipurile intră în pagină ca parte din identitate, nu ca stoc. Asta e singura diferență între „scrie-ne” și „lasă un mesaj”.
Cât durează, în cuvinte
Un termen se scrie o dată, simplu, și niciodată ca „cât mai curând”. Una-două zile lucrătoare, cu ce se întâmplă în weekend spus în clar.Termenul e o promisiune, deci e singurul rând din pagină care are nevoie de confirmarea clientului înainte de implementare.
Subiectul se alege, nu se tastează
subject e text, opțional, maxim 200 — deci lista scurtă de opțiuni nu e o schimbare de schemă: eticheta aleasă se scrie în aceeași coloană. Câștigul e la celălalt capăt: inboxul (defaultColumns: name, email, subject, status) devine sortabil pe cele cinci lucruri despre care scriu oamenii. „Altceva” descoperă textul liber pe care coloana îl permitea oricum.
Chipsul e un primitiv
Grupul de opțiuni nu e un component nou: e .pick, scos din comutatorul de rol al analizei livrate și promovat între primitive. Două componente care înseamnă amândouă „alege una dintre astea” se depărtează întotdeauna; .role a rămas doar cu rama întreruptă care marchează un control de machetă.
Toate trei stările sunt desenate
Formularul are trei rezultate și de obicei două rămân nedesenate. Ruta răspunde cu un singur mesaj generic pentru orice câmp greșit, așa că browserul trebuie să numească problema înainte de a pleca cererea — eroarea e pe câmp, cu chenar de ember și un rând sub el.A doua folosire îngăduită a emberului: culoarea de urgență ține de ce expiră sau de o acțiune care a eșuat. Categoriile n-o primesc nici acum.
Confirmarea spune adevărul
Cârligul afterChange trimite o notificare doar către practicieni; expeditorul nu primește nimic. Deci confirmarea scrie exact asta — „următorul mesaj de la noi e chiar răspunsul” — în loc să lase tăcerea de două zile să se citească a formular stricat.Recomandarea către produs e opusul: un e-mail automat de confirmare. Până când există, pagina nu are voie să-l promită.
Ghidajul stă sub câmp
Ce ai nevoie să știi în timp ce scrii nu are ce căuta în placeholder: dispare la prima tastă. Numărul comenzii și „nu-ți trebuie datele de naștere acum” stau sub caseta de mesaj și rămân acolo.
Plăcuța, nu o listă gri
Datele de identificare cerute de lege — firmă, CUI, registrul comerțului, sediu, e-mail — sunt pe o placă gravată, cu rânduri despărțite de aceeași linie care se stinge la capete. Vin din SiteSettings, deci pagina nu le știe pe de rost.
Fără hartă
Adresa din setări e o identitate juridică, nu un magazin. O hartă în jurul ei cheamă oameni la o ușă care poate fi casa cuiva. Plăcuța o numește „sediu social” și se oprește.
Momeala, fără captcha
Ruta are deja capcana (website, invizibilă, cu răspuns 200 tăcut ca robotul să nu învețe) și un plafon de 20KB pe corp. O captcha ar taxa fiecare vizitator ca să oprească o mână de roboți, pe un formular cu câteva mesaje pe săptămână.
Răspunsurile vin după formular
Cele patru întrebări cu răspuns pe sit închid pagina, nu o deschid: înaintea invitației, aceleași patru rânduri se citesc a respingere; după ea, se citesc a serviciu — și trimit înapoi în sit. Rândurile se aliniază prin subgrid, ca registrul jurnalului.Pagina asta e și singura care nu se termină cu banda de abonare: e a treia oară când sitului i-ar cere cineva adresa de e-mail, iar aici omul tocmai a scris-o.

10 · Analiza livrată

Tot ce e mai sus vinde. Aici începe lucrul vândut: pagina pe care clientul o deschide în cont. Două reguli o despart de paginile de vânzare. Întâi, documentul se citește, nu se scanează — de aceea are cuprins permanent și planșe numerotate, aparatul unei lucrări tipărite, nu al unei pagini de prezentare. Apoi, aritmetica se arată întotdeauna: un număr fără derivarea lui e o afirmație, unul cu derivare e o dovadă pe care clientul o poate reface pe hârtie. Asta e toată diferența dintre acest produs și un horoscop.

5

8+9+6=235zi · lună · an

C3R9I9S1T2I9N5A1

Inelul, scara și litera — cele trei piese noi. Operatorii sunt gramatică, nu valoare: sans, mai mici, violet, ca ochiul să citească cifrele și să deducă semnele. Eticheta de proveniență (.src) primește un punct de oprire când vine după rezultat — fără el, „41 → 5 SUMA DATEI” se citește ca și cum cuvintele ar face parte din sumă.

Blocurile documentului

Frontispiciul
Exact antetul în două coloane de la pagina produsului, cu numele clientului în locul numelui citirii. Cumpărătorul a întâlnit așezarea asta când a cumpărat; s-o reîntâlnească atunci când primește analiza este ideea — același obiect, acum cu numele lui pe el.Sub nume, trei inele (.crown) cu eticheta dedesubt, ca NumberSigil din aplicație — nu un rezumat, o semnătură. Celelalte patru numere sunt la douăzeci de centimetri mai jos, cu aritmetica lor.
Cuprinsul
Coloană de 200px, sticky, cu numeralele romane pe un fir vertical; elementul activ înlocuiește firul, nu stă lângă el. Sub 1000px devine o bandă orizontală derulabilă și renunță la sticky — fixată, ar mânca exact capul planșei pe care o anunță.Banda cere min-width: 0 pe element: lista are lățimea ei intrinsecă de ~1400px și ar trage tot documentul în afara ecranului.
Planșa
Numeral aurit, titlu, și o linie care fuge până în marginea dreaptă (.folio-head::after). Linia e ceea ce face blocul să se citească drept cap de planșă, și nu costă niciun element în plus.
Cele șapte rezultate
Grilă de fire de păr peste un fond luminat — același truc ca la .matrix, ca să nu apară niciodată o muchie dublă. Fiecare celulă: inel, etichetă, scara de reducere, înțelesul.Coloane de minimum 300px, nu 255: sub atât, „Nr. de Personalitate” și scara lui se rup fiecare pe trei rânduri.
Literele
Fiecare literă cu valoarea sub ea; vocalele — care dau Dorința Inimii — primesc celula aurită, niciodată valoarea din ea. Datele rămân lizibile; aurul rămâne ornament.
Piramida
Șaisprezece rânduri de cerculețe, fără spațiu vertical între ele: la 26px celulă și 4px spațiu orizontal, pasul de 26px face triunghiul echilateral (30 × √3⁄2 ≈ 25,98). Lățime max-content, altfel celulele se strâng în derulator și piramida încetează să mai fie echilaterală.Zerourile sunt valori adevărate (regula 10 → 0), deci primesc inel violet, nu invizibilitate.
Benzile de vârstă
Tema se scrie în coloana de etichetă, nu în interiorul barei: cea mai îngustă bandă din figură e întotdeauna cea activă (o oportunitate ține nouă ani dintr-o sută), așa că orice text pus în bare se taie exact acolo unde trebuie citit. În bară rămâne cifra; peste toate trece un fir de aur la vârsta de azi.
Partea scrisă
Singurul loc din platformă unde Cormorant duce text curent, nu o introducere — analiza e un document scris, iar serifa e ceea ce o face să pară scrisă. Inițială aurită, notă marginală flotantă care devine bloc obișnuit sub 900px.
Colofonul
Numărul analizei, data, cine a calculat și cine a scris. Închide documentul așa cum îl închide o carte.

Glosa — vocea operatorului, câte una pe planșă

Fiecare planșă poate purta o interpretare scrisă de Cristian sau de Clarissa, salvată în timpul ședinței sau după ea. Asta face documentul viu: ajunge complet la aritmetică și își completează înțelesul în zilele următoare. O glosă nu trebuie niciodată confundată cu registrul — tot ce e calculat e sans, în grilă, cu etichete violet; tot ce e scris e Cormorant pe un fir de aur, cu un nume și o dată pe el. Contrastul ăsta este produsul: omul a plătit pentru al doilea lucru, deci al doilea lucru trebuie să se deosebească de primul de la doi metri.

Scrisă

Interpretare Clarissa

Vocalele tale adună 33 și abia pe urmă coboară la 6. Ține minte suma, nu doar rezultatul: nu orice 6 vine dintr-un 33, al tău vine.

Publicat · vizibil

În așteptare — nimic scris încă

Interpretare se scrie în ședință

Piramida se citește cel mai bine cu voce tare, rând cu rând. O luăm împreună în ședință, iar interpretarea apare aici imediat ce o salvăm.

Ținută — scrisă, dar se deschide la ședință

Interpretare scrisă · se deschide la ședință

Interpretarea planșei ăsteia e scrisă și e a ta. O deschidem împreună: graficul Destin–Voință e singurul loc din hartă unde contează și ce spui tu în timp ce îl citim.

Ședința · 19 august, 18:00
Cele trei stări
Scrisă — fir plin de aur, semnătură și dată. În așteptare — fir întrerupt, violet, fără pic de aur: a auri un loc gol înseamnă a promite ce nu există încă. Ținută — fir punctat: textul e scris și plătit, dar se deschide în ședință.Starea „ținută” cere motivul scris în clar. Fără el, un chenar punctat peste un text ascuns se citește ca un paywall — nu ca o decizie de meserie.
Cifra din glosă
Un număr citat în text trimite înapoi la un rezultat de pe aceeași planșă, deci se scrie în Cinzel și primește --gold — nu --gold-bright, care la mărimea asta e imposibil de deosebit de culoarea textului și se citește ca o greșeală, nu ca o trimitere.
Cuprinsul ca barometru
A treia coloană a cuprinsului e o bulină de stare, în aceleași trei stări. Cuprinsul devine astfel și indicatorul de progres al interpretărilor — se vede dintr-o privire ce planșă are voce, fără nouă ecrane de derulat. Aceleași nouă buline apar și în frontispiciu.
Sinteza
Planșa a IX-a e tot o glosă, doar că ține o planșă întreagă: aceeași linie de atribuire, aceleași unelte, cadrul scos. Glosele vorbesc fiecare despre planșa ei; sinteza le leagă într-un singur om.
Modul operator
Aceeași pagină, văzută de cel care scrie în ea. Două lucruri trebuiau să fie adevărate: operatorul scrie în timpul ședinței, deci a compune nu are voie să însemne părăsirea documentului pentru un ecran de administrare; și tot ce tastează e pe cale să devină vizibil unui om care a plătit, deci starea fiecărei glose trebuie citită fără niciun clic.Compozitorul înlocuiește nota de așteptare în același loc și pe aceeași lățime — ce tastezi e exact acolo unde va fi citit. Deasupra lui, o listă cu cifrele planșei, ca să nu fie nevoie de derulare în timp ce vorbești.
Cromul operatorului
Ia --ember și niciodată aur. Aurul înseamnă pe pagina asta „rezultatul clientului”; dacă uneltele ar fi tot aurite, cele două straturi s-ar citi ca unul singur. Ember e destul de cald cât să pară „în direct” și nu apare nicăieri altundeva.

11 · Coșul, finalizarea și confirmarea

Trei ecrane noi, inserate imediat după pagina unei citiri și nu la coada dosarului — narativ, aici vin: răsfoiești, cumperi, primești o chitanță și abia apoi, peste câteva zile, sosește ce ai cumpărat (planșa 10). Niciunul din cele trei nu inventează un ton nou: coșul e o listă, finalizarea e biroul de contact purtat a doua oară, confirmarea e o placă gravată. Ce e genuin nou e o singură componentă — rândul unui coș — pentru că nimic de pe sit până acum nu era o listă de lucruri cu preț pe care cineva le editează. .parts și .tile-plate sunt vitrine: te uiți, pleci. Un rând de coș are nevoie de o cantitate care se schimbă și de o ieșire, deci a primit propriul .cart-line.

  • Citire

    Numerologie Karmică

    490 lei / buc
    1
    490 lei
Trei ecrane, un singur .plaque
Subtotal, transport, total — pe coș, pe finalizare și pe confirmare — sunt aceeași placă gravată de dt/dd care ține azi datele firmei pe pagina de contact. O placă de fapte nu are nevoie să știe dacă faptele sunt un CUI sau un preț.
Transportul e condiționat, nu promis
Rândul de transport apare doar când coșul conține un produs fizic (shippingBani din money.ts) — o citire nu se expediază. Specimenul de mai sus amestecă deliberat o citire cu o carte, ca regula să se vadă, nu doar să se citească într-o notă.
Finalizarea reia biroul de contact, cu o gardă în plus
.desk/.desk-form/.field sunt neschimbate din pagina de contact — același formular, altă listă de câmpuri. Dar comutatorul-machetă al finalizării nu reutilizează #st-form/#st-sent/#st-err: dosarul agregat pune toate ecranele într-un singur <body>, iar un radio lăsat bifat pe pagina de contact nu dispare când cineva trece la finalizare. Un id de comutator comun ar lăsa starea uitată a unei pagini să conducă panourile alteia. Finalizarea își ține propriile clase de comutare (.co-*), pe lângă cele vizuale (.desk-form etc.), și fiecare ecran nou trebuie să facă la fel — vezi §15.
„Adaugă în coș”, nu „Comandă”
Butonul din capul paginii de produs tot sare la #comanda — a doua ocazie de a cumpăra, neschimbată. Ce s-a schimbat e unde duce acel buton: înainte un data-stub mort, acum @cos, un ecran real. Eticheta urmează ținta: un buton care duce la un coș se numește „Adaugă în coș”, nu „Comandă”.
Confirmarea nu promite un e-mail
Aceeași regulă ca la biroul de contact (§9): ruta de comandă nu trimite nimic automat spre client — doar ContactSubmissions și Readings au afterChange cu sendEmail, și niciunul din ele nu e o confirmare de comandă. Pagina spune deschis că ea însăși e chitanța, în loc să lase o căsuță de e-mail goală să se citească a formular stricat.
Coșul din antet e singura excepție „pe tot situl”
Restul acestui capitol e deliberat local — trei ecrane noi, nimic în cromul comun. .cart-link îl încalcă intenționat: iconița stă lângă „Cont”, în .topbar-actions, pe toate cele zece pagini reale (nu și pe acest dosar sau pe §16 — nu sunt pagini ale sitului). Motivul e chiar cel pentru care coșul există: un vizitator care pleacă de pe pagina unui produs trebuie să găsească drumul înapoi de oriunde ajunge, nu doar de acolo de unde a plecat. Emblema .cart-count e statică — „2”, aceleași două produse din specimenul de mai sus — pe toate paginile mai puțin una: pe confirmare emblema lipsește, fiindcă acolo coșul tocmai s-a golit.
Discuția pe Zoom intră
în tot lanțul, nu doar la coadă
Confirmarea a primit prima mesajul „te contactăm pentru o discuție pe Zoom" — dar produsul, finalizarea, pagina principală și chiar analiza livrată (§10) încă vorbeau despre un PDF care „ajunge în cont în 5–7 zile", fără nicio discuție între comandă și livrare. Un client care citea în ordine (produs → coș → finalizare → confirmare) găsea o promisiune la pasul IV și alta, contrazicând-o, la pasul V. Acum toate cinci spun aceeași poveste: comanda programează o discuție pe Zoom cu Cristian sau Clarissa, concluziile ei intră direct în text, iar ce se livrează e o analiză online, în cont — nu un fișier. Exportul PDF (butonul Descarcă PDF din §10) rămâne desenat ca țintă, dar e etichetat „vine în curând": e pe traseu, nu deja construit.

12 · Lizibilitate măsurată

Auditul din 13 august a fost făcut pe pixeli, nu pe foaia de stil: fiecare rând de text a fost decupat din pagina randată, iar contrastul citit din ce a ieșit efectiv pe ecran. Era singura variantă — .gilt scrie cu color: transparent și pictează literele cu un gradient tăiat, așa că foaia de stil răspunde 1:1 la orice întrebare despre un titlu. Din 351 de rânduri distincte, 38 cădeau sub AA. Ultima trecere numără 379 de rânduri și două sub prag, amândouă din desen: teaserul care se stinge intenționat pe pagina de produs și săgeata de paginare dezactivată, pe care WCAG o scutește explicit. Mediana: 8.04:1.

Treapta liniștită

Culoarea asta exista înainte să aibă nume: rgb(198 205 236 / α), scrisă de mână în treizeci de locuri, cu α între .25 și .85. Fiindcă nu era token, nu exista nici loc unde să fie reparată. Măsurată pe cele patru fonduri pe care chiar se pictează, α trebuie să fie cel puțin .563 pe ink și .613 pe nebula — deci vechile favorite cad toate la limită: α .55 dă 4.34:1, α .6 dă 4.37:1 pe nebula. Trei tokenuri în loc de treizeci de literali.

α .55
4.34:1 — sub AA. Era valoarea pentru copyright, „prețuri la zi”, data articolului, paginare.
α .65
text-mute
4.87–5.72:1 după fond. Pragul: legende, meta, text mărunt, dar și liniuța de celulă goală din matrice — o cifră care lipsește e tot informație.
Ciclul
tăcut
Treapta a existat două săptămâni doar pe hârtie. --text-mute: var(--text-mute) — o proprietate personalizată care se referă la ea însăși e invalidă la calcul, așa că fiecare color: var(--text-mute) cădea pe moștenire și lua culoarea părintelui. Se citea mai luminos decât trebuia, deci nimeni nu s-a plâns; iar auditul a trecut-o de două ori, fiindcă măsoară ce e prea închis, nu ce e prea deschis. Reparată, au ieșit la suprafață patru rânduri sub prag — inițialele din ovalurile goale și săgeata dezactivată — trei dintre ele duse peste. Un audit care verifică o singură direcție nu poate vedea o eroare care greșește în cealaltă.
violet
Nu are treaptă. La opacitate plină e 7.15:1 pe ink, dar 5.27:1 pe nebula — α care mai trece peste tot e .89, adică practic 1. Violetul este deja treapta liniștită; stins, pică (numerele din index, „mod” din scară și eticheta de machetă stăteau la 3.4–4.4:1).
14px
podeaua
Închis D11: firimiturile din bandă luau două reduceri deodată — 12px și 0.72 opacitate, pe șase pagini. O șoaptă are voie la una singură. Tot la 12px stătea și „Epuizat”, cel mai decisiv cuvânt de pe raft.
24px
ținta
Linkurile din subsol erau ținte de 21px pe telefon, exact acolo unde se caută „Termeni” sau „Contul meu”. inline-block + padding, iar spațiul dintre rânduri dă înapoi cât ia padding-ul.

Ritmul vertical

Măsurat pe rânduri de pixeli fără cerneală: pagina principală avea 30% din înălțime rânduri complet goale. Cauza nu era generozitatea, ci o adunare — .section punea 112px sus și 112px jos, așa că fiecare cusătură dintre două secțiuni măsura 224px, de patru-cinci ori pe pagină. Paginile făcute mai târziu (jurnal, contact) scăpaseră deja prin padding-top:0 scris în marcaj: sistemul se contrazicea singur. Cusătura e umplutura unei secțiuni.

224 → 112px
Toate cusăturile, pe toate paginile. Prima secțiune ia 64px, fiindcă vine după o bandă ceremonială care a dat deja ochiului odihnă — și, spre deosebire de o cusătură, o și arată printr-o margine vizibilă.
Cei trei pași
Era componenta cea mai goală din sistem: 578px înălțime pe 120px de rânduri cu cerneală — 79% inactiv, față de ~45% la placa de dedesubt. Trei insule centrate, fără ramă și fără linie, se citesc ca resturi într-un gol; aceleași trei între fire de aur se citesc ca un obiect. Linia e --rule-v, al plăcii de dale — structură împrumutată, nu inventată.
Raftul
auto-fill fixa patru coloane și lăsa fiecare raft cu câte cărți are: Arhonții (cinci titluri) ieșea 4 + 1, cu o gaură de 800×600px lângă ultima carte — cea mai mare suprafață goală din tot designul. Un raft e lat cât cărțile de pe el: --titles vine din numărul pe care titlul secțiunii îl anunță deja („cinci titluri”).
Banda de
deschidere
Pagina principală era singura cu marca în afara benzii ceremoniale — celelalte șase pun un topbar--ghost înăuntru. Rezultatul: textul începea la y=258 acolo unde toate celelalte pagini încep la y=99, iar banda era cea mai înaltă de pe site. Partea de percepție are o valoare exactă: o compoziție centrată într-o bandă care atârnă sub o bară de aceeași cerneală se citește jos cu jumătate de bară, orice ar face umplutura — ochiul ia câmpul de la marginea paginii, nu de la marginea benzii. Roata stă acum în cutia titlului, nu a benzii, ca cele două să nu poată fi despărțite; abia atunci umplutura poate fi reglată pentru echilibru.
Bara de machetă
Era position: fixed cu z-index: 9 — o bară fixă stăpânește permanent podeaua ferestrei, iar ce trece pe sub ea nu se vede. Acoperea comutatorul de rol din analiză și al doilea cititor de pe pagina de contact. Nu merită: nota stă acum la sfârșitul documentului.
Rezultat
Principala 5101 → 4644px, produsul 5647 → 5262, evenimentele 4679 → 4337, cărțile 5412 → 4398px (−19%). Nicio bandă goală mai mare de 130px nu mai există în afara benzilor ceremoniale.

13 · Fotografia

Tot ce e pe site-ul ăsta e desenat în linie de aur, cu o singură excepție: cei doi oameni care citesc hărțile. O fotografie nu poate fi făcută să semene cu un sigiliu, și nici nu trebuie — dar poate fi așezată în același instrument. Trei lucruri i se fac înainte să aparțină benzii, și toate trei se pot citi dintr-o măsurătoare, nu dintr-o părere.

Fond
Jumătate din pixelii opaci ai decupajului sunt sub 0.12 luminanță — cămașă neagră, păr închis, umbră adâncă — pe un câmp de cerneală la 0.0035. Pusă goală pe bandă, jumătate din fotografie dispare. Aureola nu e ornament: e lumina care trebuie să existe în spatele lor ca să aibă contur.
Contur
drop-shadow pe un decupaj urmărește silueta reală, nu cutia. Două straturi — unul strâns și palid, unul larg și auriu — dau perechii exact conturul gravat pe care îl are orice sigiliu de pe site. Același vocabular, fără retuș.
Sfârșit
Sursa e tăiată la coaste, iar o linie orizontală dreaptă peste două trupuri e singurul lucru care s-ar citi ca poză de stoc lipită pe pagină. Masca stinge ultimul sfert în cerneală — cu cinci opriri, nu două: o rampă dreaptă în cifre nu e dreaptă pentru ochi și, peste o jachetă stacojie, apărea ca o tăietură. Îndoită, roșul — cel mai zgomotos lucru de pe o pagină al cărei subiect e desenat în aur — e consumat până la plăcuță.
Roata
Marea roată s-a mutat de sub titlu în jurul lor. Sub litere era o textură la 9% pe care nimeni n-o putea numi; în jurul celor doi e roata karmică cu practicienii în centru — toată propunerea site-ului, spusă ca imagine. E concentrică cu fețele (44%, nu 50%: masa unui bust stă sus) și e intenționat mai mare decât rama, fiindcă un inel care încape în coloană se citește ca hublou, iar unul care iese pe margini se citește ca ceva în fața căruia stau.
Plăcuța
Doi oameni fără nume dedesubt sunt o imagine de stoc. Numele au plecat din supratitlu — unde erau o etichetă — și au venit sub fotografie, unde sunt o legendă. Scrise de la stânga la dreapta, cum îi arată poza, nu în ordinea din proza site-ului: singura treabă a unei legende e să spună cine e cine. Placa măsurată pe înălțimea copiei alăturate e fotografie plus plăcuță, altfel numele atârnă sub coloana cu care trebuiau aliniate.
Rezoluție
Sursa are 392×369px utili. Macheta o arată la ~500px, ceea ce e curat la 1× și moale la 2×. Pentru producție e nevoie de aceeași fotografie la minimum 1400px lățime. WebP cu alfa, nu PNG: aceeași imagine, a cincea parte din octeți — ceea ce contează când pagina o poartă în base64.

14 · Dosarul

Un design nu se predă ca douăsprezece fișiere într-un folder. Se predă ca ceva prin care se poate umbla: meniul duce unde scrie, firimiturile se întorc, iar acolo unde macheta se termină, o spune cu o propoziție în loc să nu facă nimic. Tot ce e aici e schelă — nu ajunge în produs — dar poartă aceleași convenții ca produsul, fiindcă altfel clientul ar trebui să deducă singur care jumătate e care.

Două ținte,
o sursă
Aceleași douăsprezece șabloane dau un folder cu un fișier pe ecran (legate prin nume de fișier, se deschid de pe disc) și un singur fișier cu toate douăsprezece, adresate prin #/rută. Al doilea e cel care pleacă la client: e un singur link și supraviețuiește la forward. CSS-ul și marcajul sunt identice între ele — orice diferență de randare între folder și pachet e o eroare, și există o probă care o caută.
Adresa
În sursă, o legătură între ecrane e href="@rută" sau @rută~ancoră; build-ul o scrie ca nume de fișier sau ca fragment. Click-ul comandă direct schimbarea ecranului, iar adresa e corectată după — nu invers. Un cadru care înghite fragmentul lasă atunci un prototip nelegabil, nu unul fără navigație.
Marginea
139 legături duc spre ecrane pe care nu le-a desenat nimeni. Un href="#" mort sare în capul paginii și se citește ca defect, nu ca hotar; data-stub îi dă în schimb o propoziție („Ecranul cardului nu e desenat — procesatorul nu e ales încă”). Ce era o gaură devine o listă de decizii — și fiecare notă e o întrebare pentru discuția cu clientul.
Instrumentul
Harta ecranelor și notele iau convenția care exista deja pentru controalele ce trăiesc numai în machetă (vezi .role): ramă punctată, violet, niciodată aur. Aurul de pe paginile astea înseamnă „lucrul clientului”; dacă și unealta ar fi aurie, cineva ar trebui să ghicească la ce se uită.
Ce s-a rupt
la unire
Nouă documente într-unul singur au scos trei defecte pe care opt fișiere separate nu le puteau arăta. .ledger: numele era deja al sistemului, pentru registrul edițiilor trecute. .order-copy h2: o pagină restiliza pe ascuns o componentă comună, iar celelalte trei benzi de închidere luau tot timpul 1.5em de la browser. Și trei pagini purtau același sprite de icoane, adică id-uri duplicate în care primul câștigă tăcut peste tot. Un component comun care are nevoie de un stil pe trei pagini nu are nevoie de trei copii — are nevoie de o variantă.
Proba
Rulează pe pachet și verifică: un singur ecran vizibil pe rută, fiecare legătură ajunge undeva, niciun id duplicat, nicio regulă locală de pagină care atinge alt ecran (selectorul e rulat prin querySelectorAll și fiecare potrivire trebuie să cadă în ruta proprietarului), zero depășiri pe orizontală la 1440/1024/414 și zero erori de consolă.
Cardurile au crescut,
aritmetica nu
Comentariul de lângă .screens spunea „opt carduri, două coloane, patru rânduri, fără gaură" — adevărat cât dosarul avea opt ecrane. Coșul, finalizarea și confirmarea l-au dus la unsprezece, iar comentariul a rămas neschimbat: ultimul rând ajunsese să aibă un singur card, cu jumătate de rând gol lângă el — exact ce comentariul promitea că nu se întâmplă. .screen--sys (cardul spre §16) primește acum grid-column: 1 / -1: zece carduri de site împart două coloane pe cinci rânduri fără rest, iar al unsprezecelea — documentul, nu o pagină a sitului — se întinde singur pe ultimul rând ca o anexă, nu ca o gaură.

15 · Reguli

Așa da

  • Aurul pe titluri, numerale, marcă, sigilii și acțiunea principală.
  • Violetul pe micro-etichete — contragreutatea rece care împiedică oboseala de aur pe un scroll lung.
  • O singură încărcare orchestrată: elemente decalate la 60ms. Apoi liniște.
  • Sigiliul lângă titlu, la 112–172px: este marca produsului, nu o pictogramă.
  • O legătură care nu duce nicăieri spune de ce, într-o propoziție.
  • Instrumentul machetei — hartă, note, ștampile — în violet punctat. Aurul e al clientului.
  • Pe pagina unei analize, sigiliul e subiectul: singur, centrat, în bezel, desenat o dată la încărcare.
  • Cromul se retrage acolo unde figura e subiectul: fără bară proprie, fără linie, în interiorul benzii.
  • În analiza livrată, fiecare număr își arată operația. Fără derivare, e o afirmație.
  • Marcajul aurit pe celula care poartă data, nu pe data însăși — vocalele, banda activă, celula plină.
  • Calculat sau scris — se vede de la doi metri: grilă sans versus Cormorant pe fir de aur, cu nume și dată.
  • Când o interpretare e ținută pentru ședință, motivul se scrie în clar, în aceeași frază cu butonul.
  • Cromul de operator în ember; aurul rămâne al clientului.
  • În registru, numărul articolului e coperta lui — și e același inel ca în analiză, doar bătut, nu luminat.
  • Un rând de registru se aliniază prin subgrid, nu prin nădejdea că textul are aceeași lungime.
  • Norul se deschide în jurul figurii; sub aur rămâne cerneală. Culorile lui se adaugă în screen, nu se așază peste.
  • Forma norului vine din mască, nu din gradient. Gradientul dă doar culoarea și căderea.
  • Un fapt care se repetă la fiecare eveniment intră în banda de fapte, cu icoana lui, nu în text.
  • Data are voie la aur pe un afiș: e faptul căutat, deci e faptul ceremonial.
  • Coperta la dimensiunea ei reală, pe un raft cu linie de bază comună — nu tăiată la un raport comun.
  • Lângă un formular stau omul care răspunde și termenul în care răspunde. Fără ele, o casetă de text e o cutie de sugestii.
  • Subiectul se alege dintr-o listă scurtă și se scrie în același câmp de text: inboxul devine sortabil fără nicio schimbare de schemă.
  • Confirmarea spune ce urmează și în cât timp — inclusiv că nu vine niciun e-mail automat, fiindcă nu vine.
  • Ghidajul de care ai nevoie în timp ce scrii stă sub câmp, nu în placeholder.
  • Cormorant doar de la 20px în sus.
  • Cinzel cu latin-ext, pentru diacritice.
  • Ocolire completă la prefers-reduced-motion.
  • O culoare de text folosită de mai mult de două ori este un token. Un literal repetat nu are unde să fie reparat.
  • Contrastul se măsoară pe pagina randată, nu pe foaia de stil — altfel .gilt răspunde 1:1 la orice.
  • Cusătura dintre două secțiuni e umplutura uneia singure, nu suma amândurora.
  • Numărul de coloane al unei grile vine din câte lucruri are de așezat, când numărul e cunoscut și mic.
  • O bandă de text scurt are nevoie de o linie care s-o țină; altfel e o insulă într-un gol.
  • O fotografie primește fond, contur și un sfârșit înainte să intre în bandă: aureolă dedesubt, drop-shadow pe siluetă, mască spre cerneală.
  • O rampă de stingere se scrie cu mai multe opriri. Dreaptă în cifre nu înseamnă dreaptă pentru ochi.
  • Legenda unei fotografii cu doi oameni îi numește de la stânga la dreapta, cum îi arată poza.
  • Un primitiv spune singur unde stă eticheta lui, ca să nu fie nevoie de asta la fiecare loc care îl întinde.
  • O buclă decorativă are un capăt — sau, mai simplu (D18), nu există deloc: cerul, roata, bezelul și norul sunt toate fixe acum, nu doar puse pe pauză după impresia inițială.
  • Un strat mascat sau amestecat (D19) primește contain: paint: fără o graniță de randare a lui, browserul nu poate ține o singură bitmapă și doar s-o mute la scroll — dar numai unde nimic din el nu pictează în afara propriei cutii.
  • O figură lângă un text de lungime variabilă se prinde sus, nu la centru (D22): centrarea într-o coloană mai înaltă decât figura taie golul în două benzi vizibile, în loc să-l lase lângă rândurile cele mai puțin esențiale ale coloanei.
  • Un id de comutator-machetă e unic în tot dosarul, nu doar pe pagina lui: dosarul agregat le pune pe toate într-un singur <body>, iar un radio uitat bifat pe o pagină nu dispare când cineva trece pe alta.

Așa nu

  • Nicio fotografie pusă pe un articol doar ca să nu rămână cardul gol — asta e exact imaginea pe care o are toată concurența.
  • Niciun al doilea component care înseamnă „un număr într-un cerc de aur”. Există unul; primește o variantă.
  • Aur pe textul curent sau pe celule de date — niciodată.
  • Rame ornamentale pe fiecare secțiune: densitatea de afiș, la scară de ecran, arată ieftin.
  • Imagini cosmice de stoc. Figurile clientului sunt activul; nimeni nu le poate copia.
  • Micro-animații împrăștiate. Un singur gest memorabil, repetat de patru ori.
  • Modificarea vreunui token moștenit — rupe continuitatea cu aplicația.
  • Un href="#" care sare în capul paginii. Ori duce undeva, ori spune de ce nu.
  • Un stil de pagină care restilizează pe ascuns o componentă comună. Dacă are nevoie de altceva, e o variantă a componentei.
  • Un nume de clasă nou fără să verifici că sistemul nu l-a luat deja pentru altceva.
  • Sigiliul redus la dimensiune de pictogramă, așezat deasupra titlului — se pierde tocmai lucrul care diferențiază.
  • Al treilea gest mare pe pagina analizei: figura se desenează o dată la încărcare. Bezelul e fix (D18); nimic altceva nu se mișcă.
  • „Vezi detalii” pe un eveniment. Dacă un fapt merită o pagină, merită o celulă în afiș.
  • Ember pe o categorie. Culoarea de urgență se cheltuie doar pe ce expiră.
  • Un buton de aur pe fiecare card dintr-o listă lungă. Aurul care se repetă de douăsprezece ori nu mai e ceremonial.
  • Hartă lângă adresa firmei. Un sediu social nu e un magazin, iar o hartă cheamă oameni la o ușă care poate fi casa cuiva.
  • Captcha pe un formular cu câteva mesaje pe săptămână: taxezi toți vizitatorii ca să oprești o mână de roboți.
  • Răspunsurile de tip „poate găsești singur” înaintea formularului — acolo se citesc a respingere.
  • Încă o cerere de adresă de e-mail pe pagina în care omul tocmai și-a scris adresa.
  • Cormorant sub 20px sau în tabele.
  • Text în interiorul benzilor de vârstă: banda activă e cea mai îngustă și se taie prima.
  • Analiza livrată ca tablou de bord: e un document care se citește o oră, nu o pagină care se scanează.
  • Aur pe o glosă care nu există încă — un loc gol aurit promite ce nu s-a scris.
  • Text ascuns sub blur ca momeală. Ori se vede, ori se spune limpede de ce nu.
  • Ecran separat de administrare pentru scris: operatorul compune în ședință, în document.
  • Nor peste text sau peste sigiliu. Un fundal frumos care costă lizibilitate nu e un fundal, e o eroare.
  • Arce, mături conice, orice se rotește. Un fundal cosmic nu are direcție și nu are capăt.
  • Fișiere imagine pentru fundal: totul e CSS, deci trece de CSP și se poartă ca o componentă, nu ca un activ.
  • Violet stins. La opacitate plină abia trece pe fondul ridicat; orice α îl scoate sub prag.
  • Două reduceri pe același text — și mai mic, și mai transparent. Șoapta are voie la una.
  • O bară fixă peste conținut. Podeaua ferestrei nu e spațiu liber, e conținutul cuiva.
  • auto-fill pe o listă scurtă și cunoscută: fixează coloanele și lasă ultimul rând orfan.
  • Coloană de dată dimensionată după cea mai scurtă dată din exemplu. Un registru cu rânduri inegale nu mai e registru.
  • Fotografie așezată direct pe cerneală. Jumătate din ea e mai închisă decât fondul și pur și simplu nu mai există.
  • Marginea de jos a unui decupaj lăsată să se vadă. Sursa se termină la coaste; pagina nu e obligată s-o arate.
  • Oameni fotografiați fără nume dedesubt. Atunci e o imagine de stoc, oricine ar fi în ea.
  • O animație infinite pe o mască sau un gradient conic, fără o condiție de oprire. Durata lungă nu costă mai puțin — compozitorul tot bate din aripi la fiecare cadru, la nesfârșit.
  • contain: paint pus fără să verifici mai întâi ce pictează elementul în afara propriei cutii (D19): inelul .numen își are strălucirea într-un box-shadow care iese din chenar — l-ar fi tăiat exact la margine.

16 · Traducere în cod

Unde ajunge fiecare decizie, în src/design/.

tokens.css
Cele trei culori noi, pragul de lizibilitate --text-*, --font-serif, .gilt, .rule-gold, .plate, straturile de cer.Plus treapta liniștită — --text-quiet / --text-mute / --text-off. Portul nu are voie să scrie rgb(198 205 236 / α) de mână: exact așa au ajuns treizeci de locuri cu douăsprezece valori diferite, dintre care o duzină sub prag.
layout.css
Ritmul vertical: .section + .section nu mai adună umpluturile, iar prima secțiune dintr-un main ia treapta mică fiindcă vine după o bandă. Regula asta economisește ~450px pe pagina principală și ~1000px pe cea de cărți, fără să scoată nimic din pagină.
primitives/
Button (spălarea de aur), Card, Badge, Input — toate există deja și primesc noile stiluri.
primitives/Sigil.tsx
Componentă nouă: cele patru figuri, alese prin name.
blocks/Hero.tsx
Banda ceremonială: cer, roata mare, colțuri, kicker, titlu aurit, linie cu lozenge.Acum e o bandă împărțită: copia la stânga, portretul la dreapta, pe același .hero-split pe care îl folosește pagina de produs pentru sigiliu. Regulile de tipografie ale coloanei înguste stau pe .hero-split, nu pe pagina care a avut prima nevoie de ele; ce rămâne pe --split e rândul de preț și banda de fapte, care sunt mobilierul produsului.
primitives/Portrait.tsx
Componentă nouă: aureola, roata concentrică cu fețele, decupajul cu contur de drop-shadow și stingere în cinci opriri, plăcuța cu numele. Placa se măsoară pe înălțimea copiei de alături — fotografie plus plăcuță — și are voie s-o depășească cu 12%, fiindcă e container-type: size și nu poate întoarce nimic în înălțimea benzii.Sursa reală trebuie să vină ca media Payload la minimum 1400px lățime; macheta poartă un WebP cu alfa de 784px, decupat pe caseta alfa. Alt-textul e un nume de om, nu „portret”.
blocks/ProductShowcase.tsx
Devine placa cu patru casete și linii interioare comune, în loc de grilă de carduri plutitoare.
primitives/Cosmos.tsx
Componentă nouă, șapte <span> și un văl: adâncimea, patru câmpuri mascate (corp, magenta, marginea caldă, partea rece), filamentele, aura bezelului și nodurile de emisie. Nu primește niciun parametru în afară de --core/--cx/--cy, care vin din banda care o găzduiește.Capcană, plătită o dată: regula comună .cosmos > span are specificitate 0-1-1, iar .cos-arm are 0-1-0 — inset: 0 din prima câștiga în fața lui top/left din a doua, și ambele brațe stăteau centrate pe colțul benzii, nu pe figură. Arătau tot a nori, motiv pentru care a supraviețuit trei runde de ajustări. Reparat prin construcție: niciun strat nu-și mai ia poziția din layout — toate sunt inset: 0 și tot ce desenează e așezat de --cx/--cy în pictură. Un strat decorativ care nu poate fi pus greșit valorează mai mult decât unul pus corect. D20: pe varianta de produs, macheta înlocuiește cele patru câmpuri mascate cu un WebP static (două capturi, desktop și 960px) — încărcarea a scăzut cu ~40%, scrollul n-a fost afectat (stratul e deja în prim-plan, deasupra pliului). D21: aceeași înlocuire pe varianta wall (evenimente) — geometric verificată identic pe cinci lățimi, dar acolo câștigul de CPU nu s-a reprodus la nivel de pagină (posterul acoperă cea mai mare parte a coroanei); păstrată pentru consecvență și pentru riscul vizual zero, nu pentru un câștig măsurat pe acea pagină. Rămâne deschis dacă componenta reală păstrează varianta procedurală sau macheta.
primitives/SigilStage.tsx
Componentă nouă: bezelul gradat, aureola și figura desenată la încărcare — folosită doar pe pagina unei analize.
blocks/ProductDetail.tsx
Componentă nouă: banda ceremonială cu preț, placa componentelor, specimenul, condițiile, întrebările și banda de comandă.
AddToCartButton.tsx, CartView.tsx, CheckoutView.tsx
Există deja și funcționează — coșul de oaspete, TVA-ul, transportul condiționat de tipul produsului sunt toate reale. Ce lipsea era stilul: cele trei componente poartă azi clasele Tailwind implicite ale pornirii de proiect. Macheta nu le înlocuiește, le îmbracă.Un singur decalaj rămâne: butonul din machetă zice „Plătește cu cardul”, cel real zice „Plasează comanda” și trimite direct — nu există încă un procesator. Eticheta machetei anticipează pasul următor; portul o schimbă abia când Stripe sau Netopia (.env.example) chiar există.
primitives/CartLine.tsx
Componentă nouă: un rând de coș — titlu, insignă de tip, cantitate, preț de linie, ieșire. Nimic de pe sit până acum nu era o listă de lucruri cu preț pe care cineva le editează; .parts și .tile-plate sunt vitrine.
app/(public)/[locale]/comanda/[id]/confirmare/page.tsx
Există deja, la fel neîmbrăcată. Singura schimbare de conținut: pagina nu trebuie să înceapă vreodată o propoziție cu „ți-am trimis un e-mail” — ruta de comandă nu trimite niciunul.
primitives/Poster.tsx
Componentă nouă: afișul unui eveniment, în cele două ranguri (rank="afis" | "sheet") și în starea soldOut. Primește un document Event întreg; ce nu are rangul (lista de conținut, creditul) pur și simplu nu se randează.Regula de aici: rangul schimbă ce apare și unde, niciodată ce înseamnă. Un al doilea component „EventCard” ar începe imediat să se depărteze de afiș.
primitives/Ico.tsx + icons/
Un singur sprite de <symbol> gravate (calendar, ecran, redare, carte, sigiliu, ac, oameni, ceas, plic).Capcană, plătită scump: cu sprite, viewBox stă pe <symbol>, iar un <svg> fără viewBox propriu nu are raport intrinsec — deci height: auto cade pe implicitul de element înlocuit, 150px. Nouă icoane așa au făcut din fiecare celulă de fapt un rând de 150px și din afiș un pătrat. Se poartă ambele curele: viewBox pe fiecare instanță și aspect-ratio în CSS.
blocks/EventWall.tsx
Peretele: primul eveniment în rang I în banda ceremonială, restul în rang II, apoi registrul edițiilor trecute. Ordinea vine din startsAt, nu dintr-un câmp „featured” — un eveniment devine afiș fiindcă e următorul, nu fiindcă a bifat cineva o casetă.
collections/Events.ts
Colecție Payload nouă: title, kind (curs/atelier/seară/seminar), edition, sigil, summary, contents[], startsAt/endsAt, schedule, venue (online|sală + detaliu), seats/seatsLeft, includes[] (icoană + etichetă + notă), price, recording.seatsLeft conduce singur badge-ul de ember și starea de epuizat; nu se scrie de mână un „ultimele locuri”.
primitives/BookCard.tsx
Componentă nouă: o carte pe raft — copertă, cotor, blat, stare (inStock / reprinting / outOfPrint), preț cu PRP tăiat, cerere de reeditare. Coperta e singura imagine reală din sistem, deci e și singurul loc cu object-fit și cu dimensiuni intrinseci în marcaj.
design/_proto.*
Nu se portează. Harta ecranelor, notele de hotar și ruterul sunt schela pe care se arată machetele; produsul are rutare adevărată și nu are hotare de anunțat.Singurul lucru care trece dincolo e convenția: violet punctat pentru orice control care există doar în machetă.
collections/Books.ts
Colecție Payload nouă: title, subtitle, year, cover (media), shelf, coauthor, pages/isbn/format, price/listPrice, stock, reprintVotes, storeUrl, pricesReadAt.pricesReadAt nu e decor: prețurile vin din magazinul editurii, iar pagina promite doar data la care le-a citit. Dacă mai târziu se sincronizează automat, câmpul devine marcaj de timp al importului.
primitives/Numen.tsx
Componentă nouă: inelul cu numărul — port direct al lui NumberSigil din aplicație, cu treapta suplimentară pentru numeralele romane, care au patru glife acolo unde cifrele au una. Variante: tone="lit" | "struck" (rezultat sau indice) și dial pentru rangul I al jurnalului.Registrul jurnalului nu primește un component propriu. Dacă apare vreodată un al doilea „număr în cerc”, cele două vor începe să se depărteze în aceeași lună.
primitives/PostEntry.tsx
Componentă nouă: o intrare de registru, în cele două ranguri (rank="lead" | "entry"). Primește un document Post; timpul de citit se calculează din body la randare.
blocks/JournalRegister.tsx
Componentă nouă: bara de categorii cu numere, registrul (rangul I doar pe prima pagină) și paginatorul. Limita din getPosts urcă de la 9 la 12, ca pagina să se închidă pe un rând întreg de trei.
collections/Posts.ts
Colecție existentă, un câmp nou: number — opțional, text scurt (1–9, 11, 22, 33). Fără el, intrarea primește marca.cover rămâne în colecție și rămâne opțional: are sens pe pagina articolului, nu în registru.
primitives/Pick.tsx
Primitiv nou, dar nu o componentă nouă: grupul de opțiuni scos din comutatorul de rol al analizei livrate. Îl folosesc și subiectul mesajului, și orice altă alegere scurtă de mai târziu.
primitives/Plaque.tsx
Componentă nouă: identitatea juridică pe placă gravată, citită din SiteSettings (legalName, cui, regCom, address, notificationEmail). Ce lipsește din setări pur și simplu nu se randează.
blocks/ContactDesk.tsx
Componentă nouă: formularul cu cele trei stări, coloana cu cei doi cititori și termenul, plăcuța, iar sub ele cele patru răspunsuri. Înlocuiește grila de două coloane din contact/page.tsx, în care aside-ul e o listă gri de date fiscale.
collections/ContactSubmissions.ts
Colecție existentă, neschimbată de design: cele patru câmpuri publice rămân patru. Singura propunere e la cârligul afterChange — pe lângă notificarea către practicieni, un e-mail de confirmare către expeditor.Restul e deja corect și rămâne așa: status are acces de câmp separat, deci un expeditor anonim nu-și poate ascunde singur mesajul din inbox.
collections/Subscribers.ts
Colecție nouă, una singură pentru toate cele trei benzi de „lasă-ne adresa” (eveniment, reeditare, jurnal): e-mail, sursă, preferințe, confirmare, dezabonare. Trei liste separate ar însemna trei dezabonări care nu se anulează una pe alta.
primitives/Ladder.tsx
Componentă nouă: scara de reducere. Primește pașii din Reading și îi compune — operanzi, operatori, rezultat, etichetă de proveniență. Nimic scris de mână.
blocks/ReadingDoc.tsx
Componentă nouă: cuprinsul sticky, planșele numerotate și colofonul. Fiecare planșă își primește felia din Reading; textele scrise vin din CMS, nu din motor.
blocks/Gloss.tsx
Componentă nouă: interpretarea unei planșe, în cele trei stări. Primește un document Gloss sau nullnull înseamnă „în așteptare”, deci starea goală nu e un caz special, e cazul implicit.
collections/Glosses.ts
Colecție Payload nouă: reading (relație), folio (I–IX), body (richtext), author, status = draft | published | held, publishedAt. Accesul clientului citește doar published; held se deschide când ședința e marcată ca ținută.Aici stă și regula de plată: fără comandă achitată, nicio glosă nu iese din colecție — nu se ascunde în CSS.
blocks/GlossComposer.tsx
Componentă nouă, doar pentru rolul de operator: editorul în linie, cifrele planșei la îndemână, ciornă salvată automat, „publică pentru client”. Aceeași lățime și același loc ca glosa pe care o va înlocui.
figures/
Piramida, matrița, benzile de vârstă, destin–voință. Există deja în numerologie-web ca SVG; aici se reîmbracă în paleta ceremonială, fără să li se schimbe geometria.
chrome/
HeaderView cu marca-octogon și subliniere care se deschide; FooterView gravat.
layout.tsx
Reparație: Cinzel({ subsets: ['latin','latin-ext'] }) plus încărcarea Cormorant Garamond.