// Mobile screen building blocks - parent and teacher flows // ─── Status pill ────────────────────────────────────────────── function StatusDot({ tone = 'success', size = 8 }) { const colors = { success: 'var(--gk-success)', warn: 'var(--gk-warn)', danger: 'var(--gk-danger)', neutral: 'var(--gk-stone-300)' }; return ; } // ─── Mobile tab bar ─────────────────────────────────────────── function MobileTabBar({ active, onTab, tabs }) { return (
{tabs.map(t => ( ))}
); } // ─── Parent: Login / OTP screen ─────────────────────────────── function ParentLoginScreen({ step = 'phone' }) { return (

{step === 'phone' ? 'Welcome back' : step === 'otp' ? 'Check your SMS' : 'Set a password'}

{step === 'phone' && 'Enter your school code and phone number to receive a one-time passcode.'} {step === 'otp' && 'We sent a 6-digit code to +91 98765 43210.'} {step === 'pwd' && 'Create a password you\'ll remember — 8+ characters with one symbol.'}

{step === 'phone' && (
)} {step === 'otp' && (
{['4','8','2','6','0','1'].map((d,i)=>(
{i < 5 ? d : '|'}
))}
Didn't receive? Resend in 0:42
)} {step === 'pwd' && (
)}
By continuing you agree to Gurukool's terms & privacy policy.
); } // ─── Parent: Home dashboard ─────────────────────────────────── function ParentHomeScreen({ lang = 'en' }) { const t = (en, hi, gu) => lang === 'hi' ? hi : lang === 'gu' ? gu : en; return (
{/* Header */}
{t('Good morning', 'सुप्रभात', 'સુપ્રભાત')}
{t('Priya Patel', 'प्रिया पटेल', 'પ્રિયા પટેલ')}
{/* Child switcher */}
{[ { n: 'Aanya', g: 'Grade 5A', sel: true }, { n: 'Arjun', g: 'Grade 2B', sel: false }, ].map(c => (
{c.n} {c.g}
))}
{/* Today card */}
{t('Today · Wed 15 Apr', 'आज · बुध 15 अप्रैल', 'આજે · બુધ 15 એપ્રિલ')}
{t('Present', 'उपस्थित', 'હાજર')}
{[ { i: 'book', v: '3', l: t('Homework', 'गृहकार्य', 'ગૃહકાર્ય') }, { i: 'star', v: '5', l: t('Behaviour', 'व्यवहार', 'વર્તન') }, { i: 'focus', v: '35m', l: t('Focus', 'फोकस', 'ફોકસ') }, ].map(s => (
{s.v}
{s.l}
))}
{/* Credits card */}
{t('Level 3 · Achiever', 'स्तर 3 · प्रवीण', 'સ્તર 3 · અચીવર')}
482
{t('credits earned', 'अर्जित क्रेडिट', 'મેળવેલ ક્રેડિટ')}
Achiever {t('118 to Champion', '118 चैंपियन तक', '118 ચૅમ્પિયન સુધી')}
{[ { i: 'trophy', l: t('Attendance Master', 'उपस्थिति मास्टर', 'હાજરી માસ્ટર') }, { i: 'flame', l: t('Homework Hero', 'गृहकार्य हीरो', 'ગૃહકાર્ય હિરો') }, { i: 'sparkles', l: t('Focus Champion', 'फोकस चैंपियन', 'ફોકસ ચૅમ્પિયન') }, ].map(b => (
{b.l}
))}
{/* Pending homework */}

{t('Pending homework', 'लंबित गृहकार्य', 'બાકી ગૃહકાર્ય')}

{t('See all', 'सभी देखें', 'બધું જુઓ')}
{[ { s: 'Math', t: 'Fractions — Ex 3.4 Q1-12', due: 'Tomorrow', urgent: true, color: 195 }, { s: 'English', t: 'Read chapter 7 & summary', due: 'Fri 17', color: 25 }, { s: 'Science', t: 'Leaf collection', due: 'Mon 20', color: 145 }, ].map((h,i) => (
{h.s.slice(0,3).toUpperCase()}
{h.t}
{h.s} · Ms. Rao
{h.due}
))}
{/* Recent notifications */}

{t('Recent activity', 'हाल की गतिविधि', 'તાજેતરની પ્રવૃત્તિ')}

