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 null — null î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.