root = Card([header, filterCard, kpiCard, engagementCard, coursesCard, riskCard], "card", "column", "l")
header = CardHeader("Training Analytics", "Q3 cohort performance")
filterCard = Card([filterHeader, filterForm], "sunk")
filterHeader = CardHeader("Cohort filter")
filterForm = Form("cohort-filter", filterButtons, [cohortField])
cohortField = FormControl("Cohort", cohortSelect)
cohortSelect = Select("cohort", [cohortQ1, cohortQ2, cohortQ3, cohortQ4], "All cohorts")
cohortQ1 = SelectItem("q1-2025", "Q1 2025")
cohortQ2 = SelectItem("q2-2025", "Q2 2025")
cohortQ3 = SelectItem("q3-2025", "Q3 2025")
cohortQ4 = SelectItem("q4-2025", "Q4 2025")
filterButtons = Buttons([applyBtn, messageBtn])
applyBtn = Button("Apply")
messageBtn = Button("Message cohort", null, "primary")
kpiCard = Card([kpiHeader, kpiTable], "sunk")
kpiHeader = CardHeader("Key metrics")
kpiTable = Table([kpiMetric, kpiValue])
kpiMetric = Col("Metric", ["Active learners this week", "Course completion rate", "Average quiz score"])
kpiValue = Col("Value", ["1,284", "78%", "86%"])
engagementCard = Card([engagementHeader, engagementChart], "sunk")
engagementHeader = CardHeader("Engagement", "Active learners across the past 8 weeks")
engagementChart = LineChart(["8 wks ago", "7 wks ago", "6 wks ago", "5 wks ago", "4 wks ago", "3 wks ago", "2 wks ago", "This week"], [engagementSeries], "natural", "Week", "Active learners")
engagementSeries = Series("Active learners", [720, 810, 890, 950, 1020, 1140, 1210, 1284])
coursesCard = Card([coursesHeader, coursesChart], "sunk")
coursesHeader = CardHeader("Courses ranked by enrollment")
coursesChart = HorizontalBarChart(["Intro to Python", "Data Science Bootcamp", "Cloud Fundamentals", "UX Design Basics", "SQL for Analysts"], [enrollmentSeries], "grouped", "Enrollments", "Course")
enrollmentSeries = Series("Enrolled", [450, 380, 320, 210, 175])
riskCard = Card([riskHeader, riskList], "sunk")
riskHeader = CardHeader("Learners at risk", "Low activity in the last 14 days")
riskList = ListBlock([risk1, risk2, risk3], "number")
risk1 = ListItem("Alex Chen", "3 lessons behind · last active 9 days ago")
risk2 = ListItem("Jordan Lee", "No quiz attempts · last active 12 days ago")
risk3 = ListItem("Sam Rivera", "Completion at 31% · last active 7 days ago")