Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

Sokan keresnek információkat a HellSpin kifizetés részleteiről és a kapcsolódó lehetőségekről. A hellspin kifizetés fontos szempont lehet. Ismerd meg a tudnivalókat a hellspin kifizetés oldalon.

The Clubhouse Casino delivers smooth performance and exciting features. Access the clubhouse casino and try The Clubhouse Casino.

Corgibet ofrece una experiencia de entretenimiento online moderna y fácil de usar. Visita corgibet para descubrir una plataforma rápida, intuitiva y optimizada para todos los dispositivos.

The playjonny app offers mobile-friendly access to games, account tools, and promotions, creating a convenient way to enjoy casino entertainment on the move.

iBet Casino tarjoaa sujuvan pelikokemuksen ja laajan pelivalikoiman kaikille pelaajille. Vieraile ibet casino ja koe moderni kasino.

The platform katanaspin is designed for users who value speed and usability. Katanaspin continues to improve its features for better engagement.

BitStarz Casino continues expanding its online services while maintaining ease of use. Explore bitstarz casino and discover more.

Mega Medusa Australia offers an engaging online gaming environment with modern features and easy navigation for all users. Discover more about mega medusa australia at mega medusa australia and explore its benefits.

V Tipsport sk si hráči užijú rýchle transakcie a bezpečné hranie online. Klikni na tipsport. sk a preskúmaj platformu Tipsport sk.

Chicken Road heeft een unieke stijl die online spelers aanspreekt met eenvoudige gameplay en leuke functies. Chicken Road blijft een populaire keuze voor liefhebbers van moderne slots. Ontdek meer via chicken road en bekijk alle mogelijkheden.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

Sokan keresnek információkat a HellSpin kifizetés részleteiről és a kapcsolódó lehetőségekről. A hellspin kifizetés fontos szempont lehet. Ismerd meg a tudnivalókat a hellspin kifizetés oldalon.

The Clubhouse Casino delivers smooth performance and exciting features. Access the clubhouse casino and try The Clubhouse Casino.

Corgibet ofrece una experiencia de entretenimiento online moderna y fácil de usar. Visita corgibet para descubrir una plataforma rápida, intuitiva y optimizada para todos los dispositivos.

The playjonny app offers mobile-friendly access to games, account tools, and promotions, creating a convenient way to enjoy casino entertainment on the move.

iBet Casino tarjoaa sujuvan pelikokemuksen ja laajan pelivalikoiman kaikille pelaajille. Vieraile ibet casino ja koe moderni kasino.

The platform katanaspin is designed for users who value speed and usability. Katanaspin continues to improve its features for better engagement.

BitStarz Casino continues expanding its online services while maintaining ease of use. Explore bitstarz casino and discover more.

Mega Medusa Australia offers an engaging online gaming environment with modern features and easy navigation for all users. Discover more about mega medusa australia at mega medusa australia and explore its benefits.

V Tipsport sk si hráči užijú rýchle transakcie a bezpečné hranie online. Klikni na tipsport. sk a preskúmaj platformu Tipsport sk.

Chicken Road heeft een unieke stijl die online spelers aanspreekt met eenvoudige gameplay en leuke functies. Chicken Road blijft een populaire keuze voor liefhebbers van moderne slots. Ontdek meer via chicken road en bekijk alle mogelijkheden.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