{[ { i: 'star', c: 'lime', t: t('Aanya was marked "Very Good" in Math', 'आन्या को गणित में "बहुत अच्छा" मिला', 'આન્યાને ગણિતમાં "ખૂબ સારું" મળ્યું'), when: '2h ago' }, { i: 'check', c: 'green', t: t('Homework verified · Science', 'गृहकार्य सत्यापित', 'ગૃહકાર્ય ચકાસાયું'), when: '4h ago' }, { i: 'megaphone', c: 'neutral', t: t('Annual sports day · Fri Apr 24', 'वार्षिक खेल दिवस', 'વાર્ષિક રમત દિવસ'), when: 'Yesterday' }, ].map((n, i, arr) => (
{n.t}
{n.when}
))}
); } // ─── Parent: Attendance calendar ────────────────────────────── function ParentAttendanceScreen() { const days = Array.from({ length: 30 }, (_, i) => i + 1); // Stati: P=present, L=late, A=absent, H=holiday, E=excused, '':future const status = { 1: 'P', 2: 'P', 3: 'P', 4: 'P', 5: 'H', 6: 'P', 7: 'P', 8: 'L', 9: 'P', 10: 'P', 11: 'P', 12: 'H', 13: 'P', 14: 'P', 15: 'P', }; const dayLabels = ['M','T','W','T','F','S','S']; return (

Attendance

Aanya · Grade 5A
{/* Big percentage */}
This month · April
94%
13 present · 1 late · 0 absent · 2 holidays
{/* Month selector */}
April 2026
{/* Calendar grid */}
{dayLabels.map((d,i) => (
{d}
))}
{Array(2).fill(0).map((_,i) =>
)} {days.map(d => { const s = status[d]; const tone = s === 'P' ? { bg: 'var(--accent-soft)', fg: 'var(--accent-ink)' } : s === 'L' ? { bg: 'color-mix(in oklch, var(--gk-warn) 20%, transparent)', fg: 'oklch(40% 0.12 75)' } : s === 'A' ? { bg: 'color-mix(in oklch, var(--gk-danger) 18%, transparent)', fg: 'oklch(42% 0.15 25)' } : s === 'H' ? { bg: 'var(--gk-stone-100)', fg: 'var(--text-muted)' } : { bg: 'transparent', fg: 'var(--text-muted)' }; return (
{d} {s && s !== 'H' &&
{s}
}
); })}
{/* Legend */}
{[['P','Present','var(--accent-soft)'],['L','Late','color-mix(in oklch, var(--gk-warn) 20%, transparent)'],['A','Absent','color-mix(in oklch, var(--gk-danger) 18%, transparent)'],['H','Holiday','var(--gk-stone-100)']].map(([c,l,bg]) => (
{l}
))}

Recent

{[ { d: 'Wed, 15 Apr', s: 'Present', tone: 'success', n: '6 of 6 periods' }, { d: 'Tue, 8 Apr', s: 'Late', tone: 'warn', n: 'Arrived at 9:18 AM' }, { d: 'Fri, 5 Apr', s: 'Holiday', tone: 'neutral', n: 'Ram Navami' }, ].map((r,i,a) => (
{r.d}
{r.n}
{r.s}
))}
); } // ─── Parent: Homework list ──────────────────────────────────── function ParentHomeworkScreen() { return (

Homework

{['All · 12', 'Pending · 3', 'Completed · 8', 'Late · 1'].map((l,i) => (
{l}
))}
{[ { s: 'Math', t: 'Fractions — Ex 3.4 Q1-12', teach: 'Ms. Kavita Rao', due: 'Tomorrow', urgent: true, color: 195, desc: 'Complete questions 1–12 from exercise 3.4. Show working.', atts: 2, status: 'pending' }, { s: 'English', t: 'Read chapter 7 & write summary', teach: 'Mr. A. Mehta', due: 'Fri, 17 Apr', color: 25, desc: '5-sentence summary in your own words.', atts: 0, status: 'pending' }, { s: 'Science', t: 'Leaf collection — 5 varieties', teach: 'Mrs. S. Desai', due: 'Mon, 20 Apr', color: 145, desc: 'Collect 5 different leaves, label each with name and family.', atts: 1, status: 'pending' }, { s: 'Hindi', t: 'अध्याय 4 — प्रश्न उत्तर', teach: 'Mr. R. Sharma', due: 'Yesterday', color: 55, status: 'completed' }, { s: 'Math', t: 'Worksheet 3.3 review', teach: 'Ms. Kavita Rao', due: '12 Apr', color: 195, status: 'verified', credits: 5 }, ].map((h,i) => (
{h.s.slice(0,3).toUpperCase()}
{h.t}
{h.status === 'pending' && {h.due}} {h.status === 'completed' && Done} {h.status === 'verified' && +{h.credits}}
{h.s} · {h.teach}
{h.desc &&
{h.desc}
} {(h.atts || h.status === 'pending') && (
{h.atts > 0 && (
{h.atts} files
)} {h.status === 'pending' && ( )}
)}
))}
); } // ─── Teacher: Timetable today ───────────────────────────────── function TeacherTimetableScreen() { const periods = [ { t: '9:00', end: '9:45', sub: 'Mathematics', sec: 'Grade 5A', room: 'Room 201', status: 'done', students: 28 }, { t: '9:45', end: '10:30', sub: 'Mathematics', sec: 'Grade 5B', room: 'Room 202', status: 'done', students: 26 }, { t: '10:30', end: '10:45', sub: '— Break —', break: true }, { t: '10:45', end: '11:30', sub: 'Mathematics', sec: 'Grade 6A', room: 'Room 301', status: 'now', students: 30 }, { t: '11:30', end: '12:15', sub: 'Mathematics', sec: 'Grade 6B', room: 'Room 302', status: 'upcoming', students: 29 }, { t: '12:15', end: '1:00', sub: 'Substitute: Sci', sec: 'Grade 7A', room: 'Room 401', status: 'upcoming', students: 27, sub_note: 'Covering Ms. Desai' }, { t: '1:00', end: '1:45', sub: '— Lunch —', break: true }, { t: '1:45', end: '2:30', sub: 'Mathematics', sec: 'Grade 5A', room: 'Room 201', status: 'upcoming', students: 28 }, ]; return (
Wednesday, 15 April

