Profiluri externe (sameAs)
Core · identitate
LIVE
Homepage
sendreagabriel.ro
one-page · 6 ancore
LIVE
Arhivă Gânduri
/ganduri
lista articole
Articole publicate · 6
20 MAI
De ce filmez documentar
/de-ce-filmez-documentar
filmare documentară nuntă
20 MAI
Ce înseamnă să fii invizibil
/videograf-discret-nunta
videograf discret nuntă
20 MAI
De ce românii nu se simt bine
/romanii-in-fata-camerei
românii în fața camerei
1 IUN
Cheile amintirilor tale
/cheile-amintirilor
amintiri nuntă · film de nuntă
2 IUN
Videograf străin la nuntă
/videograf-strain-la-nunta
videograf străin la nuntă
9 IUN
De ce am două site-uri
/de-ce-am-doua-site-uri
Gabriel Șendrea Clipe Dragi
Articole propuse · 6
PROPUS
Articol despre dronă
/drona-la-nunta
filmare cu dronă nuntă
PROPUS
De ce filmez puține nunți
/de-ce-filmez-putine-nunti
videograf puține nunți an
PROPUS
Prima oră de la nuntă
/prima-ora-nunta-filmare
primele momente filmare nuntă
PROPUS
Cum arată o zi de filmare
/cum-arata-o-zi-de-filmare
ziua de filmare nuntă
PROPUS
Ce înseamnă să filmezi în Moldova
/filmare-nunta-moldova
filmare documentară Moldova
PROPUS
Despre sunetul la nunți
/sunetul-la-nunta
sunet filmare nuntă
Profiluri externe · sameAs
ACTIV
Facebook
gabrielvaleriusendrea
ACTIV
Instagram
clipe_dragi
ACTIV
Vimeo
vimeo.com/clipedragi
ACTIV
YouTube
youtube.com/@clipedragi
ACTIV
fotografi-cameramani.ro
profil verificat · 5★
ACTIV
wedday.ro
furnizori/clipe-dragi
ACTIV
Wikidata
Q139785032
Conexiune clipe-dragi.ro
BRAND
clipe-dragi.ro
site comercial · servicii
PAGINĂ
Pagina Gabriel Șendrea
clipe-dragi.ro/gabriel-sendrea
Progres general
0 / 0 sarcini
01
Tehnic & Entitate
În lucru
▼
01.01
Rezolvă dublura de schema JSON-LD — tema PHP și Rank Math generează două blocuri BlogPosting pentru același articol
Mediu
▸ detalii
De ce
Google acceptă ambele blocuri ca valide dar e o dublură inutilă. Pe termen lung, un singur bloc e mai curat și mai ușor de menținut. Nu e urgentă — nu afectează indexarea actuală.
Cum se face
Rank Math → Titles & Meta → Articole → Tip de Schema → None. Lasă tema să genereze — tema are schema personalizată completă.
Finalul
Google Rich Results Test arată un singur bloc BlogPosting per articol. Zero avertismente de duplicat.
01.02
IndexNow — eroare la trimiterea paginii apare la fiecare publicare
Mediu
▸ detalii
Concluzie după investigație (11 iun 2026)
Nu e o problemă reală de configurare. IndexNow e activ și funcționează corect — cheia API e validă și accesibilă. Eroarea 429 din istoric înseamnă „prea multe cereri simultan": apare când același articol e salvat de mai multe ori rapid (ex. la editări repetate). Bing blochează temporar, apoi revine automat. La publicarea normală a unui articol nou → o singură cerere → răspuns 200 (succes). Nu necesită nicio intervenție.
01.03
Șterge @type: Organization de pe nodul Person în schema homepage — Person și Organization sunt două entități separate
Mediu
▸ detalii
De ce
În schema validată de Google apare autorul cu
@type: Organization și
@type: Person simultan pe același nod. Gabriel Șendrea e o persoană fizică, nu o organizație — ambiguitatea poate confuza Knowledge Graph-ul.
Cum se face
Organization vine din modulul Local SEO al Rank Math — nu din functions.php. Dezactivarea modulului elimină și schema Person generată de Rank Math. Soluția corectă: filtru PHP
rank_math/json_ld care face unset pe
publisher și
place doar pe homepage, fără să atingă niciun modul. De adăugat în functions.php după investigație completă.
Finalul
Rich Results Test arată autorul ca
Person pur, fără Organization pe același nod.
01.04
Adaugă worksFor și foundingDate: "2012" în schema Person de pe homepage
Mediu
▸ detalii
De ce
„Activ din 2012" în text vizibil nu e suficient — AI-ul are nevoie de proprietatea machine-readable pentru a calcula vechimea și experiența.
worksFor cu referință spre
clipe-dragi.ro/#organization închide cercul Person ↔ Business în Knowledge Graph.
Cum se face
În
functions.php, după
jobTitle, adaugă:
'foundingDate' => '2012'.
worksFor era deja prezent.
Finalul
Schema Person conține
foundingDate: 2012 și
worksFor spre Clipe Dragi. Validat în Rich Results Test pe 11 iun 2026.
02
Linkuri între domenii
Urgent
▼
02.01
Adaugă sendreagabriel.ro în câmpul sameAs din schema Person de pe clipe-dragi.ro
Urgent
▸ detalii
De ce
Conexiunea dintre cele două domenii e unidirecțională momentan — sendreagabriel.ro trimite spre clipe-dragi.ro, dar clipe-dragi.ro nu confirmă explicit legătura inversă în schema machine-readable. Adăugarea în sameAs închide cercul pentru Knowledge Graph.
Cum se face
Pe clipe-dragi.ro, în Rank Math → Custom Schema → Person → câmpul sameAs, adaugă
https://sendreagabriel.ro. Validează cu Rich Results Test după salvare.
Finalul
Schema Person de pe clipe-dragi.ro conține sendreagabriel.ro în sameAs. Cercul entității e complet în Knowledge Graph.
02.02
Verifică că fiecare articol publicat conține cel puțin un link contextual spre clipe-dragi.ro
Permanent
▸ detalii
De ce
Linkul contextual din fiecare articol e semnalul principal prin care Google și AI-urile înțeleg că cele două site-uri sunt același om. Schema sameAs face treaba în fundal — linkul vizibil o confirmă și pentru cititor.
Cum se face
La fiecare articol nou, checklist-ul din Ghid include acest punct. Verifică și articolele existente — toate 6 trebuie să aibă link spre clipe-dragi.ro undeva în text.
Finalul
Fiecare articol din /ganduri conține cel puțin un link spre clipe-dragi.ro, plasat natural în corp.
03
Profiluri Externe & sameAs
De verificat
▼
03.01
Adaugă URL-ul sendreagabriel.ro în bio-urile de pe Instagram, Vimeo și fotografi-cameramani.ro
Urgent
▸ detalii
De ce
Profilurile externe care menționează sendreagabriel.ro confirmă că entitatea are o prezență digitală distinctă. Fără URL-ul în bio, legătura dintre profil și site nu e vizibilă pentru sistemele AI care citesc profilurile externe ca surse independente.
Cum se face
Instagram → Editează profilul → Website → adaugă sendreagabriel.ro. Vimeo → Settings → Profile → Website. fotografi-cameramani.ro → contul tău → editare profil → câmpul website.
Finalul
Cel puțin 3 profiluri externe conțin URL-ul sendreagabriel.ro vizibil în bio sau câmpul de website.
03.02
Verifică că numele „Gabriel Șendrea" e scris identic cu diacritice corecte pe toate platformele externe
Mediu
▸ detalii
De ce
Consistența numelui e fundamentală pentru Knowledge Graph. „Gabriel Sendrea" și „Gabriel Șendrea" sunt entități diferite pentru algoritm. Ș cu sedilă, nu cu virgulă — și asta contează.
Cum se face
Verifică: Facebook personal, Instagram, Vimeo, YouTube, fotografi-cameramani.ro, wedday.ro, Wikidata. Oriunde apare fără diacritice sau cu greșeală, corectezi.
Finalul
Numele apare identic — „Gabriel Șendrea" — pe toate platformele din sameAs.
04
Conținut & Publicare
În desfășurare
▼
04.01
Menține cadența de 1 articol la 3–4 săptămâni — regularitatea contează mai mult decât volumul
Permanent
▸ detalii
De ce
Google și sistemele AI evaluează consistența în timp, nu volumul de moment. 10 articole publicate odată nu valorează cât 10 articole publicate regulat pe parcursul unui an.
Cum se face
Ultimul articol publicat: 9 iunie 2026. Următorul: între 30 iunie și 7 iulie 2026. Lista de propuneri din Arhitectură e rezerva de subiecte.
Finalul
Intervalul între articole nu depășește 5 săptămâni. Fiecare articol apare în GSC în primele 24h după publicare.
04.02
Scrie articolul despre dronă — unghi de stabilit la scriere
Următor
04.03
Scrie „De ce filmez puține nunți pe an" — versiunea personală, nu comercială
Planificat
04.04
Scrie „Prima oră de la nuntă" — observație de pe teren
Planificat
04.05
Scrie „Cum arată o zi de filmare" — culise reale, fără marketing
Planificat
04.06
Scrie „Ce înseamnă să filmezi în Moldova" — specific geografic
Planificat
04.07
Scrie „Despre sunetul la nunți" — de ce sunetul contează mai mult decât imaginea
Planificat
05
Performanță & Viteză
Prioritar
▼
05.01
Imagini servite la mărimea corectă — ACF pe Return Format = ID, mărimi WordPress + srcset + preload pe hero
Impact mareCod + ACF
▸ detalii
De ce
Cele 3 câmpuri de imagine din ACF (
hero_bg_image,
foto_lucrare,
ganduri_hero_image) returnează acum URL-ul fișierului original — adică exact ce ai urcat tu, care la un export din cameră are 3–8MB. WordPress creează automat, la fiecare upload, copii mai mici ale imaginii, dar tema nu le folosește pe niciuna.
srcset e o listă de mărimi din care browserul alege singur varianta potrivită ecranului: un telefon descarcă varianta de 800px, un desktop pe cea de 1920px — nimeni nu mai descarcă originalul. „Preload" e o instrucțiune care îi spune browserului „descarcă imaginea asta prima, e cea mai importantă" — și chiar e: hero-ul e elementul LCP (Largest Contentful Paint — metrica Google care măsoară când apare pe ecran cel mai mare element vizual; e unul dintre criteriile oficiale de ranking). Bonus specific site-ului tău: hero-ul e afișat la opacitate 0.35, cu efect gri/sepia, peste fundal închis — poate fi comprimat agresiv fără să se vadă vreo diferență. Aici e diferența între o pagină de 5MB și una de 300KB.
Cum se face
Două părți, făcute împreună cu Claude, pas cu pas: (1) în ACF, la cele 3 câmpuri, schimbi Return Format din URL în ID; (2) în temă, codul care afișează imaginile se rescrie să folosească funcția WordPress care generează automat
srcset cu toate mărimile + se înregistrează o mărime custom de ~1920px pentru hero + se adaugă preload-ul în
<head>. Atenție: schimbarea din ACF fără schimbarea codului strică afișarea — se fac împreună, în aceeași sesiune.
Finalul
Nicio pagină nu mai servește imagini de mai mult de câteva sute de KB. PageSpeed Insights arată LCP verde pe mobil și desktop.
05.02
Conectează QUIC.cloud în LiteSpeed Cache și activează WebP Replacement
Impact mareDoar setări
▸ detalii
De ce
WebP e un format de imagine modern care arată identic cu JPEG dar cântărește cu 30–50% mai puțin. QUIC.cloud e serviciul gratuit al celor de la LiteSpeed care face conversia automat — pluginul trimite imaginile la ei, primește înapoi variantele WebP și le servește vizitatorilor. Din exportul de setări reiese că QUIC.cloud nu a fost conectat niciodată (cheia API e goală, nicio optimizare rulată), deci toate imaginile pleacă spre vizitatori ca JPEG-uri originale. Se combină perfect cu 05.01: aia rezolvă mărimea în pixeli, asta rezolvă compresia fișierului.
Cum se face
WordPress → LiteSpeed Cache → General → Domain Key → Request Domain Key (gratuit, durează câteva minute să vină). Apoi Image Optimization → Send Optimization Request și aștepți să proceseze toate imaginile. La final activezi Image WebP Replacement. Doar click-uri în admin, zero cod.
Finalul
În tab-ul Network din browser (sau în PageSpeed), imaginile apar servite ca
image/webp. Greutatea totală a paginilor scade vizibil.
05.03
Dezactivează Lazy Load Images din LiteSpeed Cache — tema face deja lazy loading nativ
Doar setări
▸ detalii
De ce
„Lazy loading" înseamnă că imaginile de jos pe pagină nu se descarcă decât când utilizatorul ajunge cu scroll-ul aproape de ele — economisește bandă. Tema face asta deja prin metoda nativă a browserului (
loading="lazy" pe imagini), iar WordPress o adaugă automat și pe imaginile din articole. Opțiunea din LiteSpeed face același lucru, dar printr-un script JavaScript care rescrie HTML-ul — un strat în plus de complexitate fără niciun beneficiu, și cu risc: dacă scriptul amână și imaginea hero (cea mai importantă), strică exact LCP-ul pe care vrem să-l reparăm.
Cum se face
LiteSpeed Cache → Page Optimization → Media Settings → Lazy Load Images → OFF. Apoi Purge All (butonul care golește cache-ul, ca toți vizitatorii să primească versiunea nouă).
Finalul
Lazy loading-ul funcționează în continuare (varianta nativă), dar fără scriptul suplimentar de la plugin.
05.04
Dezactivează Cache Mobile din LiteSpeed Cache — tema servește același HTML pe mobil și desktop
Doar setări
▸ detalii
De ce
Cache-ul înseamnă că serverul păstrează o copie gata făcută a paginii și o servește instant, fără s-o reconstruiască la fiecare vizită. „Cache Mobile" creează o a doua copie, separată, pentru telefoane — util doar când site-ul trimite HTML diferit pe mobil. Tema ta e responsive: același HTML, doar CSS-ul îl aranjează diferit pe ecran mic. Deci acum se țin două copii identice — spațiu ocupat degeaba și mai multe situații în care un vizitator nimerește o copie încă negenerată (pagina se încarcă mai lent la prima vizită).
Cum se face
LiteSpeed Cache → Cache → Cache Mobile → OFF. Apoi Purge All.
Finalul
O singură copie de cache per pagină, rată de servire din cache mai mare.
05.05
Preload pe cele 2 fonturi critice — Special Elite și Courier Prime regular
Cod
▸ detalii
De ce
Browserul descoperă fonturile târziu: întâi descarcă HTML-ul, apoi CSS-ul, abia din CSS află că are nevoie de fonturi și abia atunci le cere. Între timp textul se afișează cu un font de sistem și „sare" în fontul corect când acesta sosește — flash-ul acela de schimbare se numește FOUT. Preload-ul îi spune browserului din prima linie de HTML: „vei avea nevoie de aceste două fișiere de font, descarcă-le acum, în paralel". Cele două fonturi sunt folosite above-the-fold (în partea vizibilă fără scroll) pe toate paginile, deci merită.
Cum se face
Două linii
<link rel="preload" as="font"> în
<head>, adăugate în temă împreună cu Claude. Doar pentru cele 2 fișiere woff2 critice — preload pe prea multe fonturi are efect invers.
Finalul
Textul apare direct în fonturile finale, fără flash de schimbare la încărcare.
05.06
Curățare bloat WordPress — CSS-ul de blocuri Gutenberg și linkurile inutile din <head>
CodCu verificare
▸ detalii
De ce
WordPress încarcă implicit, pe fiecare pagină, niște fișiere CSS pentru editorul de blocuri Gutenberg (
wp-block-library,
global-styles,
classic-theme-styles) plus niște linkuri tehnice în
<head> (oEmbed, RSD, shortlink) de care site-ul tău nu se folosește. În total ~30–80KB de CSS/JS inutil la fiecare încărcare. Scriptul de emoji era și el pe listă, dar e deja eliminat de LiteSpeed Cache din setări — punctul ăla e bifat din oficiu.
Cum se face
Câteva linii de „dequeue" (anulare a încărcării) în
functions.php, cu Claude. Pas obligatoriu înainte: verificăm dacă vreun articol folosește blocuri Gutenberg care depind de acel CSS (galerii, embed-uri) — dacă da, păstrăm selectiv doar ce e nevoie. După modificare: Purge All + verificare vizuală pe homepage și pe 2–3 articole.
Finalul
Mai puține fișiere descărcate per pagină, zero schimbare vizuală.
05.07
Cache busting pe main.css — versiune automată cu filemtime() în loc de '1.0' hardcodat
Cod · 2 linii
▸ detalii
De ce
Browserul vizitatorului păstrează CSS-ul în cache-ul propriu 1 an (așa e setat în LiteSpeed — corect pentru viteză). Problema: când modifici
main.css, un vizitator care a mai fost pe site continuă să vadă versiunea veche din cache-ul lui, pentru că adresa fișierului e identică (
main.css?ver=1.0, mereu). „Cache busting" = schimbarea automată a acelui număr de versiune la fiecare modificare a fișierului.
filemtime() e o funcție PHP care returnează data ultimei modificări a fișierului — folosită ca versiune, se schimbă singură exact când trebuie.
Cum se face
În
functions.php, la linia care încarcă
main.css, se înlocuiește
'1.0' cu
filemtime() pe fișier. Două linii, cu Claude.
Finalul
Orice modificare de CSS ajunge instant la toți vizitatorii, vechi sau noi, fără să sacrifici cache-ul de 1 an.
05.08
Înlocuiește fallback-ul Unsplash din single.php cu o imagine locală din temă
Cod
▸ detalii
De ce
Când un articol nu are imagine proprie, tema încarcă una de rezervă direct de pe serverele Unsplash (hotlink extern). Costă: o căutare DNS în plus + o conexiune nouă spre un server străin + dependență de un terț — dacă Unsplash schimbă sau șterge acel URL, articolul rămâne cu imagine spartă, fără ca tu să afli.
Cum se face
Alegi (sau generezi) o imagine de fallback potrivită esteticii site-ului, o urci în folderul de assets al temei, iar în
single.php se înlocuiește URL-ul Unsplash cu calea locală. Cu Claude.
Finalul
Zero cereri spre servere externe; imaginea de rezervă e sub controlul tău, pe serverul tău, comprimată cum trebuie.
05.09
Opționale: DNS prefetch pentru player.vimeo.com + object cache (Redis) dacă planul Hostico îl are
Mic · opțional
▸ detalii
De ce
(1) DNS prefetch: când cineva deschide lightbox-ul cu un video, browserul trebuie întâi să afle adresa serverului Vimeo (căutare DNS) și abia apoi să ceară playerul. Prefetch-ul face căutarea DNS din timp, în fundal, cât utilizatorul încă citește pagina — la click, playerul pornește mai repede. (2) Object cache: Redis e o memorie rapidă în care se păstrează rezultatele interogărilor către baza de date, ca WordPress să nu le refacă la fiecare vizită — ajută paginile care nu sunt în cache (admin, prima vizită după Purge). Disponibil doar dacă planul de găzduire îl include.
Cum se face
(1) LiteSpeed Cache → Page Optimization → DNS Prefetch → adaugi
//player.vimeo.com. (2) Verifici în cPanel la Hostico dacă există Redis; dacă da, LiteSpeed Cache → Cache → Object → ON cu datele de conectare.
Finalul
Lightbox-ul pornește perceptibil mai repede; paginile necache-uite se generează mai rapid.
06
Cod & Mentenanță
Planificat
▼
06.01
Unifică home.php și archive.php într-un singur template part — sunt identice 100%
Cod
▸ detalii
De ce
Cele două fișiere conțin exact același cod, linie cu linie. Asta înseamnă că orice modificare la lista de articole trebuie făcută de două ori — și la un moment dat, garantat, una dintre copii va fi uitată și vor diverge fără să-ți dai seama. Un „template part" e un fragment de cod pus într-un singur fișier, pe care celelalte doar îl includ — principiul DRY (Don't Repeat Yourself): orice lucru există într-un singur loc.
Cum se face
Se creează un fișier comun cu conținutul listei, iar
home.php și
archive.php rămân fiecare cu o singură linie care îl include. Zero schimbare vizuală pe site. Cu Claude.
Finalul
O singură sursă pentru lista de articole; modifici o dată, se aplică peste tot.
06.02
SVG-ul „hârtie ruptă" — din inline în 4 fișiere într-un singur fișier .svg extern, cu path simplificat
Cod
▸ detalii
De ce
Separatorul grafic de hârtie ruptă e scris direct în HTML („inline") în 4 fișiere ale temei, în 3 variante ușor diferite între ele. Asta înseamnă ~3–4KB de markup care călătoresc cu fiecare pagină, la fiecare încărcare, și nu pot fi păstrați în cache separat. Mutat într-un singur fișier .svg referențiat din CSS, se descarcă o singură dată și browserul îl ține în cache 1 an. Bonus: la înălțimea de 55px la care e afișat, jumătate din punctele din desen sunt invizibile — path-ul poate fi simplificat fără nicio diferență vizuală.
Cum se face
Se alege varianta finală a desenului, se simplifică, se salvează ca fișier în assets-urile temei și se referențiază din CSS. Cele 4 locuri din HTML se curăță. Cu Claude.
Finalul
HTML mai mic pe fiecare pagină, un singur loc de modificat dacă vrei vreodată alt separator, aspect identic.
06.03
Iconițele sociale — template part comun pentru footer.php și front-page.php
Cod
▸ detalii
De ce
Iconițele de social media sunt copiate în două fișiere — și deja s-a produs efectul previzibil al duplicării: iconița de Vimeo are desen (path SVG) diferit în cele două locuri. Același principiu ca la 06.01: ce există în două locuri va diverge.
Cum se face
Un template part comun cu setul de iconițe, inclus din ambele fișiere; se alege varianta corectă de Vimeo. Cu Claude.
Finalul
Un singur set de iconițe, identic peste tot pe site.
06.04
Repară sendrea_reading_time() — diacriticele românești umflă timpul de citire
Cod · 1 linie
▸ detalii
De ce
Funcția care calculează „X min de citit" folosește
str_word_count, o funcție PHP veche care nu știe de diacritice: tratează ă, â, î, ș, ț ca separatoare de cuvinte. „Mănăstire" e numărat ca 3 cuvinte („m", „n", „stire"). Rezultatul: toate articolele afișează un timp de citire mai mare decât cel real — un detaliu mic, dar vizibil pe fiecare articol, și incorect.
Cum se face
Se înlocuiește cu o numărare bazată pe regex Unicode (
\p{L}+ — „secvențe de litere, din orice alfabet"). O linie schimbată în
functions.php, cu Claude.
Finalul
Timpul de citire afișat corespunde cu numărul real de cuvinte din articol.
06.05
Mărunțișuri de cod: variabile moarte, "image": null în schema, query-ul de poziție din single.php
Mic
▸ detalii
De ce
Trei lucruri mici, strânse la un loc: (1)
$hero_bg în
front-page.php și
$total în archive sunt variabile calculate dar nefolosite niciodată — „cod mort" care derutează la editări viitoare; (2) când un articol nu are imagine, schema JSON-LD trimite
"image": null — mai curat e ca proprietatea să lipsească de tot decât să fie goală; (3) numărătoarea „03 / 12" de pe articole încarcă lista tuturor ID-urilor la fiecare vizită — la volumul actual e ieftin, dar un COUNT simplu face același lucru mai elegant.
Cum se face
O trecere de curățenie prin fișiere, cu Claude — 10 minute, fără niciun efect vizibil pe site.
Finalul
Cod curat, schema fără câmpuri goale, zero schimbare pentru vizitatori.
07
UX & Accesibilitate
Planificat
▼
07.01
Repară skip-link-ul — lipsește starea :focus, deci e invizibil și pentru cei care îl folosesc
CSS · 2 linii
▸ detalii
De ce
Skip-link-ul e un link ascuns, primul de pe pagină, care le permite celor ce navighează doar din tastatură (persoane cu dizabilități motorii, utilizatori de screen reader) să sară direct la conținut, fără să treacă cu Tab prin tot meniul. Tema îl are — dar e ascuns cu
-9999px și rămâne ascuns inclusiv când primește focus, adică exact în momentul în care ar trebui să apară. Practic există, dar nu funcționează pentru nimeni. E și un semnal mic de calitate pentru audit-urile de accesibilitate (Lighthouse).
Cum se face
O regulă
.skip-link:focus în
main.css care îl aduce vizibil pe ecran când primește focus. Două linii.
Finalul
Apeși Tab pe orice pagină → linkul „Sari la conținut" apare în colțul de sus; Enter te duce direct la conținut.
07.02
Hero pe mobil: 100vh → 100svh cu fallback — elimină saltul cauzat de bara de adresă
CSS · 2 linii
▸ detalii
De ce
100vh înseamnă „înalt cât tot ecranul". Problema pe mobil: bara de adresă a browserului apare și dispare la scroll, iar „tot ecranul" își schimbă definiția din mers — hero-ul sare vizibil, mai ales în Safari pe iPhone.
svh (small viewport height) e unitatea modernă care înseamnă „ecranul cu bara de adresă vizibilă" — o valoare stabilă, care nu se mai mișcă. Fallback-ul
100vh rămâne pentru browserele foarte vechi care nu știu de svh.
Cum se face
În
main.css, pe hero:
height:100vh; urmat de
height:100svh; — browserele moderne o folosesc pe a doua, cele vechi pe prima. Pe desktop nu se schimbă absolut nimic.
Finalul
Hero-ul stă fix pe mobil, fără salt la primul scroll.
07.03
Paginarea arhivei Gânduri — adaugă drum înapoi, nu doar „mai multe gânduri →"
Cod
▸ detalii
De ce
Când arhiva va avea destule articole pentru pagina 2, vizitatorul ajuns acolo nu are niciun link înapoi spre pagina 1 — singura opțiune e butonul Back al browserului. Și crawlerele preferă paginarea în ambele direcții pentru a parcurge complet arhiva.
Cum se face
Se adaugă linkul de pagină anterioară în template-ul de arhivă (după 06.01, într-un singur loc), stilizat consistent cu cel existent — de exemplu „← gânduri mai noi". Cu Claude.
Finalul
De pe orice pagină a arhivei se poate naviga în ambele direcții.
07.04
Lightbox: focus management — la deschidere, focusul să intre în lightbox, nu să rămână pe pagina din spate
JS
▸ detalii
De ce
„Focus" e elementul activ pentru tastatură — cel pe care îl acționezi cu Enter și de la care pleacă Tab. Acum, când se deschide lightbox-ul cu video, focusul rămâne pe pagina din spate: cine apasă Tab se plimbă prin conținut acoperit, invizibil, iar utilizatorii de screen reader nu află că s-a deschis ceva. Regula standard pentru orice fereastră modală: la deschidere focusul intră în ea, la închidere se întoarce de unde a plecat.
Cum se face
Câteva linii de JavaScript: la deschidere, focus pe butonul de închidere; la închidere (X sau Esc), focus înapoi pe lucrarea care a declanșat lightbox-ul. Cu Claude.
Finalul
Tab și Esc se comportă predictibil în lightbox; navigarea din tastatură funcționează complet.