Invictus Medical - schelet magazin
Ce are programatorul in mana, ce ii mai trebuie, si in ce ordine se construieste. Documentul e scris ca sa poata fi dat direct lui Claude, sarcina cu sarcina.
Toate patru sunt in documentul asta.
Se pleaca de la Dawn, tema oficiala si gratuita Shopify, forkuita in depozit propriu. Nu se cumpara tema: la un catalog tehnic ajungem oricum sa rescriem cardul de produs, filtrele si meniul, iar o tema cumparata inseamna sa lupti cu deciziile altcuiva. Sectiunile proprii primesc prefixul inv-, ca sa se distinga instant de cele mostenite din Dawn.
| Ce | Cum |
|---|---|
| Mediu de lucru | Shopify CLI, tema de dezvoltare (shopify theme dev), niciodata direct pe tema publicata |
| Versionare | Depozit git cu tema; fiecare etapa = ramura proprie si tema nepublicata pentru verificare |
| Backup | Export JSON al temei live inainte de prima publicare |
| Date de test | 20 de produse pilot, reale, cu toate metacampurile completate - nu se construieste pe produse goale |
Fiecare bloc vizibil in macheta are un fisier si o sursa de date. Coloana a treia e cea care conteaza: de acolo vine continutul, si daca sursa nu exista, blocul nu se poate construi.
| Bloc | Fisier | Sursa datelor |
|---|---|---|
| Bara utilitara | sections/inv-topbar.liquid | Setari de sectiune (telefon, WhatsApp, mesaj livrare) |
| Antet + cautare | sections/inv-header.liquid in sections/header-group.json | Logo din setari tema; cautare = /search cu sugestii (Predictive Search) |
| Meniu doua panouri | acelasi fisier + snippets/inv-mega.liquid | Meniu Shopify (Navigation) + metacamp de parinte pe colectie |
| Bara de incredere | sections/inv-trust.liquid | Setari de sectiune, 4 blocuri repetabile |
| Sertar mobil | snippets/inv-drawer.liquid | Acelasi meniu, randat pe doua niveluri |
| Subsol | sections/inv-footer.liquid in footer-group.json | Meniuri + setari (CUI, adresa, ANPC, plati) |
templates/index.json| Bloc | Fisier | Sursa datelor |
|---|---|---|
| Hero | sections/inv-hero.liquid | Setari: supratitlu, titlu, text, doua butoane, pastile, imagine |
| Comanda din nou | sections/inv-reorder.liquid | Ultimele comenzi ale clientului autentificat; ascuns cand nu e logat |
| Grila de categorii | sections/inv-category-grid.liquid | Lista de colectii; numarul de produse = collection.products_count; subcategoriile din metacampul de copii |
| Alege dupa lucrare | sections/inv-tasks.liquid | Blocuri repetabile, fiecare cu link spre o colectie dedicata |
| Cele mai cerute | featured-collection (Dawn) cu cardul nostru | Colectie automata sortata dupa vanzari |
| De ce de la noi | sections/inv-why.liquid | Setari, 4 blocuri |
| Producatori | sections/inv-brands.liquid | Lista de vendori sau colectii de brand |
| Intrebari frecvente | sections/inv-faq.liquid | Blocuri repetabile + marcaj FAQPage in snippets/inv-schema-faq.liquid |
templates/collection.json| Bloc | Fisier | Sursa datelor |
|---|---|---|
| Firimituri | snippets/inv-breadcrumbs.liquid | Metacamp de parinte pe colectie + marcaj BreadcrumbList |
| Titlu + introducere | sections/inv-collection-head.liquid | collection.title + metacamp intro |
| Pastile subcategorii | acelasi fisier | Colectiile copil din metacamp |
| Bara de control + filtre + grila | sections/main-collection-product-grid.liquid (Dawn, rescris) | Search & Discovery peste metacampuri; produsele din colectie |
| Card de produs | snippets/inv-product-card.liquid | Titlu, SKU, lot, valabilitate, stoc, pret, adaugare in cos |
| Paginare | acelasi fisier | paginate, 24-36 pe pagina. Nu derulare infinita |
| Cum alegi | sections/inv-howto.liquid | Metacamp howto (text bogat, cu tabel) |
| Text categorie + intrebari | sections/inv-collection-body.liquid | Metacampuri body si faq |
| Categorii inrudite | sections/inv-related-collections.liquid | Metacamp lista de colectii |
templates/product.json| Bloc | Fisier | Sursa datelor |
|---|---|---|
| Galerie | main-product (Dawn) cu media rescrisa | Imaginile produsului; prima se incarca prioritar |
| Coloana de cumparare | snippets/inv-buy-box.liquid | Titlu, vendor, SKU al variantei, pret cu si fara TVA, stoc, formular de cos |
| Data estimata de livrare | snippets/inv-delivery-eta.liquid | Calcul din setari (ora limita, zile lucratoare) + prag de greutate |
| Caseta lot si pastrare | snippets/inv-lotbox.liquid | Metacampuri lot, expiry, storage; ascunsa cand lipsesc |
| Ce contine pachetul | snippets/inv-kit.liquid | Metacamp kit_contents |
| Ancore | sections/inv-anchors.liquid | Static; continutul ramane in pagina, fara taburi |
| Descriere structurata | main-product blocul de descriere | product.description, cu subtitluri dupa sablon fix |
| Tabel date tehnice | snippets/inv-spec-table.liquid | Aceleasi metacampuri ca filtrele - o sursa, doua afisari |
| Documente | snippets/inv-docs.liquid | Metacamp lista de fisiere (fisa tehnica, IFU, CE) |
| Se foloseste cu | product-recommendations + metacamp manual | Recomandari Shopify, suprascrise de lista manuala unde exista |
| Intrebari produs | snippets/inv-product-faq.liquid | Metacamp faq + marcaj FAQPage |
| Pareri | extensie de aplicatie (Judge.me / Loox) | Aplicatie, nu tema. Starea goala se stilizeaza |
| Bara lipita jos | snippets/inv-sticky-buy.liquid | Pret + adaugare in cos, doar sub 900 px |
| Marcaj Product | snippets/inv-schema-product.liquid | sku, gtin, brand, pret, moneda, disponibilitate |
Astea sunt fundatia. Filtrele din categorie si tabelul tehnic de pe produs se alimenteaza din aceleasi definitii. Se creeaza inainte de a scrie prima linie de Liquid, cu acces activat pentru magazin, altfel nu apar nici in tema, nici in filtre.
| Cheie | Tip | Unde apare | Obligatoriu |
|---|---|---|---|
product.custom.spec_* | text sau numar cu unitate | Tabel tehnic + filtre (cate unul per atribut real al categoriei) | Da |
product.custom.lot | text | Caseta lot, card de produs | La marfa cu termen |
product.custom.expiry | data | Valabilitate, filtru "valabilitate minima" | La marfa cu termen |
product.custom.storage | text | Conditii de pastrare | La marfa cu termen |
product.custom.ce_mark | text | Eticheta de conformitate langa cod | Da |
product.custom.kit_contents | lista de text | Ce contine pachetul | La kituri |
product.custom.docs | lista de fisiere | Fisa tehnica, IFU, declaratie CE | Da |
product.custom.faq | text bogat sau metaobiect | Intrebari despre produs | Nu |
product.custom.goes_with | lista de produse | Se foloseste impreuna cu | Nu |
collection.custom.parent | referinta colectie | Meniu pe trei niveluri, firimituri | Da |
collection.custom.children | lista de colectii | Pastile de subcategorii, grila de pe Acasa | Da |
collection.custom.intro | text bogat | Introducerea de deasupra grilei | Da |
collection.custom.body | text bogat | Textul de sub produse | Da |
collection.custom.howto | text bogat | Ghidul de selectie si tabelul comparativ | Nu |
collection.custom.faq | text bogat | Intrebari de categorie | Nu |
| Zona | Cum se face | De stiut inainte |
|---|---|---|
| Filtre | Aplicatia Search & Discovery, filtre construite peste metacampuri, disponibilitate si pret | Numarul de filtre e limitat - se verifica plafonul in aplicatie inainte sa promiti 8 filtre pe categorie. Filtrele functioneaza pe paginile de colectie si de cautare |
| Cautare | Cautarea nativa + sinonime din aceeasi aplicatie | Se testeaza pe catalogul real ca SKU-ul intoarce produsul. Daca nu, se trece pe un motor dedicat - decizia se ia devreme, nu la final |
| Sugestii instant | Predictive Search, cu poza, pret si stoc in rezultat | Se randeaza din snippets/inv-search-suggest.liquid |
| Trei niveluri | Meniu Shopify pentru afisare + metacampuri parinte/copii pentru relatii | Colectiile sunt plate si adresa e fixa /collections/<nume>. Ierarhia nu se poate face din adrese |
| Adresa produsului | Doar /products/<nume> | Nu se genereaza legaturi de tip /collections/x/products/y - fac dubluri |
| Filtre in adresa | Parametri de tip ?filter.p.m... | Primesc noindex si canonic spre colectia curata |
Sapte etape, fiecare cu un livrabil care se poate verifica singur. Nu se trece la urmatoarea pana cea curenta nu trece proba.
Fork Dawn, variabilele de culoare, tipografie si spatiere copiate din macheta in assets/inv-tokens.css. Antet, meniu in doua panouri, sertar mobil, bara de incredere, subsol.
Toate definitiile din capitolul 03, cu acces activat pentru magazin. Completate pe cele 20 de produse pilot.
Proba: metacampurile se citesc in tema si apar in lista de filtre din aplicatieGalerie, coloana de cumparare, lot, kit, ancore, tabel tehnic, documente, intrebari, marcaj Product, bara lipita jos.
Proba: pe cele 20 de produse pilot, fara camp gol si fara bloc rupt cand un metacamp lipsesteFirimituri, intro, pastile, bara de control, filtre, grila, paginare, ghid de selectie, text si intrebari.
Proba: filtrele intorc acelasi numar ca tabelele tehnice ale produselorHero, comanda din nou, grila de categorii, alege dupa lucrare, cele mai cerute, dovezi, producatori, intrebari.
Proba: toate legaturile duc in colectii reale, niciun link mortTrecere pe toate cele trei sabloane la 414 px. Imaginea principala prioritara, restul lenese.
Proba: zero depasire orizontala, LCP sub 2,5 s pe mobil pe produs si categorieImport complet de catalog, verificare finala, publicare temei.
Proba: lista din capitolul 07, bifata integral| Criteriu | Cum se masoara |
|---|---|
| Fara depasire orizontala | document.documentElement.scrollWidth egal cu latimea ecranului, la 414 px, pe cele trei sabloane |
| Viteza | LCP sub 2,5 s pe mobil, pe produs si pe categorie |
| Marcaj valid | Product, BreadcrumbList si FAQPage trec testul Google de rezultate imbogatite |
| Filtre corecte | Numarul afisat in filtru = numarul real de produse cu acea valoare |
| Cautare dupa cod | Zece coduri reale, luate la intamplare, intorc produsul corect |
| Fara continut fabricat | Zero recenzii inventate, zero preturi taiate fictiv, zero note fara pareri reale |
| Stari goale | Categorie fara rezultate, produs fara pareri, produs fara lot - toate arata intentionat |
| Tastatura | Meniul, filtrele si galeria se pot folosi fara mouse, cu focus vizibil |
Claude construieste bine cand primeste o sarcina inchisa, cu sursa si criteriu de acceptanta. Nu ii dai "fa magazinul", ii dai o sectiune. Astea trei lucruri i se pun in fata la fiecare sarcina.
Depozitul temei local, aplicatia Shopify CLI conectata la magazinul de dezvoltare, si un token de Admin API cu drepturi pe teme, produse si metacampuri.
Linkul machetei si al acestui document. Codul machetei se citeste direct din pagina, deci Claude poate lua cotele exacte, nu aproximari.
Un singur bloc din harta de la capitolul 02, cu fisierul tinta si proba de trecere.
# Context Tema: fork Dawn, depozit local. Magazin de dezvoltare conectat prin Shopify CLI. Referinta vizuala: https://design.devrika.ro/01-invictus-desktop-mobil.html Specificatia: https://design.devrika.ro/00-PREDARE-DESIGNER.html Harta si metacampuri: https://design.devrika.ro/04-IMPLEMENTARE-SHOPIFY.html # Sarcina Construieste blocul "Card de produs" din harta (capitolul 02, pagina Categorie). Fisier tinta: snippets/inv-product-card.liquid Cerinte: - Ordinea in card: cod produs, titlu (max 3 randuri), lot si valabilitate, stoc, pret cu TVA, buton de adaugare in cos - Cotele exacte se iau din macheta, clasa .pcard (citeste codul paginii) - Lotul si valabilitatea vin din metacampurile custom.lot si custom.expiry si se ascund cand lipsesc, fara sa lase spatiu gol - Stocul are punct colorat SI text; niciodata doar culoare # Proba de trecere - Randat intr-o colectie cu 24 de produse, la 1440 px si la 414 px - Zero depasire orizontala la 414 px - Un produs fara lot arata corect, fara gaura in card - Fara stiluri scrise inline; totul in assets/inv-*.css
Revizia A - 28.07.2026 - Devrika