diff --git a/frontend/dashboard.html b/frontend/dashboard.html index b38d109..ea3ec54 100644 --- a/frontend/dashboard.html +++ b/frontend/dashboard.html @@ -3261,6 +3261,41 @@ document.getElementById('hc-lab-meta').textContent = 'Освой: ' + lab.goal; } + /* ══ HERO: Pet (synced with /pet module via /api/pet + PetSprite) ═ */ + async function loadPetHero() { + const card = document.getElementById('hc-pet'); + if (!card) return; + let d; + try { d = await LS.api('/api/pet'); } + catch { card.style.display = 'none'; return; } // фича питомца выключена + if (!d) { card.style.display = 'none'; return; } + + // Sprite — единый рендер из pet-sprite.js (как на /pet) + const art = document.getElementById('hc-pet-art'); + if (art && window.PetSprite) { + art.innerHTML = PetSprite.render(d.petLevel || 1, d.mood || 'neutral', d.accessories || [], d.petColor || 'purple', d.streakCurrent || 0); + } + document.getElementById('hc-pet-name').textContent = d.petName || 'Квантик'; + document.getElementById('hc-pet-lvl').textContent = d.petLevel || 1; + + // XP до следующего уровня питомца + const cur = d.xpForCurrLevel || 0; + const next = d.xpForNextLevel; // null = макс + const have = Math.max(0, (d.xp || 0) - cur); + const need = next != null ? Math.max(1, next - cur) : have; + const pct = next != null ? Math.min(100, Math.round(have / need * 100)) : 100; + document.getElementById('hc-pet-xp').textContent = have; + document.getElementById('hc-pet-xpmax').textContent = next != null ? need : '—'; + document.getElementById('hc-pet-prog').style.width = pct + '%'; + + // Стрик / цель дня / настроение + document.getElementById('hc-pet-streak').textContent = d.streakCurrent || 0; + const quests = d.quests || []; + const doneCnt = quests.filter(q => q.done).length; + document.getElementById('hc-pet-goal').textContent = quests.length ? `${doneCnt}/${quests.length}` : '—'; + document.getElementById('hc-pet-mood').textContent = window.PetSprite ? PetSprite.moodLabel(d.mood) : (d.mood || 'бодр'); + } + /* ══ ACTIVITY: data structure ══════════════════════════════════════ */ let _activityRows = []; // raw history rows let _hmScale = 12; // weeks to show