Today

6 periods
2 done
{/* time rail */}
{periods.map((p,i) => { if (p.break) { return (
{p.sub} · {p.t}–{p.end}
); } const tone = p.status === 'done' ? { bg: 'var(--surface)', br: 'var(--border)', dot: 'var(--gk-stone-300)', fg: 'var(--text-muted)' } : p.status === 'now' ? { bg: 'var(--accent)', br: 'var(--accent)', dot: '#fff', fg: '#fff' } : { bg: 'var(--surface)', br: 'var(--border)', dot: 'var(--accent)', fg: 'var(--text)' }; return (
{p.t}
{p.end}
{p.sub}
{p.sec} · {p.room} · {p.students} students
{p.sub_note && (
{p.sub_note}
)}
{p.status === 'now' && (
Now
)} {p.status === 'done' && }
); })}
); } // ─── Teacher: Attendance marking ────────────────────────────── function TeacherAttendanceScreen() { const students = [ { n: 'Aanya Patel', gr: '142', s: 'P' }, { n: 'Arnav Sharma', gr: '143', s: 'P' }, { n: 'Diya Krishnan', gr: '144', s: 'P' }, { n: 'Ishaan Mehta', gr: '145', s: 'L' }, { n: 'Kavya Iyer', gr: '146', s: 'P' }, { n: 'Manav Patel', gr: '147', s: 'A' }, { n: 'Nisha Rao', gr: '148', s: 'P' }, { n: 'Rahul Shah', gr: '149', s: 'P' }, { n: 'Riya Desai', gr: '150', s: 'E' }, { n: 'Samar Gupta', gr: '151', s: 'P' }, { n: 'Tara Menon', gr: '152', s: 'P' }, { n: 'Veer Kulkarni', gr: '153', s: null }, ]; const btn = (s, active, onClick) => { const tones = { P: { bg: 'var(--gk-success)', bg_soft: 'color-mix(in oklch, var(--gk-success) 15%, transparent)', fg: 'oklch(38% 0.13 145)' }, L: { bg: 'var(--gk-warn)', bg_soft: 'color-mix(in oklch, var(--gk-warn) 22%, transparent)', fg: 'oklch(40% 0.12 75)' }, A: { bg: 'var(--gk-danger)', bg_soft: 'color-mix(in oklch, var(--gk-danger) 15%, transparent)', fg: 'oklch(42% 0.15 25)' }, E: { bg: 'var(--text-muted)', bg_soft: 'var(--gk-stone-100)', fg: 'var(--text-soft)' }, }[s]; return (
{s}
); }; return (
Mathematics · Period 3

Grade 6A · Attendance

Wed 15 Apr
10:45 AM
{/* Summary + bulk */}
P · 9 L · 1 A · 1 E · 1
{/* Legend */}
Tap to toggle · P Present L Late A Absent E Excused
{/* List */}
{students.map((st,i,a) => (
{st.n}
GR-{st.gr}
{['P','L','A','E'].map(code => {btn(code, st.s === code)})}
))}
{/* Fixed save bar */}
1 student unmarked
); } // ─── Teacher: Homework creation ─────────────────────────────── function TeacherHomeworkCreateScreen() { return (

New homework

{/* Scope */}
Assign to
{[ { l: 'Grade 5A · Math', sel: true }, { l: 'Grade 5B · Math', sel: true }, { l: 'Grade 6A · Math', sel: false }, { l: 'Grade 6B · Math', sel: false }, ].map((c,i) => (
{c.sel && } {c.l}
))}
{/* Description */}