// 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 (
{/* Big percentage */}
This month · April
94%
13 present · 1 late · 0 absent · 2 holidays
{/* Month selector */}
{/* 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]) => (
))}
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) => (
))}
);
}
// ─── 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' && (
Mark done
)}
)}
))}
);
}
// ─── 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 (
{/* time rail */}
{periods.map((p,i) => {
if (p.break) {
return (
);
}
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.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
{/* Summary + bulk */}
P · 9
L · 1
A · 1
E · 1
Mark all P
{/* Legend */}
Tap to toggle
·
P Present
L Late
A Absent
E Excused
{/* List */}
{students.map((st,i,a) => (
{['P','L','A','E'].map(code => {btn(code, st.s === code)} )}
))}
{/* Fixed save bar */}
1 student unmarked
Save
Save & notify
);
}
// ─── Teacher: Homework creation ───────────────────────────────
function TeacherHomeworkCreateScreen() {
return (
New homework
Save draft
{/* 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 */}
Description
Visible to parents as-is
{/* Due + attachments */}
Add attachments
Images or PDF · max 3 files · 10 MB each
{[{ n: 'worksheet.pdf', sz: '2.1 MB' }, { n: 'example.png', sz: '450 KB' }].map(a => (
))}
{/* Notify toggle */}
Notify parents now
~54 parents across 2 sections
Publish homework
);
}
Object.assign(window, {
StatusDot, MobileTabBar,
ParentLoginScreen, ParentHomeScreen, ParentAttendanceScreen, ParentHomeworkScreen,
TeacherTimetableScreen, TeacherAttendanceScreen, TeacherHomeworkCreateScreen,
});