diff --git a/frontend/dashboard.html b/frontend/dashboard.html index b5e796c..e240bdb 100644 --- a/frontend/dashboard.html +++ b/frontend/dashboard.html @@ -3201,23 +3201,73 @@ } /* ══ HERO: Reading card (continue or start) ══════════════════════ */ + // Градиент-обложка карточки чтения по предмету (как обложки учебников) + const SUBJ_GRADIENT = { + chemistry:'linear-gradient(135deg,#d9742a 0%,#b3531a 100%)', + physics:'linear-gradient(135deg,#3b6fd4 0%,#26408a 100%)', + biology:'linear-gradient(135deg,#2fa86a 0%,#1c6e44 100%)', + math:'linear-gradient(135deg,#7a5cf0 0%,#4b32b3 100%)', + informatics:'linear-gradient(135deg,#0f9aa8 0%,#0a6470 100%)', + english:'linear-gradient(135deg,#e0557f 0%,#a82f57 100%)', + russian:'linear-gradient(135deg,#d64545 0%,#8a2626 100%)', + belarus:'linear-gradient(135deg,#d64545 0%,#8a2626 100%)', + history:'linear-gradient(135deg,#b5862a 0%,#7a571a 100%)', + geography:'linear-gradient(135deg,#2f9aa8 0%,#1c6470 100%)', + astronomy:'linear-gradient(135deg,#5a4fd4 0%,#2e2680 100%)', + social:'linear-gradient(135deg,#c2682a 0%,#8a4519 100%)', + }; + function _renderReadCard(o) { + const card = document.getElementById('hc-read'); + if (!card) return; + if (o.href) card.href = o.href; + if (SUBJ_GRADIENT[o.slug]) card.style.background = SUBJ_GRADIENT[o.slug]; + document.getElementById('hc-read-tag').textContent = o.tag; + document.getElementById('hc-read-title').textContent = o.title; + document.getElementById('hc-read-sub').textContent = o.sub || ''; + document.getElementById('hc-read-meta').textContent = o.meta || ''; + const pw = document.getElementById('hc-read-prog-wrap'); + const pe = document.getElementById('hc-read-pct'); + if (o.showProg) { + if (pw) { pw.style.display = ''; document.getElementById('hc-read-prog').style.width = (o.pct || 0) + '%'; } + if (pe) { pe.style.display = ''; pe.textContent = (o.pct || 0) + '%'; } + } else { + if (pw) pw.style.display = 'none'; + if (pe) pe.style.display = 'none'; + } + } async function loadContinueWidget() { const card = document.getElementById('hc-read'); if (!card) return; try { const data = await LS.api('/api/courses/continue'); - if (!data || !data.courseId) return; // оставляем дефолт «Начать чтение → Учебники» - const pct = data.lessonCount > 0 ? Math.round((data.doneCount || 0) / data.lessonCount * 100) : 0; - card.href = `/lesson?course=${data.courseId}&lesson=${data.lessonId}`; - document.getElementById('hc-read-tag').textContent = 'Продолжить чтение'; - document.getElementById('hc-read-title').textContent = data.courseTitle || 'Продолжить'; - document.getElementById('hc-read-sub').textContent = data.lessonTitle || ''; - document.getElementById('hc-read-meta').textContent = `${data.doneCount || 0} / ${data.lessonCount || 0} уроков`; - const progWrap = document.getElementById('hc-read-prog-wrap'); - if (progWrap) { progWrap.style.display = ''; document.getElementById('hc-read-prog').style.width = pct + '%'; } - const pctEl = document.getElementById('hc-read-pct'); - if (pctEl) { pctEl.style.display = ''; pctEl.textContent = pct + '%'; } - } catch { /* нет курса в процессе — карточка остаётся в дефолте */ } + if (data && data.courseId) { + const pct = data.lessonCount > 0 ? Math.round((data.doneCount || 0) / data.lessonCount * 100) : 0; + _renderReadCard({ + tag: 'Продолжить чтение', + href: `/lesson?course=${data.courseId}&lesson=${data.lessonId}`, + title: data.courseTitle || 'Продолжить', + sub: data.lessonTitle || '', + meta: `${data.doneCount || 0} / ${data.lessonCount || 0} уроков`, + slug: data.subjectSlug, pct, showProg: true, + }); + return; + } + } catch { /* нет прогресса — покажем рекомендованный учебник */ } + try { + const courses = await LS.api('/api/courses'); + if (Array.isArray(courses) && courses.length) { + const c = courses[0]; + const cnt = c.lesson_count || 0; + _renderReadCard({ + tag: 'Начать чтение', + href: `/course?id=${c.id}`, + title: c.title || 'Учебник', + sub: c.description || 'Открой учебник и начни курс.', + meta: cnt ? `${cnt} § · новый учебник` : 'новый учебник', + slug: c.subject_slug, pct: 0, showProg: false, + }); + } + } catch { /* дефолт «Учебники» */ } } /* ══ HERO: Lab of the day (deterministic daily pick) ═════════════ */