(function(){ const wrap = document.getElementById("wrap-doodle"); const baseCanvas = wrap.querySelector("#baseCanvas"); const revealCanvas = wrap.querySelector("#revealCanvas"); const baseCtx = baseCanvas.getContext("2d"); const revealCtx = revealCanvas.getContext("2d"); let radius = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-radius")) || 240; let softness = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-softness")) || 0.55; let scale = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-scale")) || 0.3; let svgPath = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-svg") + "" || "").replace(/^['"]/, '').replace(/['"]$/, ''); let opacity = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-opacity")) || 0.3; let duration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-duration")) || 1000; // ms let mode = (getComputedStyle(document.documentElement).getPropertyValue("--wrap-doodle-mode") || "click").trim().replace(/['"]/g,""); // "click" or "loop" wrap.style.opacity = opacity; const wrapper = document.getElementById("wrap-doodle-wrapper"); if (wrapper) { const observer = new ResizeObserver(entries => { for (let entry of entries) { const { width, height } = entry.contentRect; wrap.style.width = width + "px"; wrap.style.height = height + "px"; resizeCanvases(); } }); observer.observe(wrapper); } const ease = 0.14; let target = {x:50,y:50}; let current = {x:50,y:50}; let img = new Image(); img.src = svgPath; img.onload = () => { createPatterns(scale); resizeCanvases(); drawReveal(1.0); if (mode === "loop") { requestAnimationFrame(loopHeartbeat); } }; let basePattern, revealPattern; function createPatterns(scale){ const off = document.createElement("canvas"); off.width = img.width * scale; off.height = img.height * scale; const offCtx = off.getContext("2d"); offCtx.drawImage(img, 0, 0, off.width, off.height); offCtx.globalCompositeOperation = "source-in"; offCtx.fillStyle = "blue"; offCtx.fillRect(0, 0, off.width, off.height); basePattern = baseCtx.createPattern(off, "repeat"); revealPattern = revealCtx.createPattern(off, "repeat"); } function resizeCanvases(){ const wrapper = document.getElementById("wrap-doodle-wrapper"); const wrapperWidth = wrapper ? wrapper.clientWidth : window.innerWidth; const wrapperHeight = wrapper ? wrapper.clientHeight : window.innerHeight; wrap.style.width = wrapperWidth + "px"; wrap.style.height = wrapperHeight + "px"; const w = wrap.clientWidth; const h = wrap.clientHeight; const dpr = window.devicePixelRatio || 1; [baseCanvas, revealCanvas].forEach(c => { c.width = w * dpr; c.height = h * dpr; c.style.width = w + "px"; c.style.height = h + "px"; c.getContext("2d").setTransform(dpr, 0, 0, dpr, 0, 0); }); drawBase(); } function drawBase(){ const w = wrap.clientWidth, h = wrap.clientHeight; baseCtx.clearRect(0,0,w,h); if(!basePattern) return; baseCtx.save(); baseCtx.fillStyle = basePattern; baseCtx.globalAlpha = 0.45; baseCtx.fillRect(0,0,w,h); baseCtx.restore(); } function heartbeatScale(phase){ let s = 1.0; if(phase < 0.08){ s = 1 + 0.03 * (1 - phase/0.08); } else if(phase < 0.18){ const p = (phase-0.08)/0.10; s = 1 + 0.08 * (1-p); } else { s = 1.0; } return s; } function drawReveal(pulse){ const w = wrap.clientWidth, h = wrap.clientHeight; revealCtx.clearRect(0,0,w,h); if(!revealPattern) return; const cx = (current.x/100)*w; const cy = (current.y/100)*h; revealCtx.save(); revealCtx.translate(cx,cy); revealCtx.scale(pulse,pulse); revealCtx.translate(-cx,-cy); revealCtx.fillStyle = revealPattern; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); const r = radius; const g = revealCtx.createRadialGradient(cx,cy,0,cx,cy,r); const hardStop = Math.max(0,Math.min(1-softness,0.99)); g.addColorStop(0,"rgba(255,0,0,1)"); g.addColorStop(hardStop,"rgba(255,0,0,1)"); g.addColorStop(1,"rgba(255,0,0,0)"); revealCtx.save(); revealCtx.globalCompositeOperation="source-in"; revealCtx.fillStyle = g; revealCtx.fillRect(0,0,w,h); revealCtx.restore(); } // 🔹 Continuous heartbeat loop (for mode = "loop") function loopHeartbeat(time=0){ const cycle = duration; // one beat duration const phase = (time % cycle) / cycle; // 0..1 looping const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); requestAnimationFrame(loopHeartbeat); } // 🔹 One-shot heartbeat (for mode = "click") function playHeartbeat(){ const start = performance.now(); function frame(now){ const elapsed = now - start; const phase = Math.min(elapsed / duration, 1); const pulse = heartbeatScale(phase); current.x += (target.x-current.x)*ease; current.y += (target.y-current.y)*ease; drawReveal(pulse); if (elapsed updateTargetFromEvent(e),{passive:true}); window.addEventListener("pointerleave",()=>{target.x=50; target.y=50; drawReveal(1.0);}); window.addEventListener("resize",()=>resizeCanvases()); if (mode === "click") { document.addEventListener("click", e => { const rect = wrap.getBoundingClientRect(); if ( e.clientX >= rect.left && e.clientX = rect.top && e.clientY <= rect.bottom ) { playHeartbeat(); } }); } })();

Recuperare Posturală
Platformă online

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

  • ✅ Raport personalizat cu detalii clare
  • ✅ Recomandări făcute de experți
  • ✅ Detectează dezechilibrele posturale
  • ✅ Evaluare automată rapidă

ANALIZĂ POSTURALĂ
INTELIGENTĂ PRIN AI

Descoperă rapid și precis starea reală a posturii tale folosind tehnologia noastră avansată de inteligență artificială. Încarcă o singură fotografie și primește imediat recomandări personalizate pentru o postură perfectă.

12 luni

Rapoarte lunare personalizate clare

520

Recomandări făcute de experți

3+

Dezechilibre posturale rezolvate de la prima sedință

5 minute

Evaluare rapidă și raport postural personalizat cu AI

MARIAN

Partener APEX Centrum

DIMA

Antrenor Personal

RADU

Partener APEX Centrum

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

GHIDARE CLARĂ
ȘI SUPORT SPECIALIZAT

Indiferent de nivelul tău, primești ghidaj detaliat și suport direct din partea specialiștilor noștri pentru a executa corect fiecare exercițiu.

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

  • Analiză posturală AI – rezultate precise în câteva secunde
  • Playlist‑uri personalizate – exerciții ce rulează continuu, fără întreruperi, pe orice dispozitiv
  • Ghidare & suport live – consultații 1‑la‑1 și corecții video cu specialiști
  • Sistem de recompense motivant – puncte, insigne și nivele ce îți susțin progresul

INTERFAȚĂ INTERACTIVĂ
PROGRES UȘOR DE URMĂRIT

Transformă recuperarea într-o activitate plăcută și captivantă, acumulând puncte și recompense pentru fiecare pas realizat.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

Audit records ensure transparent payouts at the best paying online casinos in canada featured here.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate

1вин зеркало

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

ANTRENAMENTE PERSONALIZATE
CARE RULEAZĂ AUTOMAT

Bucură-te de antrenamente personalizate la un click distanță și sesiuni intuitive care rulează continuu și fără întreruperi.

0

ANTRENAMENTE CREATE

✔ Automat pe baza analizei posturale

0

EXERCIȚII SUPORT

✔ Fără pauze sau navigări complicate