// Dashboard / Home screen.
// Three composition variants controlled by the `variant` prop:
// "classic" — KPI row + activity + side rail
// "focused" — Today-first hero (next live session, top tasks) + KPIs below
// "studio" — left = courses, right = students/inbox; KPIs as compact strip
function Sparkline({ data, color = 'var(--accent)' }) {
const w = 120, h = 32, p = 2;
const min = Math.min(...data), max = Math.max(...data);
const span = Math.max(1, max - min);
const pts = data.map((v, i) => {
const x = p + (i * (w - p * 2)) / (data.length - 1);
const y = h - p - ((v - min) / span) * (h - p * 2);
return [x, y];
});
const d = pts.map((pt, i) => (i === 0 ? `M${pt[0]},${pt[1]}` : `L${pt[0]},${pt[1]}`)).join(' ');
const area = d + ` L${w - p},${h - p} L${p},${h - p} Z`;
return (
);
}
function KPI({ k, compact }) {
return (
{k.label}
{k.value}
{k.unit}
{k.delta}
);
}
function ActivityFeed() {
const { ACTIVITY } = window.DATA;
const iconFor = { lesson: 'check', chat: 'chat', cert: 'cert', sale: 'star', quiz: 'quiz' };
return (
فعالیت اخیر دانشجویان
{ACTIVITY.map(a => (
{a.who.split(' ').map(s=>s[0]).join('').slice(0,2)}
{a.who}
· {a.did}
{a.course} · {a.t}
))}
);
}
function NextLiveCard({ hero }) {
const { LIVE } = window.DATA;
const next = LIVE[0];
return (
جلسه زندهی بعدی
{next.at}
{next.title}
{next.course}
{['#e8a07a','#7aa6c4','#a8c47a'].map((c,i) => (
))}
{next.registered} ثبتنام
);
}
function TodayCard() {
const items = [
{ ic: 'check', t: 'پاسخ به ۳ پرسش جدید در گفتوگوی دوره', done: false },
{ ic: 'edit', t: 'ویرایش درس «گرید و سیستم لیاوت»', done: false },
{ ic: 'send', t: 'ارسال پیام خوشآمد به ۱۲ دانشجوی جدید', done: true },
{ ic: 'star', t: 'مرور تمرینهای ارسالشده فصل دوم', done: false },
];
return (
کارهای امروز
۳ از ۴ باقیمانده
{items.map((it, i) => (
))}
);
}
function CoursesMini() {
const { COURSES } = window.DATA;
return (
دورههای من
{COURSES.map((c, i) => (
{c.title}
{c.status === 'draft'
? `پیشنویس · ${c.progress}٪ آماده`
: `${c.students} دانشجو · ⭐ ${c.rating}`}
{c.status === 'draft'
?
پیشنویس
:
منتشر شده}
))}
);
}
function InboxMini() {
const { INBOX } = window.DATA;
return (
پیامهای اخیر
۳ خواندهنشده
{INBOX.map((m, i) => (
{m.name.split(' ').map(s=>s[0]).join('').slice(0,2)}
{m.unread &&
}
))}
);
}
function RevenueChart() {
const months = ['فر', 'ار', 'خر', 'تی', 'مر', 'شه', 'مه', 'آب', 'آذ', 'دی', 'به', 'اس'];
const vals = [8, 11, 14, 12, 16, 18, 22, 20, 24, 26, 25, 28];
const max = Math.max(...vals);
return (
درآمد ماهانه
۱۲ ماه گذشته · میلیون تومان
{vals.map((v, i) => (
))}
);
}
function GreetingHero() {
return (
سلام آرش 👋
امروز ۲۴ نفر در دورههایت در حال یادگیریاند
);
}
function HomeScreen({ variant = 'classic' }) {
const { KPIS } = window.DATA;
if (variant === 'focused') {
return (
);
}
if (variant === 'studio') {
return (
);
}
// classic
return (
);
}
window.HomeScreen = HomeScreen;