# Changelog

All notable changes to the TutorialEu site are documented here.

Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
Versioning: [Semantic Versioning](https://semver.org/). MAJOR.MINOR.PATCH — bump
MAJOR for breaking nav/url changes, MINOR for new features, PATCH for fixes.

When you ship a new build, add a new section at the top with today's date.
Keep the live version number in `public/version.json` in sync — the footer
fetches it and shows it next to the copyright.

---

## [1.121.0] – 2026-09-17

### Added

- ✂️ **Un editor video care taie singur pauzele.** Alegi un vlog de pe calculator, iar aplicația îi ascultă sunetul și găsește fiecare bucată în care nu vorbește nimeni. Le vezi pe o hartă a sunetului și pe o listă numerotată: cât ține fiecare, unde începe, cât se scurtează videoclipul în total. Nimic nu pleacă de pe calculatorul tău — sunetul se decodează în browser, videoclipul nu se încarcă nicăieri. Când două pauze sunt despărțite de-o zecime de secundă, se unesc: acolo nu e niciun cuvânt, ci o respirație, iar păstrarea ei ar face montajul sacadat.

- 🎚️ **Trei reglaje, și lista se reface pe loc.** Pragul de liniște, cât de lungă trebuie să fie o pauză ca să conteze și cât să se lase la capete ca tăietura să nu mănânce începutul cuvântului. Sunetul se decodează o singură dată, la început; după aceea mutatul sliderelor e doar socoteală peste ce s-a măsurat deja, așa că vezi rezultatul imediat și nimerești pragul din simțire, nu din ghicit. Aplicația îți spune și ce fond de zgomot a măsurat, ca să știi de unde să pornești.

- 👁️ **Vezi montajul sau videoclipul întreg, cum vrei.** O bifă hotărăște ce înseamnă redarea, și ține și pentru butoanele proprii ale playerului. Bifată, redarea sare peste ce ai tăiat — exact fișierul final. Debifată, merge videoclipul întreg, iar când intri într-o bucată care ar dispărea ți se scrie peste imagine: „Tăietura 7 — bucata asta se taie".

- 🔢 **Îți spune ce tăietură tocmai ai auzit dispărând.** O bucată sărită nu lasă nicio urmă — linia de timp trece curat peste ea, și rămâi cu senzația că a lipsit ceva fără să știi ce. Acum, în clipa în care se sare, apare un rând care o numește, cu un buton care o pune la loc și redă imediat bucata salvată. Lista se derulează singură la rândul cu pricina (doar lista, nu toată pagina), iar ca să asculți o tăietură anume fără să schimbi modul, apeși pe rândul ei: aceea se redă întreagă o dată, apoi se revine la cum era.

- 📝 **Text informativ peste anumite secțiuni.** Un rând scurt care apare cât ține o secțiune — numele unei comenzi, un link, o precizare pe care n-ai spus-o clar. Îl pui uitându-te la videoclipul netăiat, iar aplicația mută singură momentul în montajul final și îți arată ambele capete („în montaj: 0:00 → 0:04"), colorat dacă începe chiar de la zero. Poți scrie liniștit „Comanda: npm install, apoi build" — două puncte și virgule cu tot.

- ␣ **Spațiu pornește și oprește redarea.** În editorul video și în previzualizarea din Auto Shorts AI. Tasta nu se bagă peste scris: într-un câmp de text, într-o listă derulantă sau pe un buton, spațiul rămâne al lor. Și nu mai derulează pagina în jos la fiecare apăsare.

- 🛠️ **La final primești un script, nu un fișier stricat.** Tăierea o face ffmpeg, pe calculatorul tău: mult mai rapid decât orice montaj în browser și, mai ales, la rezoluția fișierului tău. Alegi calitatea și descarci un singur fișier — `.bat` pentru Windows, `.sh` pentru Mac și Linux. Fiecare bucată păstrată se decupează separat, cu timpii pornind de la zero, și abia apoi se lipesc între ele: merge la fel la trei tăieturi și la trei sute. Scriptul îți spune la ce bucată e, se oprește din prima dacă videoclipul nu e lângă el sau dacă ffmpeg dă greș, suportă nume de fișiere cu emoji și diacritice, iar la final, doar dacă chiar a reușit, își șterge singur folderul temporar și pe sine. Dacă s-a oprit cu eroare, rămâne pe loc cu tot cu bucăți, ca să poți încerca din nou.

- 📦 **Dacă n-ai ffmpeg, ți-l pune el.** Scriptul de montaj se oferă să-l instaleze pe loc, iar separat ai un instalator de sine stătător: încearcă `winget`, iar dacă lipsește descarcă ultima versiune, o dezarhivează și o adaugă în PATH — fără `setx`, care taie la 1024 de caractere și poate rupe un PATH lung. Se întâmplă des ca winget să răspundă „already installed" fără ca `ffmpeg` să meargă de la tastatură, fiindcă folderul lui n-a ajuns în PATH; de aceea scripturile caută executabilul acolo unde chiar ajunge și îl rulează pe calea lui întreagă.

- 📺 **Și pentru un clip deja urcat pe YouTube.** Lipești linkul și un AI se uită la tot videoclipul, apoi îți spune ce secțiuni ar merita scoase: unde te repeți, unde o iei de la capăt, unde divaghezi, unde e liniște moartă — fiecare cu momentul exact și cu o propoziție care spune ce se aude acolo. Are player lângă listă, cu „Ascultă" care sare cu două secunde înainte de fiecare bucată, fiindcă o secțiune se judecă doar împreună cu ce a dus la ea.

- ⏱️ **Momentele sunt scrise exact cum le vrea YouTube Studio.** Casetele din „Trim & cut" nu primesc secunde și nici h:mm:ss, ci minute:secunde:cadre — ceasul lui Studio se dă de gol, un clip de 19:51 se termină la 19:50:15. Așa că fiecare capăt vine gata format (`01:59:00`), cu buton de copiat pentru fiecare casetă. Studio nu primește o listă dintr-o dată — fiecare tăietură se face cu „New Cut" și două câmpuri — așa că lista e numerotată și are bife, ca să nu-ți pierzi locul între douăzeci de tăieturi. Pentru clipuri de peste o oră te avertizează să verifici forma ceasului.

- 🔍 **De ce doar secțiuni pentru YouTube, nu și pauze mici.** Un videoclip publicat nu-și dă sunetul: fereastra YouTube e o cutie închisă, așa că tăierea pauzelor măsurate are nevoie de fișierul local. În schimb AI-ul chiar poate urmări un link public, deci judecata („aici te repeți") merge și fără fișier. Și e oricum împărțeala potrivită: în Studio tai bine câteva bucăți mari, nu trei sute de pauze de o secundă — alea se fac în editorul local, dintr-o singură comandă.

- 📐 **De ce ffmpeg și nu montaj în browser.** Exportul din Auto Shorts AI filmează o pânză și o recodează în timp real — potrivit când oricum reîncadrezi pe vertical, nepotrivit pentru un vlog de douăzeci de minute pe care vrei să-l primești înapoi la calitatea lui. Un montaj care doar taie n-ar trebui să se atingă de imaginea pe care o păstrează, așa că pagina asta hotărăște *unde* se taie și lasă tăiatul în seama unui program care o face bine.

### Changed

- 🏠 **Pagina principală în stil Căutare nu mai împinge casa 3D în față.** Butonul mare „Intră în casa 3D" a dispărut din antet: casa e unul dintre cele trei stiluri de pagină principală, nu o destinație de reclamat pe celelalte două. Rămâne la un clic — în lista de pagini și din comutatorul de stil din bara de sus, care e pe fiecare pagină. Butonul care duce mai departe în listă a luat locul de onoare, ca antetul să ducă totuși undeva.

- 🧰 **Editorul video apare acum pe toate cele trei pagini principale.** Era deja în „Aplicații simple" (implicit) și pe laptopul din casa 3D; acum are loc și în stilul Căutare, în lista de unelte și ca fișă proprie, lângă Auto Shorts AI.
### Fixed

- 🎵 **Melodia din Meditație nu mai e trasă la sorți notă cu notă.** Fiecare sunet se alegea singur, la întâmplare, dintre treptele modului, cu încă o aruncare de ban pentru octavă — adică un generator de note, nu o melodie: nimic nu ținea minte nota dinainte, orice treaptă era la fel de probabilă ca oricare alta, iar octava sărea fără motiv. Acum cântă o singură voce care merge pe scară: cel mai des face un pas sau doi, rar un salt, iar după un salt se întoarce în sens invers — cea mai veche regulă din scrisul de melodii. Pe timpul tare e trasă pe o notă din acordul care sună dedesubt, ca linia să se așeze pe armonie, și e ținută încet spre mijlocul registrului, ca să nu se ducă într-un capăt și să rămână acolo. Măsurat: săriturile mai mari de o sextă au scăzut de la 35% la sub 4%, iar pe moduri de șapte note la zero.

- 🎛️ **Toate instrumentele se văd deodată, fiecare cu semnul lui.** Înainte alegeai întâi categoria — „Tradiționale" sau „Moderne" — și abia apoi vedeai ce e înăuntru, adică trebuia să știi dinainte unde stă instrumentul pe care îl cauți. Sunt zece cu totul și încap toate pe ecran, așa că pasul cu categoria a dispărut: rămâne o singură grilă, cu clopoțel, flaut, bol, handpan și restul, fiecare cu iconița lui, plus „Aleatoriu" și „Fără instrument".
- 🗂️ **O aplicație se adaugă acum o singură dată, într-un singur fișier.** Până acum o aplicație nouă trebuia scrisă de mână în patru locuri, în forme ușor diferite — și listele o luaseră razna: aplicații care existau doar într-un stil, iar aceeași aplicație purtând altă iconiță și alte culori în fiecare. Acum totul stă în `public/data/apps.json`: nume, adresă, iconiță, culori, în ce stiluri apare și în ce categorie intră. O comandă (`node scripts/build-apps.cjs`) scrie plăcuțele în toate cele trei stiluri **și** lista de pagini de pe stilul Căutare, inclusiv numărul din capul fiecărei categorii, care până acum se ținea minte de mână. Are și `--check`, care spune dacă paginile au rămas în urmă față de registru, fără să scrie nimic.

- 🎨 **Aceeași aplicație arată la fel peste tot.** Pe stilul Căutare, Dorințe purta o inimă, Pietrele Zodiacale un cub, Vânătoarea de Fantome o cruciuliță — iconițe generice, rămase din alt val de lucru. Acum toate trei stilurile folosesc semnul ales în registru: o baghetă, o nestemată, o fantomă. Telecomanda își păstrează desenul făcut de mână, care exista doar într-un singur stil și acum apare în toate.
- 🧱 **Jumătate de pagină goală sub cartonașul cu vremea.** Pe stilul Căutare, fișele de unelte stăteau toate în coloana din dreapta, lângă Meteo Live. Cartonașul cu vremea e înalt cât trei rânduri de fișe și atât, dar restul rămâneau înghesuite lângă el, cu peste o mie de pixeli de gol dedesubt, în stânga. Acum, de la Calculator Fiscal încolo, fișele se întind pe toată lățimea, pe trei coloane, aliniate la fel ca panoul de zodiac de sub ele. Golul a scăzut de la 1107 pixeli la 8.

- ⚡ **Plăcuța cu modelul Gemini era goală.** Iconița ei se scria ca `<i class="fas fa-bolt">`, adică în felul Font Awesome — numai că prima pagină nu încarcă Font Awesome deloc (e chiar una dintre probele ei), așa că rămânea un pătrat gol, fără nicio eroare. Acum folosește sprite-ul SVG al paginii, ca toate celelalte. Plăcuța se rescrie singură zilnic, așa că reparația e în programul care o scrie, nu doar în pagină; iar sprite-ul ține de-acum toate iconițele pe care acel program le-ar putea alege, nu doar pe cea de azi.
- 📊 **Panoul de acces arăta zero la stilul de pagină și nicio pagină vizitată.** Numărătorile mari (accesări, persoane distincte) mergeau, dar defalcările stăteau goale, deși erau sute de vizite în spate. Vina: Firestore înțelege o cheie cu punct ca „câmpul dinăuntrul hărții" doar la `update`; la scrierea folosită aici o ia literal, așa că se năștea un câmp numit chiar „byPage.acasa" în loc de o intrare în harta `byPage`. De-aia tocmai cele două numere fără punct în nume ieșeau corect. Acum se scriu ca hărți adevărate — iar vizitele strânse până acum nu se aruncă: panoul citește și vechile câmpuri și le adună la loc peste cele noi.

---
## [1.120.0] – 2026-09-15

### Added

- 🚗 **Garajul virtual din casa 3D se conduce.** Mașina are acum scaun de șofer și de pasager: te așezi la volan, ții apăsat pe contact — se aude demarorul, apoi motorul — și pleci. Ușile, capota, portbagajul, oglinzile, stopurile și bara din spate răspund fiecare la atingere.

- 🛣️ **Ieșire din garaj și drum prin împrejurimi.** După pornire, mașina iese din garaj și circulă prin regiune, cu coliziuni pentru copaci și pentru obiectele din jur, cu repere de service și cu pilonii exteriori ai casei.

- 🧭 **Patru destinații la marginea regiunii.** Înainte se deschide Gravitație, în spate Vindecătorul, la dreapta Pădurea, iar la stânga Autobuzul de oraș. Apar numai după ce te-ai depărtat de casă, nu lângă garaj. La întoarcere ajungi exact în locul din care ai plecat, cu mașina orientată spre casă, ca să poți continua drumul înapoi.

- 🎥 **Întoarcerea în garaj e cinematică.** Când intri prin zona ușii din față, peretele central nu te mai oprește: pornește animația prin holul principal, apoi mașina se parchează singură și ușa garajului se închide după ea.

- 🎬 **Un instrument nou: Auto Shorts AI.** Lipești linkul unui videoclip de pe YouTube, iar un AI îl urmărește în întregime și alege singur cel mai bun moment pentru un short — intervalul, un scor de viralitate cu explicație, un titlu propus și subtitrări scrise după ce se aude acolo, tăiate scurt (2-5 cuvinte pe rând, rupte acolo unde vorbitorul face pauză) tocmai ca evidențierea pe cuvânt să stea lipită de voce. Previzualizarea redă exact acel interval din videoclipul original, încadrat pe vertical, cu subtitrările suprapuse peste el. Nu descărcăm și nu modificăm nimic din videoclipul de pe YouTube. Lângă câmpul de link ai acum și o legătură care deschide YouTube într-o filă nouă, ca să găsești videoclipul și să copiezi linkul fără să pierzi pagina.

- 🗣️ **Cuvântul rostit chiar acum se mărește și își schimbă culoarea.** Subtitrarea nu mai apare ca un bloc de text care stă pe loc: cuvântul care se aude în acel moment crește și se aprinde în galben, apoi revine, așa cum se poartă la shorts-uri. Un cuvânt căruia i-ai pus deja o culoare a ta rămâne cu culoarea lui și doar crește. Ca să fie sincron cu vocea, AI-ul este acum întrebat direct **la ce secundă începe fiecare cuvânt** — nu mai împărțim noi durata rândului în bucăți egale, fiindcă ghicitul acela se depărta tot mai mult de voce către sfârșitul rândului. Dacă un rând a fost rescris de mână și nu mai are aceleași cuvinte, se revine liniștit la vechea împărțire, fără nepotriviri.

- 😀 **Emoji pe momentul potrivit.** Fiecare rând de subtitrare poate primi un emoji al lui, care plutește deasupra textului cât ține rândul acela — din zece sugestii la un clic (😂 😮 🔥 ❤️ 🎉 👍 💡 ⚡), din lista întreagă de peste o sută, deschisă cu butonul „＋" și împărțită pe Fețe, Gesturi, Impact și Lucruri, sau pur și simplu scris de tine. Emoji-ul intră și în clipul exportat, nu doar în previzualizare.

- 🎚️ **Sincronizare, umbră și poziție pentru subtitrări.** Pe lângă mărime ai acum: **Sincronizare** (dacă subtitrarea apare înainte să vorbească omul, o împingi mai târziu, în pași de o zecime de secundă), **Umbra textului** (de la deloc până la dublu față de cât era fix înainte) și **Poziția textului** pe orizontală și pe verticală. Poziția pe verticală se reglează acum și pe previzualizarea de la YouTube, nu doar în editorul local: până acum subtitrarea era țintuită acolo de o regulă fixă și nu o puteai muta nicăieri, iar dacă o voiai sus, nu aveai de unde. Slider-ul spune în cuvinte unde ai ajuns — Sus, Centru sau Jos — iar rândul stă agățat de mijlocul lui, așa că nu mai urcă singur când trece pe două rânduri sau când primește un emoji deasupra. Poziția aleasă acolo trece mai departe în editorul local când preiei editarea — și, ca să nu se mute textul fără motiv vizibil, „Text pe video" și „Poziție text" se deschid singure la preluare, cu slider-ul pus deja pe valoarea venită de la YouTube. Cele două previzualizări măsoară la fel, de la mijlocul rândului, așa că textul stă în același loc în amândouă. Toate se văd la fel și în clipul exportat.

- 🖼️ **Imagine peste videoclip, unde vrei tu.** În editorul local poți adăuga o imagine — un logo, un fundal, orice — așezată sus, la mijloc, jos, în spatele videoclipului, sau exact unde o pui tu, cu poziție și mărime alese din slidere. Secțiunile opționale (textul pe video și imaginea) stau acum strânse, se deschid doar când ai nevoie de ele, ca să nu umple pagina.

- ↕️ **Încadrare verticală la zoom.** Când mărești peste 100%, poți alege și ce parte a cadrului rămâne în ramă — sus, centru sau jos — nu doar stânga-dreapta. Poziția se poate urmări în timp, ca și cea orizontală, așa că poți însoți un subiect care se mișcă.

- 🎞️ **Export în MP4, MKV sau WebM.** Clipul final se poate salva direct ca **MP4 (H.264 + AAC)** — formatul pe care YouTube însuși îl recomandă și pe care îl deschide orice telefon sau program de montaj — sau ca MKV ori WebM, dacă ai nevoie de ele. Lista arată doar formatele pe care browserul tău chiar le poate scrie, iar fișierul primește extensia containerului real, nu una pusă de ochii lumii. MP4 iese cu durata scrisă corect de la bun început; la MKV și WebM, unde recorderul o lasă goală, o completăm noi, ca să nu ajungă în montaj un clip "de lungime necunoscută".

- 📊 **Bară de progres la export, în locul unei a doua vizionări.** Exportul e o înregistrare în timp real — clipul chiar trebuie redat o dată cât e capturat — dar nu mai ești pus să te uiți la el încă o dată: previzualizarea se acoperă și vezi cât a mai rămas, în procente, cu mesajul că descărcarea pornește singură la final. Fișierul iese exact la fel: acoperirea e un strat peste pânză, iar înregistrarea ia pânza, nu ecranul.

- 🏷️ **Scrie care model a dat scorul.** Sub bara de viralitate apare acum numele modelului care a analizat efectiv videoclipul. Nu e mereu același: dacă modelul preferat e ocupat sau a fost scos din uz, aplicația coboară singură pe unul de rezervă — iar până acum treaba asta se petrecea în tăcere, așa că un scor dat de o treaptă mai jos arăta identic cu unul dat de modelul bun. Când s-a coborât, rândul o spune deschis și se face galben, ca să știi cu ce ochi să citești scorul. Același lucru se scrie și în editorul local, după „Găsește cel mai bun moment".

- 📱 **Previzualizarea rămâne pe ecran cât umbli la setări.** În „Procesare locală" rama verticală stătea în capul paginii și dispărea de îndată ce coborai la slidere — reglai încadrarea, poziția textului sau mărimea fără să vezi ce faci, apoi te întorceai sus să verifici. Acum rama se ține după derulare: pe ecran lat rămâne în dreapta, cu toate comenzile derulând pe stânga, iar pe telefon se prinde sus, peste conținutul care trece pe dedesubt, micșorată cât să lase loc și sliderelor. Orice mișcare de slider se vede pe loc, fără drumuri înainte și înapoi prin pagină. Rama se ține doar cât ține cardul: când treci de el, își vede de drum ca orice altceva din pagină.

- 💬 **Întrebările din editor arată ca restul site-ului.** Cele două confirmări (preluarea editării de pe YouTube și ștergerea pozițiilor de încadrare când schimbi clipul) foloseau ferestrele browserului. Acum sunt ferestrele obișnuite ale site-ului, cu titlu, explicație și butoane care spun ce fac — iar cea care șterge ceva are butonul roșu, ca să se vadă care e alegerea fără întoarcere.

- 💾 **Export mai clar, cu setare de calitate.** Previzualizarea și exportul se fac acum la 720×1280 în loc de 360×640, iar bitrate-ul nu mai e lăsat la mâna browserului — alegi Standard, Ridicată sau Maximă. De acolo venea cea mai mare parte din moliciunea clipului exportat. Exportul rămâne în timp real (clipul se redă o dată cât se înregistrează), deci durata lui ține de lungimea clipului, nu de calitatea aleasă.

### Changed

- 🏎️ **Viteza se dă din derulare, nu din butoane.** Glisarea sau derularea în sus crește continuu viteza de croazieră, până la 60 de unități, pentru un mers cu adevărat rapid; în jos o scade. Pe telefon, glisarea stânga-dreapta virează mai iute, iar mișcarea pe verticală reglează viteza — fără butoane de accelerație în plus.

- 🛬 **Drumurile lungi și animațiile de destinație.** Mașina poate ajunge mult mai departe spre margini înainte să pornească animația de destinație, iar intrarea prin față folosește o zonă liberă în mijlocul fațadei. Lansarea ține 12 secunde, iar textul Vindecătorului spune acum „Coborâre sub hartă, spre necunoscut…".

- 🔁 **Când modelul AI e suprasolicitat, nu ne mai oprim la eroare.** Mesajul „This model is currently experiencing high demand" înseamnă de obicei un vârf de câteva secunde, așa că acum se mai încearcă o dată pe același model, apoi se coboară pe rând pe modelele alternative, iar pe ultimul se mai încearcă încă o dată — cinci încercări, pe trei modele, până să se renunțe. La fiecare pas scrie galben pe ecran la ce anume se lucrează, ca să nu aștepți în gol. Dacă într-adevăr toate sunt ocupate, primești un mesaj limpede că merită reîncercat peste câteva minute, nu eroarea brută repetată. Modelele de rezervă sunt luate **în ordine, de la cel mai nou în jos** (3.6 Flash, apoi 3.5 Flash, apoi 3.7 Flash), fiindcă treaba de aici e să urmărească un videoclip și să cronometreze cuvinte, iar o generație mai veche se descurcă simțitor mai prost exact la asta — coborâm o treaptă doar când cea de deasupra chiar nu răspunde. Dacă un model a fost între timp scos din uz, e sărit din prima — nu mai așteptăm degeaba după ceva ce nu mai există.

- 👀 **Subtitrările sunt pornite din start.** După ce AI-ul găsește momentul, subtitrările se văd imediat pe previzualizare, fără să mai apeși pe ceva, iar subtitrările proprii ale YouTube rămân oprite, ca să nu se suprapună două rânduri de text.

### Fixed

- 🧱 **Mașina rămânea înțepenită în peretele din față.** Acum intrarea prin ușa din față pornește animația de întoarcere înainte ca verificarea de coliziune să apuce să raporteze peretele drept obstacol.

- 🎞️ **Întoarcerea se făcea uneori fără animație.** Declanșarea nu mai atârnă de o singură trecere exactă a progresului pe traseu; e recunoscută și când traseul e reluat direct din zona ușii.

- ⏱️ **Subtitrarea o lua înaintea sunetului după „Reia clipul".** După o săritură în videoclip, YouTube raportează noua poziție înainte să fi ajuns cu adevărat acolo — iar noi ne luam după ceasul acela și porneam subtitrarea prea devreme. Acum se așteaptă confirmarea că se redă efectiv. Atenție însă doar la momentul de încărcare: pe pauză subtitrarea rămâne pe ecran, cum se cuvine.

- 🧲 **Pagina nu mai sare la lista de subtitrări la fiecare rând.** Pe telefon, lista de sub previzualizare trăgea toată pagina la ea ori de câte ori se schimba rândul, luându-ți videoclipul din fața ochilor. Acum se derulează doar lista, pe loc, iar videoclipul rămâne unde l-ai lăsat.

- ↔️ **Încadrarea trasă până la capăt sărea înapoi la centru.** Dusă la marginea din stânga (sau sus), încadrarea se comporta ca și cum n-ai fi ales nimic și revenea la mijloc, deși slider-ul arăta corect. Era o capcană veche de JavaScript — zero e „fals", așa că valoarea 0, perfect validă aici, era înlocuită cu valoarea implicită. Reparat peste tot unde apărea.

- 🔎 **Poziția subtitrării era de negăsit.** Reglajul care ridică sau coboară rândul pe ecran stătea doar sub „Text pe video" → „Poziție text", două panouri închise care sună de parcă ar ține de titlul scris de mână. În realitate aceeași valoare așază și subtitrările detectate automat, așa că o căutai degeaba acolo unde lucrai cu ele. Acum apare și în „Corectează subtitrările", lângă Mărime, Umbră și Sincronizare, scris în cuvinte — Sus, Centru, Jos. Sunt două mânere pentru aceeași valoare: miști unul, celălalt se mută odată cu el.

- 🗑️ **Un videoclip nou nu mai moștenește încadrările celui vechi.** Pozițiile urmărite pe traseu rămâneau de la clipul anterior, deși nu mai aveau nicio legătură cu noul fișier, și trebuia să le ștergi una câte una. Acum se curăță singure, iar dacă aveai ceva de pierdut ești întrebat întâi.

- 🚗 **Butonul „Mașinile mele" din Garaj Virtual arăta ca un dreptunghi negru uriaș** pe pagina în stil Implicit. Pagina aceea încarcă un cod comun scris pentru stilul Căutare, care își desenează pictogramele altfel; el rula a doua oară și îl strica pe cel corect, lăsând în urmă o pictogramă nedimensionată. Acum codul comun rulează doar pe pagina căreia îi este destinat.

- 🔧 **Mecanica Digitală, la un clic din Garaj Virtual.** Secțiunea are acum, lângă „Deschide Garajul", un buton către diagnoza auto cu AI — erau două unelte pentru aceeași mașină, aflate în două locuri fără nicio legătură între ele.

- ✅ **Încercat** cu browserul, la instrumentul Shorts: lanțul de reîncercări al modelului, pe ambele capete (reușită la a doua încercare — două cereri; și toate patru încercările epuizate — mesajele galbene în ordine, apoi eroarea limpede); cronometrarea pe cuvinte, cu marcajele reale de la AI, cu rândurile rescrise de mână (revine la aproximare) și cu marcaje puse în neregulă (se îndreaptă); subtitrarea, verificată pixel cu pixel că se aprinde galben pe cuvântul rostit; încadrarea dusă la 0, verificată pe pixelii din previzualizare că arată într-adevăr marginea de sus, nu centrul; fișierul nou, că șterge încadrările vechi după ce întreabă; și subtitrarea, că rămâne pe ecran în pauză, dar nu apare înainte de vreme la încărcare.

## [1.119.0] – 2026-09-10

### Changed

- 🏠 **Pagina principală este acum o casă în 3D, prin care treci derulând.** În locul listei lungi de secțiuni, deschizi ușa, urci aleea și mergi pe hol: parterul are camerele 01 Jocuri, 02 Aplicații, 03 Garaj virtual și 04 Sănătate, scara duce la etaj, iar acolo sunt 05 Inteligență artificială, 06 Cinematograf și 07 Sistemul solar. Derulezi ca să înaintezi, atingi un obiect ca să te apropii de el, derulezi din nou ca să pleci mai departe. Nimic din pagina veche nu s-a pierdut: prezentarea cu capitole, grila de jocuri și lista de aplicații sunt exact același cod și aceleași animații ca înainte, doar că acum se văd pe televizorul și pe laptopul din casă.

### Added

- 📺 **Televizorul din camera 01 chiar joacă prezentarea, cu capitolele ei.** Sub el sunt două butoane: „Toate jocurile”, care schimbă prezentarea cu grila de jocuri pe același ecran, și un buton care se schimbă după capitolul care rulează — la „Gravitație” te duce în camera sistemului solar, la „Vremea” tot acolo, la „Secțiunea AI” la etaj în laborator, la „Garaj” în garaj, iar la Genshin sau Wild Rift deschide direct pagina.

- 🎬 **O cameră nouă doar pentru videoclipuri: 06 Cinematograf.** Un proiector din tavan aruncă pe perete cele nouă playlisturi ale canalului — testele pe GTX 1060, jocurile de 2GB rulate pe o placă de 1GB, Oculus Quest 2, Python, despachetările, evoluția site-ului, My Summer Car, setările de volan și tutorialele Android. Primul playlist se încarcă oprit, ca trecerea pe lângă cameră să nu pornească sunetul.

- 🩺 **O cameră nouă pentru mișcare: 04 Sănătate**, în stânga scării, cu Exerciții, Stretching, Bodyweight, Tai Chi, Qigong și Baduanjin.

- ✉️ **Cutia poștală de la intrare deschide un mesaj gata adresat.** Arată ca o fereastră de scris email, plutind în fața ta: completezi subiectul și textul, iar „Trimite” predă mesajul aplicației tale de email. Tot acolo sunt și legăturile către Discord, YouTube și Facebook.

- ☀️🌙 **Casa își citește ceasul.** Cerul, soarele sau luna pe arcul lor, culoarea luminii, iarba, ferestrele aprinse și lămpile de pe alee vin toate din ora de pe dispozitivul tău: la nouă dimineața casa arată cu totul altfel decât la nouă seara. Se poate și cere o oră anume din adresă — `#zi`, `#noapte`, `#rasarit`, `#apus` sau `#ora=17`.

- 🪟 **Ferestre din care se vede afară, la orice oră.** Pe coridor, pe ambele laturi și pe ambele etaje, plus una laterală în camera 02. Ziua, soarele intră prin fereastra dinspre care bate și lasă o pată de lumină pe podea.

- ↔️ **Treci direct dintr-o cameră în alta.** Cât timp o cameră e deschisă, două butoane arată vecinii ei pe traseu („‹ 05 AI”, „07 Cosmos ›”) și te duc acolo mergând prin casă, nu sărind. Iar dacă ieși din casă pe o legătură și te întorci pe „Acasă”, ajungi exact în locul din care ai plecat.

- 🔗 **Legături noi în camerele existente:** Stele lângă Gravitație, Vremea și Zodiac în camera 07; Bacalaureat, prima plăcuță pe laptopul din camera 02; iar pe peretele final, unde scrie „VA URMA…”, stau acum semnele desenate ale rețelelor — X, YouTube, Facebook, Discord — și o plăcuță către jurnalul de modificări.

- 📱 **Pe telefon.** O glisare în jos trece casa pe tot ecranul și o ține așa, ca bara de adresă să nu mai reapară. Banda neagră de sub scenă a dispărut: pânza își ține dimensiunea chiar și când bara browserului se retrage, iar camera nu mai sare câțiva metri în timpul unei glisări. Paginile care se văd pe ecranele din casă se așază exact peste ele, la orice formă de fereastră.

- ✅ **Încercat** cu browserul, 33 de verificări automate în `scripts/check-house.cjs`: fiecare cameră deschisă și închisă pe rând; toate cele 21 de plăcuțe din casă și cele 44 de legături din paginile de pe ecrane, verificate că duc la pagini care există; paginile așezate peste ecranele din 3D măsurate la 0 pixeli abatere, pe trei forme de fereastră; plăcuțele măsurate că încap pe ecran și pe telefon, și pe laptop; ramele de la intrarea în camere, verificate că stau în afara peretelui și cu fața spre vizitator; copacii, că nu cresc prin nicio cameră; ora cerută din adresă; întoarcerea în același loc; și trecerea din cameră în cameră, dus și întors.

## [1.118.0] – 2026-09-10

### Added

- 📚 **Zece lecții la fiecare materie, în loc de șase.** Toate cele șapte materii de la `/bac` au primit câte patru lecții noi — 28 în total, ajungând la 70. La Română intră operele canonice cerute la Subiectul al III-lea (Ion, Moara cu noroc, Harap-Alb, O scrisoare pierdută); la Matematică, logaritmii, numerele complexe, matricele și determinanții, sistemele rezolvate cu metoda lui Cramer; la Istorie, romanitatea românilor, autonomiile locale și instituțiile centrale, diplomația de la Mircea la Mihai Viteazul și regimurile totalitare; la Geografie, factorii climei, Carpații, Dunărea și Marea Neagră, economia României; la Biologie, celula, mitoza și meioza, digestia și respirația; la Logică, intensiunea și extensiunea termenilor, conversiunea și obversiunea, diagramele Venn, figurile silogismului; la Informatică, structurile de control, algoritmii cu cifre și divizori, pseudocodul și metoda Greedy.

- 🎬 **Aproape fiecare lecție are acum un videoclip: 69 din 70.** Erau 23. Lecțiile vechi rămase fără material video au fost căutate din nou, de data aceasta după denumirea din programă, nu după titlul nostru, iar cele 28 de lecții noi au fost alese invers: mai întâi videoclipul real, apoi tema scrisă în jurul lui. Singura lecție rămasă fără videoclip este „Cronologia: scheletul unei explicații”, unde tot ce s-a găsit era conținut rezervat membrilor unui canal — pentru ea rămâne mesajul „materialul video este în pregătire”.

- 🔍 **Fiecare videoclip, verificat că se poate reda chiar în pagină.** Un videoclip poate să existe și totuși să nu meargă încorporat: cele rezervate membrilor unui canal răspund normal la interogarea publică, dar rămân blocate pentru vizitatori. Exact așa a fost prins și eliminat un candidat care altfel părea bun. Toate cele 69 de videoclipuri au trecut verificarea strictă — public, redabil și cu încorporarea permisă — iar numele canalului afișat sub player este preluat automat de la YouTube, ca autorul să fie creditat corect.

- 🔢 **„010” nu mai apare în lista lecțiilor.** Numărul din dreptul fiecărei lecții primea un zero pus de-a dreptul în față, ceea ce mergea până la nouă lecții; a zecea ar fi apărut ca „010”. Acum numărul se completează corect, iar lista arată 01, 02, ... 09, 10. La fel, totalul de lecții afișat pe prima pagină se calculează singur, deci nu mai rămâne în urmă când se adaugă lecții noi.

- ✅ **Încercat** cap-coadă cu browserul: toate cele 70 de lecții deschise una câte una, cu bara laterală, progresul și cele 70 de fișe PDF descărcate și validate; cele 69 de lecții cu videoclip afișează playerul încorporat, iar cea fără afișează mesajul de așteptare; fiecare dintre cele 69 de videoclipuri a fost interogat direct la YouTube și confirmat ca public, redabil și încorporabil.

## [1.117.0] – 2026-09-10

### Added

- 🎬 **Lecții cu videoclip real de pe YouTube, la toate cele șapte materii.** Fiecare lecție de la `/bac` avea un spațiu video marcat „în pregătire”. Am căutat pe YouTube, pentru fiecare din cele 42 de lecții, un videoclip real de pregătire pentru Bacalaureat pe exact acel subiect — și l-am verificat independent, deschizând chiar pagina videoclipului, înainte să-l accept. 23 de lecții au primit un videoclip confirmat relevant (cel puțin una la fiecare materie); celelalte 19, unde nu s-a găsit un videoclip suficient de exact pe acel subiect îngust, au rămas cu spațiul „în pregătire” — mai bine niciun link decât unul nepotrivit sau inventat.

- ▶️ **Videoclipul se redă direct în pagină, nu doar ca link.** Spațiul video afișa doar un player HTML pentru fișiere video proprii; acum recunoaște automat un link YouTube și încarcă un player încorporat (`youtube-nocookie.com`, fără cookie-uri de urmărire înainte de interacțiune), păstrând totuși vechiul comportament pentru orice fișier video propriu adăugat pe viitor. Sub player apare o mențiune scurtă cu numele canalului care a realizat materialul, cu link către videoclipul original pe YouTube.

- ✅ **Încercat**: fiecare din cele 42 de lecții, verificată una câte una — cele 23 cu link YouTube redau playerul încorporat corect (URL validat: `youtube.com/watch?v=` cu ID de 11 caractere → `youtube-nocookie.com/embed/`), cele 19 fără videoclip găsit arată exact același mesaj „materialul video este în pregătire” ca înainte; descărcarea celor 42 de fișe PDF, testată din nou și neafectată.

## [1.116.0] – 2026-09-10

### Added

- 🎓 **Patru materii noi la `/bac`: Geografie, Biologie, Logică, Informatică.** Pagina de pregătire pentru Bacalaureat avea trei materii obligatorii (Română, Matematică, Istorie); acum are și cele patru de la proba la alegere, grupate pe două rânduri — „Materii Obligatorii” și „Materii la Alegere (Proba E.d.)” — cu exact același model de cartonaș: insignă colorată, descriere, trei bife, „3 LECȚII INTRODUCTIVE · ACCES GRATUIT” și buton „Învață la...”.

- 📚 **21 de lecții reale, nu cartonașe goale.** Fiecare materie nouă are trei lecții complete — introducere, o listă de patru-cinci puncte, un exemplu rezolvat, o întrebare cu răspuns explicat și o idee de reținut — la fel de detaliate ca cele existente: reperele reliefului și climei, Dunărea și Delta la Geografie; sistemul nervos, inima și ADN-ul la Biologie; raporturile Euler, pătratul logic și silogismul la Logică; tablouri, recursivitate și Backtracking în C++ la Informatică. Butoanele, ruta către lecție, bara laterală, marcarea „parcurs” și descărcarea fișei PDF merg identic pentru toate cele șapte materii, fără cod nou — totul e citit dintr-un singur loc de date.

- 🎨 **Culorile cartonașelor, curățate de cod repetat.** Culoarea insignei fiecărei materii era scrisă pe rând, cu câte o verificare de tipul „dacă e matematică... altfel dacă e istorie...” — cu patru materii în plus, verificarea ar fi devenit ilizibilă. Acum fiecare materie își spune singură culoarea, iar codul de afișare a rămas la fel de scurt indiferent câte materii sunt.

- 🔢 **„Din 9 lecții” nu mai rămâne în urmă.** Fereastra „Profilul meu” avea numărul total de lecții scris de-a dreptul în text; cu 21 de lecții acum, ar fi rămas să spună tot „9”. Numărul se calculează acum din câte lecții are fiecare materie, așa că profilul spune mereu adevărul, indiferent câte materii se mai adaugă.

- 📖 **42 de lecții, nu 21 — fiecare materie are acum șase, nu trei.** Toate cele șapte materii (obligatorii și la alegere) au primit câte trei lecții noi, la fel de complete ca primele: la Română, argumentarea unui text nonliterar, figurile de stil și corectitudinea exprimării; la Matematică, progresiile, funcția de gradul al doilea și trigonometria în triunghiul dreptunghic; la Istorie, Primul Război Mondial, România comunistă și constituțiile țării de la 1866 la 1991; la Geografie, hidrografia și Delta Dunării, apoi geografia populației; la Biologie, sistemul nervos și analizatorii, circulația sângelui și genetica moleculară; la Logică, propozițiile categorice cu pătratul logic și legile silogismului; la Informatică, șirurile de caractere, algoritmii de sortare și lucrul cu fișiere text. Nicio linie de cod nouă — bara laterală, progresul, marcarea „parcurs” și fișele PDF citesc totul din același loc de date, indiferent câte lecții are o materie.

- ✅ **Încercat** cap-coadă cu browserul: toate cele șapte cartonașe la vedere (3 + 4), fără derulare laterală pe telefon, tabletă sau desktop; grila materiilor la alegere trece de la 4 la 2 la 1 coloană după lățimea ecranului, iar cea obligatorie rămâne neschimbată; apăsarea pe orice buton nou duce direct în lecția potrivită, cu bara laterală și progresul corecte; toate cele 42 de lecții, verificate una câte una — inclusiv cele 42 de fișe PDF descărcate și validate.

## [1.115.0] – 2026-09-09

### Added

- 🕰️ **Vremea din ultimele 10 zile**, în `/vremea`. Sub „Evoluția orară (24h)” a apărut un rând de pastile — o zi pe pastilă, de la acum zece zile până în prognoza pe nouă zile — și apeși pe oricare ca să vezi cum a fost (ori va fi) vremea oră de oră. Zilele trecute au un contur punctat, ca să se știe dintr-o privire că sunt istoric, nu prognoză.

- 🔁 **Un singur API, fără cheie nouă.** Cererea către Open-Meteo primește în plus `past_days=10`, iar serviciul lipește zilele trecute în aceleași liste `hourly`/`daily` pe care pagina le avea deja — nu s-a adăugat niciun serviciu nou. „Prognoza pe următoarele 10 zile” de mai jos rămâne neschimbată (doar azi și viitor); istoricul se vede exclusiv prin noile pastile de la evoluția orară.

- 🧭 **„Azi” nu mai e presupus, e găsit.** Codul dinainte lua ca sigur că prima zi din răspuns e azi; acum caută data de azi în lista primită și ține minte locul ei — așa că adăugarea istoricului n-a mutat cu nimic ora curentă evidențiată, ziua activă din prognoză ori titlul „Detalii Astăzi”. **Încercat** cu browserul, pe date reale (București și Suceava): douăzeci de pastile (zece istoric + azi + nouă prognoză), ora curentă tot evidențiată corect, apăsarea pe o zi din istoric arată cele 24 de ore cu temperaturi reale fără să atingă secțiunea „Detalii” ori cardurile de prognoză.

- 📌 **Derularea rămâne unde-ai lăsat-o.** Alegeai un interval de ore (să zicem după-amiaza) și, la fiecare schimbare de zi, „Evoluția orară” sărea înapoi la miezul nopții — trebuia derulat din nou de fiecare dată. Acum se sare automat la ora curentă o singură dată (la o căutare nouă); după aceea, orice zi alegi — trecută sau din prognoză — păstrează exact același interval, ca să compari ușor aceleași ore de la o zi la alta. O căutare nouă (alt oraș) reia saltul la ora curentă.
- 🌡️ **Max, min și media zi/noapte, pe fiecare zi.** Atât pastilele de la „Evoluția orară” cât și cardurile de la „Prognoza pe următoarele 10 zile” arată acum, pe lângă maxima și minima zilei, media temperaturilor din orele de zi (☀️, între răsărit și apus) și din cele de noapte (🌙) — calculată din orele acelei zile, inclusiv pentru istoric.
- ✅ **Încercat** din nou, pe date reale (Cluj-Napoca, Iași, Timișoara): toate cele douăzeci de pastile au max/min și media zi/noapte; derularea a rămas exact pe același loc la trei schimbări de zi la rând (inclusiv revenind la „Azi”); o căutare nouă a sărit din nou la ora curentă.

## [1.114.0] – 2026-09-08

### Added

- 🐖 **Economii** (`/economii`): o aplicație pentru banii puși deoparte. Scrii ce ai pus și ce ai luat din economii, iar ea îți spune trei lucruri dintr-o privire: **cât ai acum**, **cât ai strâns cu totul** și **cât ai luat**. Nimic nu pleacă de pe dispozitiv — totul stă în browserul tău și merge și fără internet.

- 💶 **Orice valută, un singur total.** Șaisprezece valute (leu, euro, dolar, liră, franc, forint, leu moldovenesc și celelalte). Fiecare își ține soldul ei, iar totalul se face în lei, la curs. Cursul se aduce cu un buton de la `open.er-api.com` (fără cheie), rămâne ținut minte pentru când ești offline și poate fi scris de mână, rând cu rând, dacă vrei cursul tău.

- 🎯 **„Cât trebuie să pun deoparte".** Îți pui o țintă, eventual și cât pui pe lună ori până când vrei s-o atingi. Aplicația arată bara, procentul, cât îți mai trebuie și — după caz — în câte luni ajungi sau cât ar trebui să pui lunar ca să prinzi termenul.

- 🛏️ **Unde stau banii.** Fiecare sumă are un loc: la saltea, în bancă, în portofel, ori ce scrii tu. Când sunt mai multe locuri, apare o listă cu cât e în fiecare — pe valute.

- ✍️ **Scris ca de mână.** Suma se poate scrie oricum („250", „99,50", „1.500", „1 234,56"), cu butoane rapide de +50 … +1000. Fiecare mișcare poate fi schimbată sau ștearsă, iar ștergerea se poate lua înapoi. Istoricul e strâns pe luni, cu totalul lunii, și se poate filtra pe valută.

- 💾 **Copie de siguranță.** Descarci tot într-un `.json` (sau un `.csv` pentru Excel) și-l încarci înapoi oricând — cu „Anulează" dacă te-ai răzgândit. Fiindcă datele stau numai în browser, aplicația o spune pe față și îndeamnă la copii.

- 🔢 **Socotit în bani, nu în zecimale.** Sumele se țin în numere întregi de bani, nu în virgulă mobilă, ca adunările să fie exacte la bănuț oricâte ar fi. **Măsurat** cu browserul: solduri exacte pe două valute, total în lei corect, curs scris de mână intrat în total, iar după reîncărcarea paginii totul la locul lui.

- ♿ **Pe telefon și la tastatură.** O singură coloană pe ecran mic, fără derulare laterală, butoane de cel puțin 50 px, etichete pe fiecare câmp, vestiri citite cu voce (`aria-live`) și temă închisă după setarea sistemului.

## [1.113.0] – 2026-09-07

### Added

- 📖 **Învață Latina** (`/latina`): 36 de lecții în trei niveluri — începător, intermediar și avansat — cu explicații în română pentru studenți la filologie și studiu individual. Include paradigme, exemple traduse, vocabular și lecturi cu traducere și analiză la cerere.
- ✍️ **Exerciții și evaluări**: 108 întrebări în lecții și 18 în evaluările de nivel, cu feedback explicativ și acceptarea răspunsurilor fără macron. Progresul și cele mai bune rezultate se păstrează local în browser.
- 🏛️ **Lectură și analiză filologică**: fragmente atribuite din Cezar, Cicero și Vergiliu, comparații latină–română–engleză și proiect final de traducere. Trimiteri la gramatici și texte universitare pentru aprofundare.
- 🔎 **Navigare pentru studiu**: cuprins cu căutare, glosar, reluarea lecției, tipărire și afișare adaptată pentru mobil. Aplicația este accesibilă și din secțiunea „Aplicații Simple”.
- 🔊 **Pronunție latină la un buton.** Lângă fiecare text latin — exemple, vocabular, lectura ghidată, glosar — stă un buton 🔊 care-l rostește. Niciun browser nu are voce latină, dar lecția 1 predă pronunția clasică reconstituită (c = k, g mereu dur, v ca w, ae/oe diftongi), care e foarte aproape de fonetica italiană: luăm deci o voce italiană și-i rescriem textul cum l-ar citi ea corect — „Cicero" devine „Chichero" (it. *ch* = k), „vīta" devine „uita", „caelum" devine „cailum", „scientia" devine „schientia", iar macroanele se scot. Rescrierea merge la fel și cu o voce română (*ch*/*gh* au același rol), care e a doua alegere. Rostirea e puțin mai rară (0,88), ca pentru învățat; butonul e etichetat pentru cititoarele de ecran și nu apare deloc în browserele fără sinteză vocală. **Încercat** cu voce simulată: 6/6 butoane în lecție, 131 în glosar, vocea italiană aleasă, 13 cuvinte-cheie rescrise cum trebuie („Caesar" → „Caisar", „gens" → „ghens", „lux" → „lucs", „pulcher" rămâne „pulcher"), pagina întreagă fără butoane când lipsește vocea.


## [1.112.1] – 2026-09-07

### Added

- 🎲 **Apăsarea pe zaruri le aruncă.** Pe tabla în 3D nu mai trebuie căutat butonul: apeși pe zarurile din mijlocul mesei și se rostogolesc. Trece prin chiar butonul „Aruncă Zarurile", deci prin aceleași reguli (al cui e rândul, dublă, datorii) — pe lângă ele nu se strecoară nimic. Cât e rândul tău, zarurile se leagănă ușor, ca să se vadă că-s de apăsat; când nu se poate da, stau cuminți și apăsarea nu face nimic. **Încercat**: apăsarea pe zar a aruncat („Jucător 1 a dat 9"), legănatul se vede la măsurătoare, iar apăsarea când nu e voie n-a schimbat nimic.

### Fixed

- 🧊 **Rândul AI-ului îngheța și jocul murea acolo.** După o vreme, AI-ul nu mai făcea nimic: îi vedeai rândul pe ecran, dar sta. În consolă se vedea „Încheie rândul. Urmează index: 1" fără niciun „AI Turn Start" după el — semn că `checkAiTurn` se oprea la unul dintre steagurile lui de pază. Erau **două** pricini, amândouă vechi, din jocul plat, nu de la tabla în 3D:
  - **Plăcuța deja stăpânită.** `handleTileLanding` ridica `activeTileInteraction` la fiecare aterizare și-l cobora pe toate căile — cumpărat, refuzat, licitat, taxă, carte, colț — **afară de una**: când ajungeai pe o proprietate care avea deja stăpân (plăteai chirie) ori pe a ta. Atunci steagul rămânea sus pentru totdeauna, iar AI-ul nu mai juca niciodată. De-aia mergea la început (nu deține nimeni nimic) și se strica „după o vreme". Și de-aia, după o reîncărcare cu „Continuă Jocul", mai făcea exact **o** mutare: steagul nu se salvează în jocul local, așa că reîncărcarea îl ștergea — până la următoarea aterizare pe o proprietate stăpânită.
  - **Licitația încheiată.** `auctionInProgress` se cobora abia **după** fereastra cu „Ok" care anunța câștigătorul, iar calea pe care licitația se închidea odată cu fereastra își chema `auctionResolve` fără să-l coboare deloc. Acum cade în clipa în care licitația nu mai e în toi, și încă o dată, ca plasă, la ieșirea din licitația locală, orice s-ar fi întâmplat înăuntru.
  - **Fereastra luată de alta rămânea neîmplinită pe veci.** Fereastra de dialog e una singură pe toată pagina; când se deschidea una nouă peste alta, celei vechi i se ștergea ascultătorul de „s-a închis" și promisiunea ei nu se mai împlinea niciodată. Cine o aștepta cu `await` rămânea agățat acolo — iar când cea veche era o licitație, `handleTileLanding` nu se mai întorcea niciodată și rândul AI-ului murea cu ea. Acum cea veche se împlinește cinstit când îi ia alta locul.
  - **AI-ul licita împotriva lui însuși.** Când singurul care mai putea licita era chiar cel care ținea prețul, un `|| aiPlayers[0]` îl punea să liciteze mai departe: din cinci în cinci lei, de la 55 până la 210, un minut întreg de licitație, plătind singur mult peste ce cerea nimeni. Acum se oprește, iar licitația se încheie la ceas.
  - **Rândul AI-ului se încheie dintr-un singur loc**, și locul acela se dădea bătut cu un `return` sec dacă la secunda aceea o licitație mai era în toi — și nimeni nu-l mai chema vreodată. Acum mai așteaptă și încheie rândul când se poate.
  - **Apăsarea care părea că nu face nimic.** Dacă apăsai pe o plăcuță cât timp o fereastră tocmai se închidea, Bootstrap trecea cu vederea chemarea de deschidere („e în tranziție"): cuprinsul ferestrei se schimba, dar fereastra nu se mai vedea niciodată. Acum se așază la coadă și se deschide după ce s-a închis cea dinainte.
  - **AI-ul răspunde ofertei tale.** Odată ce nu mai licita împotriva lui însuși, se oprea când ținea el prețul — și nimic nu-l mai trezea când ridicai tu: licitai o dată și luai orice proprietate cu cinci lei în plus. Acum, când licitezi, se trezește și răspunde (până la limita lui), apoi tace iar cât ține el prețul. **Încercat**: eu 5 → el 10, apoi liniște 4,5 s cât ținea prețul, apoi a luat-o la 10.
  - **„Licitează" dispăruse de pe plăcuța ta.** Fereastra automată de cumpărat e cod mort (un `else if (!ownerId …)` pe ramura în care *ownerId* e adevărat), așa că omul cumpără apăsând pe plăcuța care-i luminează, iar butonul „Licitează" din fereastra ei apare doar cât e aprins steagul de interacțiune. Dresul de mai sus îl cobora pentru toți, deci și pentru tine: vedeai doar „Cumpără". Acum rămâne aprins **numai** pentru un om pe o proprietate liberă — îl cobori tu (Cumpără / Licitează / Închide) ori se coboară la încheierea rândului, așa că AI-ul nu rămâne blocat de el. Și butonul se scria „Liciteză"; acum „Licitează".
  - **„Arată / ascunde jurnalul" nu ascundea nimic pe telefon**: jurnalul e pus la vedere sub pânză cu `display: block !important` (regula de mobil a jocului îl ascundea de tot), iar clasa de ascuns pierdea în fața lui. Acum câștigă.
  - 🐕 **Și un paznic**, ca o a treia pricină să nu mai poată omorî jocul: dacă e rândul unui AI, nu e nicio fereastră deschisă, nimeni nu se mișcă și nu s-a clintit nimic de douăsprezece secunde, coboară steagurile de îndrumare, scrie în consolă ce a găsit și-l cheamă din nou.
  - ✅ **Măsurat, nu presupus.** Aceeași partidă lungă, jucată de două ori cu browserul: cu dresul scos din zbor de către server, a înghețat în patruzeci de secunde, cu `activeTileInteraction = 8` și consola oprită fix pe „Urmează index: 1" — leit ce se vedea la om; cu dresul pus, 261 de secunde de joc, nouăsprezece runde de AI și două chirii plătite (chiar calea care omora jocul), fără niciun îngheț.

## [1.112.0] – 2026-09-06

### Added

- 🔊 **Text în Vorbire** (`/product/text-to-speech/`): aplicație gratuită pentru citirea textului în română sau engleză, direct în browser. Scrie sau lipește textul, alege limba și vocea, apoi apasă **Ascultă / Read aloud**. Include reglarea vitezei, pauză, continuare, oprire și exemple în ambele limbi, într-o pagină adaptată pentru telefon și desktop.
- ⌨️ **Ctrl + Enter** pornește lectura din caseta de text; Enter simplu adaugă un rând nou. La terminarea lecturii, focusul revine automat în caseta de text pentru editare.
- 🧩 **Acces din Aplicații Simple** (`#aplicatii-intro`) și din secțiunile de descărcare TextToSpeech. Adresele scurte `/tts` și `/tts/` redirecționează permanent către aplicație.

### Notes

- Vocile disponibile depind de browser și dispozitiv. Pentru română este necesară o voce în limba română; aplicația afișează îndrumări când vocea lipsește. Unele voci necesită internet. Textul nu este salvat de pagină și nu este tradus.
- Verificări automate în browser cu vorbire simulată: alegerea limbii și vocii, comenzile de redare, scurtătura de tastatură, revenirea focusului, texte lungi, erori și afișarea pe mobil. Redarea audio efectivă necesită verificare pe un dispozitiv cu vocile instalate.

## [1.111.0] – 2026-09-06

### Added

- 🎲 **Monopol în trei dimensiuni** (`/monopol`). Tabla plată a devenit o tablă adevărată, cu grosime și umbră: pâslă verde la mijloc, patruzeci de plăcuțe de culoarea fildeșului cu fâșia lor de culoare, numele, prețul și semnul fiecăreia, cele patru colțuri (START, Închisoarea, Parcarea, „Mergi la închisoare"), zaruri care se rostogolesc în mijloc și pioni colorați care sar din plăcuță în plăcuță. Se rotește și se apropie cu degetul (OrbitControls); nu se poate coborî sub tablă.
- 🧩 **Regulile n-au mișcat un deget.** Jocul (`monopol.js`) e același — banii, chiriile, casele, hotelurile, ipotecile, cărțile, AI-ul, jocul online; doar cinci funcții de desenat întreabă „e scena aici?" și, dacă e, îi dau ei tabla, pionii, proprietățile și zarurile. Apăsarea pe o plăcuță deschide detaliile ei; apăsarea pe pionul care pulsează îl mută, ca înainte pe pătratul plat.
- 🏠 **Ce e al cui se vede pe tablă**: fâșie în culoarea jucătorului pe marginea plăcuței, căsuțe verzi și hotel roșu, plăcuța ipotecată se întunecă, iar START se aprinde când poți încheia rândul.
- 🛟 **Fără WebGL, fără three.js, pe un aparat vechi**, tabla plată se desenează întocmai ca înainte. Modulul 3D (`monopol3d.js`) nu face parte din regulile jocului: dacă nu se încarcă, nimic nu se schimbă.
- 🖥️ **Ecran întreg, cu jocul întreg în el.** Butonul din colțul pânzei umple fereastra cu tabla; HUD-ul cu banii stă sus-stânga, jurnalul jos-stânga, iar butoanele jocului — Aruncă zarurile, Încheie rândul, Schimb, Ipotecă — vin într-o bară jos, la mijloc. Sunt aceleași butoane, *mutate*, nu copiate, așa că regulile jocului nu află nimic; la ieșire se întorc fiecare la locul lui, în aceeași ordine. Ferestrele jocului (cumpără, chirie, detalii) se deschid peste scenă, pentru că ecranul întreg e cerut pentru tot documentul, nu doar pentru pânză. Un buton **Meniu** deschide sertarul cu jucătorii și portofoliul, arată/ascunde jurnalul, pune camera la vederea de la început și iese din ecranul întreg; Esc iese și el. Pe iPhone, unde Fullscreen API nu există pentru altceva decât video, merge la fel: e doar o clasă pe `body`, scena se lipește de fereastră. **Încercat** pe desktop și pe telefon, cu apăsări adevărate: intrat, dat cu zarul din bară, deschis detaliile unei plăcuțe peste scenă, deschis sertarul din meniu, pus camera la loc, ieșit prin meniu — butoanele înapoi în panou în ordinea lor, pânza iar 5:4, zero erori.
- 📱 **Camera se potrivește după forma pânzei.** Pe un telefon ținut drept, la distanța bună pentru 5:4 tabla ieșea din cadru pe lături și plăcuțele de la margini nu se mai puteau apăsa. Acum, când se schimbă forma pânzei (ecran întreg, telefon întors), camera păstrează direcția din care privește omul și se dă înapoi exact cât să încapă toate cele opt colțuri ale soclului — același calcul cu care s-a ales și vederea de la început.
- 📐 **Cadrul camerei, măsurat, nu ghicit.** Am proiectat cele opt colțuri ale soclului pentru o plasă de unghiuri și ținte și am luat așezarea care face tabla cea mai mare fără să taie colțurile de aproape: 30° de la verticală, tabla umple ~80% din pânză, cu ~8% cer sus și jos. Prima încercare, „la ochi", tăia START-ul și Închisoarea.
- 🔧 **Plăcuțele laterale, drese.** Cutia fiecărei plăcuțe se făcea în cadrul lumii (1,5 × 1 pentru coloanele din stânga și dreapta) și abia apoi se rotea cu 90°, așa că ieșea 1 × 1,5: plăcuțele laterale se încălecau una peste alta (fâșiile de culoare tăiate, „Gara de V…", Brăila peste Galați), iar între ele și pâslă rămânea un șanț întunecat. Acum cutia se face în cadrul plăcuței și se rotește după aceea; cele patru laturi arată la fel, verificat din poze de aproape, de sus, latură cu latură.
- 🔍 **Patru priviri independente peste laturi.** După dresul plăcuțelor, patru inspecții separate (fețe, fâșii de stăpân/ipotecă/lumini, case și hoteluri, pioni) au măsurat fiecare latură față de rândul de jos, din poze de aproape și din cutii de coliziune. Ce au găsit s-a dres: **săgeata de pe START** arăta spre dreapta, adică afară din tablă, nu încotro se merge — e oglindită; **trei colțuri stăteau goale** („Mergi la pușcărie" pe România, „Poliție", „Vizită" și „Free" pe Europa și SUA) pentru că semnele lor Font Awesome (mâna, ochiul, zâmbetul) nu erau în lista de glife a pânzei — au intrat, plus o stea pentru orice plăcuță specială necunoscută; **patru case** umpleau 0,92 din plăcuța de 0,96 și se citeau ca un singur bloc verde — sunt mai mici (0,16), pe pas de 0,22, cu loc între ele.
- ✅ **Încercat** cu browserul, cap-coadă, fără nicio eroare în consolă: joc local pornit pe tabla 3D (40 de plăcuțe, 2 pioni), zarurile au dat altceva la rânduri diferite, trei apăsări pe pion → trei mutări (pozițiile 0, 10, 12, 17), apăsarea pe plăcuța 1 a deschis „Detalii Proprietate — Giurgiu"; un joc salvat reluat prin „Continuă Jocul" a apărut în scenă cu pionul pe căsuța 7 și proprietatea cu două case; iar cu modulul tăiat, grila plată a avut 40 de pătrate, pionii și zarurile ei.

### Changed

- 📱 **Sub tablă, nu peste ea.** HUD-ul cu banii, rezultatul zarurilor și jurnalul s-au mutat sub scenă — sunt aceleași elemente, mutate, nu copiate, așa că își păstrează fiecare legătura cu jocul. Pânza e 5:4, pentru că tabla văzută pieziș e un trapez mai lat decât înalt: un pătrat lăsa cer gol sus și jos.

## [1.110.0] – 2026-09-05

### Added

- 🎮 **Reduceri Xbox** (`/reduceri`). Lângă PlayStation stă acum și Xbox: o filă nouă în alegătorul de platformă, cu jocuri de pe Microsoft Store la preț redus, în lei — Xbox Series X|S și Xbox One. Aceleași unelte ca la PlayStation: filtre după consolă, sub 50 și sub 100 de lei, „−50% și peste", 18+, și sortare după economie, procent, preț ori alfabetic.
- ⚡ **Gemini 3.8 Flash** în secțiunea Gemini de pe prima pagină, ca plăcuță care duce de-a dreptul în AI Studio (`aistudio.google.com/prompts/new_chat?model=gemini-3.8-flash`). Stă înaintea lui 3.6 Flash — cel nou întâi — și ține de aceeași familie de plăcuțe (`app-ai-studio`), așa că are aceeași mișcare, doar cu culoarea și semnul ei.
- 🧠 **Pagina Gemini, adusă la zi cu șase modele noi.** Lista se lua după lista oficială de la Google (`ai.google.dev/gemini-api/docs/models`), nu după ureche: **Gemini 3.8 Flash** trece în frunte, iar lângă el intră **3.7 Flash**, **3.1 Pro**, **Nano Banana 2** (`gemini-3.1-flash-image`) și **Nano Banana Pro** (`gemini-3-pro-image`). Sunt acum douăzeci de modele pe pagină, fiecare cu legătura lui — numărate cu browserul, ca să fim siguri că se văd toate.
- ✏️ **Și o vorbă care nu mai era adevărată.** Pe 3.6 Flash scria „Latest Frontier Model", deși Google însuși îl trece de-acum drept model de generația trecută, iar deasupra lui stau 3.7 și 3.8. A coborât în listă, cu descrierea dreasă.
- 🤖 **Modelele Gemini se țin singure la zi.** Un atelier nou (`Gemini — modele noi`, zilnic la 07:20 UTC) citește lista oficială de la Google și rescrie cartonașele de pe `/gemini` și plăcuțele din secțiunea AI de pe prima pagină, plus `public/data/gemini-models.json`. Nu-i trebuie nicio cheie: pagina de documentație e la vedere, iar o cheie într-un atelier zilnic e o cheie pe care trebuie s-o tot schimbi.
- 🛡️ **Și e făcut să nu strice nimic.** Rescrie numai ce stă între semnele de hotar (`MODELE-*:START/END`), așa că modelele vechi (2.5), pe care Google nu le mai dă în cartonașe, rămân scrise de mână și nu se pierd. Dacă parsarea nu arată a bine — prea puține modele, capete ciudate — pică treaba **fără să atină paginile**. **Încercat**: pus să citească o pagină greșită, a ieșit cu eroare, iar cele două pagini au rămas neclintite, octet cu octet.
- 🤔 **Două modele lăsate deoparte, spuse pe față**: `gemini-3.5-transcribe` și `gemini-omni-1.1-flash` (video). Nu știm pe ce pagină din AI Studio se deschid, iar un buton care duce într-un gol e mai rău decât unul care lipsește. Atelierul le numește în jurnal la fiecare rulare, ca să nu se uite de ele.
- 📐 **Secțiunea AI, așezată la mijloc.** Uneltele străine (Flow Music, Google Flow) au trecut pe rândul lor, iar rândurile pe jumătate pline nu mai stau lipite de stânga — la grid, `justify-content: center` centrează maldarul de coloane, nu plăcuțele. **Măsurat** la opt lățimi de ecran, de la 1920px la 400px: abatere zero pe fiecare rând.
- ✂️ **Gemini 3.6 Flash a ieșit din secțiunea AI** de pe prima pagină, de când stă acolo 3.8.
- 🔍 **„Caută cu Google AI" a trecut prima** în secțiunea AI de pe prima pagină.
- 🔎 **De unde vin.** Xbox nu are niciun izvor bun pentru reduceri, și le-am încercat pe toate: `emerald.xboxservices.com` răspunde, dar nu ia în seamă nici paginarea, nici filtrele, iar dacă-i dai `filters` se îneacă de tot (500); `displaycatalog` și `reco-public` nu răspund deloc. Ce merge e chiar pagina de răsfoire de pe xbox.com, care vine gata scrisă de pe server cu un `window.__PRELOADED_STATE__` în care stau titlul, coperta, consolele și prețurile cu reducere, în lei. Sortarea după reducere e ascultată de server, așa că de acolo luăm ofertele cele mai bune; restul se completează din căutarea magazinului, care merge din pagină în pagină.

- 🗣️ **Instructorul de Tai Chi, Qigong și Baduanjin vorbește.** Un buton nou, **Voce**, și modelul 3D îți spune ce face: numește mișcarea și cum să respiri, apoi rostește fiecare pas când ajunge la el. Pe telefon, cu ochii pe model, nu poți citi și pașii scriși — așa poți face exercițiul uitându-te la el, nu la text. Vorbește browserul (`speechSynthesis`): nu se aduce nimic de pe rețea. **Ecranul rămâne treaz** cât merge mișcarea (`wakeLock`), că altfel telefonul adoarme taman când ai mâinile ocupate.
- 🔇 **Fără voce românească pe telefon, butonul nici nu se arată.** Mai bine lipsește decât să citească românește cu gura unei voci englezești. Vorbele nu se îngrămădesc: un pas nou e rostit numai dacă nu se vorbește deja, ca vocea să nu rămână în urma modelului. **Încercat** cu browserul, pe toate trei paginile, la lățime de telefon.
### Fixed

- 🥇 **Aurul de la Nunta de Aur arăta a maro** — și, odată căutat, s-a văzut că nu era vina aurului. Un metal curat (`metalness: 1`) n-are culoare a lui: nu împrăștie lumină, ci doar oglindește ce-l înconjoară — iar mediul stătea pe tăria 1, adică aproape nimic de oglindit. **Măsurat pe pixeli**: aurul ieșea la H 35°, L 23% (pământ ars), argintul la L 27% și platina la L 23% — toate **unsprezece** metalele paginii erau la fel de flămânde. Acum metalele pornesc de la tăria 8: aurul stă la H 44°, S 75%, L 59%, argintul la L 74%, platina la L 72%. De ce 8 și nu 10: la 10 fierul urcă la L 85% și începe să semene cu argintul. Culoarea scrisă în cod era bună de la bun început — n-am schimbat-o.
- 💍 **Piatra stătea alături de verighetă, nu pe ea.** Verișoara e înclinată cu `π/9`, deci creștetul ei ajunge la z **+0,15** — dar piatra era pusă de mână la z **−0,13**, adică de partea cealaltă a benzii, plutind. Acum locul ei se scoate din chiar geometria verighetei (rază, grosime, înclinare), așa că se așază pe bandă și se înclină cu ea. Atingea **șaisprezece** aniversări, de la Topaz la Briliant — nu doar opalul și berilul. **Verificat**: petele desenate deosebit au scăzut de la două la una.
- 🥢 **Toarta cănii intra în cană.** Un inel întreg, așezat la x = 0,36, ajungea cu marginea dinlăuntru până la r = 0,175 — iar peretele cănii începe, pe dinlăuntru, la 0,24. Trecea prin perete și se vedea în scobitură ca un arc străin; cât era cana plină, ciocnirea stătea ascunsă, golirea ei a scos-o la iveală. Toarta e acum o **țeavă dusă pe o curbă**, cu capetele așezate pe perete — fiecare la înălțimea lui. Un arc simetric n-a mers: cana e mai lată sus decât jos, așa că un capăt intra în perete și celălalt rămânea în aer (măsurat: 0,014 gol). Acum fiecare capăt își ia locul din profilul peretelui la înălțimea lui, se afundă 0,03 în perete fără să răzbată în cană, și primește o bilă, că o țeavă e deschisă la capete.
- ☕ **Cana de porțelan are acum scobitura ei.** Era un cilindru plin — un dop, nu o cană: se vedea că n-are unde încăpea ceaiul. Profilul urcă pe dinafară, trece peste buză și coboară pe dinlăuntru, cu perete de trei sutimi și fund de șase, așa că i se vede gura și i se vede fundul. **Nici buza, nici fundul nu mai au colțuri**: buza e rotunjită peste muchie, iar fundul dinlăuntru e un **cazan**, nu un taler. Un taler are normala în sus peste tot, deci prinde lumina cu totul altfel decât peretele din jur și se desprinde ca un disc luminos — racordarea scurtă de la început a îmblânzit îmbinarea, dar talerul a rămas. Un sfert de elipsă, luat din nouă puncte, face lumina să curgă lin de la buză până în mijloc. Strungul (`LatheGeometry`) netezește normalele de-a lungul întregului profil — nu știe de muchii vii — așa că orice unghi drept nu iese muchie, ci o dâră de umbră întinsă peste el. De-aia buza dreaptă se vedea din gura cănii ca un arc negru tăind interiorul. Leacul n-a fost să lupți cu netezirea, ci să nu-i mai dai colțuri. Șine și de **Nunta de Porțelan** (20 de ani), și de **Porțelan Fin** (36) — amândouă iau aceeași cană.
- 🕳️ **Se vedea prin obiecte.** Potcoava (fier), ulciorul (lut) și colțul de fildeș erau coji deschise, iar ochiul le prindea măruntaiele. Potcoava și colțul sunt arcuri de tor, iar un tor tăiat rămâne țeavă deschisă la capete; ulciorul era un profil întors la strung numai pe dinafară, fără grosime și fără fund, cu peretele dinlăuntru întors cu spatele spre ochi, deci nedesenat. Acum arcurile și-au primit câte o bilă la fiecare capăt (așezată din chiar măsurile arcului, nu scrisă de mână), iar ulciorul urcă pe dinafară, trece peste buză și coboară pe dinlăuntru: are perete adevărat și fund. Am căutat prin toți însoțitorii după același cusur — restul sunt închiși.
- 💕 **Inima părea făcută din felii lipite.** Văzută din muchie, avea dungi orizontale și o cusătură pe unde peretele dă în teșitură — se vedea mai ales pe fier (lucios) și pe lut (mat și deschis). `ExtrudeGeometry` scoate peretele fațetă cu fațetă, fiecare cu normalele ei. Le-am lipit și am recalculat normalele. De știut pentru data viitoare: `mergeVertices` singur **nu face nimic** aici, fiindcă el compară toate însușirile unui vârf, iar fațetele vecine au normale deosebite — normalele trebuie șterse întâi.

- ⏰ **Atelierele de înștiințări (Filtre și Garaj) pornesc iarăși.** Amândouă erau tăiate la cinci minute, tocmai când își aduceau pachetele. Niciunul din cele două dosare n-avea lockfile, așa că la fiecare rulare se desluşea de la capăt tot arborele lui `firebase-admin` — o sută șaizeci și șapte de pachete — iar `setup-node` n-avea după ce să-și țină memoria ascunsă, fiindcă o lega de `package.json`. Acum lockfile-ul stă în depozit, se folosește `npm ci`, iar memoria se leagă de el: pachetele intră în două secunde. Plafonul a fost urcat la zece minute, ca să fie loc de întors. Cârâielile despre `uuid` din jurnal erau doar zgomot — nu ele opreau treaba, ci ceasul, și vor apărea și de-acum încolo.
- 🎯 **Bara de sărituri arată numai secțiunile deschise.** Punctele de pe marginea din dreapta se făceau după toate secțiunile paginii, și cele stinse, și cele aprinse. La „Reduceri”, unde filele de platformă lasă deschisă doar una — Desktop ori PlayStation ori Xbox — ieșea o coloană de puncte moarte: le apăsai și nu te duceau nicăieri, fiindcă secțiunea lor era stinsă (cel de Xbox se vedea și când te uitai la Desktop). Și ordinea nu se lega, fiindcă printre punctele care se vedeau stăteau altele care nu se vedeau. Acum bara ține pasul cu ce e pe pagină, se potrivește pe loc când schimbi fila, și se retrage de tot când a rămas o singură secțiune, că n-are unde să te ducă. **Verificat** cu browserul, pe toate cele șase file și pe prima pagină (unde toate cele douăzeci de puncte au rămas la locul lor).
- 🩹 **Culegătorul nu mai moare când ITAD tace.** Când lipsea cheia ori când ITAD dădea greș, se întorcea un răspuns ciunt (fără `broadDiscounted`), iar `main()` se împiedica de el cu „not iterable" — și atunci nu se mai scria **nimic** în `deals.json`, nici măcar secțiunile culese cu bine. Acum întoarce lista goală, cum face tot restul culegătorului când un izvor nu răspunde.

## [1.109.0] – 2026-08-27

### Changed

- 📴 **Aplicația de telefon merge acum fără internet.** Până acum era o fereastră către pagina de pe site, și de aici ieșeau trei neajunsuri, toate din aceeași pricină. Cu internetul închis nu pornea deloc — scria `net::ERR_NAME_NOT_RESOLVED` — adică tocmai telecomanda care **nu** are nevoie de rețea nu se putea porni fără rețea. Legăturile din subsolul site-ului se deschideau înăuntru și te trezeai închis într-o fereastră fără bară de adresă. Iar pagina adusă de pe site își chema bucățile (`components/_header.html`), care după o plimbare prin meniu nu se mai nimereau. Acum telecomanda stă în burta aplicației (`assets/telecomanda.html`): butoane și atât, fără meniu și fără subsol. Merge în casa altuia, pe un televizor care nu e deștept, cu routerul stins — acolo unde infraroșul chiar are rost.
- 🔒 **Nu mai cere voie la internet.** N-o mai folosește, așa că `INTERNET` a ieșit din listă. A ieșit și `usesCleartextTraffic`. Rămâne o singură îngăduință: ledul.
- 🚪 **Fereastra nu mai pleacă nicăieri.** Puntea `AndroidIR` e la îndemâna oricărei pagini care ar ajunge în fereastra aplicației, așa că o pagină străină ar fi putut striga la ledul telefonului. Acum poarta stă încuiată: înăuntru intră doar pagina proprie, iar ce nu e al nostru pleacă în browserul adevărat, unde puntea nu există.
- 🔁 **Codurile au o singură sursă.** `public/js/telecomanda-ir.js` e copiat lângă pagina din aplicație la clădirea APK-ului, iar copia e trecută în `.gitignore` ca să n-o dreagă nimeni din greșeală. Două tabele deosebite nu mai pot apărea.
- 📱 **Semnul aplicației.** Până acum purta un semn de-al sistemului (`ic_menu_slideshow`), fiindcă cel desenat nu fusese legat în `AndroidManifest.xml` — ar fi călătorit în APK degeaba. Acum e o telecomandă desenată, potrivită (adaptive) de la Android 8 în sus și simplă mai jos.
- 🎛️ **Semnul telecomenzii pe site.** Font Awesome are unul, dar numai în varianta cu plată — pus în cea gratuită, n-ar fi desenat nimic. E desenat de mână și pus în plăcuța din pagina de start, în meniu și în capul paginii.

## [1.108.0] – 2026-08-26

### Added

- 📺 **Pagină nouă: Telecomandă** (`/telecomanda`). Două lucruri care chiar merg, și un adevăr spus pe șleau.
- 📱 **Îți spune dacă telefonul tău are led infraroșu.** Nu întrebând telefonul — nu se poate — ci după modelul lui, pe care browserul îl dă (`userAgentData.getHighEntropyValues`, cu întoarcere la șirul de agent), pus față în față cu familiile de telefoane știute că au infraroșu. Pentru iPhone răspunsul e limpede și scurt: niciunul n-a avut vreodată. Când modelul nu e în listă o spune cinstit, în loc să ghicească.
- 🛜 **Telecomandă adevărată pentru televizoarele Samsung, prin Wi-Fi.** Televizoarele cu Tizen (2016 încoace) ascultă pe rețea, iar la ele se poate ajunge din pagină: scrii adresa televizorului, te legi, iar cele cincisprezece taste (pornit, sunet, canale, săgeți, OK, sursă, înapoi) merg de-adevăratelea. Jetonul dat de televizor la prima împerechere se ține minte, ca să nu te mai întrebe. E scris tot acolo și ce să faci când nu se leagă — pasul cu certificatul, care lipsește cel mai des.

- 🔦 **Infraroșu, prin învelișul de Android.** Pagina rămâne aceeași, dar dacă e deschisă înăuntrul aplicației din `/android-telecomanda`, ea capătă ledul: tastele merg drept spre televizor, fără Wi-Fi și fără ca el să fie deștept. În browser obișnuit nu se schimbă nimic — se merge pe Wi-Fi, ca până acum. Aplicația e o fereastră de 16 KB, fără nicio bibliotecă: toate codurile și toate butoanele stau în pagină, așa că o îndreptare se face publicând site-ul, nu făcând un APK nou.
- ⬇️ **Aplicația se ia chiar din pagină.** Butonul de descărcare stă ascuns și se arată singur numai când are rost: ești pe Android, nu ești deja înăuntrul aplicației, iar fișierul chiar se află pe server — altfel ar duce într-un gol. APK-ul e clădit de un atelier GitHub și pus de-a dreptul în site (`public/telecomanda.apk`), fiindcă depozitul e închis: și artefactele rundei, și fișierele unei lansări cer cont, iar artefactele vin într-o arhivă pe care Android n-o poate deschide.
- 📡 **Codurile Samsung, croite în pagină** (`telecomanda-ir.js`). Sunt luate din baza de coduri a Flipperului și puse față în față cu felul vechi de scriere (E0E0…): se potrivesc toate. **Verificat**: cadrul se desface înapoi și dă exact adresa și comanda de la care s-a plecat, toate cele 27 de coduri își închid octetul de siguranță, iar un semn ține 61 ms — cât unul adevărat.

### Notes

- ⚠️ **Prin infraroșu nu se poate, din nicio pagină web.** Ledul se comandă pe Android prin `ConsumerIrManager`, o unealtă a sistemului la care ajung numai aplicațiile scrise pentru telefon. Nu există `navigator.infrared`, nu există îngăduință de cerut, nu există portiță. Pagina o spune pe față, în capul ei, în loc să se prefacă. De-aia comanda merge prin Wi-Fi, nu prin infraroșu.

## [1.107.0] – 2026-08-25

### Added

- ☯️ **Calendar: tabelul chinezesc „băiat sau fată".** O filă nouă în calendar, cu tabelul vechi de pe vremea dinastiei Qing. Îi dai ziua de naștere a mamei și ziua zămislirii — sau sorocul, și dăm noi înapoi cele 266 de zile — iar el spune ce zice tabelul. Se vede și tabelul întreg, toate cele 28 de rânduri pe 12 coloane.
- 🎨 **Calendarul de sub tabel se colorează băiat/fată.** Pe fila chinezească, grila lunii nu mai stă degeaba: după ce dai ziua de naștere a mamei, fiecare zi se colorează cu ce spune tabelul dacă zămislirea ar cădea atunci — albastru băiat, roz fată — și poți umbla prin luni ca să vezi cum se schimbă. Ziua de naștere a mamei se ține minte în browser, ca să n-o dai de fiecare dată. Socoteala chinezească e scumpă, așa că se ține minte pe zi: altfel s-ar reface de patruzeci de ori la fiecare desenare a lunii.
- 💾 **Tabelul chinezesc ține minte tot ce ai completat.** La reîncărcare găsești formularul cum l-ai lăsat: ziua de naștere a mamei, ziua zămislirii (ori sorocul), care dintre ele ai ales — și răspunsul de data trecută, arătat din nou. Se ține minte **pe măsură ce completezi**, nu doar când apeși butonul: dacă scrii datele și reîncarci fără să apeși, tot le regăsești.
- 🧮 **Ține socoteala zilelor încercate: câți băieți, câte fete.** Fiecare zi de zămislire pe care o cercetezi rămâne scrisă, cu ce a ieșit, iar deasupra listei stau două bulinuțe: câți băieți și câte fete dau zilele încercate până acum. Se păstrează peste reîncărcare, aceeași zi nu se scrie de două ori, și poți scoate o zi anume ori șterge toată lista.
- ℹ️ **Se spune limpede ce e „ziua zămislirii".** Sub formular stă o lămurire strânsă: e **ziua când copilul a fost conceput** — de obicei ziua ovulației, cam la 14 zile după prima zi a ultimei menstruații, nu ziua în care ai aflat și nici prima zi a ultimei menstruații. Tot acolo scrie de ce contează (tabelul se citește după luna lunară a acelei zile) și ce să faci dacă n-o știi.
- 🌙 **Calendarul chinezesc, socotit din cer.** Tabelul NU se citește cu luna și vârsta de la noi, ci cu luna lunară a zămislirii și cu vârsta socotită chinezește (虚岁) — aici greșesc mai toate locurile care-l pun la vedere. Anul chinezesc începe între 21 ianuarie și 21 februarie, așa că în ianuarie și februarie ies amândouă altele. De-aia calendarul e socotit după rânduiala adevărată: ceasurile la ora Chinei, luna începe în ziua lunii noi, luna a unsprezecea e cea cu solstițiul de iarnă, iar luna bisectă e cea dintâi fără mijloc de anotimp. **Verificat**: Anul Nou chinezesc nimerit în toți cei 35 de ani încercați (1996–2030) și toate cele 10 luni bisecte verificate.

### Fixed

- 🌑 **Lunile noi ieșeau cu un sfert de oră greșit.** În seria lui Meeus, doi termeni aveau înmulțitorii lui M și M′ puși pe dos — scriam `sin(M − M′)` unde trebuia `sin(M′ − M)`, ceea ce întoarce semnul unui termen de 0,00739 zile. Ieșeau abateri de 7–21 de minute, iar Anul Nou chinezesc din 2030 cădea cu o zi mai devreme: luna nouă e la 23:50, ora Chinei, pe 2 februarie după socoteala greșită, și la 00:07 pe 3 februarie după cea bună. **Verificat**: pilda 49.a din Meeus iese acum la 0,1 secunde, iar lunile noi adevărate la sub un minut.
- 🎂 **Ziua de naștere nou-adăugată nu se vedea în calendar.** După ce o adăugai, intra în listă, dar grila lunii rămânea neschimbată — o vedeai însemnată abia dacă schimbai luna și te întorceai. Codul chema o funcție `render()` în patru locuri, dar ea nu era scrisă nicăieri: crăpa cu „render is not defined" imediat după ce lista se împrospăta, așa că nimic de după nu se mai făcea. Acum funcția există și împrospătează tot: ziua de azi, grila lunii și posturile mari.

## [1.106.0] – 2026-08-24

### Changed

- 🏁 **„Finalizează", când ți-a rămas o singură piesă.** Aruncarea ultimei piese încheie jocul — dar trebuia să ghicești că tocmai tragerea ei pe teanc e mutarea care câștigă. Acum, când rămâi cu una singură și e rândul tău, se aprinde un buton galben: îl apeși, piesa pleacă pe masă și se încheie partida.
- 🔎 **Socoteala nu mai vine peste tine.** După ce toată lumea își întoarce piesele pe masă, scorul nu mai sare singur după câteva clipe: te poți uita pe masă cât vrei, o apropii și o depărtezi cu lupele, numeri ce-a rămas la fiecare — și abia când apeși „Rezultat" apare socoteala. Lupele merg mai departe și după ce jocul s-a încheiat.
- 🔚 **La sfârșit se văd piesele tuturor, înainte de socoteală.** Când cineva închide, fiecare jucător își întoarce piesele rămase pe masă, în fața lui, cu fața în sus — cum se face la orice masă de remi — și abia după câteva clipe apare scorul. Până acum se sărea de-a dreptul la socoteală, fără să afli cu ce a rămas fiecare. Piesele se culcă toate întoarse la fel, spre scaunul tău: altfel cifrele celor din lateral ar sta pe muchie și n-ai putea să le citești.
- 🙈 **Piesa trasă din grămadă călătorește cu fața în jos.** Când o tragi ținând apăsat, se întorcea cu fața în sus din prima clipă — adică masa întreagă vedea ce ai luat. Acum rămâne cu fața în jos tot drumul și se întoarce abia când o lași pe suportul tău. Piesa de jos se poartă mai departe cu fața în sus: pe aceea o știe oricum toată lumea. **Măsurat**: în toate cele douăsprezece opriri de pe drum, piesa a stat cu fața în jos.
- 🎬 **Împărțirea se vede, întocmai ca la masă.** La începutul jocului piesele nu mai apar de-a gata: se așază pe postav toate cele **cincisprezece teancuri de câte șapte**, se spune care e piesa hotărâtoare, apoi un semn luminos **numără teancurile de la dreapta la stânga** până la ea. Acolo, piesa de deasupra se ridică și se pune, cu fața în sus, pe teancul următor — ăsta e atu-ul, și acolo rămâne. Abia pe urmă pleacă teancurile la jucători: calculatoarele își urcă piesele pe suport singure, ale tale te așteaptă pe masă, să ți le iei cu mâna. Fiecare pas îl pornește pe următorul, nu ceasul de perete: pe o mașină încărcată pașii rămân în urmă, iar cu ceasul teancurile plecau de pe masă în timp ce încă se număra.
- 🃏 **Atu-ul stă cu fața în sus chiar pe grămadă.** Piesa ridicată la împărțire se pune acum pe teancul următor, la vedere, cum o pune omul pe masă — nu răzleață pe lângă grămezi. De acolo se vede de la orice loc și se ridică de acolo, dacă închizi cu ea.
- 🤏 **Tragi ținând apăsat și trăgând.** Pui degetul pe grămadă sau pe piesa întoarsă de jos, tragi, și piesa vine după deget — o lași chiar în locul în care o vrei pe suport. O atingere scurtă face ca până acum: trage și o pune la rând.
- 🗑️ **Piesele aruncate se strâng ca la masă.** Se adunau într-un singur loc, ridicându-se ca un turn înclinat. Acum se pun una peste alta chiar în locul de aruncat, **cu fața în sus**, cum le lași din mână; când s-au făcut zece, cele nouă de dedesubt se împing la stânga — și **abia atunci se întorc cu fața în jos** — iar sus rămâne numai ultima. Nicio piesă nu se ascunde: câte s-au aruncat, atâtea stau pe masă. **Măsurat**: la 9 aruncate, toate nouă sunt cu fața în sus într-un singur teanc; la 10, nouă au plecat la stânga întoarse și una a rămas sus; iar cu toate cele 106, toate sunt pe masă, în 13 teancuri, fără să calce peste grămezi ori peste etalări.
- 🖐️ **Tragi și cu butonul, nu numai cu degetul pe masă.** „Grămadă" și „Jos" s-au întors, în fâșia din scenă, lângă celelalte: tragi apăsând pe grămadă ori pe piesa întoarsă cu fața în sus, cum era, sau apeși butonul, dacă așa ți-e mai la îndemână. **Măsurat**: în toate stările în care le arată jocul — înainte de tras, cu duble cu tot, și după — fâșia stă pe un singur rând și niciun buton nu calcă pe locurile de pe suport, nici pe calculator, nici pe telefon (până la 360 de pixeli lățime).
- 🟩 **Vezi unde intră piesa pe suport, cât o ții cu degetul.** Când tragi o piesă peste propriul suport, două bare verzi se aprind în locul în care va intra — ca două degete care fac loc între piese. Ies cu un cap deasupra pieselor și puțin în față, ca să se vadă și când suportul e plin. Peste o combinație etalată sau peste locul de aruncat se sting, că acolo vorbește covorașul.
- 🀄 **La început îți iei piesele de pe masă, una câte una.** Nu mai apar dintr-odată pe suport: fiecare jucător primește două teancuri de câte șapte, cu fața în jos, așezate în fața lui. Ceilalți și le iau singuri, iute; tu ți le iei cu mâna — apeși pe teanc și piesa de deasupra urcă la locul ei, sau o tragi cu degetul și o pui exact unde vrei pe suport. Scrisul de deasupra mesei ține socoteala („au mai rămas 11"), altfel teancurile de pe masă ar părea un joc înțepenit. Se împarte numai la un joc nou: dacă te întorci la unul lăsat la jumătate, piesele sunt deja pe suport. (Cine începe are un teanc de opt, că ia o piesă în plus.)
- 🩹 **Numărul pieselor de luat nu se mai împotmolește.** Un adversar poate cere o dublă chiar în timpul împărțirii și-ți ia o piesă din mână. Piesa primită la schimb urcă direct pe suport, cum se cuvine — dar cea plecată rămânea în socoteala celor de luat, așa că numărul nu mai ajungea niciodată la zero. Acum, la fiecare așezare, ce nu mai e în mână iese și din socoteală.

### Fixed

- 🌘 **Stele: Luna își arată acum fazele.** Scria dedesubt „24% luminată", dar pe cer se vedea lună plină în fiecare noapte: discul era un cerc plin, la fel de rotund mereu. Acum i se taie umbra. Terminatorul — hotarul dintre lumină și umbră — nu e o dreaptă decât la jumătățile de lună; în rest e o jumătate de elipsă, iar partea luminoasă cade întotdeauna spre Soare, cum se vede și de la fereastră. Partea neluminată nu e neagră de tot: se ghicește lumina cenușie a Pământului, aceeași pe care o vezi în seceră. **Verificat**: la lună plină iese 100%, la lună nouă 0%, la pătrare 50% — iar aria luminată de pe disc se potrivește cu procentul până la a suta parte.
- 📋 **Stele: lista de orașe arată acum „locul tău".** După ce aflai locația, lista rămânea pe „— alege un oraș —" și părea că nu s-a întâmplat nimic, deși cerul era deja socotit pentru locul unde stai. Acum, în capul listei stă „📍 locul tău" și se aprinde singură când se află locul. Dacă alegi pe urmă un oraș, lista trece pe el.
- 🪐 **Stele: corpurile se văd acum cât se văd de pe Pământ.** Luna și planetele erau desenate cu discuri de grade întregi: Luna ieșea de șapte ori mai lată decât e, iar Pluto — care nici cu ochiul liber nu se vede — se lăfăia cât un grad pe cer. Acum fiecare corp are diametrul lui unghiular adevărat: Soarele și Luna câte o jumătate de grad, iar planetele, cum sunt ele, puncte — Jupiter, cea mai lată dintre ele, are 40 de secunde de arc, adică a cincizecea parte din Lună. La mărimea asta discul unei planete e mai mic decât un pixel, așa că ce se vede e **lumina** ei, nu trupul: pâlpâitul din jur e ales după cât de tare strălucește, ca la stele. Cele trei de la margine (Uranus, Neptun, Pluto) au un prag de jos cât cea mai stinsă stea desenată, altfel n-ar mai fi nicăieri — și tocmai găsitul lor e rostul aplicației. **Verificat**: toate zece se potrivesc cu diametrele din efemeride.
- 🕸️ **Stele: Luna avea spițe în jur, ca o roată.** Pâlpâitul era pus pe un cerc, iar cercul din three.js e făcut din triunghiuri pornite toate din mijloc: lumina din poză se întindea pe ele în dungi, care se vedeau limpede în jurul Lunii. Acum stă pe un pătrat, unde poza se așază întreagă și rotundă. Și discul are 64 de laturi în loc de 24 — cu douăzeci și patru, Lunii i se numărau colțurile.
- 📍 **Stele: „Locația mea" se lăsa păgubaș din prima încercare.** Cerea locul o singură dată, grăbit și fără GPS, cu răbdare de zece secunde — iar pe multe telefoane cererea aceea se stinge în tăcere: rețeaua nu știe unde ești, GPS-ul nu e întrebat, și gata. Pe deasupra, când nu mergea spunea doar „n-am primit locația", fără să zică de ce, așa că nu aveai de unde ști dacă ai refuzat, dacă e locația oprită ori dacă doar a trecut vremea — și te apucai să cauți orașul în listă. Acum stăruie: întâi iute și ieftin, apoi cu GPS-ul pornit și cu răbdare, iar la urmă cu o pândă scurtă (`watchPosition`) — sunt telefoane care răspund numai așa. Refuzul îl ia ca răspuns și nu mai insistă. Și spune de fiecare dată **de ce** n-a mers. **Verificat** pe șase feluri de purtare a telefonului: merge din prima; prima cade și reușește GPS-ul; amândouă cad și reușește pânda; omul refuză; locația e oprită peste tot; și voie dată dinainte.
- 🤝 **Stele: dacă ai dat deja voie, locul se ia singur.** Când pagina are voie de altă dată, nu mai trebuie să apeși nimic — se cere în tăcere la deschidere, iar dacă dai voie mai târziu din bara browserului, se prinde singură. Cât nu s-a dat voie NU se cere nimic: o întrebare care sare în față neîntrebată se închide de obicei cu „nu", și pe urmă nu se mai poate cere decât din setări.
- 🔁 **Așezarea mesei se chema pe ea însăși și ascundea piese.** Așezarea ține minte ce piese a atins și, la capăt, le ascunde pe cele neatinse. Din mijlocul ei se cheamă însă jocul (numărul pieselor de luat → `updateUI` → `renderBoard`), iar acela cheamă înapoi așezarea: cea dinăuntru își făcea propria socoteală și ștergea semnele, așa că, la întoarcere, cea de afară ascundea piese pe care tocmai le pusese. S-a văzut la arătatul mâinilor de la sfârșit: se vedeau numai piesele mele, ale celorlalți trei se stingeau. Acum o chemare venită din mijlocul alteia se lasă păgubașă — cea de afară lucrează pe aceeași stare și duce treaba la capăt singură.
- 🎴 **La împărțire se arunca o piesă degeaba, iar atu-ul era dat de două ori.** Două lucruri strâmbe deodată. Întâi: se întorcea o piesă pe masă din capul locului, deși cel care începe are 15 piese tocmai ca să arunce el una — așa avea de unde trage fără să fi aruncat. Al doilea, mai urât: aceeași piesă era și atu pe masă, și a cincisprezecea din mâna celui care începe — o singură piesă, numită în două locuri. Pe masă se ștergea (o punea suportul peste ea), iar cine ar fi „ridicat atu-ul" l-ar fi primit a doua oară în mână. Acum atu-ul rămâne al mesei, a cincisprezecea piesă vine din grămadă, iar masa începe curată. **Verificat**: 240 de împărțiri, cu 2, 3 și 4 jucători — mereu 106 piese, niciuna repetată, unul cu 15 și ceilalți cu 14, nimic aruncat, iar atu-ul în nicio mână.
- 🖐️ **Cine începe ținea 15 piese și tot mai putea trage.** Jocul dă a cincisprezecea piesă celui care începe: el trebuie să arunce una și să rămână cu 14, ceilalți primesc câte 14 (șapte și șapte). Numai că oprirea de la tras se uita doar la „am tras deja", nu și la câte piese ai în mână — așa că puteai trage încă una și ajungeai la șaisprezece. Iar covorașul de la locul de aruncat se aprindea roșu, fiindcă întreba tot „ai tras?", deși jocul însuși îngăduia aruncarea cu 15 piese. Acum: cu 15 în mână nu se mai trage, covorașul e verde, iar scrisul de deasupra mesei te trimite la aruncat, nu la grămadă.
- 🤖 **Calculatoarele etalau din prima tură, deși omului îi era oprit.** Regulile Remi Etalat nu îngăduie etalarea în prima tură, iar omul primea mesajul cuvenit când apăsa „Etalează" — dar calculatoarele n-aveau oprirea asta și își coborau combinațiile chiar din primul tur. Acum regula e a tuturor. **Verificat**: în două partide la rând, până s-a întors rândul la mine, pe masă n-a apărut nicio piesă etalată.
- 📐 **Etalările ieșeau din cadru și nu se mai vedeau cele puse ultima dată.** Rândurile aveau o mărime fixă, dar locul de pe postav nu crește odată cu ele: după vreo șase-șapte combinații treceau de marginea cadrului, iar pe telefon — ținut în picioare, pe tot ecranul — cădea afară și numele din stânga, și ultimele rânduri coborâte, adică tocmai cele care contează. Acum nu mai punem o mărime fixă: socotim cât loc e între grămezi și suportul tău, și micșorăm tot ce s-a etalat până încape. Când sunt puține, stau mari; când se adună, se strâng — dar rămân toate la vedere. Mai jos de 0,42 din mărimea lor nu coborâm (dedesubt nu s-ar mai citi cifrele); dacă vreodată nici așa n-ar încăpea, se arată ultimele rânduri, nu primele. **Măsurat** pe telefon, pe tot ecranul: la 34 de combinații (168 de piese) tot ce s-a etalat stă în cadru, la 0,84 din mărime, cu numele întregi în stânga; înainte, numele se tăia la marginea ecranului.
- 🃏 **Atu-ul nu se putea lua nici când chiar închideai cu el.** Jocul cerea, pe drept, ca atuul să se ridice doar dacă închizi cu el — dar socotea greșit dacă închizi. Se uita numai la combinațiile MELE de pe masă, deși, o dată etalat, ai voie să pui pe ale oricui: chiar așa lucrează adăugarea de piese, care nici nu se uită la cine e stăpânul combinației. Și cântărea fiecare piesă rămasă separat, așa că nu vedea că două piese pot intra în ACEEAȘI combinație — un 6 și pe urmă un 7 peste „2 3 4 5". Acum chiar așează piesele, una câte una, pe combinațiile de pe masă, ale oricui, și tot reia cât timp mai intră ceva.

## [1.105.0] – 2026-08-24

### Added

- 🏷️ **Scrie a cui e fiecare etalare.** Pe o masă cu patru oameni etalați, rândurile de pe postav se amestecau și nu mai știai care combinație e a cui. Acum combinațiile se strâng pe jucători, iar în stânga primului rând al fiecăruia stă numele lui, scris cu galben. Cine n-a etalat nimic n-are nume pe masă.
- ➕ **Completezi o etalare trăgând piesa peste ea.** Aveai 8-9-10-11-12-13 pe masă și 7-ul potrivit în mână, dar n-aveai cum să-l cobori. Acum îl tragi peste suită: cât îl ții deasupra, sub combinație se aprinde un covoraș — **verde** dacă piesa se lipește, **roșu** dacă nu — și când dai drumul, piesa intră la locul ei. Dacă e roșu, se întoarce pe suport, ca să știi de ce n-a mers.
- 🗑️ **Arunci lăsând piesa pe teanc, nu apăsând un buton.** Tragi piesa peste locul de aruncat: dacă acum e vremea aruncării, se aprinde **verde** și, când ridici degetul, piesa pleacă singură din mână pe teanc — cum ai lăsa-o din mână pe masă. Dacă nu e vremea ei, se aprinde roșu și piesa se întoarce pe suport.
- 🌙 **Tema închisă aprinde lampa deasupra mesei.** Pe întuneric, camera din jur se stinge și rămâne becul de deasupra postavului: mijlocul mesei luminat, colțurile pierdute în umbră, abajurul aprins pe dinăuntru. Tema deschisă rămâne exact cum era. **Măsurat**: postavul coboară de la 193 la 140 (din 255), iar raportul dintre mijloc și colț urcă de la 1,65× la 2,92× — adică se strânge un cerc de lumină, nu se face doar „mai închis". Conul becului nu se strânge mai mult de 38°: cercul are vreo 90 cm, cât să prindă și suportul tău, că degeaba atmosfera dacă nu-ți mai citești cifrele.

### Changed

- 🤖 **Adversarii își țin piesele ca oamenii, nu ca un teanc.** Piesele lor erau înșirate una lângă alta, împinse în capătul din stânga al suportului: ieșea un bloc compact, care nu semăna cu o mână de joc. Acum fiecare adversar își rupe piesele în două-trei grămăjoare, cu goluri între ele, așezate pe la mijlocul suportului — și le rearanjează singur de câte ori trage sau aruncă. Așezarea iese dintr-un zar cu sămânță legată de numele jucătorului și de câte piese are, deci nu tremură între cadre, iar doi adversari nu stau la fel. Fețele rămân ascunse ca până acum: piesele lor n-au chip pe niciuna dintre părți.
- 🃏 **Atu-ul stă lângă grămezi.** Era împins spre marginea mesei, departe de teancul din care tragi. Acum stă la un deget în dreapta grămezilor, unde-l vezi fără să-l cauți.
- 🎛️ **Butoanele au intrat în scenă, jos peste masă; rândul de sub masă s-a stins.** „Etalează", „Aruncă", cele două duble și sortările („Grupe", „Suite") stau acum într-o fâșie peste marginea de jos a mesei, iar **„Reguli" e un buton rotund în colț, la îndemână tot timpul** — inclusiv pe tot ecranul, unde rândul de dedesubt nu se vedea deloc. Butoanele nu sunt altele, ci chiar cele vechi, mutate: își păstrează legătura cu jocul și felul în care se aprind și se sting singure. Fâșia prinde toată lățimea, dar lasă apăsările să treacă prin ea — numai butoanele opresc degetul, restul rămâne masă. **Măsurat**: cu toate șase aprinse deodată, niciunul nu calcă pe locurile de pe suport, nici pe calculator (0 din 510 puncte), nici pe telefon (0 din 335).

### Fixed

- 👁️ **Covorașul de sub etalare nu se vedea deloc.** Trei lucruri deodată: era desenat sub fața postavului (îngropat în el), era întins pe axa greșită — rămânea un pătrățel de un centimetru pe lângă combinație — și se topea în postav. Acum stă deasupra postavului, se întinde cât combinația plus un deget de margine, și e verde crud, aproape fosforescent: ce pierdea culoarea nu era nuanța, ci transparența — un verde potolit la 0,45 se pierdea, ăsta, la 0,9, iese din postav.
- 📱 **Fâșia de butoane se rupea pe două rânduri pe telefon și cădea peste suport.** Era așezată cu „left: 50%" și trasă înapoi la mijloc; așa, lățimea unei cutii puse absolut se strânge la cât loc mai e până la marginea din dreapta — pe telefon ieșeau 204 pixeli, deși avea voie la 334, iar butoanele se rupeau pe două rânduri, al doilea cădea peste suport și-ți fura tragerile. Pe calculator era destul loc și nu se vedea nimic. Acum fâșia prinde toată lățimea și își adună butoanele la mijloc.
- 🔤 **Numele jucătorului cădea peste primele piese ale etalării.** Scrisul e centrat pe punctul lui, iar punctul era pus la un decalaj fix de capătul rândului — așa că, cu cât numele era mai lung, cu atât intra mai mult peste piese și nu se mai citeau nici cifrele, nici culorile. **Măsurat**: „Jucător 1" se termina la −0,189 m, iar prima piesă începe la −0,216 m — adică scrisul stătea 2,7 cm peste ea. Acum numele e aliniat la dreapta: capătul lui se așază la 2 cm de combinație, oricât de lung ar fi. Galbenul s-a închis până la chihlimbar (`#a06400`): unul deschis se citea ca încă o piesă când te uiți de departe, fiindcă piesele sunt albe-gălbui.

## [1.104.0] – 2026-08-24

### Fixed

- 🖐️ **Mutatul pieselor nu mergea pe telefon — browserul ne fura gestul.** Pânza mesei era lăsată cu `touch-action: manipulation`, adică browserul avea voie să socotească tragerea drept derulare sau ciupire de-a lui: o lua la jumătate și ne trimitea „gest anulat". Se vedea ca „piesele nu se mută" și ca o privire care abia se clintea la două degete. Acum gesturile de pe masă le ducem noi până la capăt (`touch-action: none`). **Măsurat**: cu două degete, privirea urcă de la 53° la 66°, în loc de 0,8° cât se mișca înainte.
- 🎯 **Piesa se prinde chiar dacă degetul nu nimerește plăcuța.** Piesa are 26 pe 40 de milimetri, degetul acoperă mai mult; dacă raza nu atingea exact plăcuța, nu se apuca nimic. Acum, când raza dă greș, se ia piesa **din locul peste care a căzut degetul**.
- ↕️ **Piesa trece dintr-un rând în celălalt** al suportului, trasă cu degetul — verificat: din locul 0, de sus, în locul 27, de jos.

### Changed

- 👆 **Pe telefon, privirea se mișcă numai cu două degete.** Un deget e al pieselor, întotdeauna. Până acum, dacă atingerea aluneca pe lângă plăcuță, ajungeai să învârți masa în loc s-o muți — și părea că mutatul nu merge. Cele două degete și **apropie** masa, ciupind. Cu mouse-ul rămâne cum era: ținta e ascuțită și n-ai al doilea deget.

---

## [1.103.1] – 2026-08-24

### Fixed

- 🪟 **Regulile — și orice altă fereastră de dialog — se deschideau SUB scena pe tot ecranul.** Bootstrap le așază la 1055 în teancul paginii, iar scenele pe tot ecranul le-am pus la 1400–1500: apăsai „Reguli" și nu se întâmpla nimic la vedere, deși fereastra chiar se deschisese, doar că dedesubt. Le-am ridicat deasupra a tot ce ține de paginile astea. Greșeala era **la toate trei** paginile cu ecran întreg — **Remi**, **Biliard** și **Stele** — fiindcă toate trei au primit aceeași aranjare; la biliard și la stele s-ar fi văzut la fel: regulile, „ai câștigat" și orice întrebare.

### Notes

- Verificat pe toate trei nu doar că fereastra „e deschisă" — un lucru poate fi deschis și complet acoperit — ci întrebând pagina **ce se află chiar sub deget în mijlocul ecranului**. Pe toate trei răspunde acum ceva din fereastră.

---

## [1.103.0] – 2026-08-24

### Changed

- 🀄 **Se trage întinzând mâna pe masă, nu apăsând un buton.** Când e rândul tău, apeși pe **grămadă** ca să tragi de acolo, sau pe **piesa de jos** ca s-o iei pe aceea — direct pe masă, cum ai face la o masă adevărată. Atu-ul se ia tot așa, dacă regula îți dă voie. Butoanele **„Trage din Grămadă"** și **„Trage de Jos"** au fost scoase din rândul de jos: nu mai aveau ce face. Hotărârile (dacă e rândul tău, dacă n-ai tras deja, dacă atu-ul se poate lua) rămân tot la joc — apăsarea doar bate la ușă.
- 🧭 **Cât e rândul tău și n-ai tras încă, scrie pe pastilă de unde se trage.** O grămadă de piese nu se anunță singură că se poate apăsa pe ea, iar butoanele care spuneau asta nu mai există.

### Added

- ⚖️ **Piesele stau la mijlocul suportului.** Locurile sunt douăzeci, dar în mână ai paisprezece: până acum se îngrămădeau toate în stânga, ca și cum ai ține mâna strâmb. Acum rândul e împins cât să cadă la mijloc, **păstrând golurile dinăuntru** — că acelea le lași dinadins, ca să-ți desparți grupele. Locul căutat la tragerea cu degetul ține seama de aceeași împingere, altfel ai apuca alături de unde te uiți.

### Fixed

- 🃏 **O piesă din mână nu mai poate fi trasă în mijlocul mesei.** O piesă e un singur obiect, ținut minte după numărul ei; dacă jocul o numește din greșeală în două locuri deodată, cel așezat ultimul îi lua locul, iar piesa fugea de pe suport în locul atu-ului. Acum suportul se așază **la urmă**, deci în cazul acela piesa rămâne acolo unde omul se așteaptă s-o găsească și de unde o poate apuca.

---

## [1.102.0] – 2026-08-24

### Changed

- 🀄 **Remi se joacă numai pe masa în 3D.** Masa plată și butonul care comuta între ele au fost scoase: nu mai ai două înfățișări între care să alegi, ci una singură, cea adevărată. Rămân doar butoanele de comandă, care oricum n-au ce căuta pe masă. (Dacă placa video nu poate porni masa, pagina se întoarce singură la cea plată — e o plasă de siguranță, nu o alegere.)

### Added

- ✋ **Piesele se mută cu degetul, direct pe suport.** Apeși scurt pe o piesă și o alegi, ca până acum; tragi de ea și o duci în alt loc de pe suport — se ridică deasupra rândului cât o porți, și se așază unde o lași. Mutarea o face tot jocul, prin **aceeași funcție** folosită și de tragerea de pe masa plată. Rearanjatul nu ține de tură: și înainte îți puteai pune mâna în ordine oricând, iar așteptarea e tocmai timpul potrivit.
- 👀 **Privirea se ridică și se coboară.** Tragi cu degetul pe masă, în afara pieselor: în jos ridici privirea și te apropii de propriul suport, în sus o cobori și vezi masa toată, cu ceilalți jucători. Cadrul se strânge singur pe măsură ce urci — altfel „de sus" ar însemna doar mai departe, nu mai aproape de piesele tale. Măsurat: de la 38° din pornire, până la 58° tras în jos și 25° tras în sus.

### Fixed

- 🎯 **Locul de apucat și cel de pus nu se potriveau.** Plăcile nevăzute după care jocul află în ce loc de pe suport ai apăsat stăteau culcate ca niște tăvi, în timp ce piesele stau în picioare — așa că raza le atingea în locuri prin care nu trecea nicio piesă: apăsai pe suport, jocul afla locul, dar nu găsea nimic de luat. Acum plăcile stau exact acolo unde stau piesele.

---

## [1.101.0] – 2026-08-13

### Added

- 🀄 **Remi se joacă acum pe o masă adevărată, în trei dimensiuni.** Masă de lemn cu postav verde, patru **suporturi cu două trepte** de jur împrejur — cel din spate mai înalt, ca rândul al doilea să se vadă peste primul, exact ca suportul de acasă — și piese de plastic cu colțuri rotunjite, stând rezemate pe spate, înclinate cât să le citești stând pe scaun. Cifrele sunt tipărite colorat pe fildeș, nu piese colorate cu totul: un rând de plăcuțe țipătoare ar ascunde tocmai cifrele. Grămezile din mijloc stau cu fața în jos, piesele aruncate cu fața în sus, iar suporturile celorlalți arată numai spatele pieselor.
- 🖐️ **Piesele se mută ca pe masă**, nu sar dintr-un loc în altul: fiecare alunecă la locul ei, iar cea aleasă se ridică puțin deasupra rândului, ca și cum ai ține degetul pe ea.
- ⛶ **Pe tot ecranul**, cu butoanele jocului la îndemână. Masa ia toată fereastra, antetul se dă la o parte, iar **butoanele de joc — trage, aruncă, etalează, sortează — plutesc peste ea, jos**, în loc să rămână sub pagină. Sunt aceleași butoane din panou, doar mutate: dacă le-am fi făcut încă o dată, una din cele două copii ar fi rămas cândva în urmă. Sus rămâne scris al cui e rândul, fiindcă panoul cu scrisul nu se mai vede. Se iese cu același buton sau cu Esc.
- 🔍 Butoane pentru apropiat și depărtat, și unul care **întoarce la masa plată** oricând.

### Notes

- Cifrele sunt cele adevărate, luate de la o cutie de remi: piesa are **26 × 40 mm** și 8 mm grosime, suportul **52 cm** — două rânduri a câte 20 de piese — iar masa 1,4 m, cât să încapă patru suporturi în jurul ei.
- Regulile, împărțeala, jocul cu calculatorul și cel în rețea **n-au fost atinse**: `remi.js` a rămas stăpân pe joc, iar masa în 3D doar arată ce spune el. Dacă placa video nu poate, pagina rămâne exact cum era.
- Pe telefon, ținut în picioare, masa nu se încadrează întreagă, ci doar partea cu care ai treabă — suportul tău și mijlocul mesei. Cu masa toată în cadru, piesele ar ieși cât niște firimituri și nu s-ar mai citi cifrele de pe ele; iar abajurul lămpii, care de sus cade fix între ochi și masă, se dă la o parte.
- **Rămâne de făcut**: rearanjarea pieselor pe suport prin tragere cu degetul merge deocamdată numai pe masa plată. Alegerea unei piese, în schimb, merge direct în 3D.

---

## [1.100.0] – 2026-08-13

### Added

- ✳️ **Numele constelațiilor, pe butonul lor.** Butonul **✳** aprinde desenul figurilor, curat, fără scris peste cer. Odată aprins, lângă el apare **A**: acela pune și numele — toate cele **88**, în românește (Carul Mare, Lebăda, Săgetătorul, Coroana Australă), fiecare scris la mijlocul figurii ei, acolo unde te uiți când o cauți, nu în centrul hotarelor oficiale. Numele sunt aceleași ca în pagina Gravitație, ca să nu se cheme altfel același lucru pe două pagini ale aceluiași site. Se întunecă odată cu tot cerul când trec sub orizont, iar când stingi liniile pleacă și ele, cu tot cu buton — n-ar avea ce numi.

---

## [1.99.3] – 2026-08-13

### Fixed

- 🧭 **Cerul se zbătea stânga-dreapta când urmăreai cu telefonul — ascultam două busole deodată.** Telefonul își spune orientarea în două feluri: `deviceorientationabsolute`, socotit față de **nordul adevărat**, și `deviceorientation`, socotit față de un **zero ales la întâmplare** când s-a deschis pagina. Pe Android sosesc amândouă, pe rând, iar aplicația le lua pe amândouă de bune și scria în același loc — așa că privirea sărea între două direcții fără nicio legătură, de câteva ori pe secundă. **Măsurat**, cu cele două vești pentru aceeași poziție a telefonului: azimutul se zbătea între **36° și 263°**; acum stă neclintit la o singură valoare. Aplicația alege acum un singur izvor și rămâne la el — cel absolut are întâietate, fiindcă numai el știe unde e nordul; pe iPhone, unde „absolute" nu există, busola vine oricum în veste.
- 🔄 **Trecerea între „privire liberă" și „urmărește telefonul" nu mai mută cerul.** Privirea liberă pornea de la niște valori vechi, în timp ce camera stătea unde o lăsase telefonul — așa că prima atingere smucea cerul în altă parte. Acum fiecare mod îl preia pe celălalt de unde l-a lăsat, în ambele sensuri, iar la revenirea pe girsocop prima măsurătoare se ia dintr-o dată, fără să mature cerul până acolo.
- 🖐️ **Tragerea cu degetul nu mai poate rămâne agățată**: se încheie la ridicarea degetului, la anulare, la pierderea capturii și când pagina trece în fundal, iar al doilea deget e lăsat ciupitului în loc să se bată cu el.

### Notes

- Ce am putut măsura și ce nu: legănarea din girsocop, trecerile dintre moduri și tragerea cu degetul au fost verificate cap-coadă. Blocajul cardanic (temerea că, ridicat drept spre cer, telefonul își pierde socoteala) a fost **cercetat și exclus** — la un tremur de 0,25° al senzorului, direcția se mișcă tot cu 0,22°, la orice înclinare, inclusiv drept în sus.

---

## [1.99.2] – 2026-08-13

### Fixed

- ⭐ **Stelele clipeau când priveai cu telefonul — erau desenate prea mici.** Steaua era un punct de unul-doi pixeli, iar deosebirea dintre una strălucitoare și una slabă o făcea **mărimea**. Un punct atât de mic nu prinde de fiecare dată centrul unui pixel: la cea mai mică mișcare a privirii se stinge și se aprinde. Cu degetul nu se vedea, fiindcă privirea stă pe loc până tragi de ea; cu girsocopul, senzorul trimite măsurători de vreo șaizeci de ori pe secundă, fiecare cu puțin zgomot, deci privirea nu stă locului nicio clipă — și toate stelele tremurau între pixeli. Acum niciun punct nu coboară sub un prag de mărime, iar deosebirea dintre stele o duce **puterea culorii**, care nu pâlpâie. Marginea punctului nu se mai taie deloc: pe un punct de doi pixeli, tăierea marginii îl putea face să dispară cu totul.
- 🤚 **Privirea cu telefonul e mai așezată**: orientarea de la senzor nu se mai ia de-a gata, ci se alunecă lin spre ea. Zgomotul, fiind în ambele părți, se stinge singur; mișcarea adevărată trece mai departe.

### Notes

- **Măsurat** cu telefonul mișcat ca în mână — o rotire lină peste care se pune tremurul senzorului — urmărind vreo douăzeci de stele cadru cu cadru și numărând de câte ori se sting și se aprind: înainte, **8 stele din 21 clipeau, cu 116 stingeri**; după, **niciuna, zero stingeri**.
- Cele două îndreptări au fost cântărite separat, ca să știm care a fost de fapt vinovatul: cu punctele mari dar **fără** netezire — zero clipiri; cu netezire dar **cu punctele mici** — tot 8 stele clipind. Deci mărimea era pricina, iar netezirea e un adaos care face privirea mai liniștită, nu leacul.

---

## [1.99.1] – 2026-08-13

### Fixed

- ✨ **Planetele și Luna pâlpâiau când te uitai în jur cu telefonul.** Două greșeli, una peste alta. Întâi, calota întunecată a pământului de sub picioare era **mai în afară decât planetele** — deci nu le acoperea deloc pe cele apuse, ci le lăsa să se vadă în fața ei. Apoi, ordinea în care se desenează lucrurile străvezii era lăsată pe seama plăcii video, iar ea o hotărăște după depărtarea de cameră; cum mijlocul calotei cade fix pe ochiul privitorului, adâncimea ei ieșea zero și sărea la cea mai mică mișcare. De aici pâlpâirea: aceeași planetă acoperită într-un cadru și descoperită în următorul, cum întorceai telefonul. Acum calota e înăuntru, iar ordinea desenului e scrisă în cod, nu ghicită. **Măsurat**, rotind telefonul de jur împrejur: strălucirea lui Jupiter sărea între 386 și 718 puncte aprinse (o îndoire); acum stă între 542 și 618, iar ce rămâne e schimbarea firească de perspectivă, nu un salt.
- 🌌 **Sub orizont se vede mai limpede.** Pământul de sub picioare e acum mai străveziu (de la 88% la 60%), ca să se distingă bine planetele apuse și stelele de sub orizont, fără să se piardă linia orizontului.
- ⏱️ **Pozițiile se împrospătează la zece secunde**, nu la un minut. Rotația cerului se făcea oricum la fiecare cadru; acum nici pasul planetelor nu se mai simte — la zece secunde, Luna, cea mai grăbită, se mută sub o sutime de grad.

---

## [1.99.0] – 2026-08-13

### Added

- 🔭 **Stele îți spune ce privești.** Ăsta e, de fapt, rostul aplicației: ții cruciulița pe o stea și numele ei apare dedesubt, de la sine — steaua, magnitudinea și constelația din care face parte. Pentru stelele fără nume propriu spune măcar de unde sunt („o stea din Orion"), fiindcă tot e mai mult decât nimic. Planetele, Soarele și Luna au întâietate față de stelele din jur, iar Luna vine cu cât e de luminată și la câți kilometri e.
- 🌟 **Numele din popor**, acolo unde există cu adevărat: Venus e **Luceafărul** — și chiar *de seară* sau *de dimineață*, socotit din partea în care se află față de Soare, nu ghicit. Ursa Mare e **Carul Mare**, Polaris e **Steaua Ciobanului**, Pleiadele sunt **Cloșca cu pui**, iar brâul lui Orion e **Cei Trei Crai**.
- ✳️ **Liniile constelațiilor, la un buton** — toate cele 88 de figuri, aduse o singură dată de pe internet. Dacă nu se pot aduce, ți-o spune, în loc să tacă.
- ⛶ **Pe tot ecranul**, pentru cerul de afară: antetul și lămuririle se dau la o parte, cerul ia toată fereastra, iar jos rămân doar butoanele cu care ai treabă. Cât ești pe tot ecranul, **telefonul nu se mai stinge** — altfel, cum stai cu el ridicat fără să-l atingi, ecranul ar adormi în jumătate de minut și n-ar folosi la nimic.

### Notes

- Recunoașterea a fost pusă la încercare pe **15 stele știute** — Sirius, Vega, Betelgeuse, Rigel, Arcturus, Polaris și celelalte: ochind exact pe coordonatele fiecăreia, aplicația le-a numit corect pe toate. A șaisprezecea „greșeală" era de fapt un răspuns bun: pe 13 august Soarele trece la 0,6° de Regulus, iar aplicația a spus „Soarele", ceea ce e adevărat.
- Cât cântărește strălucirea față de depărtarea de centru se strânge singură pe măsură ce apropii imaginea. Cu o valoare fixă, ochind pe Alnitak primeai numele vecinei ei, Alnilam, de la un grad și jumătate.

---

## [1.98.1] – 2026-08-13

### Fixed

- 🔓 **Stele dădea vina pe telefon când, de fapt, pagina era deschisă prin `http`.** Girsocopul și locația se dau numai pe „legătură sigură": `https` sau `localhost`. O adresă de rețea locală — `192.168.ceva`, adică exact cum deschizi site-ul pe telefon când îl încerci de pe calculatorul de acasă — **nu** se pune, deși pare la fel de aproape. Browserul închide senzorul înainte ca telefonul să apuce să spună ceva, iar aplicația scria „telefonul ăsta nu are girsocop", ceea ce trimitea omul să caute o defecțiune care nu exista. Acum spune limpede că e vorba de `http`, arată și un chenar cu ce se poate face, iar cerul, lista și privirea liberă merg mai departe ca înainte.

---

## [1.98.0] – 2026-08-13

### Added

- ⭐ **Stele — cerul de deasupra ta, ținut în mână** (`/stele`, și pe scurt `/cer`, `/planete`, `/astronomie`). Ridici telefonul spre cer și plimbă-l în jur: vezi **planetele, Soarele, Luna și toate stelele** până la magnitudinea 5,2, fiecare la locul ei adevărat, pentru ceasul și locul în care stai. Te întorci cu spatele și le vezi pe cele din spate; cobori telefonul spre picioare și le vezi pe cele **apuse**, sub orizont, cu pământul întunecat între tine și ele.
- 🧭 **Merge și fără girsocop**: „privire liberă", cu degetul sau cu mouse-ul, ciupit ca să apropii — deci se poate umbla prin cer și de pe calculator. Dacă telefonul spune că are girsocop dar nu trimite nimic, aplicația se întoarce singură la privirea liberă și o spune, în loc să lase un cer înțepenit.
- 📍 **Fără locație, cerul e socotit de la 0°, 0°** — la ecuator, pe meridianul zero — și scrie limpede că e doar aproximativ. Cu locația pornită (sau cu un oraș ales din listă) se potrivește **una la una** cu cerul de afară, iar bara de sus îți spune exact cât de adevărat e ce vezi.
- 🔭 **Lista corpurilor** arată pentru fiecare încotro e și la câte grade, inclusiv pentru cele apuse („18° sub orizont"). O apeși și, în privire liberă, te duce chiar acolo.
- ⚙️ Pentru telefoanele fără busolă adevărată există **potrivirea nordului** din două butoane: te întorci cu fața spre nord și rotești cerul până se așază.

### Notes

- Efemeridele sunt cele de la JPL, aceleași din pagina Gravitație, iar Luna se socotește după formulele scurte ale lui Meeus. **Verificat** față de valori știute din altă parte: poziția Soarelui la J2000 (abatere sub 0,01°), timpul sideral la Greenwich, ziua siderală de 23h56m04s, Steaua Polară la nord la înălțimea latitudinii, Soarele exact la sud la trecerea meridianului (și la nord, în emisfera sudică), luna sinodică de 29,53 zile și perioada sinodică a lui Marte de 780 de zile.
- Cele două drumuri spre aceeași poziție pe cer — formula de înălțime/azimut și matricea care rotește tot globul ceresc — dau **același rezultat**, iar matricea are determinantul +1. Fără verificarea asta, o greșeală de semn ar întoarce cerul în oglindă și nu s-ar vedea până n-ai căuta o stea anume.

---

## [1.97.0] – 2026-08-13

### Fixed

- 🎯 **Bila trecea prin bila țintă la lovituri tari.** Ăsta era motivul pentru care bila „nu mergea pe linia arătată". Jocul muta bilele cu tot drumul lor dintr-un singur salt, apoi „rezolva ciocnirile" de opt ori — dar de opt ori în același loc, fiindcă între treceri nimic nu se mai mișca. La putere mare bila albă face vreo 40 de unități într-un cadru, iar o bilă are 18 de-a curmezișul: albă sărea curat peste țintă. **Măsurat, la lovitură maximă: ciocnirea era băgată în seamă abia la 29 de centimetri dincolo de bila țintă**, care apoi pleca aiurea. Acum drumul e împărțit în pași scurți, niciunul mai lung de o jumătate de rază, cu ciocnirile căutate după fiecare pas — **ciocnirea cade la 2–3 mm de unde arată linia, la orice putere**. Buzunarele se verifică tot la fiecare pas, ca o bilă iute să nu mai treacă peste gura lor fără să cadă.
- 🖐️ **Mișcatul mesei putea trimite bila fără voie.** Dacă primul deget nimerea lângă coada tacului, jocul credea că tragi de el: masa se rotea, iar la ridicarea degetelor pleca lovitura. Acum, de cum atinge ecranul al doilea deget, gestul e al camerei — lovitura începută se anulează, iar tacul se pune înapoi unde privea, fiindcă prima atingere îl mutase deja.
- 🧭 **Ochirea sărea singură la 45° dacă apăsai pe lângă masă.** Când raza nu atingea postavul — se întâmplă privind masa de aproape și apăsând deasupra benzii — codul cădea pe socoteala mesei plate; dar aceea e ascunsă în 3D, deci are lățimea zero, iar împărțirea la zero dădea infinit și mereu același unghi. Acum o apăsare pe lângă masă pur și simplu nu ochește nimic.
- 📏 **Linia de ochire nu mai promite bandă acolo unde e buzunar.** Ține cont de golurile dintre benzi, ca fizica, și se oprește în buzunar dacă drumul intră într-unul.

---

## [1.96.0] – 2026-08-13

### Added

- ✋ **Poți plimba privirea peste masă, nu doar s-o întorci.** Cele două degete învârteau masa în jurul mijlocului ei și atât — dacă te apropiai, nu mai aveai cum să te muți în altă parte a mesei. Butonul nou de lângă cele de privire spune ce fac cele două degete: **întorc masa** (cum era, și așa rămâne la început) sau **plimbă privirea**. Amândouă deodată nu se poate — degetul singur e al ochirii, iar cele două nu pot face două lucruri în același timp. Ciupitul rămâne la fel, apropie și depărtează. Pe calculator, butonul drept al mouse-ului face ce spune butonul.
- 🧭 **Nu te poți rătăci.** Privirea plimbată se oprește la marginea mesei, iar oricare dintre butoanele de privire te aduce înapoi la mijloc.

### Fixed

- 🎛️ **Butoanele „ecran întreg" și „reguli" mutau și camera.** Stau în același rând cu cele de privire și poartă aceeași clasă, iar codul le lua pe toate la grămadă: o apăsare pe ecranul întreg reașeza camera și stingea semnul de pe privirea aleasă. Acum se caută doar butoanele care chiar spun un unghi de privire.

---

## [1.95.1] – 2026-08-13

### Fixed

- 🎱 **Tacul stătea întors, cu coada groasă lipită de bilă.** Cilindrul din care e făcut primește întâi raza dinspre un capăt, iar răsucirea care culcă tacul pe orizontală duce acel capăt tocmai în partea opusă bilei — deci razele trebuiau date invers față de cum pare firesc. Acum vârful subțire atinge bila albă, iar coada se duce în spate.
- 👀 **Liniile de ochire se vedeau abia-abia.** Erau linii de-ale plăcii video, iar acelea se desenează întotdeauna de un singur punct de ecran — pe un telefon cu ecran des, un fir de păr — și pe deasupra erau albicioase, adică aproape de culoarea postavului. Acum sunt panglici întinse pe masă, late cât un sfert de bilă, fiecare cu un contur întunecat dedesubt ca să se citească și pe verdele luminat de sub lampă, și prin colțurile rămase în umbră. Albul arată drumul bilei albe, albastrul unde pleacă ea după ciocnire, chihlimbarul unde pleacă bila lovită. Bila-fantomă e un inel gros, nu un cerculeț.
- 📐 **Liniile rămân la fel de late din orice unghi.** Privite de la nivelul postavului — adică exact când ochești — panglicile culcate pe masă se turteau până dispăreau. Acum se lățesc pe atât pe cât le turtește unghiul, fără să se ridice de pe masă.

---

## [1.95.0] – 2026-08-13

### Added

- ⛶ **Biliardul se joacă pe tot ecranul.** Butonul din colțul mesei dă antetul și subsolul la o parte și lasă masa să ia toată fereastra. Sus rămâne tot ce trebuie știut: numele jucătorilor, cine e la rând, ce bile are fiecare și **scorul** — câte din cele șapte a strâns, iar cine a rămas doar cu neagra vede scris „NEAGRA". Se iese cu același buton sau cu Esc. Pe iPhone, unde browserul nu dă ecran întreg decât filmelor, aranjarea rămâne aceeași — doar bara browserului nu dispare.
- ℹ️ **Regulile, la un buton lângă masă**, ca să fie la îndemână și în ecranul întreg, unde rândul de sub masă nu mai încape.
- 🎯 **Buzunarul cerut de regula „neagra în buzunarul opus" se vede din nou.** Semnul era un cerc desenat peste masa plată; de când masa e în 3D, acolo nu se mai vedea nimic. Acum e un inel galben care pâlpâie încet, chiar pe buzunarul cerut.

### Fixed

- 🎱 **Bilele se rostogoleau invers față de cum mergeau.** Axa în jurul căreia se învârte o bilă care nu alunecă e „în sus" înmulțit vectorial cu direcția ei de mers; era luată cu semn schimbat, așa că bilele se învârteau înapoi în timp ce înaintau — ca roțile de căruță din filmele vechi.

### Notes

- Scorul se vede și în afara ecranului întreg, pe chipul fiecărui jucător, de îndată ce se împart culorile.
- Observație, nu schimbare: frecarea jocului e socotită **pe cadru**, nu pe secundă, deci bilele se opresc mai repede pe un ecran de 120 Hz decât pe unul de 60. Vine de dinainte și n-am umblat la ea — jocul merge bine așa.

---

## [1.94.0] – 2026-08-13

### Added

- 🎱 **Biliardul se joacă acum pe o masă adevărată, în trei dimensiuni.** În locul cercurilor pe o pânză plată e o masă de **nouă picioare** — cea de campionat — făcută după cifrele din regulament: suprafață de joc **2,54 × 1,27 m**, bile de **57,15 mm**, nasul benzii la **36,3 mm** (63,5% din diametrul bilei, cât trebuie ca bila să fie trimisă înapoi pe masă, nu în sus), gura buzunarului **117 mm** la colț și **130 mm** la mijloc. Bilele se rostogolesc cât drumul pe care-l fac, nu alunecă; au numărul scris pe ele și dunga celor de la 9 în sus. Deasupra, lampa cu trei abajururi din sălile de biliard.
- 👁️ **Trei feluri de a privi masa**, din butoanele de sub ea: masa întreagă, de sus (ca înainte, dar în relief) și de la nivelul postavului. Cu butonul drept al mouse-ului — sau cu două degete — o întorci cum vrei; butonul stâng și degetul rămân ale jocului, pentru ochit și lovit.

### Changed

- 📏 **Bila are acum raza adevărată în socoteala jocului: 9 unități, nu 12.** La 800 de unități pentru 2,54 m, o unitate e 3,175 mm, deci o bilă de 57,15 mm are exact 9. Cât era 12, bilele se ciocneau la o distanță pe care ochiul o vede de cum masa e arătată la mărimea ei adevărată. Buzunarele au fost strânse pe măsură (21 și 18 unități, de la 24 și 20).
- 📱 **Pe telefon masa stă în picioare**, pe lungul ecranului, și camera se așază singură după forma ferestrei — nu mai e nevoie să întorci telefonul.
- 🖱️ **O apăsare pe o bilă ochește spre ea.** Înainte deschidea un balonaș cu numărul ei; acum numărul e scris pe bilă și se vede oricum.

### Notes

- Masa în 3D pornește doar dacă placa video poate (three.js/WebGL). Dacă nu poate, pagina rămâne exact cum era, cu desenul plat, și jocul merge la fel — regulile, ciocnirile și partidele online n-au fost atinse.

---

## [1.93.0] – 2026-08-12

### Changed

- 🏠 **„Acasă" e acum ultimul rând din meniu, pe orice pagină.** Într-un meniu stătea la mijloc, iar cine se obișnuise s-o găsească la capăt o căuta degeaba. Verificate toate cele **24 de meniuri** din cod; la **Zodiac** și la **Marihano** nici nu exista (Marihano avea „Home", în engleză) — acum o au și ele, la coadă. Pe pagina de start lipsește dinadins: ești deja acolo.
- 🔢 **Secțiunea „Aplicații" urmează acum ordinea din meniu până la ultima plăcuță.** Rămăsese una pe dos: „Generator 3D" venea după „Cadou Digital", deși în meniu e înaintea lui. Rearanjarea de data trecută o sărise, fiindcă plăcuța aceea are o clasă în plus (`mg-new-item`) și nu se potrivea tiparului.

### Notes

- Verificat în browser, nu doar în cod: pe opt pagini (Jurnal, Confidențialitate, Pădure, Cititor GPX, Zodiac, Șah, Exerciții, Dorințe) ultimul rând din meniu e „Acasă".
- O probă a picat pe bună dreptate, dar din vina ei: căuta textul „Arată explicațiile" în toată pagina jurnalului — iar jurnalul povestește acum chiar că butonul a fost scos. Se aprindea pe propria explicație. Acum caută un BUTON, nu un text.

## [1.92.0] – 2026-08-12

### Changed

- ✂️ **Jurnalul s-a scurtat de cinci ori.** Chiar și cu fiecare versiune pe un rând, o sută cincizeci de rânduri însemnau **25 de ecrane** de derulat pe telefon. Acum la vedere stau **cele 15 versiuni de curând**, iar tot ce a fost înainte se strânge într-un singur rând: „Versiuni mai vechi · de la 1.0.0 până la 1.76.0 · 136 versiuni". Pagina a scăzut la **5,3 ecrane**. Rândurile sunt și ele mai strânse: textul stă pe un rând și, dacă e prea lung, se taie cu trei puncte.
- 🚫 **Scos butonul „Arată explicațiile".** Rămân trei trepte, fiecare la locul ei: rândul versiunii spune ce s-a întâmplat atunci; îl desfaci și vezi rândurile scurte; apeși „de ce?" pe unul și afli povestea lui. Un buton care deschidea tot deodată nu ajuta pe nimeni — readucea exact zidul de text pe care voiam să-l evităm.

### Notes

- Eticheta istoriei a ieșit întâi ciuntă („de la  până la 1.76.0"): luam numărul de la primul și ultimul rând, dar nu orice rând din jurnal are număr de versiune. Acum culegem numerele de la toate și luăm primul și ultimul găsit cu adevărat.

## [1.91.0] – 2026-08-12

### Changed

- 🗂️ **Jurnalul are acum o singură linie pentru fiecare versiune.** Erau **150 de versiuni**, fiecare cu secțiunile ei desfășurate — derulai de sus până jos și nu se mai vedea pădurea de copaci. Acum fiecare versiune e un rând: numărul, data, **ce s-a întâmplat atunci, în cuvinte** (cel mai important lucru din ea) și câte au fost („3 schimbate · 1 reparată"). Desfaci doar ce te interesează. Primele două rămân deschise: de obicei omul vine să vadă ce e nou, nu istoria.

### Notes

- Rezumatul nu e scris de mână nicăieri: se face din chiar jurnalul acesta — vorba îngroșată a primului rând al versiunii, plus numărătoarea pe categorii. Așa rămâne adevărat oricâte versiuni s-ar mai adăuga.
- Sunt trei trepte, de la scurt la lung: rândul versiunii → rândurile ei (doar vorba scurtă) → povestea fiecăruia, cu „de ce?". Plus un buton sus care le deschide pe toate deodată.

## [1.90.0] – 2026-08-12

### Changed

- 📓 **Jurnalul de modificări se citește acum din mers.** Fiecare rând e scris pe îndelete: ce s-a schimbat, apoi de ce, cum am aflat și ce s-a măsurat. Bun de citit la calculator — pe telefon, un zid de text. Acum rămâne la vedere **doar vorba scurtă**, iar povestea se deschide dacă vrei, cu butonul „de ce?" de lângă ea, sau toate deodată. Nu s-a șters nimic: **561 de rânduri** din 928 s-au scurtat, restul erau scurte oricum.
- 🪄 **Bagheta rămâne doar pe prima pagină.** Acolo sunt mișcările pe care le poate opri; pe paginile de jocuri și de aplicații n-avea ce face, iar un buton care nu face nimic e mai rău decât niciunul. Pe ele rămâne doar luna, pentru temă. **Alegerea ta se respectă mai departe peste tot** — dacă ai cerut liniște, o ai și acolo.
- 🔢 **Secțiunea „Aplicații" urmează acum ordinea din „Meniu Aplicații".** Erau aceleași lucruri, în ordini diferite: cine le știa din meniu nu le găsea la fel în pagină. Ordinea o citim din cod, din meniu — nu e scrisă alături, ca să nu rămână în urmă la prima schimbare.

### Fixed

- 📜 **Nu mai apar două bare de derulare când deschizi o fereastră.** Bootstrap oprește derularea pe `body`, dar aici bara e a lui `html` (are înălțime de 100% și conținutul dă pe dinafară), așa că rămânea pe margine, lângă bara ferestrei. Acum se oprește și aceea.

### Notes

- Rearanjarea plăcuțelor s-a făcut cu grijă: între ele stau comentarii (de pildă cel care spune unde au plecat Pădurea și Cititorul GPX). Prima încercare s-a oprit singură, cu „nu rearanjez orbește", fiindcă plăcuțele nu erau lipite una de alta. A doua schimbă **doar plăcuțele între ele**, lăsând tot ce e între ele exact unde era — și verifică la final că bucata are aceeași lungime și că paginile au tot 150 de ancore.

## [1.89.0] – 2026-08-12

### Fixed

- 👻 **Bara de sărituri nu mai stă la vedere tot timpul.** Așezată permanent pe marginea din dreapta, semăna cu a doua bară de derulare și încărca ecranul degeaba. Acum stă nevăzută și se arată **doar când ai treabă cu ea**: cât derulezi, și când apropii mouse-ul la o palmă de marginea din dreapta. După o clipă de liniște se stinge la loc.
- ⬆️ **Titlul și „x"-ul ferestrei urcă sus de tot.** Erau împinși spre mijloc de un gol de **64 de pixeli** — patru rem de spațiu deasupra antetului, rămas de pe vremea când titlul stătea în corpul ferestrei. Acum antetul e chiar sus: golul deasupra titlului a scăzut de la 88 la **23 de pixeli**.

### Notes

- Golul nu l-am ghicit: am măsurat lanțul de cutii al ferestrei și am citit `padding-top: 64px` pe conținut. Era o regulă veche care avea rost atunci, dar nu și acum, după ce titlul a urcat în antet.
- Două probe m-au mințit pe drum și le-am reparat pe ele, nu codul: una măsura transparența **în timpul topirii** (0,485 — nici stinsă, nici aprinsă), alta scria orașul în terminal exact când pagina și-l scria singur, literă cu literă, și-l acoperea.

## [1.88.0] – 2026-08-12

### Fixed

- 🎯 **Titlul ferestrei stă acum în antet, lângă „x", pe același rând.** Stătuse în CORPUL ferestrei, sub antet, iar „x"-ul singur sus-dreapta — așa nu se puteau alinia niciodată, oricâte reguli le-aș fi scris. Le-am pus împreună, în toate cele 15 ferestre, și titlul e la mijloc: „x"-ul are lățime fixă, iar în stânga stă un gol la fel de lat, ca butonul să nu împingă titlul într-o parte. Măsurat: mijloacele lor sunt la **0 pixeli** distanță pe verticală.
- 📱 **Pe telefon, raportul meteo nu se mai taie.** E scris cu spații aliniate, ca la un terminal adevărat — frumos pe monitor, dar pe un ecran îngust rândul cu orele ieșea din cadru. Nu l-am rupt în bucăți (și-ar fi pierdut alinierea): scrie mai mărunt, iar rândurile lungi se plimbă pe orizontală **în** terminal. Pe tot ecranul, terminalul folosește toată înălțimea, fără golul de dedesubt.

### Changed

- 🟢 **Pe telefon, butonul verde face altceva — fiindcă acolo nu există Command Prompt.** O comandă `curl` copiată pe telefon n-are unde să se ducă. Acum butonul îți dă **prognoza însăși**: dacă telefonul știe să „împartă", deschide fereastra de trimitere (WhatsApp, mesaje); dacă nu, o pune în clipboard. Pe calculator rămâne ce era: comanda gata de lipit în Command Prompt.

### Notes

- Titlul îl lipisem întâi sus, în corpul ferestrei, ca să nu fugă la derulare. Era o cârpeală pentru că stătea în locul greșit: mutat în antet, care oricum nu se derulează, regula aceea n-a mai avut niciun rost și a fost scoasă.
- Mutarea în toate cele 15 ferestre s-a făcut numărând înainte și după: 15 titluri rămân 15, iar ancorele paginii rămân 150 — nimic pierdut pe drum.

## [1.87.0] – 2026-08-12

### Changed

- 🎁 **Pe prima pagină, „Reduceri Jocuri" arată acum primele PATRU jocuri gratis acum.** Înainte era un amestec — două gratis, o reducere, unul care vine — și puneai alături lucruri de feluri diferite: vedeai „-90%" și „Curând" acolo unde te așteptai la jocuri gratis. Dacă într-o zi sunt mai puțin de patru gratis, rândul se completează cu restul, dar fiecare fișă își spune felul pe etichetă.
- 🪟 **Ferestrele (video și aplicații) folosesc acum uneltele Bootstrap făcute pentru asta** — centrate și cu derulare înăuntru. Scrisesem întâi reguli de mână și stricasem două lucruri: fereastra fugea în stânga (margini 16 și 784 în loc de 400 și 400), iar pe margine apăreau **două** bare de derulare, a paginii și a ferestrei. Acum e una singură, a ferestrei, iar fereastra stă fix la mijloc.
- 📌 **Titlul ferestrei rămâne la vedere** cât derulezi prin ea. La ferestrele lungi, cu poze și video, derulai puțin și nu mai știai la ce te uiți.
- 📖 **„Despre TutorialEu" cuprinde acum tot site-ul.** Lipseau scurtăturile spre **Natură**, **Gravitație** și **Aplicații online**, iar Natura n-avea niciun cuvânt în text — deși e cea mai nouă parte. Acum are: pădurea de lângă tine, fișierul GPX luat acasă și deschis fără semnal.

- 🧭 **O bară de sărituri pe marginea din dreapta.** Pagina de start e lungă, iar ca să ajungi la o secțiune anume trebuia să te întorci sus, la meniu sau la rândul de butoane din „Despre". Acum ai cuprinsul la îndemână oriunde te-ai afla: un punct pentru fiecare dintre cele **20 de secțiuni**, cu numele la trecerea cu mouse-ul, iar punctul secțiunii în care ești e aprins. Pe ecrane înguste nu apare — ar sta peste conținut și ai apăsa-o din greșeală.
- 🔗 **Toate butoanele din „Despre" duc acum la o SECȚIUNE din pagină.** Cel de chat sărea la altă pagină, deși rândul acela e cuprinsul site-ului; chatul își are secțiunea lui, cu legătura către pagină înăuntru.
- ♊ **Zodiacul, pe calculator: un cartonaș peste altul**, la o lățime de citit (736 px) și la mijloc — nu alături și înghesuite, nici întinse cât toată pagina.

### Fixed

- 🫨 **Terminalul vremii se strângea și se umfla la loc la fiecare căutare.** Prognoza e înaltă, iar „Connecting to satellite…" e un singur rând — așa că fereastra sărea de la înălțimea prognozei la 150 de pixeli și înapoi, ca o pâlpâire. Acum ține minte cea mai mare înălțime avută și nu mai scade sub ea.

### Notes

- Ferestrele: după ce am stricat centrarea cu reguli scrise de mână, le-am trecut pe `modal-dialog-centered` și `modal-dialog-scrollable` — uneltele pe care Bootstrap le are chiar pentru asta. Singurul lucru rămas al nostru e lățimea maximă pe ecrane late; și, fiindcă `max-width` pus peste `margin: auto` fură centrarea, o spunem acum limpede. Verificat: margini 400 și 400.
- Proba pentru „Gratis acum" a picat întâi din vina ei: ofertele se cer de pe alt domeniu, iar răspunsul prefăcut n-avea antetul de voie (CORS), așa că pagina nu primea nimic. Nu era o defecțiune a paginii.

## [1.85.0] – 2026-08-12

### Fixed

- 🧱 **Grila întregului site era stricată, și de aici venea zodiacul urât de pe calculator.** În foaia noastră de stil stătea o copie scrisă de mână a grilei Bootstrap — `.row>*`, `.col-12`, `.col-lg-4`, `.col-md-6` și altele — dar **fără media-query-uri**. Două necazuri din asta: „col-lg-4" se aplica și pe telefon, deși „lg" înseamnă „de la ecrane mari în sus"; iar `.row>*` cu `width: 100%`, venind dintr-o foaie încărcată DUPĂ Bootstrap, bătea `.col-lg-5` (aceeași greutate, dar mai târziu în ordine). Rezultat: pe ecrane mari coloanele ieșeau întinse cât toată pagina, una sub alta. Măsurat înainte și după, pe aceeași pagină:

  | | zodiac | video |
  |---|---|---|
  | **înainte** (1900px) | 1288 + 1288, una sub alta | — |
  | **acum** (1900px) | 537 + 537, una lângă alta | 3 × 432 |
  | **acum** (telefon) | stivuite, cum trebuie | pe toată lățimea |

- 🪟 **Ferestrele (video și aplicații) încap acum pe ecran, iar derularea e ÎN ele.** Creșteau cât conținutul, iar pagina căpăta bară de derulare: „x"-ul ajungea departe sus, videoclipul jos, și derulai pagina de dedesubt în loc de fereastră. Acum fereastra e cât ecranul, titlul și „x"-ul rămân la vedere, iar ce nu încape se derulează înăuntru. Verificat pe amândouă felurile de ferestre.

### Added

- 🏷️ **Fișele de la Reduceri Jocuri prind viață sub mouse**: se ridică, poza se apropie ușor, iar eticheta („GRATIS ACUM", „-90%") tresare, ca să-ți sară în ochi ce contează. Aveau mișcare doar pe telefon, la derulare; pe calculator stăteau ca niște poze.
- 🔘 **Butoanele din secțiuni nu mai arată o linie sub scris la trecerea cu mouse-ul.** Era moștenită de la legături — multe „butoane" sunt de fapt `<a>` — și arăta a link nefinisat. În loc de linie: butonul se ridică, se luminează, iar pictograma din el pleacă înainte, ca semn că te duce undeva.

### Notes

- Copia grilei n-am găsit-o ghicind: am întrebat browserul CARE reguli îi dau lățimea coloanei și din ce foaie vin. A ieșit `.row>*` din `styles.css`, după Bootstrap. Am lăsat o notă în cod, la locul ei, ca să nu fie pusă înapoi din reflex.
- Verificat la trei lățimi (1900, 1280, 390) că zodiacul, „Despre" și Video se așază cum trebuie și că pagina **nu** capătă derulare laterală.

## [1.84.0] – 2026-08-12

### Changed

- 🎬 **Apeși pe prezentare și ecranul coboară din nou din cer**, cu capitolele venind după el — ca la „Despre". Doar cu mișcarea pornită, și fără să încurcăm apăsarea pe un capitol, pe butonul de pornire sau pe video: acelea își au treaba lor.
- 🪄 **Bagheta din bara de sus nu mai arată a buton.** Clasa `btn` a lui Bootstrap îi punea fundal, margine și umbră, așa că stătea într-un dreptunghi lângă lună — care n-are nicio cutie în jurul ei. Acum e curată, și **sub mouse se poartă întocmai ca luna**.

### Notes

- N-am scris reguli noi pentru baghetă, care ar semăna azi cu ale lunii și ar ajunge să difere mâine, când cineva schimbă luna: am **adăugat-o la selectoarele lunii** (șase locuri, inclusiv cele din interiorul media-query-urilor). Singurul lucru scris doar pentru ea e culoarea de când mișcarea e oprită. Verificat că ies identice: același fundal, aceeași culoare, aceeași lipsă de margine și umbră.

## [1.83.0] – 2026-08-12

### Fixed

- 📱 **Pe telefon, videoclipurile se deschideau într-o fâșie îngustă.** Măsurat pe un ecran de 390 de pixeli: cadrul avea **221**. Vinovate erau marginile adunate — fereastră, conținut, corp, container, coloană, fiecare cu ale ei — plus o capcană mai ascunsă: coloana e scrisă `col-lg-8`, iar asta spune ceva **doar de la ecrane mari în sus**. Mai jos rămânea fără lățime pusă și, fiind într-un rând flexibil, se strângea cât textul din ea. Acum cadrul are **364 din 390** de pixeli, adică toată fereastra.
- 🖼️ **Și își păstrează forma.** Cadrul avea o înălțime fixă de 400 de pixeli, care pe telefon dădea o imagine turtită. Acum ține raportul **16:9**, oricât de lat ar fi ecranul.

### Added

- 🎞️ **Secțiunea Video prinde viață.** Plăcile apar una după alta când ajungi la ea, iar sub deget (sau cu mouse-ul peste) se ridică, primesc umbră, și săgeata de „pornește" bate ca o inimă.

### Notes

- N-am ghicit de unde vine îngustarea: am urmărit lanțul de cutii de la cadru până la fereastră și am citit lățimea fiecăreia. Coloana ieșea 221 într-un rând de 332 — acolo era buba, nu la fereastră.
- 61 de verificări în cinci suite, toate trecute.

## [1.82.1] – 2026-08-12

### Fixed

- 🖥️ **Pe tot ecranul, după ce descărcai un GPX, harta rămânea agățată și nu mai răspundea la nimic.** Părea că s-a stricat ecranul întreg. De fapt vorbeai cu o fereastră invizibilă: când harta ține tot ecranul, ea e singurul lucru pe care browserul îl mai desenează, iar întrebarea „Îl deschidem?" stă lipită de pagină — adică ÎN AFARA ei. N-o vedeai deloc, dar perdeaua ei înghițea apăsările. Acum **ieșim întâi din ecranul întreg și abia apoi întrebăm**, cu o clipă de răgaz între ele, cât îi trebuie browserului ca să iasă cu adevărat.

### Notes

- Probă nouă care se preface că harta e pe tot ecranul și cere ca ordinea să fie exact aceasta: întâi ieșirea, apoi întrebarea. Verificat și că harta nu rămâne cu clasa de ecran întreg agățată de ea.

## [1.82.0] – 2026-08-12

### Changed

- 🟢 **Verdele nu mai golește ecranul — îți dă comanda.** Terminalul de pe pagină e o joacă, dar comanda din el e ADEVĂRATĂ: `curl wttr.in/Suceava` merge întocmai în Command Prompt pe Windows. Butonul verde o pune în clipboard, gata de lipit, și-ți scrie dedesubt ce ai copiat și ce să faci cu ea. Spațiile devin `+`, cum cere wttr.in (`Baia+Mare`). Dacă browserul nu dă voie la clipboard, o încercăm pe calea veche, iar dacă nici așa nu merge, îți scriem comanda pe ecran ca s-o poți lua cu ochii — un buton mut ar fi fost mai rău decât niciunul.
- 🔴🟡🟢 **Înapoi la trei buline**, ca la un terminal adevărat. Adăugasem una albastră, de „adu totul înapoi", dar un terminal n-are așa ceva: ce ai șters, ai șters.
- 🖥️ **Pictograma terminalului strâns arată acum a fereastră Windows**: fundal închis, bară de sus cu trei pătrățele și, înăuntru, semnul de prompt `>` cu liniuța care clipește. E desenată din câteva dreptunghiuri, nu adusă ca imagine — merge la orice mărime și nu cere niciun fișier în plus.

### Notes

- Mesajul de confirmare a dispărut prima dată fără urmă: îl pusesem în zona de ieșire, iar scriptul vremii rescrie tot ce găsește acolo când vine prognoza — l-a acoperit prognoza pentru Salcea. Acum stă **sub linia de comandă**, unde nu calcă nimeni. Proba l-a prins pe loc.
- 55 de verificări în patru suite, toate trecute.

## [1.81.0] – 2026-08-12

### Added

- 🪄 **Un buton în bara de sus care oprește TOATĂ mișcarea.** Site-ul are acum multe animații: plăcuțe care se ridică, un ecran video care coboară din cer, un soare care se rotește, un om care râde. Pe un calculator mai vechi sau pe un telefon obosit, toate astea îl fac să se târască. O apăsare le oprește pe toate, dintr-o dată, iar alegerea **se ține minte** — ca tema — și e aceeași pe toate paginile.
- 🤝 **Nu întrebăm de două ori ce s-a spus deja.** Dacă ai cerut sistemului tău „mai puțină mișcare" (din setările telefonului sau ale calculatorului), pagina pornește direct cu animațiile oprite. E aceeași dorință, spusă în altă parte — n-are rost s-o repeți.
- 💃 **Butoanele de la „Despre" dansează**, fiecare cu o clipă după vecinul lui, iar dacă apeși pe secțiune **textul coboară din nou din cer**. Amândouă doar cu mișcarea pornită: în mod ușor nu pornim ceva ce oricum nu se vede și l-ar costa degeaba.

### Notes

- Oprirea e un singur zid de reguli, pus la coada foii de stil ca să bată tot ce e mai sus — și animațiile, și tranzițiile. Fundalurile și culorile rămân: se pierde mișcarea, nu frumusețea. Iar ce se arăta DOAR prin mișcare (textul de la „Despre", ecranul video, cartonașele zodiei) rămâne la vedere, nu dispare odată cu ea — verificat că opacitatea rămâne 1.
- Comutatorul stă în **același `<li>`** cu butonul de temă, fiindcă meniul se rescrie de la zero pe fiecare pagină și doar bucata aceea e păstrată. Pus separat, ar fi dispărut peste tot în afară de pagina de start.
- Prima oară l-am legat prea devreme, înainte ca antetul să fie adus în pagină: butonul încă nu exista, așa că apăsarea lui nu făcea nimic. Proba a arătat-o pe loc (`aria-pressed` rămânea „false"). Acum se leagă exact acolo unde se leagă și butonul de temă.
- 54 de verificări în patru suite, toate trecute.

## [1.80.0] – 2026-08-12

### Added

- 🖥️ **Bulinele terminalului de la „Vremea & Atmosfera" chiar fac ceva.** Erau trei puncte colorate, desen curat, care nu răspundeau la nimic. Acum: **roșu** strânge terminalul într-o pictogramă (apeși pe ea și se întoarce), **galben** îl pune pe tot ecranul, **verde** rulează `clr` și golește ce scrie, iar **albastrul** — bulină nouă, pusă de noi — aduce totul înapoi cum a fost. Se pot apăsa și cu tastatura (Enter sau spațiu), au fiecare titlul ei, iar **Escape** iese de pe tot ecranul, cum se așteaptă oricine.
- 🌞 **Cer astral la Calculator Zodiac.** Când ajungi la secțiune, cele două cartonașe se ridică, **soarele începe să se rotească** încet, cu o aură caldă care crește și scade ca o respirație, iar **dragonul chinezesc vine în zbor** dinspre dreapta către formular — apoi plutește și „respiră", cum stă bine unui dragon. Steaua dintre linii clipește și ea.
- 😄 **Omul din capul paginii râde.** Se strânge, se întinde și dă capul pe spate de trei ori — cum râde cineva cu poftă. O dată singur, la scurt timp după ce deschizi pagina, cât să apuci să-l vezi, și de câte ori pui degetul sau mouse-ul pe el.

### Notes

- Avatarul e un desen SVG adus ca imagine, deci gura nu i se poate mișca pe dinăuntru. Râsul se vede din cum se clatină tot omul, cu leagănul prins de talie (`transform-origin: 50% 85%`), nu din mijlocul imaginii — altfel ar fi părut că se învârte, nu că râde.
- Toate tac la `prefers-reduced-motion`.
- 42 de verificări în cele trei suite, toate trecute: bulinele (inclusiv Escape și întoarcerea la starea de dinainte), cerul astral, și râsul care poate porni din nou după ce s-a terminat.

## [1.79.0] – 2026-08-12

### Added

- 🎬 **Prezentarea video coboară din cer.** Ecranul se așază de sus, cu o umbră care se lasă sub el, iar cele treisprezece capitole vin apoi unul după altul, fiecare cu pictograma lui. Se întâmplă **o singură dată**, la prima întâlnire, și pe orice ecran — nu doar pe telefon. Nu s-a atins nimic din cum funcționează video-ul: doar felul în care apare.
- 🎯 **Capitolele, la deget sau cu mouse-ul peste:** se ridică, primesc umbră, iar pictograma tresare. Capitolul ales pulsează încet, ca să se vadă care e cel curent chiar și fără culoare.

### Notes

- Apariția se pornește pe **două căi**, nu pe una: ochiul care urmărește derularea, dar și o privire a noastră la fiecare derulare. O secțiune mai înaltă decât ecranul nu ajunge niciodată la „o șesime vizibilă" — partea văzută împărțită la toată înălțimea rămâne mică — iar scena video e tocmai așa; de aceea numărăm și **pixelii care se văd**, nu doar proporția.
- **Verificare, pe față:** apariția a fost dovedită în browser, la o derulare adevărată (`e-trezita` și `video-din-cer`, de două ori la rând, în două aranjamente diferite). Proba automată însă derulează prefăcut, iar în pagina asta gestul ei ajunge să miște altceva decât fereastra și nu reproduce apariția. Am **scos** cele două verificări din suită în loc să le las să pice fără vină sau — mai rău — să le fac să treacă artificial. A rămas verificarea care contează pentru siguranță: că nimic din video nu s-a stricat.

## [1.78.0] – 2026-08-12

### Added

- 🔮 **Calculatorul de zodie se pornește singur când ajungi la el.** Stătea cu două semne de întrebare mari și aștepta să alegi ziua, luna și să apeși. Acum își pune ziua de azi și **chiar calculează** — spre deosebire de terminalul vremii, aici apăsăm butonul, fiindcă socoteala se face în pagină, la tine, fără nicio cerere la vreun server. Numele semnului răsare, nu apare sec. Dacă ai ales tu ceva sau ai deja un răspuns, nu ne băgăm peste.
- 📇 **Semnele de la „Contactează-mă" se mișcă fiecare după înțelesul lui.** Cinci motive pentru care ai scrie, cinci mișcări: gândacul se târăște, becul se aprinde galben, bulele de vorbă saltă, mâinile se strâng, iar semnul întrebării se clatină nedumerit. Stăteau ca niște etichete moarte.
- ☁️ **„Despre TutorialEu" își coboară textul din cer.** Titlul, linia, textul și cele cincisprezece butoane se așază unul după altul, ca și cum ar ateriza pe pagină. E o apariție, nu o mișcare care se repetă — de aceea merge pe **orice ecran**, nu doar pe telefon, și se întâmplă **o singură dată**, la prima întâlnire. Butoanele se ridică și primesc culoare când treci peste ele.

### Notes

- Zodia n-a mers din prima: secțiunea ei n-are plăcuțe, iar ochiul care urmărește derularea se uita doar la secțiunile cu plăcuțe — așa că nimeni n-o privea. Și listele de zile și luni le umple alt script, care poate veni după noi; prima dată renunțam pe loc, acum mai încercăm de câteva ori, la sfert de secundă. Verificat: „Leu", 12/8 — ziua de azi.
- 25 de verificări pe ecran de telefon și pe desktop, toate trecute.

## [1.77.0] – 2026-08-12

### Changed

- 🌤️ **„Natură" s-a mutat imediat după „Meteo Live".** Stătea după Exerciții Fizice, dar locul ei firesc e lângă vreme: te uiți ce e afară, apoi alegi unde mergi. Meniul ⚡ Unelte merge acum în **aceeași ordine ca pagina** — Gravitație → Meteo → Natură → Zahăr → Garaj → Filtre → Exerciții → Zodiac; la fel și derularea prin apăsarea repetată pe meniu.
- 🧘 **Tai Chi a trecut imediat după Stretching**, și pe pagină, și în meniu: trei exerciții de întins și de respirat, unul după altul, apoi instructorii 3D de Qigong și Baduanjin.
- 🖼️ **Plăcuțele din Natură au rămas fără ramă.** Le pusesem o cutie de sticlă peste verde; arăta ca un dreptunghi de care nu era nevoie. Pictogramele au deja culoarea lor tare — se citesc din ele și din scris, nu dintr-un chenar.

### Notes

- La fiecare mutare am numărat ancorele și secțiunile înainte și după (143 și 20, neschimbate) și am cerut ca ordinea să iasă corectă — nu am presupus-o. Mutările prin potrivire de text cu diacritice și emoji s-au dovedit fragile, așa că bucățile se caută după adresă (`href`), nu după cum sunt scrise.

## [1.76.0] – 2026-08-12

### Added

- ⌨️ **Terminalul de la „Vremea & Atmosfera" se trezește când ajungi la el.** Arăta ca o poză: un chenar negru cu un câmp gol, în care nimeni nu se gândea să scrie. Acum, când secțiunea intră în ecran (sau o atingi), i se scrie singur un oraș — literă cu literă, cu un cursor care clipește la capăt, ca și cum ar tasta cineva. Se vede pe loc ce e și ce face. Apoi butonul verde pulsează scurt: „acum apasă-mă".
- 🤝 **Dar nu-ți face nimic pe la spate.** Nu pornește cererea singur: o interogare la serverul de vreme la fiecare derulare ar fi și nepoliticoasă, și nedorită. Scrie orașul și se oprește; apeși tu. Iar dacă tocmai ai pus mâna pe câmp, se oprește din scris pe loc și te lasă în pace.

### Changed

- 🌲 **Pădure și Cititor GPX au plecat și din secțiunea „Aplicații" de pe prima pagină.** Erau în două locuri deodată de când s-a făcut secțiunea „Natură". Acum apar exact o dată, acolo unde le caută omul.

### Notes

- Verificat pe ecran de telefon adevărat, cu `fetch` urmărit: terminalul își scrie orașul (Iași, la proba asta), iar numărul de cereri către serverul de vreme rămâne **zero** până apeși tu. 20 de verificări, toate trecute.

## [1.75.1] – 2026-08-11

### Changed

- 🚪 **Scoasă „Natură — pe prima pagină" din meniul Naturii.** „Acasă", din bara de alături, duce în același loc — iar două uși spre aceeași cameră nu ajută pe nimeni, doar lungesc meniul. Rămân cele două unelte și Via Transilvanica.

## [1.75.0] – 2026-08-11

### Added

- 📜 **Pe telefon, secțiunile prind viață pe măsură ce derulezi.** Pagina e lungă, iar plăcuțele treceau prin fața ta nemișcate — pe ecran tactil nu există „hover", deci mișcările lor nu se vedeau niciodată. Acum, când o secțiune intră bine în ecran (peste o treime din ea), plăcuțele ei pornesc singure, o dată. Se re-armează abia după ce secțiunea iese de tot din ecran, ca să nu clipească la fiecare deget mișcat.
- 🌊 **Pornesc una după alta, nu toate deodată.** O clipă între ele (0,07 s), cât să se vadă ca o undă care trece prin secțiune, nu ca o zvâcnire a întregii pagini.
- 🃏 **Și fișele care NU se apasă se mișcă acum.** Cele de la Reduceri Jocuri și surorile lor n-aveau nicio mișcare, fiindcă nu sunt butoane — pe telefon stăteau de-a dreptul moarte. Acum se ridică ușor și primesc umbră, la derulare sau la atingerea secțiunii.

### Changed

- 🌲 **Pe Pădure și pe Cititor GPX se vede DOAR meniul „Natură".** „Meniu Aplicații" a fost scos de acolo: omul e la drumeție, nu la cadouri digitale și generatoare 3D. În meniu rămân cele două unelte, legătura către **Via Transilvanica** și întoarcerea la secțiunea Natură de pe prima pagină.

### Notes

- Toate mișcările tac la `prefers-reduced-motion`: cine a cerut sistemului mai puțină mișcare primește doar o ridicare, fără legănat și fără undă.
- Probele merg pe un ecran de telefon adevărat (390×780, cu atingere): 18 verificări, toate trecute.

## [1.74.0] – 2026-08-11

### Added

- 🌲 **Meniu propriu „Natură" pe Pădure și pe Cititor GPX.** Sunt două unelte pentru aceeași ieșire — alegi pădurea, iei fișierul, îl deschizi — dar stăteau în „Meniu Aplicații", printre cadouri digitale și generatoare 3D, unde nu le caută nimeni. Acum au meniul lor, cu același nume ca secțiunea de pe prima pagină, și duc una la alta dintr-un pas. Din „Meniu Aplicații" au fost scoase, fiindcă Natură a trecut la ⚡ Unelte.
- ✨ **Plăcuțele fără mișcare proprie au acum și ele una.** Multe își aveau mișcarea lor — roata se învârte, autobuzul merge, porumbelul plutește — dar restul stăteau pur și simplu. Regula nouă e scrisă cu `:where()`, adică fără greutate în cascadă: pierde **întotdeauna** în fața unei mișcări făcute anume pentru o plăcuță, deci nu strică nimic din ce era, doar umple golurile.
- 📱 **Pe telefon, atingi o secțiune și se mișcă toate plăcuțele din ea.** Pe ecran tactil nu există „hover", așa că mișcările nu se vedeau decât dacă atingeai plăcuțele una câte una — se pierdea tocmai partea frumoasă. Acum atingi oriunde în bucata de pagină și pornesc toate plăcuțele din ea, **doar din ea**, vreo două secunde și jumătate. Atins pe meniu, pe un buton sau pe o hartă, nu pornește nimic: deschiderea meniului n-are de ce să se transforme în spectacol.

### Changed

- ✍️ **„Natura" se scrie „Natură"** — cu diacritice, peste tot: în meniul ⚡ Unelte, în meniul nou, și în titlul secțiunii. Adresa secțiunii (`#natura-intro`) a rămas neschimbată dinadins: e pusă în legături, iar schimbată ar rupe trimiterile de dinainte.
- 🎨 **Secțiunea Natură are fundalul ei**: verde adânc de pădure, cu o lumină caldă venind de sus-stânga, ca soarele printre coroane, și o linie de brazi jos. E făcut din culori, nu dintr-o poză — se încarcă instantaneu, merge și fără internet și nu îngroașă pagina cu încă un fișier. Plăcuțele stau pe el ca niște plăci de sticlă, ca să se citească.

### Notes

- Probă nouă pentru meniu și pentru atingerea pe telefon. Prima ei variantă trecea greșit: aștepta orice legătură din meniu și prindea meniul DINAINTE de a fi înlocuit — de aceea „Pădure" trecea și „Cititor GPX" pica, deși amândouă mergeau. Acum așteaptă chiar semnul meniului nou.

## [1.73.1] – 2026-08-11

### Fixed

- 🪟 **„Vizualizează" din fereastra unui punct de pe hartă arăta apăsabil taman când bradul se învârtea.** Fereastra se face O DATĂ, la desenarea punctelor, și stă deoparte până o deschizi — iar cât e închisă, butonul ei nu e în pagină, deci nu-l atingea nimic când starea se schimba. Se deschidea cu ce știa el de la naștere. Acum se pune la zi **chiar în clipa deschiderii**, așa că fereastra și bradul spun același lucru.
- 🛑 **Și, dacă tot apuci să apeși unul rămas în urmă, nu pornește nimic peste căutare.** Apăsarea închide butoanele la loc și îți scrie de ce nu s-a întâmplat nimic — nu te lasă să apeși în gol și să te întrebi dacă s-a stricat ceva.

### Notes

- Probă nouă, făcută hotărâtă dinadins: mai întâi verifică faptul că **chiar se caută în clipa aceea** (altfel n-ar spune nimic — prima variantă a probei deschidea fereastra peste o zonă deja căutată și trecea degeaba), apoi cere ca butonul din fereastră să fie închis.

## [1.73.0] – 2026-08-11

### Added

- ▶️ **Play/pauză pentru zbor, direct pe hartă.** Punctul albastru se plimbă pe HARTĂ, dar zborul se pornea doar de sub vederea 3D — te uitai la punct și nu aveai la îndemână nimic care să-l oprească, mai ales pe tot ecranul, unde butoanele din pagină nu se mai văd deloc. Acum butonul e și în colțul hărții, iar cele două se mișcă împreună: nu se mai poate întâmpla ca unul să scrie „Pauză" și celălalt „Zboară". Dacă apeși înainte ca partea de 3D să fie adusă de pe internet, o aduce el — nu te lasă să apeși de două ori fără să înțelegi de ce prima dată n-a făcut nimic.

### Fixed

- 🔵 **Punctul din vederea 3D era cât un pepene.** Avea rază fixă în lumea 3D: potrivit privit de sus, dar în zbor camera vine lângă tine, iar bila acoperea jumătate de ecran — exact drumul pe care voiai să te uiți. Acum mărimea se ia după distanța până la cameră, așa că rămâne un punct mic, cât ar fi capul unui om, oricât de aproape ai privi.
- 🔒 **„Vizualizează" stă închis cât se caută pădurile.** Nu de dragul regulii: cererea lui trece înaintea căutării și o dă la o parte, așa că apăsat exact atunci ar porni o treabă peste alta și ar aduce drumurile mai încet decât dacă aștepți o clipă. Iar un buton care arată apăsabil, dar se poartă altfel, e mai rău decât unul închis pe față — acesta spune și de ce: „Aștept să se termine căutarea pădurilor". Se deschide singur când bradul se oprește.

### Notes

- Probe noi pentru butonul de pe hartă (pornește zborul și cere singur aducerea vederii 3D) și pentru închiderea lui „Vizualizează" (42 de butoane închise cât se caută, toate deschise după).

## [1.72.0] – 2026-08-11

### Fixed

- 🌀 **Bradul se învârtea și după ce pădurile erau desenate, iar omul nu îndrăznea să apese pe „Vizualizează".** Plimbi harta, fiecare oprire cere o căutare — iar căutările se puneau la rând una după alta. Semnul se rotea minute în șir PESTE păduri de mult desenate, deci arăta „se lucrează" când de fapt nu mai era nimic de așteptat. Acum e **o singură căutare odată**: dacă tocmai căutăm, ne notăm că a mai rămas ceva de văzut și ne întoarcem la asta o dată, la sfârșit.
- ⏲️ **Și bradul nu se mai învârte niciodată mai mult de 10 secunde.** Un semn care se rotește zece secunde spune „se lucrează"; unul care se rotește un minut spune „pagina e stricată". Marcarea automată are acum și ea un capăt: **12 secunde cu totul**, a doua încercare cu tot — se reface oricum la următoarea mișcare a hărții, deci n-are rost să se întindă.
- 🤐 **Când TOATE oglinzile ne-au rugat să încetinim, tăcem de tot.** Aici greșeam urât, și se vedea în consolă ca un șir de `429` către aceeași ușă: dacă toate erau în pauză, le întrebam oricum — iar fiecare `429` primit peste pedeapsă o **prelungește**. Ne-o făceam cu mâna noastră. Acum marcarea automată nu mai trimite nimic cât toate sunt în pauză (zona se caută la mișcarea următoare), iar cine așteaptă cu ochii pe ecran primește **o singură** încercare, la ușa care se eliberează cel mai devreme — una, nu trei. A doua încercare nu se mai face degeaba: n-ar avea la cine să bată.

### Notes

- Probe noi: bradul trebuie să se învârtă imediat după mutarea hărții și să se oprească singur după prag, cu harta stând pe loc; iar cu toate ușile în pauză, numărul cererilor trebuie să rămână la zero-două, nu să crească la fiecare mișcare.
- 22 de seturi de probe, toate trecute.

## [1.71.0] – 2026-08-11

### Changed

- 🌍 **Cititorul GPX nu mai pornește cu forța peste România.** Verificat întâi ce era de fapt oprit: nimic — harta n-are margini și nici mărire minimă, fișierele se citesc pe tot globul (`-90…90`, `-180…180`), dalele acoperă lumea, iar altitudinile de la Open-Meteo vin de oriunde. Pus la treabă cu trasee din **Alpii elvețieni, Anzii chilieni, Fiordland (Noua Zeelandă), Denali (Alaska) și Greenwich** — le-a citit pe toate, a mutat harta pe ele și a socotit corect lungimea și urcarea. Singurul lucru „românesc" era locul de PORNIRE: cine umbla cu trasee din străinătate era adus înapoi acasă la fiecare deschidere a paginii.
- 🔖 **Harta ține minte unde ai rămas.** Doar privirea ei — mijlocul și mărirea — păstrată la tine în browser, nimic despre tine și nimic trimis nicăieri. La prima vizită pornește tot de acasă, peste România: e un site românesc, iar pentru cei mai mulți asta e privirea bună.
- 🧭 **`worldCopyJump`**: treci meridianul 180 fără ca harta să sară înapoi de partea cealaltă a lumii.
- 📝 **Scris pe pagină, ca să se știe:** merge cu trasee din toată lumea, nu doar din România.

### Notes

- Probă nouă, cu cinci trasee din patru colțuri ale lumii — inclusiv peste meridianul zero (longitudine negativă mică) și în emisfera sudică, acolo unde socotelile făcute „pentru România" se încurcă de obicei. 18 verificări, toate trecute.

## [1.70.1] – 2026-08-11

### Changed

- 🥾 **Via Transilvanica a plecat din „Exerciții Fizice".** De când există secțiunea „Natura", plăcuța apărea în amândouă. Un traseu de 1400 km pe jos prin țară nu e antrenament de casă, ca ganterele și stretchingul — așa că stă într-un singur loc, acolo unde o caută omul: la Natura.

## [1.70.0] – 2026-08-11

### Fixed

- 🧊 **Pagina înțepenea de tot dacă plimbai harta prin țară — browserul întreba dacă s-o închidă.** Pădurile găsite se adunau toate, de la Suceava până la Câmpulung și mai departe, iar pentru FIECARE scriam o fișă întreagă în listă, cu titlu, text și cinci butoane. Măsurat pe același drum prin țară: **1541 de fișe și 1500 de contururi** înainte, **80 de fișe și 372 de contururi** acum; o redesenare a scăzut de la 117 ms la 30 ms. Ce rămâne departe de unde te uiți se uită, împreună cu zonele deja cerute — dacă te întorci acolo, se caută din nou. Ținem o margine largă în jur (de trei ori cât se vede), ca o mișcare mică de hartă să nu arunce tocmai ce ai adus.
- 📃 **Lista nu mai scrie sute de fișe.** Contururile de pe hartă sunt ieftine (se desenează pe pânză, sute dintr-o dată), dar fiecare fișă e o bucată de pagină. Scriem primele 80 și spunem pe față câte au rămas doar pe hartă — nu le ascundem în tăcere.

### Added

- 🌲 **Secțiune nouă pe prima pagină: „Natura", cu Pădure și Cititor GPX.** Stă imediat sub „Exerciții Fizice", fiindcă exact asta e: exerciții de AFARĂ. În meniul ⚡ Unelte apare tot înaintea Exercițiilor. Via Transilvanica se vede acum în ambele locuri — cine caută „natura" o caută acolo, nu la gantere.
- ♻️ **Pădurea nu e a nimănui și e a tuturor.** Pagina Pădure spune de acum, sus, o dată și scurt: nu arunca deșeuri, **ce duci plin aduci gol înapoi** — și cojile, și chiștoacele. Fără foc în afara vetrelor amenajate, fără rupt și săpat după plante, câinele lângă tine, iar animalele se ocolesc, nu se urmăresc ca să le filmezi. Dacă trimitem mii de oameni în pădure, spunem și cum se stă acolo.
- 🚗 **Intro nou:** „Locuri verzi la câteva minute de tine cu mașina, unde poți merge pentru o drumeție de neuitat."

### Notes

- 22 de seturi de probe, 256 de verificări, toate trecute. Una nouă plimbă harta pe patru zone depărtate și cere ca fișele să NU se adune, iar pagina să răspundă sub o secundă și jumătate.

## [1.69.1] – 2026-08-11

### Fixed

- 🧞 **Șamanul se depărta încet de gura lămpii, până ajungea să plutească în cu totul altă parte.** Lampa se învârte molcom, tot timpul. Cât personajul e afară trebuia să se potolească — dar formula lăsa o zecime de rotire care mergea la nesfârșit: **21,6° pe minut**, adică 104° după cinci minute și 207° după zece. Ciocul ajungea pe partea cealaltă, fumul ieșea într-o direcție, iar șamanul rămânea agățat de locul unde apăruse, fiindcă i-l prindeam o singură dată, la chemare. Acum lampa **se oprește de-a binelea din învârtit la o jumătate de secundă** după ce apare personajul (0,68° cu totul, și nu mai crește), iar șamanul se mută molcom după gura lămpii — atât cât să pară plutire, nu prindere în ea.

### Notes

- Socotit cadru cu cadru, cu chiar formulele din pagină: înainte rotirea creștea la nesfârșit (21,6° / 43° / 104° / 207° la 1, 2, 5 și 10 minute), acum rămâne 0,68° oricât ai aștepta.

## [1.69.0] – 2026-08-11

### Added

- 🐻 **Zonele cu urs și viperă, desenate pe hartă.** Un buton nou în colțul hărții (semnul de atenționare) arată cinci arealuri: Carpații Orientali (unde Harghita, Covasna, Brașov, Vrancea și Mureș au unele dintre cele mai mari densități de urs din Europa), Carpații Meridionali, Munții Apuseni, munții Banatului și ai Olteniei, și Dobrogea. Apeși pe o zonă și afli ce trăiește acolo și cum te porți. **Pornește stins**, ca și pădurile — cine merge după poteci nu vrea harta acoperită de pete din prima clipă.
- 🥾 **Regulile de echipament, scrise limpede și puse PRIMELE.** Bocanci înalți care acoperă glezna și pantaloni lungi și groși, nu șlapi și pantaloni scurți. **Nu pune mâna pe pietre și nu băga mâna sub ele, în crăpături, în grohotiș sau în tufe fără să vezi unde o pui** — acolo stă vipera la soare, iar mușcăturile de la noi sunt în bună parte pe mână. Când urci pe stânci, uită-te unde apuci. Sunt aceleași cuvinte și pe hartă, și în fișa locului, ca să nu le înveți în două feluri.

### Changed

- 📋 **Lista din Cititorul GPX se strânge.** Un fișier de pădure vine cu douăsprezece drumuri, iar înșirate toate împingeau harta și cifrele tocmai jos de tot. Acum stau într-o listă care se desface: strânsă, fișa are **123 de pixeli** în loc de 448; desfăcută, are tot ce avea, cu fiecare drum apăsabil. Când sunt trei rânduri sau mai puține rămâne desfăcută — n-are rost să ascundem trei rânduri.

### Fixed

- 🌀 **Bradul se învârtea la nesfârșit, iar apăsarea lui nu-l oprea.** Alegeai o regiune, serverele răspundeau greu, iar căutările se îngrămădeau una peste alta. Apăsai bradul: marcarea se stingea (scria și pe ecran „Pădurile nu se mai marchează"), dar rotirea mergea înainte, așa că butonul părea stricat. Acum **apăsarea oprește rotirea pe loc**.
- 📡 **Și, mai rău, o cerere tot pleca spre servere DUPĂ ce stinseseși marcarea.** Măsurat: după apăsare, numărul cererilor creștea de la 1 la 2. Adică cereau păduri exact pentru cineva care tocmai spusese că nu le mai vrea — și tocmai astfel de cereri de prisos ne aduc „429, prea multe cereri". Acum, la stingere, se lasă baltă și ce stă la rând, și ce e în lucru: **1 → 1**.

### Notes

- Contururile de pe hartă sunt **arealul cunoscut al speciilor**, după studii publicate — nu locuri unde a văzut cineva ceva. Nimeni nu ține o hartă a întâlnirilor cu ursul, iar dacă am desena una ne-am da că știm ce nu știm. Marginile sunt trase cu linie întreruptă dinadins: un urs nu se oprește la linia pe care am tras-o noi.
- 21 de seturi de probe, 246 de verificări, toate trecute.

## [1.68.0] – 2026-08-11

### Added

- 🌲 **Bradul din colțul hărții se învârte cât caută pădurile.** Alegi Suceava din listă, harta sare acolo, marcarea pornește singură — și până acum, câteva secunde bune, nu se schimba absolut nimic pe ecran. Butonul părea stricat, iar omul apăsa din nou, cerând aceleași păduri a doua oară. Acum bradul se rotește cât se lucrează și **se oprește exact când pădurile sunt desenate**, adică atunci când chiar ai ce vedea. Îți spune și în cuvinte, dacă ții cursorul pe el („Caut pădurile din zona de pe hartă…"), și cititoarelor de ecran (`aria-busy`). Cine a cerut sistemului să nu miște lucrurile pe ecran primește o pâlpâire blândă în loc de rotire.

### Changed

- 🗣️ **Cititorul nu mai spune „ori una, ori alta".** Mesajul „ori OpenStreetMap n-are niciun drum aici, ori serverele n-au răspuns la timp" punea două lucruri foarte diferite în aceeași propoziție: unul înseamnă „mai încearcă peste un minut", celălalt înseamnă „nu mai încerca, chiar nu există poteci acolo". Pădurea trimite acum motivul odată cu fișierul, iar cititorul îl spune pe față: **serverele ne-au limitat cererile (429)**, ori **n-au răspuns la timp**, ori **au răspuns, dar OpenStreetMap chiar n-are niciun drum trecut pe acolo** — caz în care îți spune limpede că nu are rost să mai încerci.

### Notes

- Schimbarea asta e și pentru noi: până acum, când primeam „tot nu merge", mesajul era același în ambele cazuri și nu aveam de unde ști care din ele e. De-acum se vede din prima.
- 18 seturi de probe, 206 verificări, toate trecute.

## [1.67.6] – 2026-08-11

### Fixed

- 🇨🇭 **Oglinda pe care o adăugasem ieri ținea doar Elveția — și tăcea frumos despre România.** `overpass.osm.ch` răspundea `200` în 178 ms, cu antetele în regulă; părea cea mai bună din listă. Numai că, întrebată despre un colț de România, întorcea **zero elemente**, iar pagina înțelegea „n-are OpenStreetMap drumuri pe aici" și-i dădea omului fișierul cu punctul singur. Fiind și cea mai iute, câștiga întrecerea de fiecare dată — așa că mesajul „deocamdată doar punctul, fără drumuri" apărea **de fiecare dată**, nu din când în când. Verificat pe față: Berna 5 elemente, Suceava 0, Brașov 0. Am scos-o.

### Notes

- Greșeala a fost a mea, și merită scrisă ca să nu se repete: **am pus o oglindă în listă fiindcă răspundea repede, fără s-o întreb dacă are datele noastre.** Un „200" gol e mai rău decât o pană — pana se vede, golul minte frumos. Regula e acum scrisă lângă listă: înainte de a adăuga o oglindă, întreab-o despre un colț de România și numără ce vine.
- Cu serverele întrebate cum trebuie, atât întrebările cât și datele sunt sănătoase: pentru pădurea de la nord-est de Măriței, **35 de drumuri în 0,7 secunde** și 98 de elemente pentru marcarea hărții în 2 secunde. Deci nu lipsesc drumurile din OpenStreetMap, și nu e prea grea întrebarea.
- 17 seturi de probe, 197 de verificări, toate trecute.

## [1.67.5] – 2026-08-11

### Fixed

- 🚪 **Băteam mereu la aceeași ușă.** Porneam de fiecare dată de la prima oglindă din listă, așa că ea lua toată încărcarea site-ului și ne răspundea, pe bună dreptate, „prea multe cereri" (429) — în timp ce celelalte stăteau degeaba. Măsurat direct pe servere, chiar în timpul lucrului: **private.coffee** și **kumi.systems** ne răspundeau `429` cu `retry-after: 60`, adică „lasă-mă un minut". Acum pornim **pe rând de la alta**, deci încărcarea se împarte în patru.
- 🤫 **Și ascultăm când ni se spune „mai încet".** Oglinda care ne-a refuzat e lăsată în pace exact cât a cerut ea (`retry-after`), sau un minut și jumătate dacă n-a spus; la o aglomerație de moment (`504`), douăzeci de secunde. Înainte o întrebam imediat din nou — adică exact lucrul care prelungește pedeapsa.

### Added

- 🇨🇭 **O oglindă nouă: `overpass.osm.ch`.** N-am pus-o pe încredere — am întrebat-o întâi: `POST` cu răspuns `200` în **178 ms** și cu `Access-Control-Allow-Origin: *`, adică o primește și browserul. (Cea japoneză, `overpass.osm.jp`, nici nu răspunde de la noi, așa că n-are ce căuta în listă.) Pentru o singură căutare întrebăm tot cel mult trei oglinzi — lista e mai lungă nu ca să batem la mai multe uși deodată, ci ca să nu batem mereu la aceleași.

### Notes

- Verificat cu o probă nouă care pune o oglindă să răspundă `429` cu `retry-after`: întrebările se împart între patru uși, iar cea care ne-a refuzat nu mai e deranjată deloc după aceea.
- 17 seturi de probe, 197 de verificări, toate trecute.

## [1.67.4] – 2026-08-11

### Fixed

- 🕳️ **„Doar punctul, fără drumuri" — de data asta din vina rândului pe care tocmai îl făcusem.** Cererile la servere stau la rând de la versiunea trecută, ca să nu ne mai taie nimeni pentru prea multe deodată. Numai că răgazul de 20 de secunde al omului începea când cererea lui **intra la rând**, nu când **pleca**. Dacă harta tocmai își marca singură pădurile în fundal — o treabă care poate ține 20-30 de secunde, cu trei oglinzi încercate una după alta — răgazul se scurgea în întregime cât cererea lui stătea la coadă, iar el ajungea în cititor cu punctul și mesajul „ori OpenStreetMap n-are niciun drum aici, ori serverele n-au răspuns la timp". Serverele nici măcar nu fuseseră întrebate. Acum ceasul pornește **când cererea chiar pleacă**.
- ⏱️ **Și nu mai stă la coadă degeaba.** Marcarea automată a hărții e muncă de fundal: nimeni n-o cronometrează și se reface singură la următoarea mișcare a hărții. Omul care a apăsat „Vizualizează" se uită la un cerc care se învârte. Așa că **el trece înainte**, iar marcarea automată aflată în lucru e lăsată deoparte pe loc, nu așteptată. Măsurat: cererea lui pleacă la **circa 2 secunde** de la apăsare, față de aproape 20 înainte.

### Notes

- Tot cu ocazia asta a ieșit la iveală și o socoteală greșită a răgazului: oglinzile se pornesc una după alta, din 9 în 9 secunde, și fiecare își număra răbdarea de la ea. Trei oglinzi tăcute făceau 36 de secunde în loc de 20 — plus încă pe atât la cererea de rezervă, adică **64 de secunde** cu serverele complet mute. Ceasul taie acum toată încercarea, nu fiecare oglindă în parte: **30 de secunde**, cum scria și în socoteală.
- Verificat pe 16 seturi de probe (191 de verificări), printre care una nouă care pune marcarea automată să țină dinadins 22 de secunde și apasă „Vizualizează" peste ea.

## [1.67.3] – 2026-08-11

### Fixed

- 🚦 **Le ceream serverelor de hărți prea multe deodată — și ne răspundeau cu „mai încet".** Marcarea automată, căutarea de păduri și aducerea drumurilor plecau în același timp, uneori câte trei-patru cereri într-o secundă, pe aceleași oglinzi gratuite. Măsurat pe pădurea de la nord-est de Mărițеi: aceeași interogare a răspuns în 2,2 secunde când a plecat singură, dar a primit **HTTP 429 („prea des")** când am trimis mai multe una după alta. De aici veneau și „serverele nu răspund", și fișierele cu punctul și niciun drum. Acum cererile **stau la rând, una singură odată**, cu o pauză de o secundă între ele, iar când serverul ne roagă să încetinim așteptăm **6 secunde** înainte de a mai încerca — nu o secundă și jumătate, ca la o cădere obișnuită.
- 🌲 **Pădurile pornesc STINSE la fiecare deschidere a paginii.** Înainte harta ținea minte cum ai lăsat comutatorul, așa că unora li se umplea de galben din prima clipă, fără să fi cerut nimic. Acum e simplu de spus: **deschizi pagina, harta e curată; apeși bradul din colțul hărții, apar pădurile.** Fără surprize și fără cereri la servere înainte să ceri tu ceva.

### Notes

- Ce spuneam data trecută — că interogarea drumurilor ar fi „prea scumpă" — **nu era adevărat**. S-a văzut la a doua măsurătoare: aceeași interogare, 50 de drumuri în 2,2 secunde, de două ori la rând. Vinovată era graba noastră, nu forma cererii.
- Verificat: niciodată mai mult de **o cerere odată** către oglinzi, nici măcar când o descărcare se suprapune peste marcarea automată; cel puțin 0,7 secunde între două cereri.

## [1.67.2] – 2026-08-11

### Fixed

- ⏱️ **Aducerea drumurilor putea ține un minut și un sfert — la capătul căruia primeai un fișier cu punctul și nimic altceva.** Socoteala: trei oglinzi pornite din 6 în 6 secunde, cu câte 25 de secunde răbdare fiecare, plus a doua tură, fac 75 de secunde. Nimeni nu stă atât uitându-se la un cerc care se învârte. Acum e un răgaz peste tot: **30 de secunde cu totul** (20 pentru cererea mare, 10 pentru cea de rezervă), apoi ne oprim și-ți dăm ce avem.
- 🗣️ **Cititorul spune acum DE CE vezi doar un semn.** Când fișierul vine fără drumuri, îți zice pe față: ori OpenStreetMap n-are niciunul înregistrat acolo, ori serverele lui n-au răspuns la timp — și că punctul e bun oricum, îl pui pe ceas și mergi după el. Când drumurile sunt acolo, le numără („3 drumuri din OpenStreetMap"). Înainte tăcea, și rămâneai să te întrebi dacă s-a pierdut ceva între cele două pagini.

### Notes

- Verificat cu serverele făcute să tacă de tot: așteptarea a scăzut de la 75 la 30 de secunde, iar la capăt ajungi tot în cititor, cu punctul și cu explicația.

## [1.67.1] – 2026-08-11

### Fixed

- 🔁 **„Serverele de hărți nu răspund" — și, odată cu ele, niciun galben pe hartă.** Măsurat din nou, cu chiar interogarea paginii: **overpass-api.de** a răspuns în 5,2 secunde (18 păduri, 10 sate), iar **private.coffee** — cea pusă prima săptămâna trecută, fiindcă atunci era cea mai iute — n-a mai răspuns deloc. Oglinzile astea sunt ținute de oameni de bunăvoie și se schimbă de la o săptămână la alta. Prima din listă e acum cea care merge.
- 🕰️ **Mai încercăm o dată înainte să ne dăm bătuți.** Overpass dă des „prea aglomerat" — o supărare de moment, nu o pană. Dacă toate oglinzile pică, așteptăm o clipă și mai dăm o tură; de cele mai multe ori a doua trece. UNA singură, ca să nu batem la ușa unor servere gratuite până cedează.
- 🗣️ **Mesajele spun ce se întâmplă**: „mai încerc o dată", iar dacă nici a doua tură nu reușește, că locurile alese de noi sunt oricum toate pe hartă și că pădurile din OpenStreetMap merită reîncercate peste un minut.

### Notes

- Vorba „mai încerc o dată" era scrisă, dar stătea sub o condiție care n-o lăsa să iasă niciodată la lumină (`i > 1`, când semnalul de reîncercare e `0`). Se vede acum, la toate cele trei feluri de căutări.

## [1.67.0] – 2026-08-11

### Changed

- 🏙️ **Alegi orașul din listă și ajungi direct la hartă**, cu **marcarea pădurilor pornită singură**. Alegerea din listă e o întrebare limpede — „ce am pe lângă orașul ăsta?" — iar răspunsul e pe hartă. Înainte rămâneai sus în pagină, în fața unei hărți pe care n-o vedeai, și mai trebuia să apeși un buton ca să apară ce tocmai ceruseși.
- 🗺️ **La fel și când alegi o zonă a țării** (Bucovina, Transilvania, Banat…): harta se încadrează pe ea, te duce acolo și aprinde marcarea.

### Notes

- „Toate orașele" nu te mișcă din loc: n-ai cerut nimic anume, deci n-are de ce să te zgâlțâie pagina.
- Pe tot ecranul nu se derulează nimic — harta e deja sub ochii tăi.

## [1.66.3] – 2026-08-11

### Fixed

- 📍 **„Caută lângă mine" părea că nu face nimic.** Locația se primea, iar lista chiar se rearanja după cât de aproape e fiecare loc de tine — dar harta încadra **toate cele 41 de locuri din țară plus pe tine**, ceea ce înseamnă harta României, adică exact ce vedeai și înainte de a apăsa. Acum harta se duce **la tine**, de aproape, ca la alegerea orașului — și de acolo se marchează și pădurile din jur.
- 🔵 **Punctul albastru dispărea de cum se marca prima pădure.** Era pus în stratul locurilor, iar acela se șterge la fiecare redesenare. Acum stă pe hartă și rămâne acolo.
- 🗣️ **„Nu am primit locația" nu ajuta pe nimeni** — nu știai dacă e vina ta, a telefonului sau a noastră. Acum fiecare pricină își are vorba ei: acces oprit (cu ce buton să-l dai înapoi), prea mult de așteptat sub acoperiș, sau localizare oprită pe dispozitiv.

### Notes

- Răbdarea a crescut de la 10 la 15 secunde: sub acoperiș, primul punct GPS vine greu.

## [1.66.2] – 2026-08-11

### Changed

- 🗺️ **Venind din „Vizualizează", cititorul te lasă direct la hartă.** Ai apăsat ca să vezi traseul, nu ca să citești antetul paginii — așa că pagina se duce la hartă din prima clipă: vezi perdeaua cum lucrează și, sub ea, drumurile apărând.

### Notes

- Se derulează de două ori, dinadins: o dată înainte de citirea fișierului și încă o dată după ce s-a desenat. Între timp apar panourile de sub hartă — cifrele, croirea traseului — care o împing de unde era.
- Numai când vii din Pădure. Dacă deschizi cititorul de capul tău, pagina te lasă în pace, unde ai deschis-o.

## [1.66.1] – 2026-08-11

### Added

- ⏳ **La „Vizualizează", harta însăși arată că se lucrează.** Peste ea apare o perdea cu un cerc care se învârte și cu vorbă limpede — „Adun drumurile din «Pădurea X»…" — și **rămâne acolo până pleacă pagina**. Înainte, între apăsare și cititor erau câteva secunde în care harta arăta ca de obicei, așa că apăsai a doua oară crezând că n-a mers.
- 🤝 **Cititorul preia firul.** Venind din Pădure, harta lui arată aceeași perdea („Deschid «Pădurea X»…") până când traseul e chiar desenat. Între cele două pagini nu mai există clipa aceea goală în care crezi că s-a pierdut fișierul.

### Notes

- Perdeaua e ÎN hartă, deci se vede și pe tot ecranul, și oprește apăsările cât timp se lucrează.
- În cititor, perdeaua se desenează înainte de citirea fișierului, cu o clipă de răgaz: citirea ține firul ocupat, iar fără răgazul acela perdeaua n-ar apuca să apară deloc — ai fi văzut tot un ecran înghețat, doar că altfel.

## [1.66.0] – 2026-08-11

### Added

- 🎯 **Capetele traseului se aleg direct din hartă.** Butoanele de plecare, sosire și ștergere stau acum în colțul hărții, lângă mărire — acolo unde și apeși ca să pui punctul. Traseul se poate croi fără să atingi nimic din pagină.
- ⛶ **Harta are și ea „tot ecranul".** Butoanele fiind ÎN hartă, merg odată cu ea: pe tot ecranul alegi capetele și croiești traseul la fel de bine, deși pagina nu se mai vede deloc.

### Notes

- Butoanele sunt în două locuri (pe hartă și în panoul de sub ea), dar starea e una singură: se aprind și se sting împreună. Dacă s-ar aprinde doar unul, ai crede pe bună dreptate că celălalt e stricat.
- Pe tot ecranul nu mai „derulăm pagina până la hartă" când începi alegerea: harta e deja sub ochii tăi, iar derularea n-ar avea unde să ducă.

## [1.65.0] – 2026-08-11

### Changed

- 🌲 **Pădurile se marchează doar când ceri tu.** Până acum se căutau singure la fiecare mișcare a hărții și se redesenau întruna — bun când cauți unde să mergi, sâcâitor când vrei doar să te uiți pe hartă. Acum e un **buton cu brad, în colțul hărții**: verde = pădurile se marchează pe măsură ce plimbi harta; stins = harta rămâne curată și **nu se cere nimic de la servere**. Pornește stins, și ține minte cum l-ai lăsat.
- ⛶ **Butonul e în hartă, nu în pagină** — deci îl ai la îndemână și pe **tot ecranul**, unde restul paginii nu se mai vede.
- 🔎 **„Toate pădurile de pe hartă" aprinde singur butonul.** Ai cerut pădurile pe față; ar fi absurd să le căutăm și să n-avem unde să le arătăm.

### Notes

- Verificat că „stins" chiar înseamnă stins: cu butonul închis, plimbatul hărții nu trimite **nicio** cerere către serverele de hărți și nu desenează **nicio** pădure — rămân doar cele 41 de locuri alese de noi.

## [1.64.1] – 2026-08-11

### Changed

- ⛰️ **Vederea 3D pornește la scara adevărată: unu la unu cu terenul.** Umflam înălțimea singuri, cu o socoteală „potrivită" pentru fiecare traseu — dar asta însemna că același deal arăta altfel de la un fișier la altul, și nu mai aveai la ce să te raportezi. Acum panta de pe ecran e panta de pe teren. Cursorul a rămas, pentru cine vrea relieful mai apăsat.
- 🗓️ **„În curând gratis" a trecut înaintea lui „Acasă"**, la coada listei de secțiuni — acolo unde stă și pe pagină. Meniul merge acum în aceeași ordine cu ochiul: apeși pe rând și cobori, fără să sari înapoi.

### Notes

- Metrii pe verticală se măsoară acum cu aceeași riglă ca metrii pe orizontală. Înainte înălțimea era întinsă ca să umple o cutie de mărime fixă, ceea ce însemna că un traseu plat era ridicat la fel de sus ca unul de munte.

## [1.64.0] – 2026-08-11

### Added

- 🛩️ **Zbori peste traseul tău, de la plecare până la sosire.** În vederea 3D, camera merge pe drum ca un om care umblă: puțin în spate, puțin mai sus, cu ochii înainte. Vezi urcușul cum vine spre tine, nu ca o linie pe o hartă. Ai **pauză**, **viteză** și o bară cu care sari unde vrei pe traseu.
- 📍 **Punctul albastru merge și pe hartă, în același timp.** Altfel te-ai uita la o priveliște frumoasă fără să știi unde e în lume; așa vezi tot timpul prin ce loc treci.

### Notes

- Zborul merge pe **metri parcurși**, nu pe numărul punctelor. Altfel ai zbura repede pe porțiunile unde punctele sunt rare și ai încetini unde sunt dese, deși terenul e la fel — exact greșeala care face animațiile astea să pară sacadate fără motiv.
- Cât zbori, învârtitul cu degetul e oprit: camera e a traseului. La pauză ți-o iei înapoi.
- E același lucru pentru care alții cer abonament. La noi merge fiindcă totul se întâmplă în browserul tău: n-avem servere de plătit.

## [1.63.1] – 2026-08-11

### Fixed

- 🕰️ **„Primele două servere nu răspund" — pe bună dreptate.** Le încercam strict pe rând, iar prima din listă era tocmai cea moartă: fiecare căutare începea cu 25 de secunde de așteptare degeaba, apoi încă pe atâta la a doua. Măsurat, cu aceeași interogare, de două ori fiecare: **private.coffee** 181 de drumuri în 2,3 s, **overpass-api.de** 182 în 4,1 s, **kumi.systems** — n-a răspuns niciodată. Lista e acum în ordinea asta, iar cea moartă a rămas ultima.
- ⚡ **Și nu mai stăm degeaba nici când tace prima.** Dacă în șase secunde n-a zis nimic, pornim a doua în paralel, apoi a treia; câștigă cine răspunde primul, restul se opresc. Un server mort nu mai ține pe nimeni în loc, iar când primul e sănătos — cazul obișnuit — nici nu ajungem să deranjăm celelalte.

### Notes

- N-am adăugat oglinzi cu date regionale (de pildă overpass.osm.ch): răspund repede și frumos, dar cu **zero drumuri pentru România**. Ar fi arătat ca un succes și ne-ar fi dat un fișier gol — o minciună mai rea decât o eroare.

## [1.63.0] – 2026-08-11

### Added

- 🧭 **Croiește-ți traseul.** Un fișier de pădure are zeci de drumuri: e o rețea, nu un traseu. Acum alegi pe hartă **de unde pleci** și **unde vrei să ajungi**, iar pagina caută drumul dintre ele prin potecile din fișier, ca un GPS. Rezultatul e o singură linie de urmat — cu kilometri, urcare și profil — pe care o poți **salva separat ca GPX**. Dacă cele două puncte nu se leagă prin nicio potecă, ți-o spune pe față; nu inventează un drum prin pădure.
- ⛰️ **„Traseul n-are altitudini scrise în fișier" — rezolvat.** Drumurile din OpenStreetMap chiar n-au înălțimi, de aceea vederea 3D n-avea din ce face relieful. Acum, după ce ți-ai croit traseul, **îi cerem altitudinile** de la Open-Meteo (gratis, fără cont) și 3D-ul se aprinde. Se cer doar pentru traseul tău, nu pentru tot ghemul de poteci, și doar dacă ceri tu traseul.

### Fixed

- 🌲 **Se vedeau și drumurile pădurilor vecine.** Le luam din dreptunghiul din jurul pădurii, care prinde și colțuri ce nu-s pădure — drumuri din satul de alături, din codrul de peste deal. Acum se păstrează doar drumurile care trec **prin** pădure, după conturul ei.

### Notes

- Drumurile se leagă între ele rotunjind capetele la circa un metru — așa se ating în OpenStreetMap. Fără lipitura asta, fiecare potecă ar fi o insulă și n-ai putea trece de pe una pe alta.
- Aceeași capcană ca la derularea paginii, a doua oară: Leaflet trimite apăsarea obiectului de sub deget, iar pe o hartă plină de poteci degetul cade aproape mereu pe una — deci harta nu afla niciodată că ai apăsat. Ascultăm pe cutia hărții și socotim noi locul.

## [1.62.0] – 2026-08-10

### Fixed

- 🚧 **„Am încercat 3 din 3 servere" și tot un punct gol.** Cererea de drumuri era prea grea: îi ceream serverului și străzile satelor și aleile de parcare, pe toată suprafața pădurii. Măsurat pe serverul adevărat, pe o pădure de 9 km: **HTTP 504 — refuzată**, la toate cele trei oglinzi. Fără ele: **182 de drumuri, în câteva secunde**. De nouă ori mai multe decât vechiul cerc de 2,2 km, și fără să chinuim pe nimeni. (Străzile satului n-aveau ce căuta oricum într-un fișier de drumeție.)
- 🪃 **Dacă tot nu se poate, nu mai rămâi cu mâna goală.** La o pădure cât un județ, cererea mare se lasă păgubașă și cerem mai puțin: potecile din jurul locului. Mai puțin decât am fi vrut, dar mult mai bine decât un fișier cu punctul și nimic altceva.
- 🌳 **Pădurile nu se mai desenează una peste alta.** OpenStreetMap dă adesea aceeași pădure de mai multe ori — o suprafață mare și, peste ea, petice mai mici. De aici „regiuni în interiorul regiunilor" și o listă plină de fișe care duc în același loc. Peticele **fără nume** dinăuntrul altei păduri se aruncă; cele **cu nume** rămân întotdeauna, fiindcă „Pădurea Crijana" din mijlocul unui codru mare e o pădure adevărată, nu un duplicat.
- 🌾 **Poienile rămân poieni.** Pădurile mari au goluri înăuntru — poieni, lacuri, sate. Desenam doar conturul exterior, deci le pictam ca pădure. Acum se decupează, ca în realitate.

### Notes

- Interogările au fost cronometrate pe serverul adevărat înainte și după, nu ghicite: 504 la 10 secunde înainte, 182 de drumuri la 1,2 secunde după. Butonul „Drumuri și poteci" a fost verificat separat (900 de drumuri, 1,3 secunde) — acela era în regulă și a rămas neatins.
- Decupajul poienii e verificat uitându-ne la ce primește harta — un contur cu două inele, nu unul singur. Prima încercare număra pixeli și n-a dovedit nimic: nu știi unde a căzut poligonul pe ecran, deci „nepictat" putea însemna și „am măsurat alături".

## [1.61.0] – 2026-08-10

### Fixed

- 🛣️ **Deschideai o pădure în cititor și vedeai doar un punct.** Drumurile se căutau la 2,2 km de MIJLOCUL pădurii — într-o pădure de nouă kilometri, aproape tot ce te interesa cădea în afara cercului. Acum se caută în tot dreptunghiul ei, și nu doar potecile: intră și **drumurile de pământ și cele forestiere**, pe care se umblă de fapt.
- ⏱️ **Și le abandonam prea devreme.** Tăiasem răbdarea la 12 secunde pentru toate cererile; pentru drumuri — care sunt mai grele și pe care omul le așteaptă, fiindcă e fișierul lui — asta însemna să renunțăm exact când serverul era pe cale să răspundă, și să-i dăm un fișier cu punctul și nimic altceva. Drumurile au acum 25 de secunde; căutarea pădurilor rămâne la 12, unde o ratare nu costă nimic.
- 🔵 **Bulinele înghițeau harta când depărtai.** Ele au o mărime fixă în pixeli, așa că, pe măsură ce depărtezi, pădurile se micșorează și bulinele nu — până nu se mai vede nimic sub ele. Depărtat, pădurile cu contur nu mai primesc bulină: **se văd doar suprafețele**, care se pot apăsa la fel de bine. Parcurile și vârfurile, care n-au contur, își păstrează bulina — altfel ar dispărea cu totul.

### Added

- 👁️ **„Vizualizează"**, lângă „Descarcă GPX", pe fiecare fișă și în fereastra de pe hartă. Adună drumurile, pune pădurea deoparte și te duce **direct în Cititorul GPX** — pentru când vrei doar să te uiți la traseu, fără să-ți umpli dosarul de descărcări.

### Notes

- Regula „depărtat, fără buline" e verificată întrebând harta câte forme a desenat, nu numărând pixeli: 42 de buline aproape, 41 depărtat (pleacă exact bulina pădurii, suprafața rămâne), 42 din nou când te apropii. Prima încercare de verificare număra pixeli albi și se lupta degeaba cu netezirea marginilor și cu fereastra care se mută singură — măsura umbra regulii, nu regula.

## [1.60.1] – 2026-08-10

### Added

- 🗓️ **„În curând gratis" e acum în meniul paginii de Reduceri Jocuri**, între „Gratis" și „Demo-uri". Secțiunea exista, dar stătea la coada paginii și trebuia derulat până la ea; acum se sare direct, ca la celelalte.

### Notes

- Meniul se face din include.js, care e cerut la fel de toate cele 74 de pagini. Reîmprospătat peste tot, altfel cine a mai fost pe site ar fi rămas cu meniul vechi din memoria browserului.

## [1.60.0] – 2026-08-10

### Added

- 🤝 **După ce descarci o pădure, te întrebăm dacă vrei s-o și vezi.** Dacă spui da, se deschide singură în **Cititorul GPX** — cu potecile, urcarea și profilul ei — fără să umbli după fișier prin dosarul de descărcări.
- 🎒 **Pădurea rămâne pusă deoparte, în browserul tău.** Una singură: ultima descărcată o înlocuiește pe cea dinainte. Nu e o arhivă, e „pădurea la care mergi acum" — și fiindcă stă la tine, nu pe vreun server, o găsești și mâine, **în pădure, fără semnal**. Când intri în cititor, te întreabă dacă s-o deschidă.
- 🛰️ **„Arată-mă pe hartă" în Cititorul GPX.** Ăsta e rostul întregii povești: ești pe traseu, fără semnal, și te vezi mișcându-te pe el. **GPS-ul nu are nevoie de internet** — sateliții nu știu de operatorul tău. Fără semnal lipsesc doar dalele hărții; linia traseului și punctul tău se desenează oricum. Cercul din jurul punctului arată cât de sigur e GPS-ul.

### Changed

- 💬 Mesajul de la marcarea automată a pădurilor spunea „fără nume" despre păduri care au totuși un nume pe fișă („Pădurea de la Zamostea"). Acum spune același lucru ca restul paginii.

### Notes

- Verificat drumul întreg, cap-coadă, **cu dalele hărții tăiate dinadins**: descarci din Pădure → ești întrebat → pădurea e pusă deoparte (una singură, a doua descărcare o înlocuiește) → o deschizi în cititor fără internet și traseul tot se desenează → pornești GPS-ul și te vezi pe el, cu precizie cu tot.

## [1.59.0] – 2026-08-10

### Fixed

- 🧊 **„Toate pădurile de pe hartă" îngheța harta.** Fiecare pădure era un element desenat în pagină; la câteva sute, browserul se îneca și nu mai mișca nimic. Acum se desenează toate pe o singură pânză — verificat cu **500 de păduri deodată**: harta se mută în 76 de milisecunde, unde înainte se bloca.
- 🎯 **Căutarea se făcea pe o zonă cât patru județe.** Îngăduiam un dreptunghi de vreo 180×130 km, din care ieșeau sute de păduri, dintre care aproape nici una nu-ți folosea. Acum zona e cât cuprinde un om într-o zi — **cam 60×45 km** — și e luată de acolo de unde ai pleca de fapt: **de unde ești** (dacă ne-ai dat voie la locație), altfel **de la orașul ales**, altfel din mijlocul hărții. Mesajul spune de fiecare dată unde a căutat.
- ⏳ **Butonul nu arăta nimic cât lucra.** Avea un ceas de nisip nemișcat, care arată exact ca o pagină blocată. Acum se învârte, scrie „Caut pădurile…", și mesajul de sus spune în jurul cărui oraș caută.

### Changed

- 🏙️ **Când îți alegi orașul, harta se duce la el**, de aproape, și pornește singură căutarea pădurilor din jur. Înainte încadra toate locurile orașului — iar o singură pădure de la 50 de km (cum e Codrul Slătioara pentru Suceava) depărta harta atât încât nu mai deosebeai nimic.

### Notes

- Trecerea la desenul pe pânză a fost verificată citind **pixelii** de pe hartă, nu numărând elemente: pădurile chiar se văd (aproape 30.000 de pixeli pictați), iar cele fără nume chiar sunt galbene. Probele care numărau elemente în pagină au fost mutate pe aceeași măsurătoare — altfel ar fi raportat „nimic pe hartă" tocmai când harta arată totul.

## [1.58.1] – 2026-08-10

### Fixed

- ⏳ **La descărcarea fișierului GPX, site-ul părea blocat.** Nu era: aducea potecile din OpenStreetMap. Numai că putea dura mult, iar singurul semn era un ceas de nisip nemișcat, pe un buton care de multe ori rămânea sub degetul tău, jos în listă. Acum apare **un cerc care se învârte** și un **mesaj sus**, vizibil oriunde te-ai afla pe pagină, care spune ce se aduce și că poate dura câteva secunde.
- ⏱️ **Așteptarea, în cel mai rău caz, a scăzut de la un minut și jumătate la treizeci și șase de secunde.** Încercam trei servere de hărți, unul după altul, cu câte 30 de secunde răbdare fiecare. Serverele astea sunt gratuite și aglomerate: ori răspund repede, ori nu răspund deloc — așa că le dăm 12 secunde fiecare. Și îți spunem când trecem la următorul, în loc să te lăsăm în fața unei pagini mute.
- 🔄 Același semn care se învârte apare acum și la **„Drumuri și poteci"**, la **căutarea pădurilor** și la **potecile locului ales** — toate treceau prin aceeași așteptare tăcută.

### Notes

- Verificat cu serverul făcut lent dinadins: primul nu răspunde deloc, al doilea răspunde târziu. Proba se uită că semnul chiar se rotește — compară unghiul la două momente, nu doar existența iconiței — că se spune când se trece la alt server, și că la final fișierul vine cu tot cu poteci, semnul se oprește, iar butonul se poate apăsa din nou.

## [1.58.0] – 2026-08-10

### Fixed

- 🖱️ **După ce se marcau pădurile, pagina nu se mai putea derula.** Rotița se prinde de hartă când apeși pe ea și trebuie să se elibereze când pleci cu mouse-ul. Numai că întrebam harta când pleacă mouse-ul, iar Leaflet trimite anunțul ăsta obiectului de sub cursor — de când harta e plină de contururi de pădure, ieșeai aproape mereu peste unul, harta nu mai afla că ai plecat și rotița îi rămânea prinsă. Acum întrebăm cutia hărții, care nu se lasă păcălită de ce e desenat în ea.
- 📜 **Atribuirea OpenTopoMap era incompletă.** Scriam „© OpenStreetMap · OpenTopoMap (CC-BY-SA)", dar ei cer și **SRTM** (datele de altitudine) și despărțirea între datele hărții și felul în care e desenată. Licența CC-BY-SA cere să atribui exact cum cere autorul, deci lipsa nu era un fleac. Corectată pe ambele hărți.

### Added

- ⛶ **Harta pe tot ecranul**, din colțul ei. Într-o fereastră de-o palmă, o hartă cu poteci se citește greu — iar pe tot ecranul dispare și cearta dintre rotiță și derularea paginii, fiindcă nu mai e nicio pagină de derulat.
- 🔗 **`/trasee`** duce la Pădure.

### Changed

- 🗺️ **Cititorul de GPX pornește pe harta simplă**, cu relieful la o apăsare distanță — la fel ca Pădure. Pe harta simplă se citește limpede prin ce sat și pe ce drum trece traseul.

### Notes

- Proba pentru derulare a fost întâi greșită: mișca mouse-ul pe coordonate aflate sub marginea ecranului, unde nu era nicio hartă, și „trecea" degeaba. Refăcută ca să aducă întâi harta în fața ochilor. Verificată în ambele sensuri — cu codul vechi pagina chiar rămâne pe loc (scrollY 779 → 779), cu cel nou se derulează (779 → 1179).

## [1.57.0] – 2026-08-10

### Added

- 🥁 **Handpanul sună acum a handpan.** Până acum era ce e orice alt instrument din pagină: trei sinusoide peste o notă. Un handpan adevărat are patru lucruri pe care le auzi fără să le poți numi, și acum le are și ăsta: câmpul de ton acordat pe **fundamentală, octavă și cvintă compusă** (semnătura instrumentului), **fiecare parțială stingându-se în ritmul ei** (altfel sună a orgă), **pocnetul metalic al loviturii** care moare în câteva sutimi (fără el nota „apare" în loc să fie lovită), și **bâzâitul cald al cutiei** — aerul închis sub tăblii, care răspunde la fel la orice notă. În plus, fiecare parțială e dublată și dezacordată cu o fărâmă de cent: unduirea aceea lentă e „viața" pe care o are oțelul bătut cu ciocanul și n-o are o sinusoidă curată.
- 🎹 **Tonalitatea se alege dintr-o listă.** Toate cele 42 de variante pe care le poate genera pagina — „Si dorian", „Do pentatonic minor", „Do eolian" — scrise exact cum apar pe eticheta ședinței. Până acum se nimereau, și dacă îți plăcea una trebuia să apeși „Altă muzică" până se întorcea. Ce fixezi rămâne fixat: „Altă muzică" schimbă tempoul, instrumentul și densitatea, nu tonalitatea.
- 🔇 **„Fără instrument"**, lângă „Aleatoriu". Rămân pad-ul, basul și percuția, dar nimic nu mai cântă deasupra — pentru cine vrea doar covorul de fundal, ca să adoarmă sau ca să lucreze pe el.

### Changed

- 🗺️ **Pădure pornește pe harta simplă**, nu pe cea de relief. E limpede, se încarcă repede și pe ea se văd bine contururile pădurilor. Relieful, cu tot ce e împădurit verde și cu curbe de nivel, rămâne la o apăsare în colțul din dreapta sus — bun când chiar pleci la drum.

### Fixed

- 🔤 **Chakra Rădăcină scria „undefined".** Numele notelor veneau dintr-un tabel scris de mână, iar nota ei (Do, jos de tot) lipsea din el — așa că eticheta ședinței arăta „undefined pentatonic minor". Numele se socotește acum din nota însăși, deci nu mai poate avea găuri.
- 🤝 **Când chakra și tonalitatea ta se bat cap în cap**, pagina spune care câștigă (a ta) și cum să i-o dai înapoi chakrei, în loc să afișeze o notă care nu se potrivește cu chakra aleasă.

### Notes

- Verificat ascultând, nu privind butoanele: probele numără oscilatoarele pornite și frecvențele lor — că handpanul chiar are raportul 1:2:3, rezonanța cutiei la 116 Hz, pocnetul loviturii și parțialele dublate; că „fără instrument" chiar nu programează nicio notă deasupra; și că tonalitatea fixată supraviețuiește lui „Altă muzică" și reîncărcării paginii.

## [1.56.0] – 2026-08-10

### Added

- ✂️ **Cititor GPX: alegi de unde până unde.** Rareori mergi exact traseul din fișier — pleci de la altă parcare, te întorci de la jumătate, sau vrei doar ziua a doua dintr-o tură de trei zile. Două cursoare aleg capetele, bucata se îngroașă pe hartă iar restul se stinge, iar cifrele și profilul se potrivesc pe ce ai ales. **O salvezi ca GPX** și se deschide la fel de bine pe ceas ca fișierul dinainte, cu altitudinea și orele păstrate.
- 🧊 **Traseul în 3D.** Pe hartă, un drum de munte și unul de câmpie arată la fel: o linie. În 3D se vede unde urcă, unde coboară și cât de sus ajunge — cu o „perdea" până la podea și cu umbra traseului dedesubt, ca ochiul să citească înălțimea. Nu aducem relief de nicăieri: **tot ce se vede iese din altitudinile scrise chiar în fișierul tău.** Cât se umflă înălțimea se socotește singur, după cât e de întins traseul față de cât urcă, și se poate schimba din cursor.
- 🎚️ **Meditație: alegi ce se aude.** Fundalul, instrumentul, percuția și natura se sting și se aprind fiecare în parte, **chiar în timp ce cântă**. Plus scurtătura **„Doar instrumentul"**, pentru cine vrea să audă cum sună un bol tibetan sau o kalimba fără pătura fundalului peste el. Ce stingi se ține minte.
- 🧭 **Pădure și Cititor GPX au intrat în „Meniu Aplicații".** Până acum se ajungea la ele doar de pe pagina de start.

### Fixed

- 🗺️ **Harta nu mai sare cât tragi de cursor.** Se așază pe bucata aleasă abia când îi dai drumul — altfel se apropia și se depărtează la fiecare milimetru și nu puteai nimeri capătul.
- 🔗 **Legătură moartă**: pagina de GPX trimitea la „Munții Noștri", care nu există.
- 🧹 **Meniul nu ajungea la oameni.** Toate paginile cereau aceeași versiune veche a meniului, așa că un vizitator care mai fusese pe site ar fi rămas cu cel din cache. Reîmprospătat pe toate cele 74 de pagini.

### Notes

- Vederea 3D **se aduce de pe internet abia când apeși butonul** — până atunci pagina rămâne ușoară, iar dacă nu vine (fără semnal, dispozitiv fără WebGL), o spune limpede și restul paginii merge întreg. Traseele lungi se răresc înainte de desenare, dar nu din N în N: un pas orb ar tăia exact vârful, adică punctul pentru care ai deschis 3D-ul.
- Verificat în browser: 33 de probe pentru tăiere, 3D și meniu (inclusiv că se desenează efectiv geometrie, nu doar că apare o pânză goală), 12 pentru straturile din Meditație — măsurate pe magistralele audio, nu pe cum arată butoanele.

## [1.55.0] – 2026-08-10

### Added

- 🗺️ **Cititor de GPX** (`/gpx`). După ce descarci un fișier, urma întrebare e „și acum ce fac cu el?". Îl deschizi aici și vezi **traseul pe hartă**, câți kilometri are, cât se urcă și cât se coboară, între ce altitudini merge, cât a durat (dacă fișierul are ore) și **profilul de altitudine** — cum urcă și cum coboară drumul, de la plecare spre sosire.
- 🔒 **Fișierul nu pleacă nicăieri.** Se citește în browserul tău și atât; nu-l trimitem pe niciun server, fiindcă nu e nevoie. Poți închide internetul înainte să-l deschizi și tot merge — lipsește doar fundalul hărții, linia traseului se desenează oricum.
- 📂 **Mai multe fișiere deodată**, fiecare cu culoarea lui, ca să compari două variante de drum pe aceeași hartă. Se trage fișierul peste pagină sau se alege din calculator.
- 🎯 **„Vezi pe hartă", la fiecare fișier** — și fiecare urmă și fiecare punct din listă sunt apăsabile și te duc exact acolo. Când deschizi un fișier nou, harta se mută pe **el**, nu se depărtează ca să le cuprindă pe toate.
- 🌲 **Din Pădure ajungi acolo dintr-o apăsare**: buton „Deschide un GPX" lângă celelalte și o legătură la sfaturi.

### Fixed

- 🗺️ **Deschideai un fișier și vedeai toată țara.** Pădurile care n-au încă poteci în OpenStreetMap vin ca fișier cu un singur punct, fără traseu — iar cititorul le socotea „fără nimic de arătat": nu desena nimic, nu muta harta, dar scria vesel „traseul e pe hartă". Acum punctul se desenează, harta se duce la el, iar mesajul spune pe față că fișierul are doar punctul.
- 🧭 **Un singur punct greșit strica toată harta.** Aparatele care n-au prins încă sateliții scriu „0,0" — un punct în golful Guineei. Marginile traseului se întindeau până acolo și te trezeai uitându-te la o jumătate de continent. Coordonatele imposibile se lasă acum afară.
- 📉 **Traseele foarte lungi cădeau în tăcere.** La peste ~100.000 de puncte, socoteala altitudinii minime crăpa și oprea tot ce urma — inclusiv mutarea hărții. Verificat cu o urmă de 150.000 de puncte (9 MB): se citește întreagă și harta se așază pe ea.
- 🖱️ **Fișierul tras peste chenar intra de două ori**, cu kilometrii dublați și două linii una peste alta.
- 📟 **Fișierele GPX 1.0** (aparate mai vechi) își pierdeau numele, iar cele scrise cu prefix (`<gpx:trkpt>`) păreau goale deși erau întregi.

### Notes

- Urcarea e socotită cinstit: aparatele care măsoară altitudinea tremură cu câțiva metri chiar și când stau pe loc, așa că numărăm doar diferențele mai mari de 3 m — altfel o plimbare pe câmp ar arăta ca o zi de munte.
- **Ce cere internet și ce nu:** fișierul tău nu ajunge niciodată pe vreun server — se citește la tine, și odată pagina deschisă merge și fără semnal. Dar *deschiderea* paginii cere internet (harta Leaflet vine de pe un CDN), așa că nu promitem mai mult decât putem ține.
- Verificat cap-coadă în browser, cu cifrele socotite de mână: un traseu de 1,1 km cu 100 m urcare iese exact așa; un fișier stricat e refuzat cu explicație, fără să dea pagina peste cap; iar fișierul descărcat din **Pădure** se deschide în cititor cu tot cu poteci și punctul pădurii.

## [1.54.0] – 2026-08-10

### Changed

- 🌲 **Pădurile se marchează singure pe hartă.** Până acum trebuia să știi că există un buton și să-l apeși; altfel harta arăta pădurile ca pete verzi, dar niciuna nu se putea alege. Acum mărești harta peste zona care te interesează, aștepți o clipă și li se desenează conturul. Cum plimbi harta, se adaugă și celelalte, fără să le pierzi pe cele dinainte. Butonul a rămas, pentru cine nu vrea să aștepte.
- 🏡 **Pădurile fără nume și-au primit un nume.** „Pădure fără nume" nu spune nimic și nu se ține minte. Cele mai multe păduri ale României chiar nu au nume în hartă, așa că le spunem cum le-ar spune un om de pe acolo: după satul de lângă ele — **„Pădurea de la Zamostea"**, iar dacă e mai departe, **„Pădurea la nord de Todirești"**. Satele vin din aceeași căutare, deci nu costă nicio așteptare în plus.
- 🗺️ **Harta nu mai sare.** Se așază pe zona căutată doar când ceri tu asta; când pădurile vin singure, rămâne unde ai lăsat-o.

### Fixed

- 🫥 **Pădurile de pe hartă dispăreau exact când îți alegeai orașul.** Veneau fără oraș și fără zonă, iar filtrele le ștergeau pe toate — de aici și „nu văd toate pădurile". Acum fiecare primește orașul cel mai apropiat și distanța până la el, iar filtrele nu mai ating ce e găsit pe hartă: acolo filtrul e harta însăși.
- 🌳 **Lipseau tocmai pădurile mari.** Cele întinse nu sunt trecute în hartă ca o singură bucată, ci ca mai multe legate între ele — și le ceream greșit, așa că nu veneau deloc. Acum vin, cu conturul lor.
- 👆 **Apăsai pe o pădure fără nume și harta sărea la alta.** Se chemau toate la fel, iar pagina le deosebea doar după nume; acum le deosebește după loc.

### Notes

- Verificat în browser: contururi închise, cele fără nume galbene și botezate după sat, pădurea-din-bucăți ajunge în listă, filtrele nu mai ascund nimic, harta stă locului când sosesc păduri noi și aceeași zonă nu se cere de două ori.

## [1.53.0] – 2026-08-10

### Added

- 🟩 **Pădurile se văd acum cu conturul lor, nu ca un punct.** Un punct în mijloc nu spune nimic despre unde începe și unde se termină pădurea — de aceea păreau „nedetectate". Acum se desenează suprafața fiecăreia: verde pentru locurile verificate de noi, galben pentru cele fără nume. Apeși oriunde pe suprafață și o alegi.
- 🥾 **„Drumuri și poteci"**: un buton care desenează tot ce se poate umbla în zona de pe hartă, nu doar în jurul unei păduri anume. **Maro** = poteci, **întrerupt** = drumuri forestiere, **albastru** = piste de bicicletă, **gri** = drumuri de mașină. Fiecare linie își spune numele când treci peste ea. Apeși din nou și dispar.

### Fixed

- 🚧 **Al doilea drum înfundat, de aceeași fire ca primul.** Butonul de drumuri refuza cu „zona e prea mare" ori de câte ori harta arăta mai mult decât un colț de județ — adică aproape mereu, fiindcă după o căutare de păduri harta se lărgește singură. Acum taie în jurul mijlocului hărții, cam cât umblă omul într-o zi, se așază pe zona aceea și spune ce a făcut.

### Notes

- Verificat că sunt **contururi închise**, nu doar puncte, că cele fără nume ies galbene, că fiecare fel de drum își primește culoarea, și că a doua apăsare chiar le ascunde.

## [1.52.0] – 2026-08-10

### Added

- 🟡 **Și pădurile fără nume se pot alege acum.** Ele sunt majoritatea în România și tocmai ele lipseau: nu apăreau nicăieri, deși au aceleași drumuri forestiere și poteci ca oricare alta. Apar cu **puncte galbene** pe hartă și în listă, cu semnul „fără nume · doar drumuri și poteci". Apeși pe una și primești exact ce primeai și înainte: potecile desenate pe hartă, avertismentele despre animale și fișierul GPX.
- 🎨 Culoarea spune totul dintr-o privire: **verde** pentru locurile verificate de noi, **galben** pentru pădurile luate din hartă fără nume. Legenda stă sub hartă.

### Fixed

- 🚧 **Butonul de căutare era un drum înfundat la prima deschidere.** Harta pornește arătând toată țara, iar o zonă atât de mare înseamnă mii de poligoane — așa că butonul răspundea „zona e prea mare" și atât, de fiecare dată, fără să spună ce ai de făcut. Acum, dacă zona vizibilă e prea largă, caută **în jurul mijlocului hărții** (vreo 30 km) și scrie limpede că asta a făcut.
- 🔁 Două petice de pădure fără nume, unul lângă altul, nu mai apar de două ori: fără nume se pot deosebi doar după loc, așa că le socotim ca fiind una dacă sunt la mai puțin de vreo sută de metri.

### Notes

- Verificat cu pagina pornită „de la zero", cum o deschide omul: butonul găsește păduri, cele fără nume ies galbene și pe hartă și în listă, iar una fără nume produce un GPX valid, cu punctul ei și cu potecile din jur.

## [1.51.1] – 2026-08-10

### Fixed

- 🎬 **Chakrele duceau toate la clipul vecin.** Playlistul începe cu un clip general, „RELAX CHAKRA MEDITATION", abia apoi vin cele șapte. Codul socotea „al câtelea clip din listă" fără să știe de el, așa că totul era mutat cu unu: **Rădăcină** deschidea clipul general, **Sacral** îl deschidea pe cel al Rădăcinii, iar **Plex** pe cel al Sacralului — exact cum s-a semnalat.
- 🔗 **Legătura se face acum după clip, nu după poziție.** Fiecare chakră ține minte ID-ul clipului ei, iar pagina îl caută în lista pe care i-o spune chiar playerul. Dacă mai adaugi, ștergi sau muți ceva în playlist, potrivirea rămâne bună de la sine — înainte, orice schimbare ar fi mutat din nou totul cu unu.

### Notes

- Playlistul a fost citit de pe YouTube ca să se afle ordinea adevărată, în loc să fie ghicită. Testul folosește acum chiar acea ordine și verifică **după ID**, nu după poziție: fiecare chakră ajunge la clipul ei, niciuna la clipul general, și nu există două chakre care să ducă în același loc.

## [1.51.0] – 2026-08-10

### Fixed

- 🌲 **Lipseau păduri, iar motivul nu era la noi.** În OpenStreetMap, **cele mai multe păduri ale României nu au nume** — sunt doar suprafețe verzi. Nicio căutare după nume nu le poate scoate pe toate: în tot ținutul Sucevei, de pildă, harta știe **patru** locuri numite „Pădurea …". Așa că pagina nu mai încearcă să le înșire pe toate, ci ți le **arată**: harta implicită e acum una de relief, pe care **toate pădurile țării apar verzi**, cu curbe de nivel, fără nicio întrebare pusă vreunui server. Poți comuta oricând pe harta simplă.
- 🔎 **Căutarea după nume prinde acum și „Pădurea Prodana".** Înainte se uita doar la suprafețele etichetate ca pădure; la noi, numele stă adesea pe un simplu punct pus în mijlocul ei. Acum se caută **orice obiect al cărui nume începe cu „Pădurea"**, indiferent ce etichetă poartă.
- 🔌 **Butonul de căutare părea stricat în zilele aglomerate.** Serverul principal de interogări e gratuit și des supraîncărcat — la o probă a răspuns 504. Acum ținem trei oglinzi și o folosim pe prima care răspunde, cu termen limită pe fiecare; iar dacă niciuna nu e disponibilă, scrie de ce, nu tace.

### Notes

- Limita e a hărții, nu a paginii: dacă o pădure n-are nume în OpenStreetMap, nu poate apărea într-o listă de nume. Se vede însă pe hartă, iar potecile ei intră în fișierul GPX la fel ca oriunde. Textul de sub hartă spune asta pe față, ca să nu pară că lipsesc lucruri.

## [1.50.0] – 2026-08-10

### Added

- 🌲 **Toate pădurile, nu doar cele alese de noi.** O listă scrisă de mână nu poate cuprinde miile de păduri ale țării, așa că apeși „Toate pădurile de pe hartă" și le cerem de la OpenStreetMap pentru zona pe care o vezi. Cele găsite așa poartă semnul **„din hartă · neverificat"** — numele și locul vin de acolo, nu au trecut prin verificarea noastră. Cele 41 verificate rămân deasupra, nu sunt înlocuite.
- 🥾 **Potecile se văd pe hartă**, nu doar în fișier. Alegi un loc și se desenează drumurile forestiere și potecile din jur, cu totalul în kilometri — ca să știi dinainte dacă ai pe unde umbla.
- 🐻 **Cu ce te poți întâlni în zonă.** Pentru fiecare loc: căpușe (peste tot, de primăvara până toamna), **urs brun** acolo unde chiar e arealul lui, **viperă comună** și **viperă cu corn** după zonele în care trăiesc, mistreț, iar la marginea orașelor câinii fără stăpân. Fiecare cu ce ai de făcut, pe scurt.

### Notes

- **Avertismentele nu sunt inventate și nu sunt despre pădurea ta.** Nu avem cum să știm ce e într-o pădure anume și nu ne dăm că știm. Ce se poate spune cinstit e **arealul cunoscut al speciilor** plus **altitudinea locului**, cerută de la Open-Meteo. De aceea textul zice mereu „în zona asta", iar sub listă scrie limpede că e vorba de areal, nu de o observație pe teren.
- Regulile vin din date publice: ursul brun trăiește în toată suprafața împădurită a Carpaților, de regulă **peste 600 m**, cu cele mai mari densități în **Brașov, Harghita, Buzău, Vrancea, Mureș și Covasna** — acolo avertismentul e marcat mai apăsat. Vipera comună e în Banat, Crișana, Transilvania, vestul Olteniei, nordul și centrul Moldovei; vipera cu corn în munții Banatului și ai Olteniei, zona Hațeg, sudul Apusenilor și Dobrogea.
- Verificat pe teren, cu pagina: la **Muntele Tâmpa** (Brașov, aproape 900 m) apare ursul, marcat serios; în **Parcul Tineretului** din București **nu apare deloc** — dar căpușele, da. Asta era regula care conta.

## [1.49.1] – 2026-08-10

### Added

- 🗺️ **Hartă adevărată în pagina Pădure.** O listă de 41 de rânduri nu răspunde la întrebarea „unde pot să merg?"; harta da. Vezi toată țara, cu un punct pentru fiecare loc, colorat după fel. Apeși pe punct și afli ce e, cât e de departe și descarci GPX-ul de acolo. Apeși pe un loc din listă și harta sare la el. Harta e **legată de România**: nu poți ieși din țară cu ea, fiindcă n-ar avea ce să-ți arate.
- 🧭 **Zone istorice**, nu doar orașe: Muntenia, Moldova, Transilvania, Banat, Dobrogea, Oltenia, Bucovina, Crișana. „Sunt în Ardeal" e mai aproape de cum gândește omul decât un oraș anume. Butoanele se fac din locurile care există cu adevărat, ca să nu apară o zonă goală.
- 🚗 **Waze, pe lângă Google Maps.** Fiecare are aplicația lui — Waze e mai bun la trafic, Maps la drumuri de țară — așa că le dăm pe amândouă, cu coordonatele locului.
- 📍 **Te vezi pe hartă** printre locurile verzi, dacă apeși „caută lângă mine".

### Notes

- Rotița mărește harta **doar după ce apeși pe ea**. Altfel, derulând pagina cu rotița peste hartă, ai fi mărit harta în loc să cobori — supărarea clasică a hărților puse în mijlocul unei pagini lungi.
- Politica de confidențialitate a fost completată: dalele hărții sunt cereri către OpenStreetMap, ca orice imagine adusă de pe alt server.

## [1.49.0] – 2026-08-10

**Pădure** — pentru cei de la oraș care au o mașină și o jumătate de zi.

### Added

- 🌳 **Pagină nouă: [Pădure](padure.html)**, cu **41 de locuri verzi din România** aproape de oraș — păduri, parcuri mari, rezervații, grădini botanice — în 14 orașe. Alegi orașul sau apeși „caută lângă mine", iar lista se așază după cât de aproape sunt.
- 🛰️ **GPX de luat cu tine, gratuit.** Ăsta e rostul paginii: descarci fișierul **cât ai internet**, îl pui pe ceas (Garmin, Suunto, Coros, Amazfit) sau pe telefon (OsmAnd, Organic Maps, Locus) și pleci — în pădure nu mai ai nevoie de semnal. Fișierul are punctul unde mergi plus **potecile reale din zonă**, aduse din OpenStreetMap.
- 🥾 **Înregistrarea traseului**, pentru drumul înapoi: pornești, mergi, iar la final salvezi tot un GPX. Punctele cu precizie proastă sunt lăsate deoparte, altfel un salt de GPS care nu s-a întâmplat umflă kilometrii. Totul rămâne pe telefon.

### Notes

- **Nu inventăm trasee.** Un traseu desenat de calculator prin pădure ar trimite oameni pe unde nu e potecă. Se dau doar potecile pe care le știe OpenStreetMap, spuse ca atare; dacă harta nu știe niciuna acolo, primești punctul și scrie limpede că doar atât e.
- **Coordonatele nu sunt scrise de mână.** Fiecare loc a fost cerut de la OpenStreetMap și verificat de două ori: că e chiar felul de obiect pretins și că e la mai puțin de 60 km de orașul de care e legat. Din 49 de locuri propuse, **41 au trecut**; trei au fost scoase fiindcă harta întorcea o stație de tramvai, un cimitir sau o comună întreagă în loc de parcul ori pădurea căutată — mai bine mai puține locuri decât un loc care te trimite aiurea.
- Fișierul produs a fost **parsat înapoi ca XML** în test, nu doar citit cu ochiul: un GPX stricat e refuzat de ceas, iar asta se află abia în pădure.
- Pagina are și avertismentul care lipsește din multe aplicații de drumeție: pădurea nu e parc, spune cuiva unde te duci, iar în ariile protejate se merge doar pe potecile marcate.

## [1.48.0] – 2026-08-10

### Added

- 🔊 **Lampa se aude când o freci.** Un foșnet de frecare care se ascute pe măsură ce lampa se încălzește, cu un bâzâit adânc dedesubt care crește odată cu el — senzația că se trezește ceva înăuntru. Când duhul iese, un clinchet luminos; când chemarea dă greș, un pufnet care coboară și se stinge. Nimic de descărcat: sunetul e făcut în browser, din zgomot filtrat, și nu pornește decât la prima atingere.
- 🔇 **Buton de sunet** în colțul scenei, ținut minte de la o vizită la alta. Nu declanșează frecatul lămpii când îl apeși.

### Fixed

- 🎬 **În Meditație, butoanele de chakre păreau că duc toate la același clip.** Playerul YouTube se construiește într-o clipită, dar nu instantaneu; dacă apăsai o chakră în secunda aceea, saltul cădea pe varianta de rezervă — care **înlocuiește** iframe-ul și distruge playerul, în timp ce codul rămânea să-i vorbească celui mort. De atunci încolo nicio apăsare nu mai schimba nimic: rămâneai pe clipul încărcat prima dată, așa că Rădăcină și Sacral arătau la fel, iar Plex părea că dă clipul altei chakre. Acum saltul cerut prea devreme **se ține minte** și se face exact când playerul e gata.

### Notes

- Verificat cu un player care devine gata abia după o jumătate de secundă — fereastra în care omul chiar apasă: saltul cerut în plină construcție nu se pierde, nu se mai construiește un al doilea player, iar fiecare chakră duce la clipul ei.

## [1.47.2] – 2026-08-10

**Toate cele 74 de pagini, deschise una câte una și verificate.**

### Fixed

- 🎵 **IMRO Talent putea rămâne fără muzică 24 de ore.** Dacă serverul întorcea altceva decât o listă de clipuri — o eroare, un răspuns gol — pagina crăpa la afișare. Partea rea nu era asta, ci că răspunsul stricat **se și salva în memoria browserului**, așa că biblioteca rămânea goală o zi întreagă, chiar după ce serverul își revenea. Acum se primește doar o listă adevărată, iar dacă în memorie e ceva stricat de dinainte, se aruncă singur.
- 🖼️ **Sigla lipsă de pe pagina iMarianRO** lăsa o imagine ruptă chiar în capul paginii. Până apare fișierul, în locul ei stă un cerc cu emblema Roblox; dacă sigla e adăugată, se folosește ea, fără altă schimbare.
- 🎨 **Fundalul paginii Integramă lipsea cu totul**: stilul cerea un fișier care nu exista. A fost desenat, cu cercuri care se leagă la margini fără cusătură.
- 🔖 **Pagina cadoului primit nu avea iconiță**, deci browserul cerea una inexistentă la fiecare deschidere.

### Notes

- Verificarea a fost făcută deschizând **fiecare pagină** într-un browser adevărat și adunând: excepții, erori de consolă, fișiere cerute și inexistente, imagini rupte și depășiri pe lățimea unui telefon. Din șapte pagini cu probleme au rămas patru, toate explicate: două sunt mesaje normale (autentificarea Google, o funcție de server care nu rulează local) și două sunt fișiere opționale, cerute anume cu plasă de siguranță — textura de fațade a jocului cu autobuzul și sigla de mai sus.

## [1.47.1] – 2026-08-10

### Fixed

- 📱 **Marginile laterale erau duble pe tot site-ul.** Bootstrap își pune singur o valoare de gutter și o folosește **pe jumătate**; la noi, suprascrierea din stiluri o folosea întreagă, deci fiecare pagină avea 24px de fiecare parte în loc de 12px. Pe telefon asta înseamnă 24px de conținut pierduți degeaba, pe fiecare pagină. Corectat **doar sub 576px**, unde fiecare pixel contează; pe ecrane late am lăsat spațiul larg, fiindcă acolo nu lipsește nimănui și tot site-ul a fost desenat cu el.
- 🔁 **Spiritul își trimitea înapoi propriile replici, în Ședință.** Paza împotriva ecoului ținea minte o singură replică, dar recunoașterea vocală vine cu întârziere: până ajungea la noi ce rostise acum două replici, el mai spusese una, iar potrivirea nu se mai făcea — așa că propriile lui cuvinte plecau ca întrebarea ta. Acum ține minte **ultimele șase replici** (douăzeci de secunde) și, în plus, **nu ascultă deloc cât timp vorbește**.
- 🎧 Surzenia aceea se pune **doar dacă vocea e pornită**. Fără sunet nu are ce să se întoarcă prin microfon, iar dacă o puneam oricum, prima ta întrebare — spusă imediat după ce apare spiritul — se pierdea degeaba.

### Notes

- Măsurat pe toate cele 74 de pagini, la șapte lățimi (320 → 1280px, inclusiv exact pe muchia de 576px): pe telefon nu mai există niciun container la 24px, pe desktop a rămas neatins, iar **nicio pagină nu depășește lățimea ecranului** la nicio lățime. Singurul container mai lat rămas pe telefon e cel din antetul paginii Gemini, care își cere anume 0,85rem în CSS-ul ei.

## [1.47.0] – 2026-08-10

### Changed

- 🔗 **Linkul cu dorințe a devenit scurt.** Până acum toată lista călătorea **în adresă**, codificată: linkul ieșea cât un paragraf, arăta a greșeală și se rupea când aplicațiile de mesagerie îl tăiau pe două rânduri. Acum lista se salvează, iar în link rămâne doar un cod — `dorinte?d=…`.
- 🛟 **Fără server, tot se poate trimite.** Dacă salvarea nu reușește — ești offline sau serverul n-are cheia — linkul se face ca înainte, cu lista în adresă. Împărțirea dorințelor mergea fără niciun server și trebuie să meargă mai departe așa.
- 📨 **Linkurile trimise deja funcționează în continuare.** Forma veche e citită la fel ca înainte; nimeni nu rămâne cu un link mort în conversație.

### Notes

- Verificat într-un browser adevărat: linkul iese scurt, lista ajunge la server, cine îl deschide vede numele și dorințele (fără lampă, ca să nu frece lista altcuiva), cu serverul oprit se trimite linkul lung, un link vechi tot se deschide, iar un cod inventat spune limpede că lista nu există.
- Politica de confidențialitate a fost actualizată: lista pleacă de pe dispozitiv **doar când apeși „Trimite"**, se păstrează ca Gist secret și oricine are linkul o poate citi.

### Manual

- Linkurile scurte au nevoie de `GITHUB_PAT` în Netlify — aceeași cheie folosită de cadoul digital. Fără ea, totul merge, dar cu linkul lung.

## [1.46.0] – 2026-08-10

**O sticlă mare nu se bea dintr-odată.**

### Added

- 🥤 **Porții, nu doar pachete întregi.** Până acum, un produs se trecea în jurnal doar în pachete: o sticlă de suc de 1 litru însemna „1 pachet" și tot zahărul ei într-o singură zi. Acum poți scrie **cât ai consumat de fapt** — 250 ml azi, alți 250 ml mâine — iar zahărul se împarte exact pe cât ai băut.
- 🍶 **La pachetele mari, porția e alegerea din start.** Peste 500 g/ml pagina trece singură pe porție, fiindcă acolo întrebarea firească e „cât beau azi?", nu „câte sticle beau?". Sub această mărime rămâne pe pachete întregi, ca înainte.
- 👆 **Porțiile obișnuite, la un clic**: jumătate de pachet, 100, 200, 250, 330 sau 500 — se arată doar cele care încap în pachet.
- 🧮 **Îți spune cât a mai rămas**: „Din pachetul de 1000 ml rămân 750 ml pentru altă dată" — ca să știi ce te așteaptă mâine.
- 📓 **În jurnal scrie „250 ml"**, nu „0,25 pachete". Porția se păstrează așa cum ai scris-o, inclusiv la export și la import.

### Fixed

- 🧪 **Calculatorul manual măsura totul în grame.** Unitatea era fixată pe „g", așa că o sticlă de 1 litru intra în jurnal ca 1000 g — tocmai la băuturi, unde e vorba de mililitri. Acum alegi **g sau ml**, iar unitatea tabelului („la 100 g" / „la 100 ml") se potrivește singură după ea.

### Notes

- Verificat într-un browser adevărat, pe o sticlă de 1 litru cu 10 g zahăr adăugat la 100 ml: patru porții de 250 ml dau **exact** cele 100 g din sticlă, fiecare intrare scrie „250 ml · 25 g zahăr adăugat", iar întoarcerea la pachete întregi readuce totul cum era.

## [1.45.8] – 2026-08-09

### Fixed

- 🎤 **Ascultarea murea după prima tăcere, iar butonul rămânea aprins.** Chrome închide singur sesiunea de recunoaștere după fiecare pauză — pe telefon, la câteva secunde. Repornirea se cerea chiar în clipa închiderii, sincron, iar Chrome refuză atunci cu `InvalidStateError` fiindcă nu a apucat să elibereze. Eroarea era înghițită, deci vorbeai într-un microfon care nu mai asculta pe nimeni, cu butonul zicând că ascultă. Acum repornirea se face după o pauză, cu încercări tot mai rare, iar dacă nici așa nu merge se construiește un recognizer nou. Verificat cu un microfon care refuză șase reporniri la rând: ascultarea supraviețuiește tuturor.
- 🔀 **Microfonul se împarte acum cinstit între spectru și voce.** Pe multe telefoane, cât timp pagina ține microfonul deschis pentru analiza spectrului, recunoașterea vocală pornește dar nu primește sunet — vezi barele EMF sărind când vorbești și totuși niciun cuvânt recunoscut. Nu se poate ști dinainte pe ce dispozitiv se întâmplă, așa că pornim cu amândouă și, dacă în zece secunde de ascultare nu s-a auzit nimic, dăm microfonul vocii și scriem pe ecran ce s-a întâmplat. La oprirea ascultării, spectrul îl primește înapoi.

## [1.45.7] – 2026-08-09

### Fixed

- 📓 **În jurnalul ședinței, replicile spiritului apăreau ca și cum le-ai fi spus tu.** Verificarea „s-a auzit pe sine" se făcea abia după scrierea în jurnal, așa că tot ce rostea el și se întorcea prin difuzor intra la „auzit în cameră". Printre rândurile lui puse pe seama ta, propriile întrebări se pierdeau. Acum verificarea se face prima, iar în jurnal rămâne doar ce ai spus cu adevărat.
- 🧹 Aceeași curățenie e valabilă în toate modurile, nu doar în Ședință — și înainte cutia își umplea jurnalul cu propriile cuvinte când vorbea prin difuzor.

### Notes

- Verificat într-un browser adevărat: după o discuție vorbită, **fiecare** rând de voce din jurnal e o întrebare a omului, niciunul nu e replica spiritului, iar totul se păstrează după reîncărcarea paginii.

## [1.45.6] – 2026-08-09

### Fixed

- 🗓️ **În Calendar scria „undefined 2026" în loc de numele lunii.** Când s-a adăugat citirea zilelor de naștere lipite din Facebook, a intrat în fișier o a doua listă de luni — una care merge invers, de la nume la număr. Titlul lunii a ajuns din greșeală s-o folosească pe aceea, iar căutarea „luna 7" într-o listă cu chei ca „iulie" nu întoarce nimic. Cele două nu se mai încurcă.
- 🔥 **Aceeași încurcătură crăpa eticheta postului din capul lunii.** Acolo se cerea și `.toLowerCase()` pe rezultatul inexistent, ceea ce nu dădea „undefined", ci oprea de tot desenarea lunii — deci lunile cu post din calendarul ortodox puteau rămâne fără eticheta lor.

### Changed

- 🙏 **Rugăciunile au coborât la sfârșitul paginii.** Stăteau înaintea calendarului, deși pentru calendar vii pe pagină. Acum ordinea e firească: alegi confesiunea, vezi ziua de azi, apoi calendarul, posturile, explicațiile — și la urmă rugăciunile, pentru cine rămâne să le spună.

## [1.45.5] – 2026-08-09

### Fixed

- 🎙️ **Ce spuneai cu gura nu ajungea la spirit, deși ce scriai ajungea.** Paza pusă ca spiritul să nu se audă pe sine compara ce s-a auzit cu **toate** cuvintele rostite de el vreodată — iar el și tu vorbiți aceeași limbă, așa că „cine ești?" semăna cu vocabularul lui și era aruncat ca ecou propriu. Acum se compară doar cu **ultima** replică rostită, și numai dacă a fost spusă în ultimele opt secunde.
- 🔇 **Recunoașterea vocală eșua în tăcere.** Din șase feluri în care poate să nu meargă, unul singur era spus omului; restul — microfon ocupat de altă aplicație, lipsă de internet, limbă nerecunoscută, nimic auzit — arătau toate la fel: a nimic. Fiecare are acum mesajul lui, fiindcă niciunul nu se rezolvă din pagină.
- 👂 Când vorbești în Ședință, se scrie pe ecran **„… — trimit spiritului"**, ca tăcerea care urmează să nu mai fie ambiguă între „nu te-a auzit" și „te-a auzit, dar nu a răspuns".

## [1.45.4] – 2026-08-09

### Fixed

- 🤫 **Cutia vorbea peste discuție, iar zgomotul ei părea răspunsul.** În Ședință, replicile locale („în sfârșit", „nu am mai vorbit demult") continuau să iasă pe cronometru, la fel ca în celelalte moduri. Întrebai „cine ești?" și primeai una dintre ele — care nu e un răspuns, ci doar cutia bolborosind. Acum spiritul rupe tăcerea **o singură dată**, la început, apoi tace și doar răspunde.
- ⏳ **O singură cerere agățată omora ședința pentru tot restul sesiunii.** Nu exista termen limită pe cerere, așa că dacă furnizorul nu răspundea niciodată, spiritul rămânea „ocupat" pe veci și **toate** întrebările următoare erau aruncate în tăcere. Acum cererea se taie la 15 secunde și ședința își revine.
- 🗣️ **Întrebarea pusă cât spiritul gândea dispărea fără urmă.** Se ține minte și se pune imediat ce se eliberează, iar între timp scrie „te aud, așteaptă o clipă" — în loc să pară că nu te-a auzit nimeni.
- 🔁 **Spiritul se auzea pe sine prin difuzor și își răspundea singur**, ocupând linia exact când voiai tu să întrebi. Acum recunoaște ce tocmai a rostit și ignoră.
- 💬 Mesajele de eroare scrise de noi nu mai sunt acoperite de textul brut al browserului: la o cerere expirată scrie „Furnizorul nu a răspuns în 15 secunde", nu „signal is aborted without reason".

### Notes

- Toate cele patru au fost întâi **reproduse** într-un browser adevărat — cerere agățată, a doua întrebare pusă peste ea, revenirea după expirare și liniștea dintre replici — apoi rezolvate. Primele două încercări de rezolvare au picat la aceleași teste, ceea ce era exact rostul lor.

## [1.45.3] – 2026-08-09

### Fixed

- 🤐 **Ședința nu răspundea deloc: modelul gândea în locul vorbitului.** Modelele `gpt-oss` de la Groq raționează înainte să răspundă, iar jetoanele consumate cu gânditul se scad din aceeași limită ca răspunsul — cu efortul implicit „mediu". Îi dădusem o limită de 120 de jetoane, potrivită pentru o replică de câteva cuvinte, așa că modelul consuma tot bugetul gândind și întorcea un răspuns **gol**, iar pagina raporta „răspuns gol de la groq". Acum cere efort de raționament mic și are loc destul; scurtimea replicii vine din instrucțiuni, nu din limită.
- 🔎 **„Răspuns gol" nu mai e tot ce afli.** Serverul spune acum și de ce s-a oprit modelul (`finish_reason`) și dacă a rămas fără jetoane raționând — adică exact ce ai de reglat. Înainte, orice fel de răspuns gol arăta la fel.

## [1.45.2] – 2026-08-09

### Fixed

- ⌨️ **Enter salvează cheia** în panoul Ședinței. Câmpurile nu stau într-un formular, așa că apăsarea pe Enter — reflexul oricui lipește o cheie — nu făcea nimic, iar cheia părea pusă fără să fie. Acum merge și cu Enter, și cu butonul.

## [1.45.1] – 2026-08-09

### Added

- 🔌 **„Verifică legătura"** în panoul de chei al Ședinței. O ședință mută poate însemna zece lucruri — cheie greșită, model scos din uz, limită atinsă, sau pagina deschisă local, unde funcțiile de server nici nu rulează. Butonul face o singură cerere și îți spune **exact ce s-a întors**: ce furnizor, ce model și ce a răspuns, cuvânt cu cuvânt.

### Notes

- Întreg drumul a fost verificat într-un browser adevărat, nu doar pe hârtie: pornit vânătoarea, trecut pe Ședință, scris o întrebare, urmărită cererea către server și răspunsul afișat. Plus patru feluri de defecțiuni — model scos din uz, cheie greșită, limită atinsă, funcție lipsă — ca să fim siguri că în **fiecare** dintre ele scrie pe ecran de ce, nu doar o replică oarecare a spiritului.

## [1.45.0] – 2026-08-09

**Spiritul te ascultă cu adevărat** — și nu mai repetă aceleași vorbe.

### Fixed

- 🔁 **Spirit box-ul repeta aceleași replici.** În modul Dialog replicile se alegeau direct dintr-o listă, fără nicio ferire de repetiție — iar listele au între 5 și 12 rânduri, așa că aceeași frază revenea des, uneori de două ori la rând. Cuvintele obișnuite aveau de mult grija asta; dialogul nu o avea. Acum o are: pe 60 de replici la rând, **zero repetiții imediate** și zero într-o fereastră de cinci, față de mai multe înainte.
- 🔇 **Spiritul amuțea după o vreme și nu mai răspundea la ce spuneai.** Reacția se declanșa comparând cu **lungimea** listei de cuvinte auzite — dar lista e plafonată la 40. După 40 de cuvinte lungimea rămânea fixă, condiția nu se mai împlinea niciodată, iar spiritul te ignora complet exact când discuția se încingea. Se numără acum de câte ori ai vorbit, nu câte cuvinte încap în listă: **120 de replici, 120 de reacții**, față de 40 înainte. Și un „da" scurt contează ca răspuns, nu doar cuvintele lungi.
- 🗣️ Ecoul — cuvântul tău pe care spiritul îl repetă înapoi — se ia acum doar din **ce tocmai ai spus**. Înainte putea scoate un cuvânt rostit cu cinci minute în urmă.

### Added

- 🕯️ **Ședința: un spirit care chiar înțelege ce îl întrebi.** Un mod nou, al patrulea, în care nu mai potrivim tipare, ci ține o discuție adevărată: înțelege întrebarea, **ține minte** ce ați vorbit până atunci, răspunde la subiect și pune și el întrebări. Rămâne în personaj, vorbește scurt, ca o cutie de spirite, și își ia numele și povestea din **locul unde te afli** — la un loc bântuit cunoscut, chiar din legenda lui.
- ⚡ **Merge pe Groq — gratuit și, mai ales, rapid.** La o ședință viteza chiar contează: o pauză de câteva secunde omoară fiorul. Merge și pe **Gemini**, **OpenRouter** sau **z.ai**, iar dacă furnizorul ales nu are cheie pusă pe server, ședința **încearcă singură pe celălalt** înainte să renunțe — nu rămâi cu un spirit mut fiindcă site-ul are pusă altă cheie decât credeai.
- 🔑 **Cheia ta, pentru un spirit mai viu.** Fără cheie proprie mergi pe cea a site-ului: limită zilnică împărțită de toți vizitatorii și un model mic, ales ca să fie rapid. Cu cheia ta nu mai împarți limita cu nimeni și **poți alege singur modelul** — de acolo vine saltul de realism, fiindcă un model mai bun ține minte mai bine firul discuției. Cheia și modelul rămân **doar în browserul tău**; noi nu le vedem niciodată. Modelul se poate schimba doar peste cheia ta — pe cheia site-ului rămâne cel implicit, ca nimeni să nu ceară modele scumpe pe socoteala noastră.
- 💬 Când ceva nu merge — cheie greșită, limită atinsă, model scos din uz — ți se spune **exact ce a răspuns furnizorul** și ce ai de făcut, în loc să tacă spiritul fără explicație. Mesajul brut ajunge și în consolă, pentru cazurile mai încurcate.

### Fixed

- 🔌 **Modelul Groq era unul scos din uz.** `llama-3.3-70b-versatile` a fost anunțat ca ieșit din uz pe 17 iunie 2026 și se oprește pe **16 august 2026** — adică peste o săptămână. Era modelul implicit al proxy-ului nostru, deci lovea și **Generatorul 3D**, nu doar ședința. Înlocuit cu cel recomandat chiar de Groq (`openai/gpt-oss-120b`), iar ședința cere anume varianta rapidă (`openai/gpt-oss-20b`), fiindcă acolo contează să vină răspunsul repede, nu să fie lung.
- ⌨️ **Poți și să scrii, nu doar să vorbești.** Ședința are căsuță de text, deci merge fără microfon — și fără recunoașterea vocală a browserului, care oricum trimite sunetul la Google.
- 🛟 **Dacă pică internetul, ședința nu se rupe**: spiritul revine la replicile locale și discuția merge mai departe.

### Notes

- Ședința e **singurul** mod din toată pagina care trimite ceva de pe telefon. Nu pornește de la sine: o alegi tu, iar înainte ți se spune limpede ce se întâmplă și ți se cere acordul, o dată. În Cuvinte, Povestea locului și Dialog nu pleacă nimic — ca până acum.
- Politica de confidențialitate a fost actualizată în aceeași zi, ca să spună exact asta.

## [1.44.0] – 2026-08-09

**Baduanjin verificat după textul chinezesc** · Șamanul plutește · ecran complet la Dorințe.

### Fixed

- 🧘 **Trei greșeli în descrierile Baduanjin**, găsite verificând forma rând cu rând după textul chinezesc al variantei standardizate (健身气功·八段锦), nu după traduceri — în engleză detaliile astea pur și simplu lipsesc. **La arc** (mișcarea 2) scria că palma întinsă e cu fața în sus; de fapt e întoarsă în direcția împingerii, cu încheietura lăsată pe spate, degetul mare și arătătorul întinse, iar cealaltă mână se face gheară. **La pumni** (mișcarea 7) scria că pumnul se răsucește cu dosul în sus; de fapt stă pe muchie, cu degetul mare în sus, și **rămâne așa** — nu se răsucește deloc. **La prima mișcare** lipsea cu totul încrucișarea degetelor, care e tocmai ce ține mâinile împreună cât urcă spre cer.
- 🖐️ **Completat ce era pe jumătate**: la „cuprinzi picioarele" palmele alunecă întâi în jos pe spate, de o parte și de alta a coloanei, abia apoi pe spatele picioarelor; la „o mână urcă" degetele palmei ridicate arată spre partea cealaltă a corpului, cealaltă înainte, iar privirea rămâne în față — nu în sus, cum era.
- ✊ **Și mâinile din animație au fost puse la punct**, nu doar textul. Pumnii de la mișcarea 7 chiar se răsuceau: stăteau cu palma în sus la talie și ajungeau cu dosul în sus la împingere. Acum stau pe muchie de la început până la sfârșit, exact ca în formă. La mișcarea 3, degetele palmei ridicate priveau înainte în loc de lateral. Unghiurile noi nu au fost ghicite, ci calculate: încheietura are două grade de libertate, așa că s-au căutat pe tot intervalul valorile care întorc mâna exact unde trebuie, cu grijă ca între cadre mâna să ia drumul scurt, nu să se desfacă înapoi.
- ✅ **Arcul (mișcarea 2) era deja corect în animație** — doar descrierea îl spunea greșit. Verificarea a arătat că palma privește de mult în direcția împingerii, nu în sus.
- 🧞 **Șamanul se legăna odată cu lampa.** Acum locul lui de ieșire se prinde o singură dată, la chemare, și rămâne acolo: plutește deasupra fumului, mai sus decât înainte, în loc să fie purtat de gura lămpii care se rotește.

### Added

- 🗺️ **Harta site-ului, refăcută.** Ghidul de la coada jurnalului rămăsese la vreo 25 de pagini din cele **71** care există azi — lipseau Dorințe, Meditație, Calendar, Lista de Cumpărături, jocurile cu autobuzul, formele de Qigong și încă vreo patruzeci. E rescris pe categorii, verificat pagină cu pagină (nicio pagină lipsă, niciun link mort) și mutat la sfârșit, ca o anexă, în loc să stea înghesuit între două versiuni vechi.
- ⛶ **Ecran complet la Dorințe.** Buton în colțul scenei, cu aceeași soluție ca la pietrele prețioase — nativ unde se poate, acoperire cu CSS pe iPhone, unde Safari nu dă ecran complet decât pentru video. Butonul nu declanșează din greșeală frecatul lămpii.
- 🔎 **„Caută cu Google AI"** în secțiunea Gemini de pe prima pagină.

### Notes

- Forma standardizată are și o poziție de pregătire și una de încheiere, în afara celor opt brocarturi. Sunt acum menționate în pagină, dar nu au încă animație.
- Toate cele **92 de cadre** ale celor trei forme — Tai Chi, Baduanjin, Qigong — au fost trecute din nou prin verificarea de anatomie: genunchii se îndoaie doar înapoi, coatele doar înainte, mâinile nu trec prin corp, tălpile rămân pe podea. Curat peste tot. Tai Chi și Qigong nu aveau nevoie de nicio corectură.

## [1.43.0] – 2026-08-09

**Șamanul iese pe gura lămpii, stă de vorbă cu tine — și nu vine de fiecare dată.**

### Added

- 💬 **Poți vorbi cu Șamanul, nu doar să-i dictezi.** Discuția se vede acum pe două voci, ca un chat: ce spui tu într-o parte, ce răspunde el în cealaltă. Îl poți întreba cine e, ce mai face, câte dorințe ți-au rămas, dacă chiar există — și răspunde la obiect. **Nimic din ce scrii nu pleacă de pe telefon**: răspunsurile sunt ale paginii, nu ale unui serviciu de inteligență artificială. O întrebare nu mai ajunge din greșeală pe lista de dorințe.
- ✋ **Te întreabă înainte să însemne.** Îți citește dorința înapoi — *„…ești sigur că asta e dorința pe care o dorești?"* — și abia după un „da" o trece pe listă, spunând că a memorat-o și câte mai poți adăuga. Dacă spui „nu", o ia de la capăt. Merge și cu vocea: „da" spus cu gura confirmă.
- 🎲 **Chemarea poate să nu reușească.** Chiar și cu lampa încinsă, uneori duhul se răsucește în fum și rămâne înăuntru: lampa se zbate, pufnește și se răcește la loc, iar tu o iei de la început. Șansa vine din norocul zilei, dar **fiecare ratare o urcă** — a patra încercare iese sigur.
- ⏳ **Răbdarea bate norocul.** Cine freacă **un minut întreg** fără să se lase îl scoate afară oricum: și în zilele în care lampa rămâne rece, și după oricâte ratări. Norocul spune cât de ușor iese; răbdarea spune dacă iese.

### Fixed

- 🧞 **Șamanul ieșea din mijlocul lămpii, nu pe gura ei.** Acum se ridică exact de acolo de unde se vede aburul, îl urmează când lampa se rotește, iar lampa se potolește cât el e afară, ca să nu-l clatine. Cadrul se lărgește puțin la apariție, ca să-i încapă tot capul.

## [1.42.0] – 2026-08-09

**Reclamele nu mai pornesc până nu spui tu că e în regulă.**

### Changed

- 🚦 **Consimțământ adevărat pentru reclame.** Scriptul Google pune cookie-uri chiar în clipa în care e adus în pagină, deci aducerea lui e tocmai lucrul pentru care se cere acordul — dar el stătea în `<head>`-ul celor 19 pagini cu reclame și se încărca înainte ca cineva să apuce să răspundă. Acum nu mai stă acolo: paginile poartă doar un marcaj, iar scriptul e adus din `include.js` **abia după un „Accept" apăsat de om**. Cine apasă „Refuz" nu-l vede niciodată, iar pagina merge exact la fel.
- 🙋 **Bannerul are și „Refuz", nu doar „Am înțeles".** Ambele răspunsuri arată la fel și sunt la fel de ușor de apăsat. Vechiul banner doar confirma că l-ai citit și nu oprea nimic — și, fiind scris de mână într-o singură pagină, **18 din cele 19 pagini cu reclame nici nu-l afișau**. Acum se construiește din cod, pe fiecare pagină cu reclame, și **doar** acolo: în restul site-ului nu e nimic de acceptat, fiindcă nu se pune niciun cookie.
- 🔕 **Reclamele pornesc nepersonalizate.** Pentru reclame personalizate în Uniunea Europeană, Google cere partenerilor o platformă de consimțământ certificată de el, iar bannerul acesta e scris de mână. Până atunci se trimite semnalul standard (Consent Mode v2) cu personalizarea oprită.
- 🔄 **Îți poți schimba alegerea oricând**, din politica de confidențialitate: scrie ce ai ales acum și are două butoane. Retragerea acordului trebuie să fie la fel de ușoară ca darea lui.

## [1.41.0] – 2026-08-09

**Politica de confidențialitate**, scrisă după cod, nu după șablon.

### Added

- 🛡️ **Pagină de confidențialitate** la [/confidentialitate](confidentialitate.html), cu link în subsolul fiecărei pagini. Nu e un text copiat: fiecare rând a fost scos din codul care rulează efectiv în pagină. Are un rezumat de sus pentru cine nu citește mai departe, două tabele — **ce rămâne în browser** și **ce permisiuni cere fiecare aplicație, și dacă pleacă ceva de pe dispozitiv** — plus lista serviciilor externe încărcate în pagină.
- 🔍 Lucruri spuse pe față, fiindcă puțini le-ar bănui: **recunoașterea vocală** din Chrome trimite sunetul la Google; **apelul video** face schimb de adrese IP ca să lege convorbirea; un **cadou digital** poate fi deschis de oricine are linkul; **dorințele trimise** sunt scrise chiar în adresa linkului; iar bannerul de cookie-uri **nu blochează** reclamele înainte de accept.

### Changed

- 🧭 **Meniu scurt la confidențialitate și la jurnalul de modificări.** Cele două pagini de subsol nu mai poartă meniul întreg al site-ului — omul a venit să citească un text, nu să navigheze. Rămân trei intrări: Acasă și legătura către cealaltă pagină din pereche, ca să treci ușor dintr-una în alta.

### Fixed

- 📒 **Patru versiuni stăteau la coada jurnalului, sub cea mai veche.** 1.23.8–1.23.11 fuseseră adăugate la sfârșitul fișierului, în alt format, așa că în pagină apăreau după 1.0.0. Sunt acum la locul lor, în ordine, iar instrucțiunile de la sfârșit spun limpede că o versiune nouă se pune **sus**, nu jos.
- 📱 **Titlul paginii de confidențialitate se vedea tăiat pe telefon.** „CONFIDENȚIALITATE" e un singur cuvânt de șaisprezece litere, iar la mărimea fixă a temei depășea ecranul și era retezat. Acum se micșorează după lățimea ferestrei.
- ✅ **Corectate câteva afirmații greșite din politică**, după o verificare rând cu rând: la **Fantome** coordonatele nu pleacă nicăieri (se compară în browser); la **Zahăr** fotografia etichetei nu se încarcă nicăieri (textul e citit local); un **cadou digital** nu se șterge după șapte zile, ci doar nu mai poate fi deschis de pe site. În plus, au fost trecute lucrurile lipsă: ce țin **Garajul și Filtrele** pe server, formularul de contact, echipele salvate public și jurnalul alimentar.
- 📅 Nota din **Calendar** spunea că anul nașterii nu se salvează. Se salvează — tocmai ca vârsta să crească singură la anul.

## [1.40.0] – 2026-08-09

**Gândul Zilei ține minte că vii** și **rugăciuni citite cu voce, în Calendar**.

### Added

- 🌱 **Statornicie în Gândul Zilei.** Ziua se bifează singură când deschizi pagina — ai venit să citești, nu să apeși un buton. Se ține **seria de zile la rând**, punctele, câte zile ai citit în total și cea mai lungă serie a ta, plus o treaptă cu nume, de la „La început" până la „Un an rotund". Zece puncte pe zi, câte unul în plus pentru fiecare zi de serie, și o răsplată mai mare la 7, 21, 50, 100, 200 și 365 de zile.
- 🎁 **Gânduri în plus pentru cine vine zilnic.** La trei zile la rând se deschide un gând în plus, iar la două săptămâni încă unul — **24 de texte originale**, scrise anume pentru cineva care are deja obiceiul, deci mai directe decât cele de zi cu zi. Se aleg după zi, nu la întâmplare, așa că rămân aceleași până a doua zi.
- 🙏 **Rugăciuni în Calendar**, la calendarul ortodox: **Tatăl nostru** și **Crezul**. O voce liniștită le spune **rând cu rând**, iar rândul care se rostește acum e luminat și adus în dreptul ochilor, ca să poți spune rugăciunea odată cu ea, nu după ea. Se citesc rar și cald, cu o răsuflare între rânduri. Poți pune pauză și **relua exact de unde ai rămas**, sau opri de tot.

### Notes

- Vocea o dă browserul; dacă are una românească, o folosește pe aceea. Fără voce, textul rămâne pe pagină și se poate citi liniștit.
- Rugăciunile apar doar când e ales calendarul ortodox, ca tot restul informațiilor religioase.
- Seria și punctele se țin **doar în browserul tău**.

## [1.39.0] – 2026-08-09

**Zile de naștere în Calendar** — al doilea calendar, lângă cel simplu și cel ortodox.

### Added

- 🎂 **Calendarul zilelor de naștere** la `/calendar`: al doilea buton din capul paginii, înaintea celui ortodox, fiindcă nu toată lumea e ortodoxă. Zilele apar colorate în calendar, iar deasupra e lista celor care urmează în următoarele 60 de zile, cu **vârsta pe care o împlinește fiecare la următoarea aniversare** — nu cea de acum.
- ✍️ **Adăugare de mână**, cu nume, zi, lună și, opțional, anul. Se salvează ziua și luna, nu o dată fixă, așa că ziua de naștere **revine singură în fiecare an**. La „an" poți scrie fie anul nașterii (1990), fie vârsta (35): vârsta e transformată pe loc în an, ca la anul să crească singură în loc să înghețe pe cifra scrisă azi.
- 🔄 **Sincronizare cu Google**: aduce numele și zilele de naștere din agenda ta, cu permisiunea ta, direct de la Google. Merge pe mai multe pagini, deci ia toată agenda, nu doar primele contacte.
- 📋 **Lipire din Facebook.** Facebook nu lasă alte site-uri să citească zilele de naștere ale prietenilor — tu le vezi în aplicație, un site străin nu, din Graph API v2.0 încoace. Așa că deschizi pagina lor de zile de naștere, copiezi lista și o lipești: recunoaștem singuri numele și data în aproape orice format, românesc sau englezesc, cu lună scrisă în litere sau în cifre.
- ❤️ **Cui trimiți urări și cui nu.** Fiecare persoană poate fi bifată „îi trimit" sau „nu îi trimit", iar cine e adăugat din agendă sau scris de mână pornește bifat — pe aceia îi cunoști. O listă lipită în bloc cuprinde și cunoștințe îndepărtate, așa că aceia rămân **nehotărâți** până alegi tu; e mai cinstit decât să presupunem. Cei refuzați nu mai apar în lista de sus, iar pentru ceilalți există un buton care trimite urarea cu numele și vârsta deja scrise.

### Notes

- Zilele de naștere se țin **doar în browserul tău**; nu pleacă nicăieri.
- Sincronizarea Google cere ca API-ul **People** să fie pornit în Google Cloud pentru clientul site-ului, iar permisiunea `contacts.readonly` să fie trecută pe ecranul de consimțământ. Până atunci, butonul spune limpede că Google a refuzat cererea.

## [1.38.0] – 2026-08-09

**Dorințe** — freci lampa, iese Șamanul și îți notează dorințele. Iar în decembrie răspunde Moș Crăciun.

### Added

- 🪄 **Dorințe** la `/dorinte` (aliasuri `/lampa`, `/dorinta`, `/wishlist`): **freci** lampa cu degetul, nu o apeși — se încălzește, tremură, apoi iese **Șamanul lămpii** și îți notează **trei dorințe**, după care se întoarce înăuntru. Îl chemi din nou oricând, pentru încă trei. De fiecare dată e nevoie de puțin altceva ca să iasă, iar frecarea se pierde dacă te oprești, așa că rămâne un gest, nu un buton.
- 🎅 **Moș Crăciun apare doar în perioada lui**, între **25 noiembrie și 26 decembrie**. În restul anului butonul e închis și scrie câte zile mai sunt — tocmai așteptarea îl face să conteze. Moșul primește mult mai multe dorințe decât Șamanul, fiindcă de obicei sunt cadouri, iar lista se trimite părinților. Dacă rămâne selectat din decembrie, în ianuarie pagina se întoarce singură la Șaman.
- 📨 **Trimiterea listei — ideea principală.** Lista pleacă prin butonul de partajare al telefonului, prin WhatsApp sau copiată ca text, iar linkul conține chiar dorințele. Cine îl deschide vede lista în citire, ca să te poată ajuta să le împlinești.
- ✅ **Bifezi dorința când s-a împlinit** și personajul spune „Dorința ta a fost îndeplinită. Continuă cu următoarea dorință." Poți șterge orice dorință — lista e a ta.
- 🎙️ **Poți spune dorința cu vocea**, nu doar să o scrii, iar personajul vorbește în română. Cine nu poate freca, apasă Enter pe lampă de câteva ori.

### Changed

- 🌈 **Chakrele din Meditație chiar sună diferit.** Notele lor sunt vecine — Do și Re sunt la un ton distanță — așa că, schimbând doar tonalitatea, Rădăcină și Sacral porneau aproape la fel. Acum fiecare chakră schimbă tot caracterul: registrul (jos și greu la bază, înalt și aerisit la vârf), modul, tempoul, instrumentele preferate, dacă are sau nu percuție și cât de deschis sună pad-ul.

### Notes

- Dorințele se salvează **doar pe dispozitiv**; nu pleacă nicăieri până nu le trimiți. Linkul e o fotografie a listei din clipa trimiterii — dacă adaugi ceva după, trimite-l din nou.

## [1.37.0] – 2026-08-09

**Toate plăcile de pe prima pagină au acum animație — și pe telefon, la atingere.**

### Fixed

- 📱 **Ținerea apăsată pe o placă arată animația, nu meniul browserului.** Pe telefon nu există `:hover`, așa că plăcile stăteau nemișcate, iar apăsarea lungă scotea meniul de context sau bula de selecție de pe iOS. Acum atingerea aprinde aceleași animații ca hover-ul pe desktop, iar meniul e oprit **doar** când gestul vine de la un deget — clic-dreapta cu mouse-ul funcționează mai departe, ca să poți deschide o pagină în filă nouă. Dacă derulezi cu degetul peste plăci, animația se stinge singură.

### Added

- ✨ **Animații pentru toate cele 69 de plăci.** Aveau doar 14; restul de 55 stăteau pe loc, mai ales cele din aplicații. Zece mișcări refolosite, alese după ce reprezintă placa: cardurile se întorc, inima bate, bomba și clopoțelul se scutură, mașina și căruciorul alunecă, globul și steaua se rotesc, becul și cipul pulsează, fantoma și floarea de lotus plutesc. Toate pornesc și la hover, și la atingere, și toate se opresc dacă sistemul cere mișcare redusă.

## [1.36.0] – 2026-08-09

**Meditație** — muzică de relaxare care se compune singură în browser, cu ghid de respirație, cronometru și lista noastră de meditații de pe YouTube.

### Added

- 🧘 **Meditație** la `/meditatie` (aliasuri `/relaxare`, `/meditate`, `/mindfulness`): muzica **nu e un fișier**, ci se generează notă cu notă cât o asculți, cu același motor din casetofonul Autobuzului de Munte — dar la jumătate de tempo, cu acorduri lungi și percuție abia auzită. La fiecare pornire se aleg altă tonalitate, alt mod, alt tempo (46–62 BPM) și alt instrument, deci **nu vei auzi de două ori aceeași ședință**. Butonul „Altă muzică" reașază totul fără să oprești.
- 🌧️ **Șase ambianțe**, toate sintetizate: pădure (vânt prin frunze, cu păsări depărtate), ploaie, ocean (valuri care respiră dintr-un singur oscilator lent), foc (trosnete rare de lemn), noapte (greieri, abia auziți) și liniște, dacă vrei doar muzica. Toate trec printr-un filtru care taie vârfurile ascuțite, ca să sune a natură, nu a șuierat de radio. Volumul muzicii și al ambianței se reglează separat.
- 🌈 **Comutator de chakre** lângă lista de pe YouTube: cele șapte chakre, fiecare cu bulina ei colorată. Alegerea acordează muzica generată pe nota tradițională a chakrei (de la Do, jos, la Si, sus) și sare la clipul potrivit din listă — **în playerul deja deschis, fără reîncărcare**, așa că nu o ia nimic de la capăt. Dacă YouTube e blocat, se revine la un player simplu. Corespondența dintre chakre și note e prezentată ca tradiție, nu ca măsurătoare, iar „Liber" lasă tonalitatea la voia întâmplării.
- 🔒 **Ședința merge mai departe cu ecranul blocat** sau cu fila în fundal, iar pe ecranul de blocare apar butoanele de pornit/oprit. Sunetul iese printr-un element media alimentat de Web Audio, ca telefonul să trateze pagina drept player, iar ceasul care construiește notele stă într-un Worker, cu rezervă mărită cât timp ecranul e stins — altfel muzica s-ar fi bâlbâit, fiindcă filele din fundal primesc ceasul o dată pe secundă.
- 🎼 **Zece instrumente, în două categorii.** Tradiționale (clopoței, kalimba, flaut de lemn, cupe de cristal, bol tibetan) și moderne (handpan, pian electric, marimbă, celestă, coarde ciupite). Butoanele de categorie filtrează lista, iar instrumentul poate fi fixat sau lăsat la sorți. Fiecare are propriul atac și propriile parțiale — de acolo vine diferența dintre o kalimba și un bol.
- 🎧 **Bătăi binaurale** (Delta 2 Hz, Theta 6 Hz, Alpha 10 Hz): două tonuri de 110 Hz, câte unul fix în fiecare ureche, cu diferența exactă a bătăii alese. Când sunt pornite apare un avertisment vizibil că **e nevoie de căști** — bătaia se formează la ascultare, nu în aer, deci în boxe pur și simplu nu există.
- 🏷️ **Etichetă de instrument** peste scenă, din sticlă mată (`backdrop-filter`), cu variantă de rezervă pe browserele care nu o acceptă. Haloul din jurul cercului se umflă și se stinge în unsprezece secunde, cât ține rezonanța instrumentelor, nu în ritm de metronom.
- 🔉 **Oprirea stinge sunetul în trei secunde**, printr-o rampă calculată pe eșantion, nu printr-un interval care scade volumul pas cu pas — un interval e încetinit de browser exact când fila trece în fundal, adică fix când s-ar auzi hopurile.
- 🫁 **Ghid de respirație** cu cerc care crește la inspirație și scade la expirație, în patru tipare — Calm 4–6, Pătrat 4–4–4–4, Relaxare 4–7–8 și Lung 6–8 — fiecare cu o notă despre pentru cine e potrivit.
- ⏳ **Cronometru** de 3–20 de minute sau fără limită. La final, muzica și ambianța scad lin timp de șapte secunde și sună un **clopot de încheiere** în trei bătăi, ca să nu te trezească brusc.
- ▶️ **Lista noastră de meditații de pe YouTube**, ca alternativă la muzica generată. Se încarcă **doar dacă apeși** — până atunci pagina nu ia deloc legătura cu YouTube — și folosește domeniul fără cookie-uri. Cele două surse se exclud: dacă pornești lista, muzica generată se oprește, și invers.

### Notes

- Nimic nu se descarcă: pad-urile, basul, clopoțeii, toba, ploaia și valurile sunt toate construite în Web Audio, deci pagina merge și fără internet (mai puțin lista de pe YouTube).
- Sunetul pornește **doar după ce apeși** butonul, cum cer browserele, iar dacă pleci din filă se oprește singur.
- Acordurile sunt derivate din scara aleasă, nu scrise de mână, așa că pad-ul nu poate nimeri o notă din afara modului. Verificat: 72 de note de acord, toate în scară, cel mai mic interval fiind terța mică.

## [1.35.0] – 2026-08-09

**Qigong și Baduanjin**, două pagini noi cu același instructor 3D — și o cale de învățare: bazele, apoi Cele Opt Brocarturi, apoi Tai Chi.

### Added

- 🌬️ **Qigong** la `/qigong` (aliasuri `/qi-gong`, `/chi-kung`): **opt exerciții de bază**, treapta dinaintea celorlalte două — statul liniștit (*Wújí Zhuāng*), respirația în dantian, eliberarea umerilor și a cefei, rotirea taliei cu brațele libere, baterea meridianelor, ridicare-coborâre cu deschidere-închidere, statul cu sfera (*Bàoqiú Zhuāng*) și închiderea (*Shōu Gōng*), fără de care nu se termină niciodată o ședință.
- 🙌 **Baduanjin** la `/baduanjin` (aliasuri `/ba-duan-jin`, `/opt-brocarturi`): **Cele Opt Brocarturi**, în ordinea din forma standardizată de Asociația Chineză de Qigong pentru Sănătate — de la „Ridici cerul cu amândouă mâinile" până la „Șapte săltări pe vârfuri". Fiecare mișcare are numele tradițional în chineză și pinyin, explicație în română, indicație de respirație și 3–4 pași povestiți în timp real.
- 🧘 Ambele folosesc **exact același instructor 3D** ca Tai Chi: dâra palmelor, cercurile de greutate sub tălpi, palma deschisă la culoare cu dosul mai închis, cele trei priveliști, oglinda și viteza reglabilă. Apar în meniul de **Exerciții** și pe prima pagină, în ordinea firească a învățării: Qigong → Baduanjin → Tai Chi.

### Changed

- 🧍 **Instructorul are acum talie și glezne care se ridică pe vârfuri.** Talia e o articulație adevărată, iar umerii și capul atârnă de ea, așa că aplecările din Baduanjin chiar duc brațele cu ele — înainte trunchiul, umerii și capul erau piese separate și nimic nu se putea apleca. Călcâiul se poate ridica de pe podea, iar corpul urcă singur cu vreo 9 cm, exact cât trebuie pentru a opta mișcare. Ambele sunt opționale, deci Tai Chi a rămas neschimbat la milimetru (verificat numeric).
- ♻️ **Motorul 3D a devenit un modul comun** (`instructor3d.js`): personajul, matematica pozițiilor și playerul stau într-un singur loc, iar fiecare pagină aduce doar lista ei de mișcări. `taichi.js` a scăzut de la 770 la 275 de linii, iar `taichi.css` a devenit `instructor.css`, folosit de toate trei. Datele Tai Chi-ului au trecut neatinse, octet cu octet.

### Fixed

- 👻 **Fantome: jurnalul e acum o conversație, nu un monolog.** Când ascultarea e pornită, ce se aude în cameră intră în jurnal lângă răspunsurile cutiei — retras, cu altă culoare și scris cu ghilimele. Până acum se vedea doar ultima frază auzită, într-o singură linie care se ștergea imediat, așa că nu-ți dădeai seama la ce anume răspunsese spiritul și nici ce spusese celălalt, dacă erați mai mulți. Conversația se salvează la fel ca restul jurnalului.
- 🔍 Toate cele **92 de cadre** ale celor trei forme sunt verificate automat: genunchii se îndoaie doar în spate, coatele doar în față, tălpile ating podeaua exact, mâinile nu intră în trunchi, iar cele **184 de orientări de palmă** sunt calculate din poziția brațului, nu ghicite. Aceeași verificare rulează pe oricare formă nouă.

## [1.34.0] – 2026-08-09

**Tai Chi încape acum pe telefon, se vede care e palma și care e dosul mâinii, iar spectrul din Fantome nu mai saltă.**

### Fixed

- 📱 **Tai Chi nu mai iese din ecran pe telefon.** Pe mobil coloana era declarată `1fr`, care în CSS înseamnă `minmax(auto, 1fr)` — adică nu poate coborî sub lățimea celui mai lat lucru dinăuntru. Cum three.js scria lățimea scenei 3D direct în pixeli pe pânză, aceasta devenea un prag: o dată lărgită (la rotirea telefonului în peisaj sau chiar la prima randare), pagina rămânea lată și apărea derulare orizontală, fără cale de întoarcere. Coloana are acum minim zero, pânza e scoasă din flux, iar three.js nu-i mai scrie deloc dimensiunea în stil — o ia numai din CSS.
- 📱 **Scena 3D nu mai blochează derularea paginii.** Ocupa toată lățimea și 340px înălțime, cu `touch-action: none`, așa că orice glisare cu degetul era înghițită de ea și nu puteai trece mai departe. Acum tragerea pe verticală derulează pagina, iar tragerea pe orizontală rotește în continuare instructorul, iar înclinarea pe verticală a camerei se face cu două degete.
- 📱 **Lista mișcărilor și butoanele se strâng cum trebuie.** Coloanele listei aveau un minim fix de 16rem, care depășea ecranul pe telefoanele mici și pe setările de text mărit; butonul mare de redare avea o lățime minimă rigidă care împingea rândul de comenzi în afara panoului. Toate rândurile de butoane se rup acum pe rândul următor în loc să iasă din panou. Ținta de atins pentru butoane a crescut la 44px, iar efectul de `:hover` nu mai rămâne lipit după atingere — atingerea are acum răspunsul ei, care se stinge la ridicarea degetului.
- 📱 **Se vede care mișcare e selectată.** Fundalul stării active avea un contrast de circa 1,14:1 față de pagină, adică practic invizibil; acum selecția are și o dungă colorată, iar butoanele apăsate o subliniere. Butonul „Drumul mâinilor" își spune starea în text, ca cel de oglindă.
- 📱 Aceeași corecție de coloană a fost aplicată și la **lista de posturi din Calendar**, care avea exact același minim de 16rem.
- 👻 **Fantome: spectrul audio nu mai saltă în sus și în jos.** Eticheta benzii comuta între „jos (0–300 Hz)" și „mijloc (300–2000 Hz)"; cea lungă trecea pe al doilea rând pe telefon, antetul creștea, iar graficul se mișca la fiecare comutare. Eticheta stă acum pe un singur rând, iar intervalul în Hz apare doar dacă încape.

### Changed

- 🧘 **Se vede care e palma și care e dosul mâinii.** Mâna are acum degete, deget mare și noduri: palma e deschisă la culoare, cu o pernuță colorată în mijloc (albastru la stânga, chihlimbar la dreapta), iar dosul e mai închis, cu nodurile degetelor. Silueta asimetrică dată de degetul mare arată dintr-o privire încotro e întoarsă mâna.
- 🧘 **Încheietura s-a articulat**, cu răsucire și îndoire, așa că palma poate privi exact unde spune explicația: în sus când ții mingea pe dedesubt, în jos când apeși, înainte când împingi. Cele 66 de orientări de palmă din formă sunt calculate din poziția brațului, nu ghicite, și verificate una câte una — 64 ies exact, iar două sunt diagonale intenționate, la 5° de țintă.

## [1.33.0] – 2026-08-09

**Instructorul de Tai Chi arată acum ca un om și îți spune, pas cu pas, ce face.**

### Added

- 🧘 **Explicație pas cu pas, în timp real.** Sub instructor scrie exact ce face în clipa aceea — «ții mingea: palma dreaptă deasupra, stânga dedesubt», «pășești cu stângul în față, călcâiul întâi», «treci greutatea în față și desparți mâinile». Cele zece mișcări au împreună **34 de pași explicați**, iar textul se schimbă singur pe măsură ce mișcarea curge.
- 🧘 **Drumul mâinilor se vede.** Palmele lasă câte o dâră care se stinge treptat — albastră pentru stânga, portocalie pentru dreapta — așa că vezi traiectoria completă, nu doar poziția de moment. Se poate opri dintr-un buton.
- 🧘 **Cercuri de greutate sub tălpi**, care se aprind pe piciorul care ține corpul. În Tai Chi greutatea e totul, iar acum se vede dintr-o privire pe ce picior stă instructorul.
- 🧘 **Trei priveliști dintr-un buton** — din față, din lateral și de sus — pentru că unele mișcări (pașii, întoarcerile) se înțeleg abia din profil. Rotirea liberă cu degetul a rămas.
- 🧘 **Mod oglindă**: instructorul se oglindește, ca să miști aceeași mână ca el când stai în fața ecranului, fără să mai traduci stânga în dreapta.

### Changed

- 🧘 **Personajul e făcut din capsule și articulații rotunde**, nu din cuburi: are gât, umeri și genunchi cu bilă, palme aplatizate cu degete (contează, fiindcă orientarea palmei e jumătate din Tai Chi), tălpi, guler și brâu. Proporțiile sunt de om, nu de robot.
- 🧘 **Ritmul implicit e mai lent (0,8×)** și fiecare mișcare durează mai mult, ca pozițiile intermediare să se citească.

### Fixed

- 🧘 **Genunchii se îndoiau invers.** Datele pozițiilor aveau semnele amestecate, așa că gamba pleca înainte, ca la păsări. Toate cele 31 de cadre au fost rescrise după o convenție verificată (genunchiul se îndoaie doar în spate, cotul doar în față) și sunt verificate automat.
- 🧘 **Lăsarea pe genunchi nu se vedea deloc.** Laba piciorului se rotea odată cu gamba, personajul ajungea pe vârfuri, iar așezarea pe podea anula exact cât se lăsase. Are acum **gleznă adevărată**, care ține talpa lipită de sol — corpul coboară vizibil, între 2 și 12 cm, după poziție.
- 🧘 **Personajul stă mereu pe podea.** Înălțimea nu mai e scrisă de mână în fiecare poziție, ci calculată din poziția tălpilor — nu mai plutește și nu mai intră în podea la nicio mișcare.
- 🧘 **Câteva mișcări nu ajungeau unde spunea textul**: mâna «de jos» de la Mișcarea Norilor stătea la piept în loc de talie, iar câteva măturări de braț plecau în partea greșită. Pozițiile sunt acum verificate numeric — se calculează unde ajunge fiecare palmă și se compară cu ce promite explicația.

## [1.32.0] – 2026-08-09

**Tai Chi cu instructor 3D**, **Gândul Zilei** (366 de învățături) și **calendarul posturilor devine neutru**, cu alegerea confesiunii.

### Added

- 🧘 **Tai Chi** la `/taichi` (alias `/tai-chi`), în meniul de Exerciții: **zece mișcări din forma Yang** arătate de un **instructor 3D animat** — același omuleț rigat ca la Fotbal Românesc, refolosit aici. Fiecare mișcare are numele în română și pinyin (Despicarea coamei calului sălbatic · Cocorul alb își întinde aripile · Mișcarea norilor · Biciul simplu...), explicație, **indicație de respirație**, bară de progres și listă din care sari direct la orice mișcare. Personajul se **rotește cu degetul** ca să vezi poziția din orice unghi, iar **viteza e reglabilă (0,4×–1,5×)** ca să înveți încet drumul mâinilor. Mișcarea e continuă, interpolată între poze — cum trebuie să fie Tai Chi-ul.
- 💡 **Gândul Zilei** la `/secret` (aliasuri `/gandul-zilei`, `/invataturi`): **366 de învățături scurte, originale**, scrise pentru TutorialEu — recunoștință, puterea gândului, atenție, încredere, dăruire, răbdare, iertare, acțiune, bucurie, abundență, curaj, liniște. Una pe zi, aceeași pentru toată lumea, cu **calendar** din care citești învățătura oricărei zile, **salvare la favorite** și copiere în clipboard. Temele se rotesc zilnic, ca să nu ai o săptămână întreagă despre același lucru.

### Changed

- 📅 **Pagina de post a devenit „Calendar"**, la `/calendar`. Se deschide ca un calendar obișnuit; butonul de confesiune schimbă **toată pagina** — titlul devine „Calendar Ortodox", subtitlul, calendarul și informațiile trec pe rânduiala ortodoxă, iar alegerea se ține minte. Vechile adrese (`/post`, `/posturi`, `/zile-de-post`, `/calendar-ortodox`) redirecționează către `/calendar`, iar în meniu apare simplu **Calendar**.
- 💪 **Exercițiile pornesc implicit pe „masculin"** la prima vizită (gantere, greutate corporală și stretching) — înainte se deschideau pe feminin. Alegerea ta rămâne salvată ca până acum.
- ✝️ **Calendarul posturilor e acum al tuturor.** Implicit se deschide ca un **calendar simplu, fără nimic religios**; alegi din capul paginii confesiunea și abia atunci apar zilele de post ale acesteia. Alegerea se **ține minte** la reîncărcare, așa că fiecare vede doar calendarul lui. Rânduiala ortodoxă a rămas neatinsă (toate cele 40 de verificări trec), dar e acum un „furnizor" între mai mulți — se pot adăuga alte confesiuni fără să se atingă nimic din ce există.

## [1.31.0] – 2026-08-07

**Calendarul Posturilor** — pagină dedicată creștinilor ortodocși: afli imediat dacă azi e zi de post.

### Added

- ✝️ **Calendarul Posturilor** la `/post` (aliasuri `/posturi`, `/zile-de-post`, `/calendar-ortodox`): un card mare îți spune **dacă azi e post și ce fel de post**, plus câte zile mai ține sau când vine următoarea zi de post. **Calendar lunar** colorat pe cinci niveluri — post aspru, post, dezlegare la ulei și vin, dezlegare la pește, harți — cu punct violet pe sărbători; apeși pe orice zi și vezi de ce e (sau nu e) post. Sunt calculate corect **cele patru posturi mari** cu datele exacte ale anului, **data Sfintelor Paști**, dezlegările (Buna Vestire, Florii, Schimbarea la Față), zilele de post cu dată fixă (Ajunul Bobotezei, Tăierea Capului Sf. Ioan, Înălțarea Sfintei Cruci, Ajunul Crăciunului) și **săptămânile de harți** (Săptămâna Luminată, de la Crăciun la Bobotează, după Duminica Vameșului și după Rusalii).
- ✝️ **Semne pe zilele cu dezlegare**: 🐟 pentru pește și 💧 pentru ulei și vin, direct în căsuța zilei — se vede din calendar ce e dezlegat, fără să apeși pe zi. Legenda explică pe scurt și ce înseamnă **sărbătoare** (zi de prăznuire din calendarul bisericesc — poate fi și zi de post, și zi fără post).
- ✝️ **Se vede din ce post face parte ziua**: cardul de azi arată numele popular al postului (**Postul Paștelui, Postul Sânpetrului, Postul Sântămăriei, Postul Crăciunului**), numele oficial dedesubt, **a câta zi din câte** ești și o bară de progres. Deasupra calendarului apar posturile care ating luna afișată, cu zilele acoperite, iar ziua apăsată îți spune și ea din ce post face parte. Postul în curs e evidențiat cu eticheta „acum" în lista celor patru posturi mari.
- ✝️ Totul e **calculat local**, după rânduiala Bisericii Ortodoxe Române (calendar îndreptat pentru sărbătorile fixe, Pascalia veche pentru Paști) — merge pentru orice an, fără internet. Pagina scrie explicit că rânduiala poate fi mai aspră în mănăstiri și că pentru cazuri deosebite (boală, sarcină, copii, vârstnici) se întreabă duhovnicul.

## [1.30.0] – 2026-08-07

**Pietre Prețioase** — clasamentul a 35 de pietre și materiale prețioase după preț, cu model 3D pentru fiecare.

### Added

- 💎 **Pietre Prețioase** la `/pietre` (aliasuri `/gems`, `/pietre-pretioase`): **35 de materiale** — pietre prețioase, semiprețioase, metale (aur, platină, paladiu, rodiu, argint) și materiale organice (perlă, coral, chihlimbar, sidef) — **clasate după preț**. Totul e adus la **preț pe gram** (1 carat = 0,2 g), singurul mod de a compara un metal vândut la gram cu o piatră vândută la carat: așa se vede că **aurul e abia pe locul 23**, sub 22 de pietre, iar un diamant bun costă de ~450 de ori mai mult pe gram decât el. Fiecare material are **model 3D** (piatră fațetată sau lingou), preț pe gram și pe carat, duritatea Mohs și o notă despre ce îl face rar. Filtre pe categorii și comutator gram/carat. Prețuri orientative pentru calitate superioară, august 2026.
- 💎 Buton nou de la **Pietre Zodiacale** către clasament, și intrare în **Meniu Aplicații**.
- 💎 **Ecran complet pentru scenele 3D** pe toate cele trei pagini cu 3D — Pietre Prețioase, Pietre Zodiacale și Ani de Căsătorie: buton în colțul vizualizatorului, cu ieșire din Escape. Pe iPhone, unde Safari nu permite ecran complet real pentru altceva decât video, scena acoperă tot ecranul în același mod.
- 💎 **Schimbare rapidă** între materiale pe pagina de pietre: listă derulantă cu tot clasamentul (grupată pe categorii, cu locul și prețul fiecăruia) plus butoane ▲▼ care te mută un loc mai sus sau mai jos în clasament (merg și săgețile de la tastatură).

- 🪙 **Moneda de la „Dat cu Banul" e acum 3D**: monedă de aur cu ambele fețe gravate (portret pentru CAP, pajură pentru PAJURĂ) și cu marginea zimțată ca la monedele reale, aruncată cu o traiectorie adevărată — sare, se rotește în aer și aterizează pe fața rezultatului, cu umbră care se strânge la coborâre. Dacă dispozitivul nu are WebGL, rămâne moneda 2D de dinainte.

### Changed

- ♟️ **Șah — Tactici rapide**: mutarea adversarului **se animează la fel ca a ta** (alunecă pe tablă, cu sunet), nu mai apare instant. Cele două ultime mutări rămân amândouă marcate pe tablă.
- ♟️ **Sunet propriu la selectarea piesei**, în meciul normal și în tactici: pionul face un tic scurt și înalt, calul un ton nazal, turnul unul greu, regina și regele sună cel mai plin și mai grav — auzi ce piesă ai luat, fără să te uiți.
- `/pietre` era alias pentru pagina de pietre zodiacale; acum e pagină proprie, iar zodiacul are aliasurile `/pietre-zodiac` și `/piatra-zodiei`.

## [1.29.0] – 2026-08-07

**Vânătoare de Fantome** — aplicație nouă de divertisment care transformă telefonul în „spirit box" și detector EMF.

### Added

- 👻 **Vânătoare de Fantome** la `/fantome` (aliasuri `/fantoma`, `/ghost`): **spirit box** care rostește cuvinte (cu voce) alese după **frecvența dominantă captată de microfon** — sunete joase scot cuvinte „grele" (întuneric, piatră, beci), banda vocii scoate nume și chemări, frecvențele înalte scot cuvinte scurte și tăioase. Vocabular de **240 de cuvinte** plus 21 de fraze; mesajele sunt **fragmente de 1–3 cuvinte**, care se lungesc pe măsură ce crește indicatorul.
- 👻 **Detector EMF pe senzori reali**: pe telefoanele care expun magnetometrul, citirea e **câmpul magnetic măsurat în µT** — sare când apropii telefonul de alt telefon, de un încărcător sau de o priză; altfel folosește busola (tot magnetometru, indirect), mișcarea și sunetul. Panoul spune mereu ce senzori are dispozitivul tău.
- 👻 **Locuri bântuite din România**: dacă permiți locația, aplicația verifică **local** (coordonatele nu pleacă de pe telefon) dacă ești în unul dintre cele **15 locuri** din listă — Pădurea Hoia-Baciu, Castelul Iulia Hasdeu, Cetatea Poenari, Bran, Bánffy, Corvinilor, Curtea de Argeș, Hotel Cișmigiu, Mănăstirea Chiajna, Trivale, Dealul Lunganilor, Bellu, Salina Turda, Râșnov, Miclăușeni — și atunci **spirit box-ul vorbește vocabularul locului**: numele din legendă (Iulia, Manole și Ana, Baciu, Vlad) și obiectele ei (pian, ședință, fântână, turmă, zid). Panoul arată și legenda locului, iar în afara zonelor îți spune care e cel mai apropiat loc bântuit și la câți km.
- 👻 **Listă cu toate locurile** (15) direct în aplicație: alegi oricare și îi asculți povestea de unde ești, fără să mergi acolo; un buton te întoarce la povestea locului tău real. Fiecare poveste începe cu **anul sau epoca** în care s-a întâmplat.
- 👻 **Răspunsuri pe măsura locului**: la „câți ani ai?" spiritul de la Castelul Iulia Hasdeu răspunde „aveam nouăsprezece ani", cel de la Curtea de Argeș „eram tânără", iar la „cum ai murit?" — „zidul m-a strâns". Fiecare dintre cele 15 locuri are răspunsuri proprii pentru vârstă, an, mod, loc și dorință.
- 👻 **Jurnalul se păstrează** după reîncărcarea paginii (până la 60 de mesaje, cu dată pentru cele din zilele trecute).
- 👻 **Trei moduri** în spirit box: **Cuvinte** (cutia clasică), **Povestea locului** — spiritul îți spune, bucată cu bucată, ce s-a întâmplat acolo (165 de fragmente scrise pentru cele 15 locuri: Manole care își zidește soția, cei trei prizonieri care sapă fântâna 15 ani la Hunedoara, ciobanul pierdut în Hoia-Baciu, Iulia care îi dictează tatălui planurile castelului) — și **Dialog**, în care un spirit din zona ta se prezintă cu un nume local, te întreabă lucruri și reacționează la ce răspunzi.
- 👻 **Cutia te ascultă și îți răspunde** (opțional, cu buton separat): pui o întrebare cu voce tare — „cine ești?", „unde ești?", „câți ani ai?", „mă auzi?" — și primești un răspuns potrivit întrebării, în ~1 secundă; numele venite ca răspuns sunt cele ale locului sau ale regiunii în care te afli. Cuvintele tale pot fi repetate înapoi printre celelalte. Aceeași întrebare primește același răspuns, iar cutia nu se ascultă pe sine. **Notă:** recunoașterea vocală a browserului trimite sunetul la serverele Google — de asta e oprită implicit.
- 👻 **Lungimea mesajului vine din sunet**: numărul de cuvinte (1–5) e dat de bogăția spectrului — o cameră liniștită scoate un cuvânt, vorbitul scoate trei, o bătaie în ușă scoate cinci. Banda se alege după **centrul spectral**, nu după vârf, ca un bâzâit constant (frigider, ventilator) să nu blocheze cutia pe aceleași cuvinte.
- 👻 **Vocabular regional pentru toată România**: în afara locurilor bântuite, aplicația determină regiunea (Transilvania, Moldova, Muntenia, Oltenia, Banat, Crișana, Maramureș, Bucovina, Dobrogea) și folosește nume și cuvinte de acolo — la mare apar „far, val, pescar, stuf", în Maramureș „poartă de lemn, horincă, Iza".
- 👻 Restul: spectru audio live, reglaj de sensibilitate (ritmul mesajelor), buton **Test voce**, jurnal al sesiunii cu ora, frecvența și EMF-ul fiecărui mesaj. Totul e **doar pentru distracție** — măsurătorile sunt reale, interpretarea lor ca activitate paranormală nu.

### Fixed

- 💎 **Pietrele 3D erau prea închise la culoare** (ametistul ieșea aproape negru, nu violet): distanța de atenuare a luminii era mult prea mică față de grosimea pietrei, așa că absorbea ~88% din lumina care trecea prin ea. Corectat pentru toate pietrele din **Pietre Zodiacale** și **Aniversări de Nuntă** — ametist, granat, safir, smarald, topaz, acvamarin și restul arată acum ca pietrele reale.

## [1.28.0] – 2026-08-07

**Demo-uri gratuite în Reduceri Jocuri** — secțiune nouă imediat după „Gratis acum".

### Added

- 🎮 **Secțiunea „Demo-uri gratuite"** pe `/reduceri` (Desktop): demo-urile jucabile de pe **Steam** — cele mai noi, cele populare și demo-urile jocurilor din **topul wishlist** (așa apar viralele gen Low-Budget Repairs) — plus **Epic Games** când există. Sortate după **câți jucători au demo-ul chiar acum** (afișat pe card: „N joacă acum"), demo-urile din ultimele 7 zile au eticheta **NOU**; filtre Toate / Noi / Steam / Epic / Fără 18+; butoane „Vezi toate demo-urile" către Steam și Epic; intrare nouă „Demo-uri" în meniul paginii.
- Datele vin din același sistem actualizat de două ori pe zi — secțiunea apare după prima rulare a acțiunii de reîmprospătare.

## [1.27.1] – 2026-08-07

**Aniversări de nuntă an cu an, cu obiecte 3D, plus meniuri unificate pe paginile secundare.**

### Added

- 💍 **Obiect 3D specific lângă inimă**, pentru fiecare aniversare: foaie de hârtie, buturugă de lemn, potcoavă, vază de lut, colier de perle, inel cu piatra anului, lingouri, ghindă...
- 💍 **Cronologie completă an cu an până la 50** — fără salturi: Topaz, Ametist, Granat, Opal, Beril, Jad, Mahon, Catifea, Căpșuni, Chihlimbar, Sidef, Lavandă, Cașmir, Cedru și restul.
- 💍 **Data nunții se salvează în browser** și rămâne completată la revenirea pe pagină.

### Changed

- **Meniuri unificate**: paginile de aplicații au **Meniu Aplicații**, paginile de chat/cumpărături/Chat AI/știri au **Meniu Chat**; „Meniu AI" a fost eliminat, iar Gemini Hub are navigare simplă.

### Fixed

- Chat AI afișa un meniu vechi după conectare; Știri AI primea meniul greșit (ruta `/ai` o „fura" pe `/ai-news`); data nunții se reseta din cauza cache-ului (versiune nouă de script).

## [1.27.0] – 2026-08-06

**Trei aplicații noi** — Listă de Cumpărături partajată cu prietenii, Aniversări de Nuntă și Pietre Zodiacale cu obiecte 3D, plus scurtături noi în secțiunea Gemini.

### Added

- **🛒 Listă de Cumpărături** la `/cumparaturi` (aliasuri `/lista`, `/liste`, `/shopping`): liste multiple (Kaufland, Piață...), partajate cu prietenii din **Chat Privat** — același cont Google, aceiași prieteni. Produse cu cantitate, bifare/debifare în **timp real** pe toate telefoanele deodată (cu semnal sonor când altcineva modifică), se vede cine a adăugat și cine a bifat fiecare produs, membru nou adăugat de proprietar dintre prieteni, părăsire listă, redenumire și ștergere (doar proprietarul). Fără notificări push în această versiune — sincronizarea live ține loc. Intrare nouă în **Meniu Chat** pe paginile secundare și pe prima pagină în secțiunea **Chat**.
- **💍 Aniversări de Nuntă** la `/nunta` (aliasuri `/casatorie`, `/aniversari`): scrii câți ani de căsătorie ai (sau alegi data nunții — cu numărătoare inversă până la următoarea aniversare) și vezi denumirea tradițională românească a aniversării, de la **Nunta de Hârtie** (1 an) până la **Nunta de Stejar** (80 de ani), cu o inimă sau piatră prețioasă **3D** în materialul anului: hârtie, bumbac, piele, lemn, argint, aur, rubin, diamant... plus cronologia completă a tuturor aniversărilor.
- **💎 Pietre Zodiacale** la `/zodiac-pietre` (alias `/pietre`): alegi zodia (sau ziua de naștere) și vezi piatra ei prețioasă norocoasă șlefuită în **3D** — diamant pentru Berbec, smarald pentru Taur, rubin pentru Rac, safir pentru Fecioară și restul — cu descrierea semnificației. Fiecare zodie are și **3 pietre tămăduitoare** (cristaloterapie: jasp roșu, cuarț roz, ochi de tigru, piatra lunii, obsidian...) — apeși pe orice piatră și o vezi imediat în 3D, cu semnificația ei. Buton nou și în secțiunea Zodiac de pe prima pagină.
- **Secțiunea Gemini**: scurtături noi către **Flow Music** (invitație) și **Google Flow** (unealta AI de video pentru youtuberi, labs.google).
- Secțiunea **Aplicații Simple** de pe prima pagină cuprinde acum și **Ani de Căsătorie** + **Pietre Zodiacale**.

### Notă pentru administrare

- Regulile Firestore au fost extinse (colecția `shoppingLists` + funcția `listMember`) — fișierul `firestore.rules` din repo trebuie lipit în consola Firebase (proiectul tutorialeu-chat) **înainte** de primul test al paginii de cumpărături.

## [1.26.2] – 2026-08-05

**Prima pagină** — zona AI reorganizată în secțiuni cu meniu propriu, capitolele video Garaj/Exerciții corectate și playlistul C# înlocuit cu evoluția site-ului.

### Changed

- **🤖 AI e acum un meniu cu subiecte** (ca 🎮 Jocuri și ⚡ Unelte): **✨ Gemini · 💬 Chat · 🧩 Aplicații** — secțiuni proprii pe prima pagină, cu fundal adaptat temei albe/întunecate. Secțiunea **Gemini** adună Nano Gemini Hub și modelele din AI Studio. Secțiunea **Aplicații Simple** cuprinde **Cadou Digital** (mutat din secțiunea Jocuri) și **Generator 3D**. La fel și în meniurile paginilor secundare: **Cadou Digital** a trecut din „Jocuri & Divertisment" în „Meniu AI", iar pagina de cadouri afișează acum acest meniu. Secțiunea **Chat** cuprinde **Chat Privat**, **Apel Video**, **Chat AI** și scurtătura către **Știri AI**.
- **Capitolele prezentării**: „Garaj & Exerciții" era un singur capitol — acum **Garaj Virtual** e capitol separat pe videoclipul lui dedicat (cu reluare de unde ai rămas), iar **Exerciții Fizice** primește minutul 35:30 din prezentarea curentă, care chiar asta arată. Reparat și punctul de întoarcere după videoclipurile secundare: terminarea demo-ului Garaj revine la Exerciții, iar Reduceri revine la Jocuri & simulatoare (înainte săreau la momente din VECHIUL videoclip, care în cel nou cad în mijlocul altor secțiuni).
- **Playlistul „Tutoriale de programare în C#"** din portofoliul video a fost înlocuit cu **„Evoluția site-ului tutorialeu.ro"** — miniatură nouă, descriere nouă, playlistul de pe canal.

### Added

- **Animații la hover** pentru jocurile care nu aveau: Autobuzul de Munte hurducăie ca pe drum de munte, Autobuzul de Oraș frânează în stație, mașina din Condu în Orice Oraș virează, ținta Arcașei încasează săgeata, mingea de fotbal driblează, porumbelul Vindecătorului planează, iar cronometrul de la Test Reflexe ticăie acum continuu cât stai deasupra.

### Fixed

- Capitolul **„Noutăți & meniu"** din prezentare nu avea iconiță (apărea un „i") — folosea `fa-sparkles`, care există doar în Font Awesome Pro; înlocuit cu bagheta magică din setul gratuit.

## [1.26.1] – 2026-08-05

**Chat privat** — primul mesaj către un prieten nou-adăugat nu se trimitea; linkurile din mesaje sunt acum apăsabile.

### Fixed

- **Primul mesaj eșua silențios**: pentru un prieten abia adăugat, documentul conversației nu există încă, iar regulile resping orice citire a unui document inexistent (`permission-denied`) — codul lăsa acea eroare să anuleze toată trimiterea, iar conversația nu se crea niciodată. Acum citirea eșuată e tratată corect drept „conversația nu există" (sigur, pentru că ID-ul conversației conține propriul uid) și documentul se creează pe loc, la deschiderea chatului și la trimitere. Important: lista de participanți se scrie **doar la creare** — conversațiile vechi o au salvată în ordinea [expeditor, destinatar], iar regula de update compară ordinea exactă, deci retrimiterea ei ar fi respinsă. **Nu e nevoie de nicio modificare a regulilor Firestore.** Repară și trimiterea imediat după „șterge conversația".
- Ascultătorii de mesaje și de conversație au acum handler de eroare (erorile apar o dată în consolă, nu ca excepții neprinse).

### Added

- **Linkurile din mesaje sunt detectate și apăsabile** (se deschid în tab nou) — utile de exemplu ca să trimiți un link către browserul TV-ului. Implementat sigur, fără HTML injectat: textul devine noduri DOM + ancore, punctuația de la finalul linkului rămâne în afara lui, iar `www.` primește automat `https://`.

## [1.26.0] – 2026-08-02

**Filtrele Mele** — pagină nouă la `/filtre`: evidența filtrelor de apă, aer și casă, cu notificări push reale pe telefon când e timpul să le schimbi.

### Added

- **Pagina `/filtre`** (aliasuri `/filters`, `/filtru`): login cu Google, filtrele salvate în cloud (același cont ca Garajul Virtual), sincronizate pe toate dispozitivele. Adaugi un filtru cu data instalării + intervalul de schimb; vezi statusul (verde / „de schimbat curând" / depășit), bară de uzură, câte zile mai sunt, și apeși **„Am schimbat filtrul"** ca să resetezi ciclul — cu **istoric** al ultimelor 10 schimbări.
- **13 tipuri predefinite** în 4 categorii, cu intervale tipice: 💧 apă (cană filtrantă Brita/Aquaphor · cartuș sub chiuvetă · membrană osmoză · filtru frigider), 🌬️ aer (HEPA · carbon activ · pre-filtru lavabil), 🏠 casă (hotă metalică/carbon · AC · aspirator), 🔥 centrală & dedurizator (anti-magnetită · sedimente) — plus filtre complet personalizate.
- **Notificări push pe telefon** (funcționează cu site-ul închis): o acțiune GitHub zilnică (06:30 UTC) citește filtrele din cloud și trimite push prin Firebase. Mai deșteaptă decât cea de la Garaj: potrivire pe **fereastră** (o rulare ratată nu pierde reminder-ul), exact **o notificare per ciclu** de schimb, iar filtrele depășite primesc un ping la cel mult 7 zile. Setezi din pagină cu câte zile înainte vrei anunțul.
- **Reminder-e de calendar** ca alternativă/plus: buton Google Calendar și fișier .ics per filtru, programate cu N zile înainte de schimb.
- **Instalabilă ca aplicație** (manifest propriu): pe iPhone, unde push-ul web cere instalarea pe ecranul principal, pagina afișează un ghid pas-cu-pas; pe Android/desktop merge direct din browser.

### Changed

- **Service worker-ul de notificări** (partajat cu Garajul): la apăsarea unei notificări, acum deschide/focalizează pagina **proprie** a notificării (Garaj → `/garaj`, Filtre → `/filtre`) — înainte focaliza orice tab `/garaj` deschis, indiferent de țintă.
- Notă: activarea push-ului pe /filtre înscrie browserul și la notificările Garajului (și invers) — același cont, aceeași listă de dispozitive. Este intenționat, nu un bug.

## [1.25.0] – 2026-07-28

**Gravitație** — ploile de meteori arată acum corect doar când privești cerul de pe Pământ, cu urmărire automată a radiantului.

### Added

- **Urmărește radiantul**: un nou buton lângă „Ploi de meteori" (vizibil de pe Pământ) care ține camera îndreptată automat spre radiantul ploii active, pe măsură ce cerul se rotește — foarte util când derulezi timpul rapid, ca să nu pierzi ploaia din cadru. Dacă radiantul e sub orizont, urmărirea așteaptă și pornește singură când răsare. O tragere manuală pe ecran o oprește imediat, ca să nu se lupte cu privirea ta.
- Datele ploilor de meteori (9 ploi majore — Cvadrantide, Liride, Eta Acvaride, Delta Acvaride de Sud, Perseide, Orionide, Leonide, Geminide, Ursidele) au fost verificate față de calendarul IMO (International Meteor Organization): radianți (AR/Dec), date de maxim și ZHR se potrivesc cu sursa de referință.

### Fixed

- **„Curentul de meteoroizi" din vederea Sistemului Solar** arăta un nor de particule + un text 3D care se mișca vizibil odată cu Pământul pe orbită — pentru că poziția lui era, într-adevăr, calculată relativ la poziția curentă a Pământului. Era o reprezentare confuză, redundantă cu traseele din cer de pe Pământ (care sunt corecte: fixate pe stele, pornind din radiantul real). Am scos varianta din Sistemul Solar — meteorii apar acum **doar** când ești pe Pământ și privești cerul.
- **Traseele de meteori continuau la Pauză**: clipirea traseelor (care perechi din cele 18 sunt vizibile) folosea ceasul real al browserului, nu ceasul simulării — așa că apăreau meteori noi chiar și cu timpul oprit. Acum clipirea folosește un ceas propriu care se oprește exact când apeși Pauză, la fel ca restul scenei.

## [1.24.0] – 2026-07-28

**Zahăr** — planifici ce vrei să consumi, vezi pe semafor unde te afli față de recomandarea zilnică și de ce contează pe termen lung. Plus scanare pentru numele produsului și reparații la scaner.

### Added

- **Istoric zile**: produsele consumate azi trec automat, de mâine, într-o listă de zile anterioare — fiecare zi lucrează deja sub propria cheie de stocare, deci nu e nevoie de nicio mutare a datelor. Fiecare zi din istoric arată un punct colorat (🟢🟡🟠🔴, la fel ca semaforul zilei), data și totalul consumat, și se poate extinde pentru lista de produse (doar vizualizare — istoricul nu se editează). Zilele fără niciun produs consumat nu apar în listă.
- **Notificare de zi nouă**: la prima deschidere a paginii într-o zi nouă, apare o bară scurtă — „Ieri ai consumat X g” — colorată după cât de aproape sau de departe a fost ziua anterioară de recomandare, cu buton spre istoric. Apare o singură dată per zi (nu la fiecare reîncărcare a paginii).
- **Estimare zahăr adăugat**: etichetele din UE declară doar „Zaharuri" (totale), nu și cât din ele este adăugat — de aceea produsele fără valoare declarată nu puteau intra în totalul zilei. Acum alegi **categoria produsului** (băuturi răcoritoare, lactate îndulcite, nectaruri, conserve și gemuri, sosuri, panificație) și scădem **zahărul natural mediu** al categoriei ca să estimăm partea adăugată. Vezi și echivalentul în **lingurițe** (1 linguriță ≈ 4 g). Ex.: iaurt cu fructe, 150 g, 12 g zaharuri → ≈ 7,5 g/100 g adăugat, ≈ 11,3 g pe pachet, ≈ 2,8 lingurițe. Valorile estimate sunt marcate peste tot cu **„≈ estimat"** (rezultat, jurnal, produse salvate) și au încredere „scăzută", ca să nu fie confundate cu o valoare citită de pe etichetă. Produsele care conțin doar zahăr natural (ex. iaurt simplu) rezultă corect în **0 g adăugat**.
- **Semafor pentru ziua curentă**: 🟢 verde sub 80% din recomandare, 🟡 galben la 80–100%, 🟠 portocaliu peste limită și 🔴 roșu peste 150%. Vezi dintr-o privire dacă ai depășit limita de zahăr adăugat (25 g femei / 36 g bărbați, AHA).
- **De ce contează pe termen lung**: când ziua trece de limită, apare o notă cu ce este asociat un consum ridicat **menținut zi după zi** (creștere în greutate, risc de diabet de tip 2, boli de inimă, carii, ficat gras). Nota citește tiparul, nu o singură zi: dacă ai depășit limita în cel puțin 2 din ultimele 7 zile înregistrate, îți spune exact în câte. Sunt prezentate ca **asocieri de risc**, nu certitudini sau diagnostic, cu îndemn la discuția cu medicul.
- **„Vreau să consum” intră în jurnal**: produsele planificate apar într-o secțiune separată și **nu se adună în totalul zilei** până le bifezi ca fiind consumate. O linie de proiecție arată unde ai ajunge dacă mănânci tot planul.
- **Produse salvate, refolosibile**: „Ultimele produse analizate” are acum adăugare rapidă în plan sau în consum (fără să scanezi din nou), **editare** a valorilor greșite (nume, gramaj, zahăr/pachet — valorile la 100 g se recalculează) și **ștergere cu confirmare**.
- **Scanare nume produs**: pe aceeași fotografie poți selecta și numele produsului, nu doar „Zaharuri” și „Cantitate netă”. Citirea numelui folosește doar litere, ca gramajele și codurile de bare să nu ajungă în câmpul de nume.
- **Șterge fotografia**: buton care golește scanerul și readuce starea inițială (înainte fotografia rămânea pe ecran până o înlocuiai cu alta).

### Fixed

- **Rotirea micșora fotografia**: fiecare glisare a unghiului rotea rezultatul rotit anterior, așa că pânza creștea de fiecare dată și poza ajungea tot mai mică, cu tot mai mult alb în jur (după 5 rotiri de 15°, poza ocupa 13% din imagine). Acum unghiul se aplică **absolut, pe imaginea originală** — 45° înseamnă același rezultat indiferent din câți pași ajungi acolo, iar revenirea la 0° restaurează poza intactă. Previzualizarea în timpul glisării arată exact ce se salvează.
- **Configurare AI gratuit**: modelul Groq configurat (`llama-4-scout`) fusese retras de furnizor — de aici eroarea „modelul nu există”. Verificat față de documentația curentă și înlocuit cu un model gratuit cu vedere (`qwen/qwen3.6-27b`). **OpenRouter** folosea un identificator inexistent (`openrouter/free`), iar **Grok/xAI** nu are nivel gratuit — ambele au fost scoase, ca secțiunea să conțină doar API-uri personale cu adevărat gratuite.
- **Fundal secțiune Zahăr (prima pagină)**: folosea o clasă fără nicio regulă CSS, deci arăta identic pe temă deschisă și întunecată. Acum are fundal propriu pentru fiecare temă.
- **Informația de detecție** apare acum deasupra fotografiei, unde se vede imediat după scanare. Butonul de rotire la 90° a fost eliminat, fiind acoperit de glisorul de unghi.

### Removed

- **„Decupează detaliile nutriționale"**: selectarea zonei direct pe fotografie (ține apăsat și trage) face același lucru mai simplu, așa că butonul și fereastra de decupare au fost scoase. Astfel pagina nu mai încarcă deloc biblioteca externă Cropper.js de pe CDN.

## [1.23.11] – 2026-07-26

### Added

- **Sunet la intrarea în cameră**: un ton ascendent confirmă acum intrarea unui participant în camera video, similar cu notificările de voce din Discord.

## [1.23.10] – 2026-07-26

### Added

- **Sunet la ieșirea din cameră**: un sunet scurt este redat pentru participanții rămași atunci când cineva părăsește camera video.

## [1.23.9] – 2026-07-26

### Changed

- **Apelurile fără răspuns se închid singure** după 45 de secunde: camera se oprește și invitația este eliminată.

## [1.23.8] – 2026-07-26

### Fixed

- **Răspunsul „Refuză" la apel**: invitația este eliminată fără a adăuga persoana în camera video.

## [1.23.7] – 2026-07-26

### Fixed

- **Flux video apel direct**: apelurile directe folosesc acum aceeași intrare în cameră ca apelurile numite, pentru ca ambii prieteni să inițializeze participanții și semnalele WebRTC în aceeași ordine.

## [1.23.6] – 2026-07-26

### Fixed

- **Semnale și chat după acceptarea apelului**: funcțiile de apel direct restabilesc explicit lista celor doi membri înainte ca răspunsul să intre în cameră, astfel încât regulile Firestore permit lista participanților, semnalele WebRTC și chatul camerei.

## [1.23.5] – 2026-07-26

### Fixed

- **Acceptare apel direct**: înregistrarea participantului este acum efectuată de funcția securizată de server, nu din browser. Astfel, răspunsul la apel nu mai poate fi blocat de permisiunea Firestore pentru documentul participantului.

## [1.23.4] – 2026-07-25

### Added

- **Sunete de notificare**: un ton scurt pentru mesaje noi și un ton repetat pentru apelurile directe primite, generat în browser fără fișiere audio suplimentare.
- **Prezență prieteni**: punct verde pentru online, galben pentru inactiv, roșu pentru apel în curs și gri pentru offline. Starea este actualizată numai la conectare, schimbarea ferestrei și apel, fără heartbeat-uri costisitoare.

## [1.23.3] – 2026-07-25

### Changed

- **Protecție free tier pentru apeluri directe**: clickurile repetate sunt ignorate temporar, iar serverul reutilizează invitația deja în așteptare în loc să creeze alte camere sau alte scrieri Firestore.

## [1.23.2] – 2026-07-25

**Chat privat** — apelurile directe au acum o notificare pentru persoana apelată.

### Added

- **Notificare apel direct**: persoana apelată vede în bara laterală cine o sună și poate apăsa **Acceptă** sau **Refuză**. Acceptarea intră în aceeași cameră privată, fără să trimită un apel nou înapoi.

## [1.23.1] – 2026-07-25

**Chat privat** — identități protejate prin cod numeric, apeluri WebRTC cu camere numite, apel direct între prieteni și chat text în cameră.

### Added

- **ID numeric privat pentru utilizatori**: directorul public arată numai coduri, nu nume. O cerere de prietenie se trimite prin cod, iar numele expeditorului devine vizibil doar destinatarului; după acceptare, ambele persoane văd numele în lista de prieteni.
- **Blocare cereri de prietenie**: destinatarul poate bloca expeditorul direct dintr-o cerere; serverul refuză ulterior cererile acelui utilizator și îi comunică faptul că nu mai poate trimite cereri.
- **Camere video WebRTC**: camere cu nume ales de creator, link de alăturare, maximum 5 participanți, microfon/cameră comutabile și profil video optimizat pentru latență redusă.
- **Chat text în camera video**: participanții pot trimite mesaje scurte în timpul apelului.
- **Apel video direct între prieteni**: butonul camerei de lângă un prieten pornește o cameră privată accesibilă numai celor doi prieteni.

### Fixed

- **Prompt Google One Tap**: chatul nu mai cere automat autentificarea Google pentru o sesiune deja activă, eliminând mesajul de tip „User declined or dismissed prompt / API exponential cooldown”.
- **Mesaje între prieteni**: participantul care nu a creat conversația nu mai rescrie ordinea participanților, deci mesajele nu mai sunt respinse de regula Firestore.

### Security

- **Reguli Firestore și funcții Netlify**: profilurile, prieteniile, blocările și membrii camerelor sunt gestionați server-side; clienții nu pot modifica lista de membri sau depăși limita apelului.

## [1.23.0] – 2026-07-25

**Gravitație** — inelul lui Sgr A* arată mult mai realist, și poți compara direct două corpuri în modul de comparare.

### Added

- **Compară 2 corpuri direct**: în modul de comparare a mărimilor, un nou buton (↔) pornește selecția pe perechi —
  atingi un corp, apoi altul, și se deschide un panou cu ambele diametre + raportul dintre ele (ex. „Jupiter este de
  11,2× mai mare decât Pământul"). Cele două corpuri alese rămân evidențiate cu un halo colorat cât timp panoul e
  deschis.

### Changed

- **Inelul lui Sgr A* arată mai realist**: discul de acumulare nu mai e o culoare plată — e o textură cu **gradient
  cald** (alb-gălbui lângă orizont → portocaliu → roșu spre exterior), **turbulență** vizuală și o **asimetrie de tip
  Doppler** (partea discului care se apropie de noi e mai luminoasă), plus un **inel de fotoni** subțire și strălucitor
  chiar lângă umbră — mai aproape de imaginile reale EHT ale găurilor negre.

## [1.22.6] – 2026-07-24

**Gravitație** — eticheta de distanță crește când te apropii, iar atingerea ei deschide un panou mare cu detalii.

### Added

- **Panou mare de distanță**: atingi eticheta plutitoare de distanță (mod distanță pornit) și se deschide un panou care
  arată clar corpurile alese, distanța în **milioane de km**, **UA**, **km exacți** și **timpul luminii** până acolo. Se
  închide cu butonul ✕, atingând în afara panoului, sau cu Esc.

### Changed

- **Eticheta de distanță crește la apropiere**: mărimea ei nu mai variază liniar cu distanța camerei — sub un anumit
  prag rămâne la o mărime minimă în lume, așa că devine **vizibil mai mare pe ecran cu cât te apropii**; peste un prag e
  plafonată ca să nu domine ecranul în vederile de sistem/galactice.

## [1.22.5] – 2026-07-24

**Gravitație** — eticheta de distanță era tăiată la margine (canvas fix, text mai lung după adăugarea numelor corpurilor);
acum se lărgește automat și e afișată mai mare.

### Fixed

- **Eticheta de distanță** foloseau un canvas de lățime fixă (512px); textul nou, mai lung ("☀ Soare ↔ 🌍 Pământ · … mil.
  km · … UA"), depășea acea lățime și pur și simplu **se tăia la margine** — de-aia părea „mică"/greu de citit. Acum
  eticheta își lărgește automat canvas-ul ca să încapă tot textul și e randată **vizibil mai mare** pe ecran.

## [1.22.4] – 2026-07-24

**Gravitație** — distanța nu mai e fixă doar Pământ↔Marte; alegi perechea din butoanele „Vezi”.

### Changed

- **Distanță între corpuri**: butonul de riglă (fost „Distanța Pământ–Marte”) e acum un **mod de distanță general** —
  activat, apeși pe două butoane din „Vezi” (Soare / Pământ / Lună / Marte) ca să alegi capetele măsurătorii; linia +
  citirea live (mil. km / UA) se actualizează între **orice pereche aleasă**, nu doar Pământ↔Marte. Perechea implicită
  rămâne Pământ↔Marte până alegi alta.

## [1.22.3] – 2026-07-24

**Gravitație** — cercul țintă se golește când te miști și se umple singur când te oprești pe o regiune nouă.

### Changed

- **Cercul țintă**: numele revelate acum **dispar imediat ce te miști** (rotești sau schimbi zoom-ul) — nu mai rămân
  lipite de un loc din care s-a mutat obiectul. Iar când **te oprești** pe o regiune nouă (cu cercul pornit și zoom-ul
  suficient de mare), numele apar **singure**, fără să mai fie nevoie de un tap — la fel cum funcționează eticheta
  automată de stea, doar că acum ținând cont de ce e înăuntrul cercului. Atingerea manuală tot funcționează oricând.

## [1.22.2] – 2026-07-24

**Gravitație** — cercul țintă arată acum un nume **deasupra fiecărui obiect** (ca la atingerea directă), doar la zoom maxim.

### Changed

- **Cercul țintă**: la atingere, în loc de o singură listă de nume înghesuită sub cerc, fiecare Soare/Lună/stea găsită
  înăuntru primește propria **etichetă plutitoare chiar deasupra ei** — la fel ca atunci când atingi direct un obiect —
  ceea ce face mult mai ușor de citit ce e ce când sunt mai multe stele apropiate.
- Reveal-ul funcționează **doar la zoom maxim** (FOV mic): la unghi larg stelele sunt prea apropiate una de alta ca
  etichetele individuale să aibă sens, așa că acum cere să mărești zoom-ul întâi (mesaj explicativ dacă nu ești suficient
  de aproape).

## [1.22.1] – 2026-07-24

**Gravitație** — cercul țintă de pe Pământ dezvăluie numele stelei la **atingere** (nu continuu), și am scos cercurile
țintă din vederea din spațiu.

### Fixed

- **Cercul țintă** (De pe Pământ) acum **așteaptă un tap** ca să dezvăluie ce e înăuntru, în loc să scaneze și să
  schimbe numele în fiecare cadru — mai clar și fără să se lupte cu eticheta automată de stea sau tooltip-ul de atingere
  (nu mai apar două nume deodată). Butonul „Cerc țintă” e vizibil doar cât ești pe Pământ (nu mai are rost în spațiu).
- **Cercurile transparente din jurul planetelor în spațiu au fost eliminate** — Soarele/Luna/Marte/Pământul afișează
  doar eticheta cu numele, ca înainte de a introduce cercurile, fără inelul țintă din jurul lor.

## [1.22.0] – 2026-07-23

**Gravitație** — călătorie în timp până la Big Bang, panouri HUD ascunse individual, căutare de locație și busolă corectă.

### Added

- **Călătorie la Big Bang** 🕳️→💥: când derulezi timpul **înapoi** (butonul *Înapoi* din grupul Galactic) apare un buton
  **Big Bang** care pornește o secvență cinematică — **zoom imersiv** din Sistemul Solar → Calea Lactee → pânza cosmică
  de galaxii → învelișul CMB („prima lumină") → un motiv al **Creației** (mâini + scânteie) → **flash-ul Big Bang**, cu
  etichete pe repere reale (Sistemul Solar ~4,6 mld ani, primele galaxii/stele, recombinarea). Poți apoi **reda înainte**
  (▶ Până azi) sau ieși. Vârsta e prezentată ca **estimare (~13,8 miliarde ani)**, iar Sistemul Solar dispare corect pe la
  ~4,6 mld ani (nu forțăm efemerida planetară până la t=0).
- **Căutare de locație** (Nominatim/OpenStreetMap): scrie un loc (ex. „Suceava, România") în grupul *De pe Pământ* sau în
  bara de la sol și ajungi acolo — util când **GPS-ul nu e disponibil**.
- **Panouri HUD individuale**: fiecare grup (Vezi / De pe Pământ / Timp / Galactic), panoul de info și bara de la sol au
  un **ochi** în colțul din dreapta-jos care le ascunde/afișează separat (rămâne apăsabil când e strâns). Ochiul mare din
  dreapta-sus ascunde/afișează tot.

### Fixed

- **Liniile N/E/S/V de pe Pământ**: erau o „încrengătură" de segmente ce intrau în glob; acum sunt o **cruce curată**, cu
  intersecția exact la locația ta și orientată corect spre nord/est/sud/vest.

## [1.21.0] – 2026-07-23

**Gravitație** — cerul „de pe Pământ" acum corect astronomic, Marte realist, și Soarele orbitând gaura neagră supermasivă.

### Fixed

- **Cerul de pe o locație era oglindit** (mână stângă): din cauza unei reflexii în transformarea ecliptică→scenă (două
  axe schimbate, determinant −1), Soarele ieșea corect (orientarea Pământului e calibrată după ora reală) dar **Luna și
  stelele apăreau pe partea greșită** — Luna calculată sub orizont când în realitate era sus. Acum maparea e o **rotație
  propriu-zisă**, verificată numeric față de efemeride (USNO): Soare + Lună + stele cad pe pozițiile reale (azimut/altitudine)
  pentru orice locație și emisferă.
- **HUD la scări galactice**: la ritmurile mari de timp (100k / 1 mil. ani/s) data trecea de limita `Date` din JavaScript
  (~anul 275.760) și ceasul + valorile arătau `NaN` / `undefined`; acum afișăm anul („Anul ~230 mil.") și poziția Soarelui
  rămâne validă. Numerele lungi (km) sunt **prescurtate** (k / mil. / mld.).

### Added

- **De pe Pământ**: butoane **Spre Soare / Spre Lună** (te întorc spre astru dacă e deasupra orizontului, altfel te
  avertizează), **schimbarea locației fără a ieși** din vederea de la sol (Locația mea + alt oraș direct din bară), și
  **nume de stele** care apar când ești zoomat pe cer și dispar când schimbi zoom-ul.
- **Distanța Pământ–Marte** pe un buton comutabil: o linie între planete + citire live (**mil. km și UA**) — accelerează
  timpul ca s-o vezi variind între ~55 mil. km (la opoziție) și ~400 mil. km.
- **Textură reală pentru Marte** (regiuni adevărate — Valles Marineris, Tharsis, Hellas).
- **Vederea galactică**: întregul **Sistem Solar (Soare + planete) orbitează Sagittarius A\*** — gaura neagră stă pe loc
  (cum e în realitate), iar Sistemul Solar se mișcă pe orbita reală (nu un „al doilea sistem" fals). Adăugate ritmuri de
  timp **galactice** (**10 · 100 · 1.000 · 10.000 · 100.000 · 1 mil. ani/s**) ca să vezi Soarele făcând o tură completă
  în jurul găurii negre — o „an galactic" durează **~230 milioane de ani**. Cifre reale: ~26.000 ani-lumină, ~230 km/s.
- **Cameră „Sgr A\*"** (fixează privirea pe gaura neagră — te învârți în jurul ei și vezi Soarele dând ocol) și un buton
  **ochi** care ascunde/arată toate panourile pentru o vedere curată.
- **Urmărire („pin")**: **ține apăsat** un corp din „Vezi" (Soare / Pământ / Lună / Marte) → camera îl **urmărește** cât
  trece timpul și te poți **roti liber în jurul lui** (buton evidențiat). Un **tap scurt** doar încadrează. „Vezi Soare"
  pornește puțin mai depărtat.
- **Panouri HUD**: fiecare panou (info stânga, controale jos) are un **ochi** în colțul din dreapta-jos care îl
  ascunde/afișează individual; butonul **ochi** principal (dreapta-sus) ascunde/afișează **tot**. Grupul *Galactic* are
  **Pauză / Reia** (sincronizat cu *Timp*) și un buton **Înapoi** care derulează timpul înapoi la viteza aleasă (vezi
  Soarele orbitând invers). Am scos nota „…de aceea Pământul e un punct" din panoul din stânga.
- **Discul lui Sgr A\*** se rotește acum la ritm **realist** (o tură la ~40 min, ca hot-spot-urile observate de GRAVITY),
  legat de timpul simulat — aproape nemișcat în timp real, se învârte când accelerezi (înainte era mult prea rapid).

## [1.20.0] – 2026-07-22

**Gravitație** — un joc/vizualizare 3D nou: **Soarele și Pământul în timp real, la scară reală**.

### Added

- **Gravitație** (`/gravitatie`) — Soarele și Pământul în 3D cu **mărimi și distanțe reale (1:1)**. Pământul e așezat la
  **poziția lui adevărată pe orbită pentru momentul curent** (efemeridă astronomică), se rotește pe axa înclinată la
  23,44° (zi/noapte), cu **Luna** în jur, într-un câmp de stele practic infinit.
- **Texturi reale** pentru Pământ (se văd continentele — Europa, Africa etc.) și pentru Lună; Pământul e **orientat după
  ora curentă**, așa că meridianul corect e spre Soare (poți citi unde e ziua/noaptea). **Luna e la poziția ei reală**
  (efemeridă), deci **faza** afișată corespunde cerului real; orbitează Pământul o dată la ~27,3 zile (nu într-o zi).
- **Timp real + accelerare**: ceas live; poți derula timpul (**Oră/s · Zi/s · Săpt./s · Lună/s · An/s**), **Pauză** și
  **Acum** (revii la momentul real) ca să vezi Pământul orbitând.
- **Marte** adăugat (poziție reală pe orbită, la scară) — modelul e **extensibil**, celelalte planete se adaugă printr-un
  singur rând de date.
- **Cer cu stele reale**: ~2000 de stele din catalogul Yale Bright Star, la **pozițiile lor adevărate** (RA/Dec J2000),
  dimensionate după magnitudine și colorate după indicele de culoare — apar **constelațiile reale** (Orion, Carul Mare…),
  orientate corect (axa Pământului chiar arată spre Steaua Polară).
- **„De pe Pământ" (planetariu)**: alege un loc pe glob (**click pe glob**, **Locația mea** prin GPS, sau un **oraș**) și
  privești **cerul real de deasupra** acelui loc, la ora curentă — aceleași stele, Soare și Lună pe care le-ai vedea afară.
  Trage ca să privești în jur, cu reperele **N/E/S/V** la orizont; accelerează timpul ca să vezi stelele răsărind/apunând.
  Partea de noapte a Pământului e ușor luminată, ca să poți alege ușor orice loc.
- **Centru galactic**: la **zoom-out** apare **Sagittarius A\*** (gaura neagră supermasivă), cu Soarele orbitând-o în
  **sens antiorar** (schematic — perioada reală e ~225 milioane de ani). **Click** pe o **stea / Soare / Lună** în cerul
  „de pe Pământ" arată **numele** (nume oficiale IAU pentru stele) și apropie imaginea; **pinch-zoom** pe mobil. Luna arată
  acum **fața reală** îndreptată spre Pământ.
- **Presetări de cameră** (**Soare / Pământ / Lună / Marte / Sistem**) + **Urmărește Pământul**, fiindcă la scară reală
  planetele sunt puncte lângă Soare; randare cu *logarithmic depth* ca totul să fie clar pe distanțe uriașe.
- **HUD**: data/ora (UTC + local), anotimpul (+ echinocții/solstiții), distanța Soare–Pământ (UA + km), longitudinea
  heliocentrică, ziua din an și viteza orbitală. Model **extensibil** — celelalte planete se adaugă ușor mai târziu.

## [1.19.1] – 2026-07-21

Corecții pe mai multe jocuri: **Reduceri** (secțiunea Mobile + link Meta), **Fotbal** (poziționare + HUD),
**Autobuzul de Oraș** (pasajul CFR din Suceava) și o reașezare de meniu.

### Fixed

- **Reduceri — imaginile jocurilor Android** apar acum. Iconițele se rezolvă din App Store (via iTunes) pentru **toate**
  jocurile mobile, nu doar cele iOS — jocurile fiind cross-platform, aceeași iconiță e folosită și pe cardul de Android.
- **Reduceri — linkul „Vezi ofertele pe Meta Quest Store"** ducea la o pagină inexistentă (secțiune veche, retrasă).
  Acum trimite la magazinul funcțional `meta.com/experiences`, unde apar și reducerile curente.
- **Reduceri — secțiunea VR arăta doar jocuri SteamVR.** Sursa veche Meta (graph.oculus.com) a fost blocată de Meta
  (token invalidat), așa că **jocurile Meta Quest lipseau**. Acum aducem din nou **oferte Meta Quest + jocuri gratuite**
  (Cities: VR, Vampire: The Masquerade – Justice, The 7th Guest VR, Gorilla Tag, VRChat, Bait! ș.a.), pe lângă SteamVR.
- **Fotbal — bara CONDIȚIE** s-a mutat sus-dreapta (nu mai stă peste numele jucătorului de la mingea).
- **Fotbal — controlul nu mai „pâlpâie"** între doi jucători aflați pe aceeași linie: schimbarea automată are acum
  o temporizare și un prag de distanță mai mare.
- **Fotbal — echipa nu mai stă înghesuită lângă propria poartă.** Formația 4-4-2 e distribuită realist pe tot terenul
  (fundași în jumătatea proprie, mijloc la centru, atacanți în jumătatea adversă) și **blocul se deplasează** sus/jos
  odată cu mingea.
- **Autobuzul de Oraș — pasajul CFR (Suceava)** nu mai apare „dublat"/suprapus: cele două sensuri mapate în OSM
  ca șosea cu dublă bandă se **unesc într-un singur tablier** centrat (la fel și pasajul de la Sala Sporturilor).
- **Autobuzul de Oraș — stația IRIC** era plasată sus, pe tablierul pasajului; acum stă la **nivelul străzii**, pe
  Calea Unirii, la piciorul dinspre Burdujeni al pasajului.

### Changed

- **Meniu jocuri:** **Arcașa** a fost mutată din „Simulatoare" în categoria nouă **„Acțiune"** (în meniu și pe pagina
  principală).

### Added

- **Reduceri — jocuri mobile plătite / premium** în listă (Minecraft, Stardew Valley, Terraria, GTA: San Andreas,
  Monument Valley 2, Papers Please ș.a.), pe lângă cele free-to-play. Prețul curent se ia **live din App Store** (RON)
  la fiecare actualizare; dacă e sub prețul obișnuit, jocul apare cu **reducere**. Filtru nou **„Plătite"** în Mobile.
- **Reduceri — filtre VR pe cască**: **Quest 2** și **Quest 3** (plus **Gratis**), fiindcă unele jocuri sunt exclusiv
  Quest 3. Fiecare card Meta arată pe ce Quest rulează (ex. „Quest 2/3" sau „Quest 3").

## [1.19.0] – 2026-07-13

**Fotbal** — o revizie amplă a jocului de fotbal 3D: teren la dimensiuni reale, stadioane cu public animat, reluări
(replay), joc în 2 la manete, mod spectator (AI vs AI) și zeci de îmbunătățiri de gameplay, cameră și control.

### Added

- **Reluări (replay)**: după **goluri, parade, ratări, faulturi și penalty-uri** se derulează incidentul. Reluarea se
  **repetă până apeși o tastă / click**; în modul spectator (AI vs AI) se reia de câteva ori și continuă singură. La
  cartonaș roșu, eliminarea se aplică **după** reluare, ca să vezi tot faza.
- **Public animat**: tribunele se umplu cu **oameni** (corp + cap, ținute și tonuri de piele variate) care **saltă și
  ridică mâinile** la gol; **galerie tricoloră** pe laturi; **murmur de stadion** mai puternic, cu vuiet la gol.
- **Joc în 2 (Versus)**: conectezi **a doua manetă** și ea conduce echipa adversă. **Mod spectator** cu tasta **Y** —
  ambele echipe joacă pe AI, să urmărești meciul.
- **Voleu (minge din aer)**, controlezi **portarul** cu **H** (îl trimiți la minge), iar la **corner** apare o **linie
  de sugestie** spre centrul careului.

### Changed

- **Teren la mărime reală** (~104 × 68 m) cu marcaje corecte (careu, careu mic, cerc de centru, punct de la 11 m) →
  jucătorii apar realist de mici; **stadionul crește** după capacitatea arenei alese.
- **Jucători** mai înalți și cu variație reală de **statură/constituție**, plus **culoare de păr, ten și ochi**.
- **Dribling realist**: la sprint în linie dreaptă **împingi mingea în față** și alergi după ea; la viteză mică / fentă
  (C) ai control apropiat; jucătorul se **apleacă în față** când sprintează.
- **Forță mărită** la pase, mingi înalte, șuturi și degajarea portarului (potrivit terenului mare); **echipa urcă** în
  atac cu jucători care fac cursă în față (pas sau minge înaltă), rămânând on-side.
- **Cameră** din spate mai aproape de joc; camera laterală degajă tribunele; reluarea are un unghi apropiat.
- **Q / E fără minge = schimbi jucătorul** cel mai apropiat; comentariul la pasă spune **numele** celui care primește.
- Meciuri mai lungi.

### Fixed

- **Buclă aeriană blocantă** (mingea sărea la nesfârșit din cap) — rezolvată cu un mic timp de blocare după cap/voleu.
- **Portarul nu mai „fură" mingea** unui atacant mai apropiat (contactul merge la cel efectiv mai aproape).
- **Bara transversală respinge** mingea (nu mai rămâne pe ea); mingea **intră vizibil în plasă** la gol.
- Controale **relative la cameră** (corecte în orice unghi) și **înclinare corectă** în față la sprint.
- Deposedarea **din spate nu mai e** posibilă; nu mai dai **autogol** dintr-o pasă spre propria poartă; pasa **nu se mai
  anulează** la sprint; portarul nu mai iese din teren în propria plasă; blocaj de progres la runde rezolvat.

## [1.18.0] – 2026-07-12

**Vindecătorul** — calendarul ortodox devine real și se ține la zi singur, iar sărbătoarea/postul se citesc doar la
locurile sfinte (nu mai stau permanent pe ecran).

### Added

- **Calendar ortodox „hibrid"**: pe lângă praznicele cu dată fixă, jocul calculează acum **Paștile ortodoxe (computus)**
  și, din ele, **sărbătorile mobile** (Floriile, Înălțarea, Rusaliile, Izvorul Tămăduirii) și **posturile mobile**
  (Postul Mare, Săptămâna Luminată = dezlegare, Postul Sf. Apostoli). Astfel **fiecare an e corect automat**, fără
  întreținere.
- **Îmbogățire din crestinortodox.ro**: un nou workflow (`.github/workflows/calendar.yml` + `scripts/calendar-fetch/`)
  „coace" anual `public/data/calendar.json` cu **textul exact al sfinților zilei** și crucea roșie/neagră de pe site.
  Jocul îl citește dacă e pentru anul curent; altfel cade elegant pe computus (nu se strică niciodată). Se poate rula
  **manual oricând** din tab-ul Actions, iar automat pe **1 ianuarie** (an nou).

### Changed

- **Fără afiș permanent**: eticheta cu sărbătoarea de sus a fost **eliminată**. Acum **citești** sărbătoarea și dacă e
  **zi de post** doar când te apropii de **crucea din biserică** sau de **cartea de pe masa cu lumânări (altar)**.

## [1.17.0] – 2026-07-12

**Vindecătorul** — o serie mare de adăugiri la jocul de vindecare 3D: **vizite la domiciliu** într-un sat nou,
**sărbătoarea zilei** din calendarul ortodox (cu cruce roșie/neagră) și multe îmbunătățiri de suflet, iad și control.

### Added

- **Vizite la domiciliu (Satul)** — o regiune nouă în rotație. La fiecare casă poți **vindeca pe loc** sau **da un
  sfat/leac** (tasta **G** / butonul **SFAT**). Sfaturile se salvează într-o **agendă persistentă**; la o vizită
  ulterioară, oamenii **revin**: cei credincioși au urmat leacul și s-au făcut bine (primești mai multe candele), iar
  **păcătoșii** nu — trebuie vindecați din nou și pot fi **întorși la credință** (convertiți).
- **Sărbătoarea zilei** — jocul citește **data curentă** și afișează, cu o **cruce ortodoxă cu trei brațe** în biserică
  și un afiș în HUD, ce **sărbătoare** e azi din calendar (praznice cu dată fixă). La **cruce roșie** (praznic mare)
  **demonii sunt dezlănțuiți** (mai iuți și mai flămânzi); la **cruce neagră**, obișnuiți.
- **Suflet & iad** — morții îți spun **cum au murit** (indiciu unde se odihnește sufletul); unele **suflete împăcate în
  ceruri refuză să se întoarcă**; **portalul** apare doar dacă un suflet nu e în ceruri; în iad sunt **mai mulți demoni,
  unii uriași**, iar dacă iei sufletele la timp și te întorci, **unii demoni te urmează** la suprafață.
- **Urmăritori** — poți **trimite un urmăritor** (tasta **R** / butonul **TRIMITE**) la altar ca să-ți **aducă energie
  divină**. Cine te urmează te ajută la vindecare și la refacerea energiei.
- **Salvare extinsă** — se păstrează la refresh **binecuvântările**, **numărul de vindecați** și progresul (nivel/rundă,
  candele, upgrade-uri, agenda).

### Fixed

- **Blocaj de progres**: rundele nu mai rămân blocate (ex. „2·1") — se trece corect la runda următoare.
- **Control pe mobil**: joystick-ul steerează acum ca la mașină (sus/jos = înainte/înapoi, stânga/dreapta = viraj),
  potrivit cu camera care urmărește vindecătorul.
- La întoarcerea din iad, camera se orientează spre curte (nu mai privești în ceață).

## [1.15.0] – 2026-07-12

**Vindecătorul** — un joc nou de **vindecare 3D**, opusul calm al Arcașei: în loc să lupți, **vindeci și învii** oameni
cu **har divin ortodox**. Te plimbi la persoana a treia printr-o **biserică** (unde îți refaci energia la altar), un
**cimitir** (unde învii morții) și o **infirmerie** (unde dregi brațe și picioare rupte sau alini bolnavi).

### Added

- **Vindecătorul (joc nou)**: joc **3D calm, non-violent**. Țintești o persoană și **ții apăsat** ca să reverși un
  **fascicul de lumină sfântă** — bara de vindecare se umple, iar **energia ta divină** scade. Mergi cu **W A S D /
  joystick / click & trage**; la șut… pardon, la vindecare folosești **Space / click dreapta**, iar pe mobil butonul
  **VINDECĂ**.
- **Trei regiuni** care se rotesc și cresc în dificultate: **Biserica** (vindeci enoriași și îți **refaci energia** la
  altar), **Cimitirul** (**învii morții** — se ridică din morminte în lumină), **Infirmeria** (**brațe/picioare rupte**
  cu atele și **boli** — atela dispare, omul se îndreaptă).
- **Provocare cu răbdare**: fiecare om are un **prag de răbdare**; dacă întârzii prea mult, pleacă (sau sufletul se
  stinge). Dacă pierzi prea mulți într-o rundă, **reiei runda**. Energia se **reface doar la altar** — gestionează-ți
  harul.
- **Daruri (magazin)**: cheltui **candele** pe **Har** (vindeci/învii mai repede), **Energie divină** (rezervor + regen)
  și **Binecuvântare** (alini și oamenii din jur, ai mai mult timp). Progres salvat local (**Continuă**).
- **Atmosferă**: lumină divină (aură, fascicul, explozie de har), **clopote și cor** sintetizate, binecuvântări rostite
  în română, plus animație de **înviere** (te ridici din poziția culcat).
- **Meniu & pagina principală**: Vindecătorul apare în meniul **Jocuri** (grup nou „Aventură") și ca **dală nouă** pe
  pagina principală, în lista **Jocuri 3D**.

---

## [1.14.0] – 2026-07-12

Pagina principală prezintă acum **tot site-ul dintr-o privire**, iar **Fotbal Românesc** primește o transformare
majoră: **reluare slow-motion la șuturi**, **portar realist** care plonjează și respinge, **efect (curl)** controlat de
tine, **nume reale** pentru jucători și **comentariu TV în română**.

### Added

- **Fotbal — finalizare slow-motion**: orice **șut puternic spre poartă** (ambele echipe) declanșează un **slow-motion**
  lent, cu camera aproape de minge, care ține până mingea ajunge la portar / un apărător sau intră în plasă. La **șutul
  tău** **ghidezi complet** mingea în colț cu **◀ ▶** sau **atingând / dând click pe ecran**, iar mingea se vede
  **intrând în poartă** în reluare lentă.
- **Fotbal — portar realist**: portarul **plonjează** pe direcția șutului și **respinge** loviturile puternice (nu le
  mai „absoarbe" ca un magnet); șuturile **înalte și tari le scoate SUS, peste bară**, iar cele plasate în colț îl bat.
- **Fotbal — șut cu efect (curl)**: mingea se **curbează** în aer în funcție de cât de tehnic e jucătorul; poți pune
  efect spre colțuri.
- **Fotbal — control aerian**: **preluare pe piept / umăr** a mingilor căzătoare și **lovituri de cap** (șut cu capul
  spre poartă sau pasă cu capul).
- **Fotbal — portar la minge & faze fixe**: cu **Q** portarul ia mingea **în mâini**, cu **Space** o **degajează lung**;
  **penalty (7m)** la fault în careu, plus **cornere** și **lovituri de la poartă**.
- **Fotbal — duel de dribling**: un apărător **din față îți oprește driblingul** (te strecori pe lângă el) — folosește
  **trucul (C)** ca să treci de el; adversarul încearcă la rândul lui driblinguri.
- **Fotbal — cartonașe la intrări din spate**: o alunecare **din spate** = fault (**galben**), iar dacă accidentezi grav
  adversarul = **roșu**.
- **Fotbal — nume reale**: fiecare echipă are un **„11" propriu** cu nume românești; **eticheta cu numele** apare pe
  jucătorul care are mingea, iar **stânga sus** arată mereu cine e la minge. Jucătorii au **înălțime și greutate**
  diferite (siluete realiste).
- **Fotbal — comentariu TV live (în română)**: un comentator descrie faza (șut, gol, paradă, cap, fault, cartonaș,
  corner, ofsaid, penalty…) cu **text în stânga sus** și **voce**.
- **Fotbal — camere multiple**: comuți între **în spate / lateral (TV) / de sus** cu **V** sau butonul de cameră.
- **Chat privat**: notă **„Apel video & cameră live — în curând"**.

### Changed

- **Acasă — „Despre" mutat deasupra „Prezentare"** și extins într-o **prezentare completă a site-ului** — toate paginile
  și ce poți face pe fiecare, cu scurtături rapide. Ordinea din **meniu** urmează la fel: **Despre**, apoi
  **Prezentare**.
- **Fotbal — apărare mai activă & ofsaid**: linia de fundași **urcă** și ține o **linie mai sus**, ceea ce declanșează
  des **ofsaidul**; per total jocul e mai **lent și realist**.

### În curând

- **Chat privat**: **cameră live** pentru persoana care intră în conversație și **apel video** integrat.
- **Toate jocurile trec în 3D**, așa cum e deja **Șahul**.

---

## [1.13.0] – 2026-07-11

**Fotbal Românesc** — un joc nou de **fotbal arcade 3D** care completează toate genurile de pe site (primul joc din
categoria **Sport**). Alege-ți echipa și adversarul dintre cluburile din Liga 1 și joacă un meci live pe **stadioane
reale din România**, randate 3D.

### Added

- **Fotbal Românesc (joc nou)**: meci **arcade 3D** low-poly, cameră **de sus, ușor înclinată** (vezi tot terenul).
  Alegi **echipa ta** și **adversarul** din ~14 cluburi din **Liga 1** (Steaua, Dinamo, Rapid, CFR Cluj, U Craiova,
  U Cluj, Farul, Sepsi, UTA, Petrolul, Oțelul, FC Argeș ș.a. — doar nume + culori de echipament). Controlezi automat
  **jucătorul cel mai apropiat de minge** (se schimbă singur), cu **joystick** pe mobil sau **W A S D / săgeți** pe PC
  și butoane de **Pasă**, **Minge înaltă** și **Șut**. Meciul are **două reprize** scurte, scor live, cornere, aut și
  lovituri de la poartă, plus ecran final cu victorie / egal / înfrângere și **revanșă**.
- **Fotbal — stadioane reale**: fiecare meci se joacă pe un **stadion real din România**, randat în 3D, de la cele
  **mici** (Areni – Suceava, Municipal Botoșani, Sepsi OSK) până la cele **mari** (Arena Națională, Cluj Arena, Ion
  Oblemenco). Tribunele, nocturna și acoperișul se adaptează după mărimea stadionului. Poți alege stadionul din meniu.
- **Meniul „🎮 Jocuri" — categorie nouă „Sport"**: Fotbal Românesc apare într-un grup nou în meniul de jocuri și ca
  dală pe pagina principală.

---

## [1.12.0] – 2026-07-11

**Arcașa** primește un val mare de conținut: **3 locații noi**, **șefe multiple**, un **scut care reflectă**
loviturile grele și un upgrade nou de **bombe lipicioase**. Plus, meniul **Jocuri** de pe pagina principală
derulează acum secțiunile la click.

### Added

- **Arcașa — 3 locații noi** (Abisul, Tărâmul Umbrelor, Sfârșitul), acum **15 locații** în total. În ele,
  arcașele **se ascund după stânci** și **apar** ca să tragă (mecanică de „pop-up").
- **Arcașa — șefe multiple**: locațiile avansate au **2–3 șefe** deodată, mai rezistente și cu **săgeți grele**
  care lovesc mult mai tare.
- **Arcașa — scut care reflectă**: dacă îmbunătățești scutul la **Nivelul 3+**, acesta **respinge săgețile grele**
  înapoi în șefă (îi face daune); sub acel nivel, loviturile grele **străpung** scutul.
- **Arcașa — bombe lipicioase (upgrade nou)**: cumperi upgrade-ul **Bombă** și fiecare săgeată devine o bombă care
  se lipește de inamic; apeși **B** (sau butonul de pe mobil) ca să **detonezi toate bombele** deodată — daune de
  zonă care pot dezmembra mai multe arcașe.

### Changed

- **Arcașa — arcașe în mișcare**: pe locațiile avansate, arcașele obișnuite se **deplasează lateral**, nu mai stau
  pe loc.
- **Acasă — meniul „🎮 Jocuri"**: la click pe desktop **derulează** pe rând secțiunile de jocuri (Reduceri Jocuri →
  Toate jocurile → Genshin → Wild Rift), la fel ca meniul „⚡ Unelte". „Reduceri Jocuri" a fost mutat **deasupra**
  listei de jocuri.

### Fixed

- **Arcașa — slow-motion**: săgeata ghidată **ajunge acum la arcașele din spate** (cădea prea repede înainte); un
  **tap/click** în timpul camerei care urmărește săgeata **o sare** înapoi la jucător; camera nu mai **îngheață**
  când săgeata lovește o stâncă.

---

## [1.11.0] – 2026-07-11

**Reduceri pe platforme** — alegi platforma dintr-un tab (Desktop / PlayStation / VR / TV) și vezi doar
ofertele relevante. Secțiuni noi pentru **VR** și **GeForce Now**.

### Added

- **Reduceri — selector de platformă**: bară de taburi în capul paginii (**Desktop · Mobile · PlayStation ·
  VR · TV**) care afișează doar secțiunile și filtrele platformei alese; alegerea e **memorată** (localStorage).
- **Reduceri — Mobile**: secțiune nouă cu jocuri pe **Android și iOS** (gratis sau la reducere), cu filtre
  Android / iOS / gratis / reducere.
- **Reduceri — și pe GeForce Now**: jocurile de pe Desktop (Steam/Epic) care sunt și în biblioteca
  **GeForce Now** primesc un badge — le poți juca prin streaming, fără PC puternic.
- **Reduceri — VR**: secțiune nouă cu reduceri de pe **Meta Quest Store** și **SteamVR** (PC-VR), cu filtre
  Meta Quest / SteamVR / reducere și badge-uri de platformă.
- **Reduceri — GeForce Now (TV)**: jocuri **free-to-play** care pot fi jucate gratis prin streaming pe orice
  ecran, un panou cu **dispozitivele acceptate** (Smart TV Samsung/LG, NVIDIA Shield, Fire TV, browser,
  Android/iOS, Steam Deck, Chromebook) și o **recomandare de controller ieftin** (de la Jumbo). Lista F2P e
  verificată automat față de lista publică de jocuri acceptate de NVIDIA.

---

## [1.10.0] – 2026-07-10

**Arcașa** — un joc nou de **tir cu arcul 3D la persoana întâi**. Țintește, încarcă arcul ținând
apăsat și eliberează ca să tragi.

### Added

- **Arcașa (joc nou)**: tir cu arcul la persoana întâi, cu grafică low-poly. **Trage** cu mouse-ul sau
  degetul ca să țintești, **ține apăsat** ca să încarci forța și **eliberează** ca să lansezi săgeata
  (cu traiectorie parabolică — vizează mai sus la ținte îndepărtate). Prima scenă are **5 arcașe
  inamice**; o lovitură **la cap** = bonus. Odată ce te-au văzut, **trag și ele înapoi**, așa că ai grijă
  la bara de viață. Toate personajele sunt modele noi de fete, variantă feminină a personajului din
  Autobuzul de Oraș. Efecte: sunete de arc (Web Audio) și confetti la victorie. Disponibil pe desktop și
  mobil (ecran complet + blocare pe orizontală).

---

## [1.9.0] – 2026-07-10

**Reduceri PlayStation** + un **Autobuz de Oraș** mult mai viu (controlori, poliție, GPS,
semafoare, benzinării) și extra pentru **Condu în Orice Oraș** (rampe de săritură, NOS).

### Added

- **Reduceri — PlayStation**: secțiune nouă cu reduceri de pe **PlayStation Store (PS4 & PS5)**,
  prețuri în **RON**, filtre PS5 / PS4 / preț / reducere. În plus, filtre de magazin pe secțiunea
  „Recomandate".
- **Autobuzul de Oraș — controlori & poliție**: urcă **2 controlori**, verifică pe rând fiecare
  pasager (unul din față, unul din spate); dacă cineva nu are bilet (rar) poate plăti pe loc,
  coboară la stația următoare sau — dacă refuză — controlorul **sună la 112** și poliția ajunge la
  stația următoare.
- **Autobuzul de Oraș — comenzi**: **claxon** (H) și **semnalizare** stânga/dreapta (Q/E), plus
  butoane pe mobil; ajutor **„voce în română"** (cum instalezi o voce ro pentru anunțuri).
- **Autobuzul de Oraș — oraș viu**: **GPS care recalculează traseul** când ieși de pe drum;
  **pietoni care traversează pe zebră** + **semafoare** la intersecțiile mari; **benzinării** și
  **stații de încărcare electrică**; parcări **pline de mașini**.
- **Condu în Orice Oraș**: **rampe de săritură** peste porțiunile de drum întrerupte; **NOS**
  (Shift) pentru accelerare și **săritură** (Spațiu), cu butoane dedicate pe mobil.

### Changed

- **Autobuzul de Oraș**: butoane mai mari și mai ușor de apăsat pe mobil; stațiile din Suceava
  repoziționate mai exact (Bazar, Banca, Depozitul de Ouă, Torino, Piața Burdujeni), cu stații pe
  **ambele sensuri**; motor electric mai fin și mult mai puține claxoane (doar în mers, în trafic).
- **Condu în Orice Oraș**: săgețile de sens unic sunt acum **plate pe carosabil** și mai rare.

### Fixed

- **Reduceri**: „Preț minim istoric" se **repopulează** (ITAD a schimbat câmpul — folosim acum
  prețul minim din magazin).
- **Autobuzul de Oraș**: mașinile din **sensul giratoriu** nu mai dispar și nu mai blochează
  traficul la ieșire; **marcajele rutiere** nu se mai suprapun la intersecții și pe pod (liniile
  continuă corect pe pod); **busola** arată corect spre stație; fără rampe/semne în mijlocul
  giratoriului; pasagerii **urcă și coboară** corect la toate stațiile.
- **Condu în Orice Oraș**: **busola** arată corect spre destinație; rampele nu mai apar în
  intersecții.

---

## [1.8.0] – 2026-07-07

**Joc nou — „Condu în Orice Oraș"** + **Șahul devine complet 3D**. Alegi orice oraș din
lume și îi conduci străzile reale (OpenStreetMap) cu mașina, autobuzul sau camionul cu
remorci; iar tabla de șah, piesele și lecțiile sunt acum redate 3D, cu sunet și animații.

### Added

- **Condu în Orice Oraș** (joc nou): scrii un oraș (cu sugestii) → îi aducem **drumurile
  și șinele reale**, redate 3D pe loc, cu **altitudine**. Alegi **strada de start**, conduci
  spre **destinații** marcate cu un far vizibil — iar dacă ieși de pe drum, cazi în gol.
- **Garaj cu vehicule**: Mini, Mașină, SUV, Autobuz, Camion și **Camion cu 1 / 2 / 3 remorci**
  (remorci articulate) — le cumperi cu banii câștigați din livrări; rigurile mari câștigă mai mult.
- **Sens unic** cu **linie albă pe mijloc** și **săgeți de direcție** din 5 în 5 m; te avertizează pe contrasens.
- **Ecran complet + mod peisaj** pe telefon, zoom și busolă spre destinație.
- **Șah 3D** în tot jocul (meci, lecții, tactici, mini-meci): tablă și piese modelate 3D,
  **mutări animate** (calul sare, restul alunecă), **sunet de lemn**, **piese capturate** așezate
  lângă tablă și **fanfară + confetti** la victorie.
- Șah: **joci cu albele sau cu negrele** (adversarul mută primul), **zoom** cu două degete/butoane,
  **previzualizarea mutărilor** unei piese adverse (roșu) la atingere, și **ecran complet** pe tot ecranul.

### Changed

- **Autobuzul de Oraș**: sunet de **motor electric** (mai fin la viteză), voci pe stradă mai
  variate în română, sunete de uși, **controlori de bilete + poliție**, mașini care respectă
  **sensul unic**, mai mulți **pietoni** pe trotuare.
- Șah: butonul **„Înapoi"** (o mutare) e mereu disponibil vs. AI; după final poți alege
  **„Mai încearcă"** ca să dai înapoi și să continui partida.

### Fixed

- Șah: modalul de final + confetti apar acum **în ecran complet**, iar alegerea piesei la
  **promovare** se vede pe tot ecranul.
- Autobuzul de Oraș: camera nu se mai blochează la accident; **stâlpii** nu mai apar pe
  carosabil și nu mai treci prin ei; vocile românești sună corect chiar fără voce ro instalată.
- Piese de șah **„lipite"** (fără goluri între forme); **zarul** cu puncte plate pe fețe;
  **calul** din Generator 3D cu urechi corecte.

---

## [1.7.0] – 2026-06-26

**Generator 3D — creează modele 3D din text** (unealtă nouă în secțiunea AI), plus
un **autobuz redesenat**. Descrii un obiect, AI-ul îl construiește din forme simple
(low-poly), îl ajustezi cu mâna și îl exporți pentru orice joc.

### Added

- **Generator 3D**: scrii o descriere → AI-ul face un model low-poly → îl vezi live,
  îl editezi (mută/rotește/scalează cu gizmo) și îl exporți ca **JSON · cod Three.js · GLB · OBJ**.
- **Furnizori AI gratuiți, comutabili**: Gemini, **Groq** (rapid), GLM Flash (z.ai),
  OpenRouter — cu cheia ta sau a site-ului.
- **Pe telefon**: scena ocupă tot ecranul, cu butoane mari (mută/rotește/scalează,
  șterge/duplică); AI-ul și formele stau într-o bară pliabilă.
- **Undo/Redo** (`Ctrl+Z` / `Ctrl+Shift+Z`) și **salvare automată** — la reîncărcare
  revii la ultimul model.

### Changed

- **Autobuzul** are o caroserie low-poly mai realistă: acoperiș rotunjit, bot/spate
  teșite, parbriz înclinat, faruri/stopuri, oglinzi, ștergătoare și arcade la roți.

---

## [1.6.0] – 2026-06-24

**Autobuzul de Oraș — Pasageri, cabină și control pe telefon**: oprești în noile
**refugii** din stații, deschizi o ușă și **pasagerii urcă, se așază pe scaune**
(sau stau în picioare) și coboară la stația lor, plătind biletul. Cabina are acum
volan, bord și **vedere din scaunul șoferului**, iar pe telefon conduci cu un
**volan pe ecran**.

### Added

- **Pasageri** care urcă/coboară pe ușa deschisă, se așază (mărimi și vârste
  diferite) sau stau ținându-se de bară — **bilet plătit la urcare**.
- **Vedere din interior** (tasta `C` / buton pe telefon): scaun șofer, volan, bord, parbriz.
- **Volan pe ecran** pe telefon (rotire ca în realitate), buton **schimbare cameră** și
  **comenzi de ușă** tactile (deschide/închide, blochează ușa); volan sau butoane, din meniu.
- **Refugii de autobuz** (asfalt) în fața fiecărei stații, pe ambele sensuri.

### Changed

- Ușa din față pornește **blocată**; volanul din cabină se rotește identic cu cel de pe ecran.

### Fixed

- Autobuzul **rămâne pe pod** (pasajul Calea Unirii) și mașinile nu mai urcă pe pasaj
  de pe drumul de dedesubt.
- Roțile nu mai „tremură" la eliberarea direcției; geamul din față e mai transparent.

---

## [1.5.0] – 2026-06-21

**Autobuzul de Oraș — Linii, branduri și mod peisaj**: alegi acum o **linie reală**
TPL/CTP și o conduci cu stații cu **nume reale**; orașul are branduri și instituții
recognoscibile, parcări, poduri și cale ferată; pe telefon jocul pornește în **modul peisaj**.

### Added

- **Selector de linie** în meniu — Suceava (1, 2, 4, 5, 30) și Iași (Expres 50, 28,
  36, 19). Autobuzul pornește din capătul liniei (Iași din **Gară**).
- **Nume reale de stații** pe **ambele** părți ale drumului (plăcuțe albastre TPL/CTP).
- **Branduri & instituții** ca panouri colorate: Lidl, Kaufland, Carrefour, Auchan,
  Penny, Mega Image, McDonald's, KFC, Decathlon, Dedeman ș.a., plus **Primăria** și **Poliția**.
- **Parcări** (zonele de asfalt fără marcaje) și **poduri pe care se circulă**, **cale
  ferată** cu **treceri semaforizate**, **lacuri și râuri**.
- **Mod peisaj pe telefon** — ecran complet + orientare blocată landscape.
- **Căutare stradă/cartier** în modul administrator (zbor deasupra hărții).

### Changed

- Suceava pornește din **Burdujeni**; balustradele podurilor doar pe exterior; nu se
  mai generează obiecte pe marginile hărții.

### Fixed

- Mașinile parcate stau doar pe marginea drumului; mașinile nu mai dispar la pod;
  stâlpii de electricitate nu mai trec prin poduri.
- Tastarea în căutare nu mai blochează comenzile; ieșirea din modul zbor revine corect.

---

## [1.4.0] – 2026-06-20

**Autobuzul de Munte — Muzică la bord**: casetofonul din bord cântă acum mai
multe „posturi" (melodia temă, două piese instrumentale generate în joc și
**radiouri românești live**), cu volum separat pentru joc și muzică direct pe
ecran. În plus, autobuzul pornește mai blând și cabina arată mai curat.

### Added

- **Casetofon cu mai multe posturi** (butonul 🎵 din bord ciclează → oprit):
  melodia temă, **două melodii instrumentale generate live** (fără voce, pentru
  condus) și **radiouri live — Kiss FM, Pro FM, Rock FM**. Numele postului apare
  scurt pe ecran când schimbi.
- **Volum separat pentru joc și pentru muzică** — în Setări și printr-un **buton
  rapid pe ecran** (🔊), ca să reglezi din mers fără să intri în meniu.

### Changed

- **Pornire mai blândă, fără „wheelie"**: autobuzul trage mai lin și ține botul
  jos, cu viteză maximă plafonată la **~138 km/h** — potrivit pentru primul autobuz.
- **Volan pe ecran mai mare** pe telefon, mai ușor de controlat.
- Autobuzul de Munte e menționat acum și în secțiunea **„Despre TutorialEu"**.

### Fixed

- **Parbriz fără dublură de sticlă**: am scos panourile de geam suprapuse din
  colțurile din față (banda întunecată din cabină) — parbrizul și geamurile
  laterale se unesc curat, fără sticlă în plus jos.
- Scos un clip video pus din greșeală în secțiunea **„Video Editor"** (era, de
  fapt, clipul de la ChampRune).

## [1.3.0] – 2026-06-18

**Joc nou: Autobuzul de Munte** — un joc **3D real** în care conduci un autobuz pe
șosele de munte pline de dealuri, eviți obstacolele și ai grijă să nu cazi de pe drum.
Jucabil direct în browser: pe telefon (ține-l orizontal), la tastatură, cu controller
sau cu volanul — din aceeași familie cu Romanian Drifts.

### Added

- **Autobuzul de Munte** (`/autobuz`), adăugat în categoria **Simulatoare** (pagina
  principală + meniul de jocuri):
  - **Motor 3D real** (Three.js + fizică cannon-es): autobuzul are **roți cu suspensie
    independentă** care chiar stau pe șosea și calcă denivelările și pantele — nu mai e
    desen plat pe șine.
  - **Traseu de munte** șerpuit care urcă spre vârf și coboară, cu viraje și prăpăstii
    pe margini — dacă ieși de pe șosea, **cazi** și pierzi; dacă te răstorni, pierzi.
  - **Coliziuni reale**: lovești marginea sau un vehicul parcat și autobuzul se ciocnește
    (nu mai dispari instant) — obstacole de evitat pe drum.
  - **Camere 3D**: din spate (urmărire), de sus și **liberă (orbitală)** în jurul
    autobuzului — comută cu butonul 👁 sau tasta **L**.
  - **Comenzi**: telefon (butoane pe ecran), tastatură (săgeți / WASD), **controller
    și volan**, plus **ecran complet** și o avertizare de rotire pe telefon.
  - *Versiunea 1 (MVP)* — urmează: carieră pe capitole, garaj și cumpărarea de
    autobuze pentru a ajunge la ultimul capitol.

## [1.2.2] – 2026-06-14

**Romanian Drifts — actualizare mare: circuite tehnice cu curbe înclinate
(bancate), minihartă pe toate cursele, player de muzică cu melodii noi de la
Marihano și mașina din Garaj exact ca în joc.** Traseele sunt mai lungi și mai
întortocheate, cu viraje în ambele sensuri care se înclină lateral ca pe un circuit
real; ai o minihartă în orice cursă; poți schimba și repeta melodiile, cu numele
afișat în joc; iar previzualizarea 3D din Garaj e identică cu mașina pe care o conduci.

### Added

- **Curbe înclinate (bancate)** pe traseu: în viraje asfaltul se înclină lateral
  (marginea exterioară urcă), ca pe un circuit/velodrom real, iar mașina se apleacă
  în viraj. Cu cât virajul e mai strâns, cu atât înclinarea e mai pronunțată. Doar
  vizual — nu schimbă felul în care se conduce.
- **Minihartă pe TOATE cursele** (colț stânga-jos): pe traseu vezi tot circuitul,
  cu virajele de drift marcate albastru, și unde ești tu; la **Drift Clasic** vezi
  limitele arenei, zona centrală de drift și **mașinile parcate și obstacolele** ca
  puncte; la **Capturează Steagul**, steagurile rămase. O săgeată arată direcția
  mașinii. (Pe telefon se mută sus-stânga ca să nu acopere butoanele de pe ecran.)
- **Player de muzică**: **8 melodii noi de la Marihano** (14 piese în total), cu
  **butoane ⏮ / ⏭** (melodia anterioară / următoare), **mod „repetă melodia"** (🔁)
  și **numele melodiei afișat în joc** (bară discretă sus-centru) și în meniu.
- **Muzica continuă de unde a rămas** după un refresh: melodia și secunda exactă
  sunt reținute, așa că reîncărcarea paginii reia același cântec din același punct.

### Changed

- **Slalom — greșelile costă acum**: dacă ratezi o poartă (treci pe partea greșită)
  pierzi un punct (ex. 2/52 → 1/52), iar dacă ieși de pe traseu (pe iarbă) pierzi
  încă unul. Trebuie să stai pe traseu și să prinzi porțile corect.
- **Circuite mai lungi și mult mai întortocheate**: traseele (Slalom și Traseu
  Drift) au acum **multe viraje la stânga ȘI la dreapta** (S-uri reale) pe un tur
  considerabil mai lung — nu mai sunt aproape rotunde. Sensul de parcurgere
  alternează pe capitole (pe cele pare pornești în direcția opusă), iar porțile de
  slalom se distanțează pe traseul mai lung.
- **Garaj — previzualizarea 3D e acum identică cu mașina din joc**: roți rotunde (nu
  pătrate), faruri în față, stopuri roșii + plăcuță cu litera clasei în spate, și
  farurile coborâte pe corpul mașinii (mai ales la camioane).

### Fixed

- **Gata cu obstacolele invizibile pe traseu** (Traseu Drift / Slalom): am scos
  conurile împrăștiate pe șosea. Erau așezate fix pe linia de drift / în zona
  albastră și, fiindcă în timpul driftului ajung lângă mașină (în afara câmpului
  vizual al camerei), le loveai fără să le vezi vreodată. Drumul rămâne curat —
  curbele și zonele albastre sunt provocare suficientă.
- **Roțile nu mai apar și dispar** când rotești mașina în Garaj: rămân lipite de
  caroserie și se ascund doar atunci când partea respectivă se întoarce cu spatele
  (ca în realitate).

## [1.2.1] – 2026-06-14

**Romanian Drifts — trasee unice pe capitol + dificultate rebalansată**: fiecare
capitol are acum propriul traseu (curbă + aranjament de arenă), vizibil în hartă;
driftul e mai greu, dar și mai corect.

### Added

- **Traseu unic pe fiecare capitol** (fix — identic la fiecare reluare): Slalom și
  Traseu Drift primesc o **curbă diferită** per capitol, iar Drift Clasic și
  Capturează Steagul primesc un **aranjament de arenă** propriu (pozițiile
  mașinilor parcate și ale obstacolelor + mărimea zonei centrale de drift).
- **Miniatură cu traseul** pe fiecare capitol în **Carieră** — exact traseul pe
  care îl vei conduce (cu zonele albastre marcate).
- **Slalom pe mai multe ture (×2 porți)**: după ce treci toate porțile de pe tur,
  ele se reactivează pentru încă o tură, până atingi totalul dublat — slalom mai
  lung, pe mai multă distanță.
- **Finalizare automată** la Drift Clasic / Traseu Drift în momentul în care
  atingi scorul de **aur** (maxim) — nu mai aștepți cronometrul.

### Changed

- **Drift mult mai greu**: scorurile cerute pentru medalii la **Drift Clasic** și
  **Traseu Drift** sunt acum **~3× mai mari** (recompensele în lei rămân la fel).
- **Coliziunile „rad" driftul în loc să-l reseteze**: o atingere de con / butoi /
  mașină parcată pierde **~30%** din puncte și scade puțin combo-ul, dar nu mai
  șterge tot (aurul devenise prea greu cu mașinile parcate peste tot). Ieșirea din
  pistă și tête-à-queue-ul complet resetează în continuare.
- **Driftul în afara zonei albastre** (pe traseu) scade combo-ul mai repede — ești
  împins să rămâi în zonele de drift.
- **×1.5 steaguri** la Capturează Steagul, cu cronometre mărite pentru noile
  cursuri mai lungi (slalom și capturează steagul).
- Zonele albastre de drift apar mai sigur pe noile curbe (prag de curbură redus).

## [1.2.0] – 2026-06-13

**Romanian Drifts — actualizare mare**: o **Carieră Sport** pentru clasa S,
**previzualizări 3D rotative** în garaj, un **meniu de Setări** grafice, **cutii
de viteze diferite per mașină** și o serie largă de îmbunătățiri la camere,
drift, randare și comenzi.

### Added

- **Cariera Sport (capitolele 11–20)** pentru clasa S: evenimente mai lungi
  (Drift Clasic, Slalom cu mai multe porți, Capturează Steagul cu mai multe
  steaguri, Traseu Drift), recompense mari și deblocare graduală **A → S**.
  Trei mașini noi de clasă **S** (Aurelian X, Dorobanț H, Zimbru ZR-S).
- **Previzualizare 3D rotativă** pe fiecare card din Garaj și în caruselul de
  selecție — mașina se rotește încet și i se văd corpul, culoarea și eleronul
  din toate unghiurile. Camioanele au acum **ferestre laterale + parbriz**.
- **Meniu „Setări"** (din meniul principal): **Rezoluție** (50/75/100%),
  **Distanță vizibilitate** (scăzută/medie/înaltă) și **Efecte** (fum & urme) —
  salvate local, pentru un joc mai fluid pe telefoanele mai lente.
- **Meniu „Comenzi"**: legendă cu tastele de pe **PC** și butoanele de pe
  **Android**, ca să știi cum conduci.
- **Cutii de viteze per mașină**: mașinile ieftine (ex. Traband) au **4 trepte**,
  cele de top au **7** — fiecare mașină își parcurge treptele până la viteza ei
  maximă.
- **Mașini parcate solide**: nu mai treci prin ele (te opresc/te resping); în
  Capturează Steagul **steagurile nu mai apar peste mașini sau conuri**.
- **Etichetă de versiune** (build) afișată în meniu.

### Changed

- **Camere refăcute**: vederea „Capotă" reglată (privire peste capotă), camera
  „Eroic (sus)" **eliminată**; mașina păstrează **aceeași poziție pe stradă** în
  toate camerele; pe „Cinematic" mașina **virează pe loc** fără să alunece
  lateral; **farurile** sunt proiectate corect în fața mașinii.
- **Distanță de randare mărită** — conurile și mașinile parcate se văd mult mai
  departe (reglabilă din Setări).
- **Grila de parcare umple toată arena**, consistentă din orice cameră.
- **Zone albastre de drift mai lungi** pe viraje — poți începe driftul mai
  devreme, înainte de curbă (lățimea rămâne aceeași).
- Butoanele touch auxiliare rearanjate: **semnalizatoarele sus, claxon/faruri
  jos**.

### Fixed

- **Roțile și geamurile nu mai dispar** la rotirea mașinii în previzualizarea 3D
  din Garaj — ordinea de desenare a fost corectată (sortare pe adâncime + plan
  de orientare per piesă, verificată numeric pe tot cercul de rotație).

## [1.1.1] – 2026-06-13

**Joc nou: Romanian Drifts** — un joc de drift în stil arcade, scris în
JavaScript pur (canvas, fără motor extern), cu mașini și camioane în stil
românesc (embleme parodie, fără logo-uri reale). Jucabil pe telefon, tastatură,
controller sau volan.

### Added

- **Romanian Drifts** (`/drift`), adăugat în lista de jocuri într-o **categorie
  nouă „Simulatoare"** — atât pe pagina principală, cât și în meniul „Jocuri &
  Divertisment".
  - **Randare pseudo-3D**: mașina e un corp 3D care se rotește în drift (i se
    vede lateralul), cu 4 roți rotunde, faruri/stopuri, plăcuță și emblemă.
  - **Fizică de drift**: frână de mână care declanșează driftul, roțile din față
    contra-virează, moment de auto-aliniere (mașina alunecă înainte fără să se
    învârtă) și păstrarea vitezei în drift.
  - **Comenzi**: mobil (landscape, **fullscreen automat**, butoane touch cu
    multi-touch — accelerezi și driftezi simultan), tastatură, controller și
    **volan** (ex. Thrustmaster) cu **calibrare**; transmisie manuală cu
    ambreiaj sau automată.
  - **Carieră** cu 10 capitole (drift clasic, traseu, slalom, capturează
    steagul), **Garaj** cu 16 mașini pe clase E–A, economie în lei și **Test
    Drive** pentru orice mașină (gratis dacă o deții, 50 lei altfel).
  - **Sunet** sintetizat: motor, scârțâit de cauciucuri, claxon și un semnal la
    capturarea steagului; volum reglabil 0–100.

## [1.1.0] – 2026-06-11

**Doi noi moduri de practică pe pagina de șah**: un **adversar AI adaptiv**
care crește în putere pe măsură ce înveți și câștigi, plus **Tactici Rapide**
— un mod cronometrat în care rezolvi cât mai multe tactici contra ceasului.

### Added

- **Adversar adaptiv „Dorel" (nume editabil)** în „Joacă Local (AI)":
  - Un singur adversar al cărui **ELO crește** când câștigi (+40), scade ușor
    când pierzi (−25), și nu coboară niciodată sub un **prag de învățare**
    derivat din lecțiile completate (fiecare lecție +25, fiecare modul complet
    +50, plafon 1800). Așa, pe măsură ce înveți, Dorel devine mai puternic.
  - **Numele este personalizabil** (apasă pe creion → implicit „Dorel").
  - Card cu avatar, ELO curent și scorul tău (V/R/Î) vs el.
  - La final de partidă, un dialog arată rezultatul și cum s-a schimbat
    ELO-ul lui Dorel.
  - Nivelurile fixe clasice (Ușor / Mediu / Greu / Expert / Maestru) rămân
    **vizibile** sub cardul Dorel („Sau alege un nivel fix"), exact ca înainte.

- **Mod „Tactici Rapide" (Puzzle Storm)** — buton nou roșu pe meniul
  principal, cu două tipuri de exercițiu:
  - **Mini Match** — un **mini-joc de capturi fără regi**, motor propriu
    (nu chess.js). Pe tablă apar doar **Nebun / Turn / Regină / Pion**. Tu
    (alb) muți, apoi adversarul (AI lacom de capturi). Capturezi → **+puncte**
    (P=1, N/B=3, R=5, Q=9); pierzi o piesă → **−puncte**. Piese noi „pică"
    continuu pe pătrate goale (fiecare tabără ține ≥3 piese, tabla ≥8), deci
    jocul curge fără reset până expiră timpul. Record în `miniBest`.
  - **Tactici** — **antrenament de învățare** cu poziții **generate aleator**
    (cu regi, reguli reale de șah), mereu diferite. Fiecare puzzle are exact
    o captură legală a unei piese neapărate; o rezolvi → **+20 ELO**, greșești
    → **−10 ELO**. Ratingul e **persistent** (`tacticsElo`) și **crește în
    timp**; dificultatea urcă odată cu el (mai multe piese-decoy). Cel mai bun
    rating în `tacticsBest`. Construite + validate cu chess.js (1500/1500
    legale pe fiecare prag de ELO, captură unică garantată).
  - Alegi durata: **30s / 60s / 3 minute**.
  - HUD cu cronometru (roșu pulsant sub 10s) + scor (puncte la Mini Match,
    ELO la Tactici).

- *(Notă: fișierul `public/data/chess-tactics.json` cu 14 puzzle-uri curate
  rămâne în repo, dar modul Tactici folosește acum generatorul procedural —
  poziții mereu noi — în locul listei fixe care se repeta.)*

- **Alegerea piesei la promovare** — când un pion ajunge pe ultima linie în
  partidele jucate (local vs Dorel / nivel fix / online), apare un selector
  cu 4 opțiuni: **Regină, Turn, Nebun, Cal** (sub-promovare). Înainte
  promova automat în regină. Lecțiile din „Învață Șah" rămân cu promovare
  automată în regină (conform textului lor).

### Changed

- **Motorul AI (`chess-worker.js`) poate juca mai slab, credibil** — pe lângă
  adâncimea de căutare (depth), acceptă acum `blunderRate` (probabilitatea de
  a juca o mutare aleatoare) și `tolerance` (fereastra în centipioni în care
  alege aleator dintre mutările „suficient de bune"). La ELO mic Dorel
  greșește ca un începător; la ELO mare joacă perfect. Compatibil înapoi
  (blunderRate=0, tolerance=0 → comportamentul clasic „cea mai bună mutare").
- **`renderTrainingBoard()`** acceptă acum `opts.boardId`, ca să poată fi
  reutilizat și pentru tabla din modul Tactici Rapide (nu doar lecții).
- **Modelul de progres** (`sah_training_progress`) extins cu `bot`
  ({name, elo, wins, losses, draws}) și `tacticsBest`. Retrocompatibil —
  câmpurile lipsă se completează la încărcare.

### Versioning
- `version.json` → **1.1.0** „Dorel & Tactici Rapide".
- Cache-bust: `chess-worker.js` (Worker) și `chess-tactics.json` la
  `?v=20260611c`; `sah.js` + `sah.css` la `?v=20260611g` (Mini Match fără regi,
  Tactici generator + ELO, selector promovare, niveluri fixe vizibile).

---

## [1.0.5] – 2026-06-10

**Mai multă practică pe fiecare lecție**: utilizatorii pot acum exersa
mutările pe tabla interactivă pentru **27 din 40** de lecții (anterior:
~15). Fiecare exercițiu cere o mutare *corectă* înainte de a continua —
fără ghidare explicită, ca un test real.

### Added — 17 noi teste practice

- **Tactici** — fiecare lecție de tactică (Furca, Pinul, Şişul, Atac
  descoperit, Atac dublu, Atragerea, Apărător supraîncărcat) are acum
  cel puțin un puzzle interactiv. Tu joci, tu găsești mutarea.
- **Mat în N** — `m01-mate1` are acum 2 puzzle-uri de mat-în-1 (clasic
  + back-rank); `m03-classic-patterns` are puzzle de mat înăbușit
  (smothered mate — calul pe f7).
- **Deschideri** — toate cele 6 deschideri (Centrul, Dezvoltare,
  Italiana, Spaniola, Siciliana, Gambit Damei) au câte un test cu
  mutarea-semnătură a deschiderii respective.
- **Finaluri** — `e04-passed-pawn` are 2 mutări (avansează + promovează).
- **Tactici suplimentare** — `t01-fork` are acum 2 puzzle-uri de furcă
  (rege+regină pe coloana a; rege+tură pe rândul 8).

### Fixed
- **Poziția ilegală în `e04-passed-pawn`** — regele alb (e1) și regele
  negru (e2) erau adiacenți în FEN-ul anterior, ceea ce face poziția
  imposibilă în șah. Repozitionat regele negru pe a8.
- **JSON.parse error** — 6 lecții aveau ghilimele românești (`„...\"`) cu
  ghilimea de închidere ASCII în loc de Unicode (`"`), care rupea
  parsing-ul JSON. Toate convertite la ghilimea curly românească corectă.
- **t04-discovered: knight fork verification** — fixat lista de
  expected-moves din `t01-fork` puzzle 2 (calul de pe e4 atacă rege+tură
  doar din `d6`, nu și din `f6`).

### Versioning
- `version.json` rămâne **1.0.4** (acesta este un release de conținut, nu
  o schimbare de funcționalitate).
- Cache-bust pe `sah.js` și fetch-ul lecțiilor la `?v=20260610c` pentru a
  forța re-descărcarea fișierului JSON corectat.

---

## [1.0.4] – 2026-06-10

**Antrenament șah — extindere majoră**: quiz-uri eliminate (feedback: erau
„enervante"), înlocuite cu **teste practice de mutare** unde utilizatorul
joacă liber și trebuie să găsească mutarea corectă pe cont propriu. Modulele
1 & 2 devin **opționale** (utilizatorii care știu deja regulile sar direct
la conținut avansat). Curriculum crescut de la 25 la **40 de lecții** cu
două module noi: **Strategie** și **Practică**.

### Changed
- **Modulele 1 & 2 (Bazele Pieselor, Reguli & Obiective) sunt acum
  OPȚIONALE** — niciun prerechizit nu le mai cere, iar titlul afișează
  „(opțional)". Utilizatorii avansați pot porni direct cu Tactici / Mat /
  Deschideri / Finaluri / Strategie / Practică, fără să termine bazele.
- **Toate lecțiile din Modulele 1 & 2 sunt acum independente** între ele —
  poți face „Calul" fără să fi făcut „Pionul" sau „Turnul", de exemplu.
- **Toate cele 12 întrebări quiz eliminate** și înlocuite cu **teste
  practice de mutare**: poziție pe tablă + prompt minim („Tu joci. Aplică
  ce ai învățat.") + validare automată a mutării. Utilizatorul nu mai
  primește help — trebuie să găsească singur mutarea corectă, ca într-un
  test real. Tipuri de teste:
  - *Capturează piesa neagră cu nebunul/calul/regina*
  - *Răspunde la șah*
  - *Dă șah-mat în 1*
  - *Promovează pionul*
  - *Evită patul* (testul de la lecția r03-stalemate)
  - *Fă rocada* (mică sau mare, alegere liberă)

### Added — **15 lecții noi** (curriculum de la 25 → 40)

#### Tactici (+2 lecții, total 7)
- **`t06-deflection` — Atragerea (Deflection)**: forțează un apărător să
  părăsească pătratul pe care apăra ceva important.
- **`t07-overload` — Apărător supraîncărcat**: o piesă cu prea multe sarcini
  cedează când o încarci.

#### Mat în N (+2 lecții, total 4)
- **`m03-classic-patterns` — Pattern-uri clasice**: mat înăbușit,
  Anastasia, Boden, arab, back-rank. Recunoaștere instantă = calcul mai
  rapid.
- **`m04-mate3` — Mat în 3**: tehnica calculării combinațiilor forțate.

#### Deschideri (+2 lecții, total 6)
- **`o05-sicilian` — Apărarea Siciliană** (1.e4 c5): cea mai populară
  replică la 1.e4. Variante celebre: Najdorf, Dragon, Sveșnikov.
- **`o06-queens-gambit` — Gambit Damei** (1.d4 d5 2.c4): deschiderea
  preferată de Carlsen, Anand și Karpov.

#### Finaluri (+2 lecții, total 5)
- **`e04-passed-pawn` — Pionul liber**: principiul lui Nimzowitsch
  („pionii liberi trebuie împinși") și pionii liberi protejați.
- **`e05-lucena` — Poziția Lucena**: cea mai cunoscută poziție de câștig
  în finalurile de turn + pion, cu tehnica „construirii podului".

#### Modul nou: Strategie (4 lecții)
- **`s01-pawn-structure` — Structura de pioni**: pioni dubli, izolați,
  liberi, conectați, pătrate slabe.
- **`s02-outposts` — Avanposturi pentru cai**: cal pe pătrat puternic =
  uneori mai puternic decât un turn.
- **`s03-good-bad-bishop` — Nebun bun vs nebun rău**: cum determină
  pionii valoarea nebunului.
- **`s04-rook-7th` — Turnul pe rândul 7**: „porcul gras", una dintre cele
  mai puternice plasări de piesă din șah.

#### Modul nou: Practică (3 lecții)
- **`pr01-trade-eval` — Când schimbi piesele**: reguli practice de schimb
  (material, spațiu, activitate).
- **`pr02-conversion` — Cum convertești un avantaj**: tehnica clasică de
  transformare avantaj → victorie, citatul lui Capablanca.
- **`pr03-calculation` — Calculul combinațiilor**: metodologia Kotov
  pentru calcul în adâncime (candidates, depth-first, forced moves only).

### Fixed
- **Poziții ilegale în finalurile e01 și e02**: anterior pozițiile aveau
  regina/turnul alb dând șah regelui negru pe mutarea albă (poziții
  imposibile în șah). Repoziționate corect.

### Versioning
- `version.json` → **1.0.4** cu numele „Antrenament Avansat".
- Cache-bust pe `sah.css`, `sah.js`, și pe `chess-lessons.json` la
  `?v=20260610b` pentru a forța încărcarea conținutului nou.

---

## [1.0.3] – 2026-06-10

**Învață Șah** — un mod de antrenament în stil Duolingo, integrat în pagina
`/sah` alături de modurile *Joacă Local (AI)* și *Joacă Online*. Drum de
lecții bite-sized cu **explicații + practică interactivă** pe aceeași tablă
familiară, pentru a duce un începător de la „cum se mișcă pionul" până la
finaluri de bază.

### Added

- **Buton nou *Învață Șah*** pe meniul principal din `/sah`, cu drum vertical
  de **25 lecții** grupate pe 6 module:
  1. **Bazele Pieselor** — Pionul, Turnul, Nebunul, Calul, Regina, Regele,
     Rocada, Promovarea (8 lecții, complet autorate).
  2. **Reguli & Obiective** — Șah, Șah-mat, Pat (3 lecții, complet autorate).
  3. **Tactici** — Furca, Pinul, Şişul, Atac descoperit, Atac dublu
     (5 lecții, schelet cu explicații; puzzle-urile interactive vin curând).
  4. **Mat în N** — Mat în 1, Mat în 2 (2 lecții, schelet).
  5. **Principii de Deschidere** — Controlul centrului, Dezvoltare,
     Deschiderea Italiană, Spaniola (Ruy Lopez) (4 lecții, schelet).
  6. **Finaluri** — Mat cu Regina, Mat cu Tura, Opoziția pionilor
     (3 lecții, schelet).

- **Cinci tipuri de pași pe lecție** (toate funcționale în engine):
  - `lesson` — card explicativ cu text + mini-tablă cu pătrate evidențiate
  - `move` — mută piesa cerută pe tabla interactivă; validare automată
    împotriva mutării așteptate (cu suport pentru promovare și rocadă)
  - `find-square` — apasă pe pătratul corect (read-only)
  - `quiz` — întrebare cu 2-4 răspunsuri, explicație după click
  - `complete` — card de felicitare cu streak și buton spre lecția următoare

- **Drum cu stări locked / unlocked / completed** — nodurile circulare au
  inel verde (terminat) cu badge ✓, inel albastru pulsant (lecția curentă)
  sau gri cu lacăt (blocat). Module headers afișează progresul pe modul
  (`3 / 8`). Lecțiile se deblochează când prerechizitele lor sunt completate.

- **Streak zilnic** — counter `🔥 N zile` în colțul de sus al drumului,
  calculat după calendarul Europe/Bucharest. Se incrementează când termini
  o lecție într-o zi diferită de ultima, se păstrează dacă ai jucat ieri,
  se resetează la 1 dacă ai sărit ≥ 2 zile.

- **Sistem de hint și „Vezi soluția"** — la pașii de tip `move` și
  `find-square`, după 2 încercări greșite apare hint-ul autorului; după 4
  încercări apare butonul *Vezi soluția* care animează mutarea corectă pe
  tablă; lecția se marchează completată indiferent dacă soluția a fost
  dezvăluită (model Duolingo „toleranță blândă").

- **Persistență per-browser** prin `localStorage.sah_training_progress`
  (format JSON: `{ lessons: {...}, streak: {...} }`). Lecțiile terminate
  rămân terminate la reîncărcarea paginii; sesiunile mid-lesson NU se
  salvează (lecțiile sunt atomice).

- **Overlay full-viewport pentru lecții** (z-index 1060, peste header și
  Bootstrap modal) cu top-bar verde, indicator de pas (`Pas 2 / 5`),
  buton X de închidere cu confirmare *„Sigur vrei să ieși?"* dacă ești
  mid-lecție.

- **Tablă de antrenament cu sprite-uri identice** cu cele din modul de joc
  — reutilizează `.chess-board`, `.square.*`, `.piece.wp..bk` din `sah.css`,
  fără sprite-uri noi. Folosește o instanță **separată** `trainingGame =
  new Chess()` ca să nu afecteze starea unei partide locale salvate.

### Changed

- **`public/sah.html`** — adăugat butonul *Învață Șah* pe meniul principal,
  containerele `#training-view` și `#training-overlay` (cu top-bar, body,
  bottom-bar).
- **`public/js/sah.js`** — importat `showModal` din `./modals.js`; adăugate
  ~ 450 linii noi (path renderer, lesson runner, 5 step renderers,
  validators, streak logic, helpers `renderMarkdownLite` + `escapeHtml`).
  Modul *Joacă Local (AI)* și *Joacă Online* rămân **neschimbate**.
- **`public/css/sah.css`** — adăugate ~ 280 linii noi: stiluri pentru drum,
  noduri circulare cu 4 stări, overlay-ul lecției, quiz, feedback animat
  (pop pe corect, shake pe greșit), card de completare.
- **Cache-bust** pe `sah.css` și `sah.js` la `?v=20260610a` pentru ca
  utilizatorii cu cache vechi să primească imediat noul cod și UI.

### Data

- **`public/data/chess-lessons.json`** (fișier nou) — toate cele 25 de
  lecții cu pași și conținut bilingv (text românesc; terminologia șah
  păstrează variantele românești standard: cal/nebun/turn/regină/rege).
  Modulele 1–2 au pași `lesson` + `move` + `quiz` completați; modulele
  3–6 au câte un pas `lesson` cu placeholder *„Puzzle-uri interactive în
  versiunea următoare"* — sistemul rulează end-to-end pentru toate
  lecțiile, conținutul detaliat se autoritează incremental.

---

## [1.0.2] – 2026-06-10

Politica „doar modele **gratuite**": Pro-urile dispar din toate selectoarele
și carduri. Cine vrea Pro tot poate folosi direct
[Google AI Studio](https://aistudio.google.com) — noi nu mai promovăm și nu
mai trimitem cereri către modele Pro din site.

### Added
- **Tile *Via Transilvanica* în secțiunea Exerciții Fizice** — link extern
  către [viatransilvanica.com](https://www.viatransilvanica.com/) pentru cei
  care vor mișcare în plus față de antrenamentele indoor (1400 km de traseu
  marcat prin România). Carusel-ul are acum patru tile-uri: Gantere, Greutate
  Corporală, Stretching, Via Transilvanica. Iconiță `fa-person-hiking`,
  gradient terracotta-maro și animație `hike-stride` la hover.

### Changed
- **`public/data/models.json`** — scos `gemini-3.1-pro-preview` și
  `gemini-2.5-pro`. Rămân doar Flash / Flash-Lite (7 modele). Cele trei jocuri
  AI (`rebus.js`, `integrama.js`, `dezamorsarea.js`) care încarcă acest fișier
  trec automat pe lista nouă.
- **`public/ai.html` (Nano Gemini Chat)** — eliminat din dropdown-ul de modele:
  - `gemini-3.1-pro-preview` (grupul *Latest Preview*)
  - `gemini-2.5-pro` (grupul *Recomandate stabile*)
  - `gemini-1.5-pro` (grupul *Compatibilitate maximă*)
- **`public/gemini.html` (Gemini Hub)** — eliminat cardul *Gemini 2.5 Pro*
  „Most Advanced Reasoning". Restul carduri-lor (3 Flash, 2.5 Flash, etc.)
  rămân neschimbate.
- **`public/index.html`** — scos item-ul *„Gemini 3.1 Pro Preview"* din
  dropdown-ul *Gemini Labs* de pe pagina principală.
- **`public/js/ai-chat.js`** — `filterChatModels()` nu mai acceptă substring-ul
  `pro` în filtrul `isFreeTierStyle`. Astfel, chiar și când dropdown-ul se
  reconstruiește dinamic din `/v1beta/models`, nu mai apar modele Pro pe care
  contul utilizatorului le-ar putea avea activate.

### Fixed
- **Eroare 404 pe modele blocate regional** — adăugat auto-recovery în
  `ai-chat.js`: la prima eroare 404 ridicată de SDK, lista de modele este
  re-fetch-ată din API, se alege automat alt model compatibil, dropdown-ul se
  rescrie, mesajul utilizatorului este re-trimis o singură dată. Mesaj:
  *„Modelul curent nu este disponibil în regiunea ta. Caut alternative..."*
  → *„Am comutat automat la modelul: **X**"*. Modelul ce funcționează este
  salvat în `localStorage` per-utilizator ca `nanoBananaPreferredModel-EMAIL`
  și folosit ca selecție implicită la următoarea sesiune de chat.
- **Pre-fetch tăcut al modelelor la intrarea în chat** — `switchToChatView()`
  apelează acum `prefetchAvailableModels()` care, dacă există cheie API salvată,
  reconstruiește dropdown-ul cu lista reală a utilizatorului. Dacă API-ul
  eșuează, dropdown-ul HTML static rămâne intact (fail-safe).

---

## [1.0.1] – 2026-06-10

Două îmbunătățiri vizibile direct în footer: un changelog **renderizat
frumos** și un indicator **"Actualizat"** care arată ora ultimului deploy.

### Added
- **Pagina `/changelog` cu markdown renderizat** — vezi această pagină chiar
  acum. Linkul `v1.0.0 · Vremea` din footer trimite aici (nu mai la fișierul
  `.md` brut). Secțiunile sunt color-codate:
  - <span style="color:#28a745">**✚ Added**</span> verde — funcții noi
  - <span style="color:#0d6efd">**✎ Changed**</span> albastru — îmbunătățiri
  - <span style="color:#fd7e14">**✔ Fixed**</span> portocaliu — bugfix-uri
  - <span style="color:#dc3545">**✖ Removed**</span> roșu — eliminări
  - <span style="color:#6f42c1">**🔒 Security**</span> mov — securitate

  Sub capotă: `marked.js` (CDN) parsează `CHANGELOG.md` și injectează HTML;
  CSS-ul tematic se aplică la `<h2>`, `<h3>`, `<ul>`, `<code>`, etc. Funcționează
  pe light/dark theme.

- **Indicator "Actualizat: zz.ll.aaaa, hh:mm" în footer** — afișează automat
  data și ora ultimului deploy pe `main`, în fusul orar al României. Stă lângă
  versiunea (`· v1.0.1 · Vremea · Actualizat: 10.06.2026, 21:29`). Hover peste
  text dezvăluie commit-ul SHA și branch-ul.

  Sub capotă: Netlify rulează `node -e "..."` în `netlify.toml [build] command`
  la fiecare push pe `main`, generând `public/build-info.json` cu timestamp
  ISO UTC + `$COMMIT_REF` + `$BRANCH`. `updateDeployInfo()` în `include.js`
  fetch-uiește fișierul și formatează cu `Intl.DateTimeFormat('ro-RO',
  { timeZone: 'Europe/Bucharest', ... })`.

- **Redirect `/zodie` → `/zodiac`** — pentru cei care tastează cuvântul
  românesc. 301 permanent, prin `_redirects`.

- **Gemini Hub: două carduri "noi" deasupra lineup-ului existent** —
  **Gemini 3.5 Flash** (auriu) pentru next-gen reasoning și
  **Gemini 3.5 Live Translate** (mov) pentru traducere live audio/video în
  timp real.

- **Buton "Reîmprospătează" pe `/reduceri`** — re-fetch `deals.json` fără
  reload de pagină. Util când lași tab-ul deschis peste noapte și cron-ul de
  06:30 / 18:30 UTC actualizează datele.

### Changed
- **Partial-uri (`_header.html`, `_footer.html`, `_modal.html`) cu
  `cache: 'no-cache'`** — fetch-uiate cu revalidare obligatorie, deci editări
  viitoare la navbar/footer apar instant fără refresh forțat.
- **`updateSiteVersion()` și `updateDeployInfo()` se auto-injectează** —
  dacă footer-ul cache-uit pe browser-ul utilizatorului nu are încă span-urile
  `#site-version` / `#site-deployed`, JS-ul le creează la runtime. Astfel
  funcționalitatea apare imediat chiar și pentru cei cu cache vechi.
- **Cache-bust sitewide pe `js/include.js?v=20260613e`** — bumpă URL-ul script
  tag-ului în toate cele 44 de fișiere HTML, forțând browserele să încarce
  noul `include.js` cu logica de auto-inject + display deploy info.

### Fixed
- **`/vremea` afișează corect meniul "weather"** — `include.js` are acum în
  route guard `currentPath.includes('/vremea')` (înainte era doar `/weather`,
  iar funcția a fost redenumită din `updateNavForWeather` în
  `updateNavForVremea`). Înainte de fix, pagina arăta meniul default din
  `_header.html` pe deploy-urile fresh.

---

## [1.0.0] – 2026-06-09

First versioned release. Snapshots the recent batch of improvements before we
start incrementing.

### Added
- **`/vremea` page** — Romanian-named weather page (replaces `/weather.html`).
  Old `/weather` URLs 301-redirect to `/vremea` via `_redirects` so external
  bookmarks keep working.
- **Site versioning + changelog** — `public/version.json` is the source of
  truth; this file lists what landed in each version; footer shows the version
  next to the copyright.
- **Mic test feature in workout modals** — "Test microfon" button with live
  audio meter (Web Audio `AnalyserNode`). Auto-stops when "Control vocal" is
  toggled on to avoid double-grabbing the mic.
- **Bilingual exercise names** — every entry in the dumbbell (28), bodyweight
  (198) and stretching (107) JSON datasets now has `name_ro` alongside `name`.
  Modal title, planner row, picker, and voice announcements all surface the
  Romanian primary with English in smaller italic below.
- **Exercise completion tracking** — finishing the rep target marks the
  exercise with a green ✓ and strikethrough; clicking a completed exercise
  prompts "Doriți să faceți din nou exercițiile de astăzi?"; flags reset
  automatically each Monday.
- **Whole-row click** in the workout planner — tapping anywhere on an exercise
  row opens its modal (not just the small video thumbnail).
- **Workout "all-day complete" congrats modal** — *"Toate exercițiile au fost
  completate pe astăzi, reveniți în altă zi!"* fires only when every exercise
  in the day's plan is marked completed.
- **Auto-scroll to today's planner column** on page load (all three workout
  pages).
- **HTTPS-required hint** — when voice control is enabled on a non-secure
  context (HTTP local-IP), the status now reads *"Microfonul necesită HTTPS"*
  instead of a generic "Control vocal oprit".

### Changed
- **Workout modal labels** simplified: "Prec." → "Precedent", "Urm." → "Următor",
  "Țintă Repetări" / "Durată (sec)" → "Nr. repetări", "Viteză Video" → "Viteză
  repetări", "Control Vocal" → "Control vocal".
- **Workout modal layout** — speed dropdown is inline with its label to save
  vertical space; status text is sticky-positioned at the bottom of the
  scrollable body so "Ascult comenzi..." stays visible on tall phones;
  navigation buttons use a uniform `gap` for symmetric spacing.
- **Exercise modal full-screen on phones** — `max-height: 100dvh`, body
  scrolls internally instead of pushing buttons off-screen.
- **Exercise video size on phones** — capped to `32dvh` so the controls always
  fit in the viewport.
- **Genshin character Hoyoverse links** — `charIndex` synced for Mondstadt
  (24), Liyue (23), Inazuma (16), Sumeru (14), Fontaine (15), Natlan (12),
  NODKRAI (9); Chiori reclassified Fontaine; Nicole added; Manekin/Manekina
  fall back to Fandom wiki.
- **Translation tone** — Romanian fitness terminology (genuflexiuni, fandare,
  flotări, planșă, etc.) instead of anglicisms.
- **Cache-Control headers** for `include.js`, `_header.html`, `_footer.html`,
  `_modal.html` set to `must-revalidate` so future shared-partial edits land
  on the next page-load without a hard-refresh.

### Fixed
- **Voice command diacritics** — speech recognition output ("viteza" vs
  "viteză", "urmatorul" vs "următorul") now matches keyword list via NFD strip.
- **Voice speed parsing** — handles "2x", "doi x", "doi ori", "două" etc.
  instead of failing on anything beyond an exact word match.
- **Voice recognition restart after TTS** — added 200ms delay + InvalidStateError
  retry so the mic resumes listening after each spoken confirmation instead of
  disconnecting after the first command.
- **Microphone permission prompt** on Android Chrome — `getUserMedia` is now
  primed from the user gesture (exercise click / Control vocal toggle) so the
  browser actually shows the permission dialog.
- **Speech synthesis priming** — `resume()` + zero-volume `speak()` from gesture
  unlocks Android Chrome's speech engine; watchdog timer fires `onend` manually
  if the real event never arrives.
- **Stuck "Așteaptă finalizarea audio..."** — recovery checks `speechSynthesis.speaking`
  and resets the `isSpeaking` flag when the engine reports false but our flag
  is stale.
- **Mic activates from planner view** — gated the post-TTS recognition restart
  on `currentModalExerciseData` so closing the modal mid-TTS doesn't accidentally
  start the mic outside the exercise context.
- **`not-allowed` race tolerance** — first occurrence shows *"Reluare control
  vocal..."* and retries instead of immediately deactivating, because mobile
  Chrome sometimes throws not-allowed transiently after TTS ends.
- **Vremea page nav routing** — `/vremea` triggers `updateNavForVremea()` to
  render the correct weather menu (Top / Căutare / Prognoză / Harta AQI / Acasă)
  instead of the default `_header.html` items.

### Removed
- **`weather.html`** — superseded by `vremea.html`. Old URL still works via
  the 301 redirect.

---

## How to bump the version

1. Decide the new number:
   - PATCH (`1.0.0 → 1.0.1`) — bug fixes only.
   - MINOR (`1.0.0 → 1.1.0`) — new features, backwards-compatible.
   - MAJOR (`1.0.0 → 2.0.0`) — breaking nav/url/data changes.
2. Update `public/version.json`:
   ```json
   { "version": "1.1.0", "released": "2026-06-20", "name": "..." }
   ```
3. Add a new section to the top of this file documenting what changed.
4. Commit both files in the same commit.
5. Deploy. The footer pulls `version.json` on every page load.

**Always insert the new section at the TOP of the file**, right under the `---`
separator — never append it at the bottom. The changelog page renders this file
in file order, so anything added at the end shows up below the oldest release.
Use the `## [X.Y.Z] – YYYY-MM-DD` heading format (`##`, square brackets, en
dash) so it lands at the same level as the other releases.

---

## 🗺️ Harta site-ului

Tot ce se găsește acum pe **TutorialEu**, pe categorii. Lista e ținută la zi odată
cu versiunile de mai sus; dacă ceva de aici nu mai există sau lipsește, e o scăpare
de-a noastră.

### 🎮 Jocuri

**De noroc**
- **Roata Norocului** (`/wheel`) — o roată pe care o personalizezi și o învârți ca să alegi ceva la întâmplare.
- **Zaruri 3D** (`/dice`) — arunci zaruri 3D, pentru jocuri de masă sau decizii rapide.
- **Cap sau Pajură** (`/coin-flip`) — dai cu banul.

**De cărți**
- **Una** (`/una`) — joc de cărți în stil UNO, cu prietenii sau contra calculatorului.
- **Șeptica** (`/septica`) — popularul joc românesc de cărți.
- **Remi** (`/remi`) — remi românesc, în două variante.
- **Soliter** (`/soliter`) — solitaire clasic, cu dificultate reglabilă.

**De masă**
- **Table** (`/table`) — table contra calculatorului sau în doi.
- **Șah** (`/sah`) — șah cu adversar AI, joc online, lecții și tactici rapide.
- **Monopol** (`/monopol`) — Monopoly cu adversari AI și multiplayer online.
- **Biliard** (`/biliard`) — biliard 8-Ball, cu dificultate reglabilă.
- **Închide Cutia** (`/inchide-cutia`) — jocul de zaruri „Shut the Box".
- **Puzzle Imagini** (`/puzzle`) — puzzle din poze încărcate de tine sau făcute de AI.

**De logică**
- **Rubik's Cube 3×3** (`/rubik-cube`) — cub Rubik 3D interactiv.
- **X și 0** (`/tic-tac-toe`) — contra calculatorului sau în doi.
- **Sudocu** (`/sudocu`) — sudoku cu patru niveluri de dificultate.

**De cuvinte**
- **Dezamorsarea** (`/dezamorsarea`) — ghicești cuvântul contra cronometru, cu mod AI.
- **Rebus AI** (`/rebus`) — rebus generat pe tema aleasă de tine.
- **Integramă AI** (`/integrama`) — integramă generată pe temă.

**La volan**
- **Romanian Drifts** (`/drift`) — drift arcade cu mașini românești, pe telefon și PC.
- **Autobuzul de Munte** (`/autobuz`) — curse de munte cu autobuzul, cu radio propriu.
- **Autobuzul de Oraș** (`/oras`) — condu autobuzul pe străzile reale ale Sucevei.
- **Condu în Orice Oraș** (`/orice-oras`) — alegi orice oraș din lume și îi conduci străzile adevărate.

**Acțiune și reflexe**
- **Arcașa** (`/arcasa`) — tir cu arcul.
- **Fotbal Românesc** (`/fotbal`) — fotbal cu echipe românești.
- **Vindecătorul** (`/vindecatorul`) — joc de îngrijit și vindecat.
- **Test Reflexe** (`/reaction-test`) — îți măsori viteza de reacție, cu istoric.

### 🧘 Mișcare și sănătate

- **Rutine de exerciții** — cu **gantere** (`/workout`), cu **greutatea corpului** (`/workout-bodyweight`) și de **stretching** (`/workout-stretching`), cu animații video și planificator săptămânal.
- **Tai Chi** (`/taichi`), **Baduanjin** (`/baduanjin`) și **Qigong** (`/qigong`) — forme predate de un instructor 3D care se mișcă odată cu tine, cu explicații pas cu pas.
- **Zahăr** (`/zahar`) — calculezi zahărul adăugat, scanezi eticheta cu camera și ții un jurnal pe zile.

### 🪄 Aplicații

- **Dorințe** (`/dorinte`) — freci lampa, iese Șamanul, stai de vorbă cu el și îți notează trei dorințe. De Crăciun, și Moșul.
- **Meditație** (`/meditatie`) — muzică de relaxare generată live, pe chakre, cu bătăi binaurale și playlist propriu.
- **Gândul Zilei** (`/secret`) — o învățătură pe zi, cu serie, puncte și gânduri în plus pentru cine vine zilnic.
- **Calendar** (`/calendar`) — calendar simplu, zile de naștere sau calendar ortodox, cu posturi și rugăciuni citite cu voce.
- **Ani de Căsătorie** (`/nunta`) — ce nuntă aniversezi și materialul ei tradițional, în 3D.
- **Pietre Zodiacale** (`/zodiac-pietre`) — piatra zodiei tale, în 3D.
- **Pietre și Materiale Prețioase** (`/pietre`) — clasament după preț.
- **Compatibilitate Zodiac** (`/zodiac`) — zodiac european și chinezesc.
- **Vânătoare de Fantome** (`/fantome`) — detector cu senzorii telefonului, spectru audio și jurnal de ședință.
- **Gravitație** (`/gravitatie`) — Soarele, Pământul, Luna și cerul, în timp real, de oriunde de pe glob.
- **Vremea** (`/vremea`) — prognoză pe 10 zile, calitatea aerului și hartă.
- **Pădure** (`/padure`) — păduri, parcuri și locuri verzi din România aproape de oraș, cu fișier GPX de luat pe ceas sau pe telefon și înregistrarea traseului mers pe jos.
- **Garaj Virtual** (`/garaj`) — mașinile tale, RCA, ITP, revizii și documente, cu notificări.
- **Filtrele Mele** (`/filtre`) — evidența filtrelor de apă, cu notificări pe telefon.
- **Cadou Digital** (`/create-gift`) — creezi și trimiți un card-cadou cu mesaj.

### 🤖 Inteligență artificială

- **Nano Gemini AI** (`/ai`) — asistent AI, conversație în timp real, cu fișiere atașate.
- **Gemini Hub** (`/gemini`) — poartă către modelele Google Gemini gratuite.
- **Știri AI** (`/ai-news`) — ce se mai întâmplă în lumea AI.
- **Generator 3D** (`/model-generator`) — modele 3D scrise în cuvinte.

### 💬 Cu alți oameni

- **Chat Privat** (`/chat`) — chat și apel video cu prietenii, în timp real (necesită cont Google).
- **Listă de Cumpărături** (`/cumparaturi`) — liste împărțite cu ai tăi, bifate în timp real.

### 🏷️ Reduceri

- **Reduceri Jocuri** (`/reduceri`) — gratis acum, demo-uri, preț minim istoric și ce vine, pe Steam, Epic, PlayStation, VR și GeForce Now.

### 🧩 Genshin Impact și Wild Rift

- **Genshin** — personaje (`/genshin-characters`), tier list (`/genshin-ranking`), constructor de echipe (`/genshin-teams`) și clasamentul echipelor (`/genshin-teams-ranking`).
- **Wild Rift** — campioni (`/wildrift-characters`), tier list (`/wildrift-ranking`), constructor de echipe (`/wildrift-teams`) și clasamentul echipelor (`/wildrift-teams-ranking`).

### 📺 Canale și playlisturi

- **iMarianRO** (`/imarianro`), **IMRO Gaming** (`/imro`), **IMRO Talent** (`/imrotalent`), **LowVrGamer** (`/lowvrgamer`) și **Marihano Music** (`/marihano`).

### 💾 Aplicații Windows

- **Download** (`/download`) — aplicații gratuite pentru Windows.

### 📄 Pagini de subsol

- **Jurnal de modificări** (`/changelog`) — chiar pagina asta.
- **Politica de confidențialitate** (`/confidentialitate`) — ce se întâmplă cu datele tale, scris după cod.

