root = Card([header, kpiRow, deptFilter, sections, courseApprovalForm, messageForm])
header = CardHeader("University Administrator Dashboard", "Fall 2026 · Real-time institutional overview")
kpiRow = SnippetCardBlock([kpiEnrollment, kpiAcceptance, kpiTuition, kpiHousing], "grid", true)
kpiEnrollment = SnippetCardItem("total-enrollment", kpiEnrollmentLhs, kpiEnrollmentRhs)
kpiEnrollmentLhs = IconText(kpiEnrollmentIcon, "neutral", "m", "Total Enrollment", "Fall 2026 census", false, "horizontal")
kpiEnrollmentIcon = Icon("users", "people")
kpiEnrollmentRhs = BoldText("number", "24,847", "+3.2%", "metric")
kpiAcceptance = SnippetCardItem("acceptance-rate", kpiAcceptanceLhs, kpiAcceptanceRhs)
kpiAcceptanceLhs = IconText(kpiAcceptanceIcon, "neutral", "m", "Acceptance Rate", "Fall 2026 cycle", false, "horizontal")
kpiAcceptanceIcon = Icon("check-circle", "shapes")
kpiAcceptanceRhs = BoldText("number", "18.7%", "-1.4%", "metric")
kpiTuition = SnippetCardItem("tuition-revenue", kpiTuitionLhs, kpiTuitionRhs)
kpiTuitionLhs = IconText(kpiTuitionIcon, "neutral", "m", "Tuition Revenue (FY26)", "Year-to-date", false, "horizontal")
kpiTuitionIcon = Icon("circle-dollar-sign", "finance")
kpiTuitionRhs = BoldText("number", "$384.2M", "+5.8%", "metric")
kpiHousing = SnippetCardItem("housing-occupancy", kpiHousingLhs, kpiHousingRhs)
kpiHousingLhs = IconText(kpiHousingIcon, "neutral", "m", "Housing Occupancy", "Fall 2026 move-in", false, "horizontal")
kpiHousingIcon = Icon("home", "home")
kpiHousingRhs = BoldText("number", "94.3%", "+2.1%", "metric")
deptFilter = FormControl("Focus Department", deptSelect, "Filter all views below to a specific department")
deptSelect = Select("department-filter", deptOptions, "All Departments", {})
deptOptions = [optAll, optCS, optBio, optEng, optBus, optPsych, optEcon, optArt, optChem, optPhys]
optAll = SelectItem("all", "All Departments")
optCS = SelectItem("cs", "Computer Science")
optBio = SelectItem("bio", "Biology")
optEng = SelectItem("eng", "Engineering")
optBus = SelectItem("bus", "Business")
optPsych = SelectItem("psych", "Psychology")
optEcon = SelectItem("econ", "Economics")
optArt = SelectItem("art", "Arts & Humanities")
optChem = SelectItem("chem", "Chemistry")
optPhys = SelectItem("phys", "Physics")
sections = SectionBlock([secEnrollment, secApplications, secCourses, secRisk, secHousingEvents, secAlumni, secWaitlist], false)
secEnrollment = SectionItem("enrollment", "Enrollment Trends (5 Years)", [enrollmentChart, enrollmentTable])
enrollmentChart = LineChart(enrollmentYears, [enrollmentTotal, enrollmentUG, enrollmentGrad], "natural", "Academic Year", "Students")
enrollmentYears = ["2022-23", "2023-24", "2024-25", "2025-26", "2026-27"]
enrollmentTotal = Series("Total", [22100, 22850, 23400, 24080, 24847])
enrollmentUG = Series("Undergraduate", [16800, 17300, 17650, 18100, 18620])
enrollmentGrad = Series("Graduate", [5300, 5550, 5750, 5980, 6227])
enrollmentTable = Table([colEnrYear, colEnrTotal, colEnrUG, colEnrGrad, colEnrYoy])
colEnrYear = Col("Year", enrollmentYears, "string")
colEnrTotal = Col("Total", [22100, 22850, 23400, 24080, 24847], "number")
colEnrUG = Col("Undergrad", [16800, 17300, 17650, 18100, 18620], "number")
colEnrGrad = Col("Graduate", [5300, 5550, 5750, 5980, 6227], "number")
colEnrYoy = Col("YoY %", ["—", "+3.4%", "+2.4%", "+2.9%", "+3.2%"], "string")
secApplications = SectionItem("applications", "Applications & Acceptance by Program", [appsChart, appsTable])
appsChart = HorizontalBarChart(programNames, [appsSeries, admittedSeries, enrolledSeries], "grouped", "Count", "Program")
programNames = ["Computer Science", "Engineering", "Business", "Biology", "Psychology", "Economics", "Arts & Humanities", "Chemistry", "Physics"]
appsSeries = Series("Applications", [4820, 3950, 3210, 2870, 2450, 1980, 1650, 1120, 890])
admittedSeries = Series("Admitted", [890, 720, 610, 540, 480, 380, 310, 210, 165])
enrolledSeries = Series("Enrolled", [445, 360, 305, 270, 240, 190, 155, 105, 82])
appsTable = Table([colProg, colApps, colAdmit, colEnroll, colAcceptRate, colYield])
colProg = Col("Program", programNames, "string")
colApps = Col("Applications", [4820, 3950, 3210, 2870, 2450, 1980, 1650, 1120, 890], "number")
colAdmit = Col("Admitted", [890, 720, 610, 540, 480, 380, 310, 210, 165], "number")
colEnroll = Col("Enrolled", [445, 360, 305, 270, 240, 190, 155, 105, 82], "number")
colAcceptRate = Col("Accept Rate", ["18.5%", "18.2%", "19.0%", "18.8%", "19.6%", "19.2%", "18.8%", "18.8%", "18.5%"], "string")
colYield = Col("Yield", ["50.0%", "50.0%", "50.0%", "50.0%", "50.0%", "50.0%", "50.0%", "50.0%", "49.7%"], "string")
secCourses = SectionItem("courses", "Course Capacity & Teaching Load", [capacityChart, teachingLoadTable])
capacityChart = HorizontalBarChart(courseNames, [fillSeries], "grouped", "Fill %", "Course Offering")
courseNames = ["CS101 Intro Programming", "ENG201 Thermodynamics", "BUS301 Finance", "BIO201 Genetics", "PSY101 Psychology", "ECON201 Microeconomics", "ART101 Art History", "CHEM201 Organic Chem", "PHYS201 Mechanics", "MATH201 Calculus II"]
fillSeries = Series("Fill Rate", [98, 87, 92, 95, 78, 84, 71, 89, 93, 86])
teachingLoadTable = Table([colFaculty, colDept, colCourses, colStudents, colContactHrs, colLoad])
colFaculty = Col("Faculty", ["Dr. Chen", "Prof. Rodriguez", "Dr. Patel", "Prof. Kim", "Dr. Williams", "Dr. Gupta", "Prof. Martinez", "Dr. Thompson", "Dr. Lee", "Prof. Anderson"], "string")
colDept = Col("Department", ["CS", "ENG", "BUS", "BIO", "PSY", "ECON", "ART", "CHEM", "PHYS", "MATH"], "string")
colCourses = Col("Courses", [3, 2, 3, 2, 3, 2, 2, 3, 2, 3], "number")
colStudents = Col("Total Students", [142, 98, 156, 87, 134, 112, 78, 105, 94, 128], "number")
colContactHrs = Col("Contact Hrs/Wk", [9, 6, 9, 6, 9, 6, 6, 9, 6, 9], "number")
colLoad = Col("Load Index", [1.2, 0.9, 1.3, 0.8, 1.1, 1.0, 0.7, 1.1, 0.9, 1.2], "number")
secRisk = SectionItem("risk", "Academic Risk & Scholarships", [riskCards, scholarshipCard])
riskCards = OverviewCardBlock([risk1, risk2, risk3, risk4], "grid", true)
risk1 = OverviewCardItem("probation", risk1Top, risk1Metric)
risk1Top = IconText(risk1Icon, "warning", "m", "Academic Probation", "GPA < 2.0", false, "vertical")
risk1Icon = Icon("alert-triangle", "shapes")
risk1Metric = MetricIndicatorInline("1,247", "students", { direction: "up", value: 4.2 })
risk2 = OverviewCardItem("early-alert", risk2Top, risk2Metric)
risk2Top = IconText(risk2Icon, "info", "m", "Early Alert Flags", "Faculty referrals", false, "vertical")
risk2Icon = Icon("flag", "shapes")
risk2Metric = MetricIndicatorInline("389", "active cases", { direction: "down", value: 8.1 })
risk3 = OverviewCardItem("at-risk-finaid", risk3Top, risk3Metric)
risk3Top = IconText(risk3Icon, "danger", "m", "At Risk + Fin Aid", "Probation & aid loss risk", false, "vertical")
risk3Icon = Icon("user-x", "people")
risk3Metric = MetricIndicatorInline("214", "students", { direction: "up", value: 12.5 })
risk4 = OverviewCardItem("retention-risk", risk4Top, risk4Metric)
risk4Top = IconText(risk4Icon, "neutral", "m", "1st-Year Retention Risk", "Predicted non-return", false, "vertical")
risk4Icon = Icon("trending-down", "charts")
risk4Metric = MetricIndicatorInline("8.7%", "of cohort", { direction: "down", value: 0.6 })
scholarshipCard = ContextCardBlock([schol1, schol2], "grid", true)
schol1 = ContextCardItem("schol-used", "Scholarship Budget Used", "$28.4M of $35.0M allocated (81.1%)", "gray")
schol2 = ContextCardItem("schol-remaining", "Remaining Unallocated", "$6.6M available for spring adjustments", "gray")
secHousingEvents = SectionItem("housing-events", "Housing & Campus Events", [housingChart, eventsList])
housingChart = BarChart(housingTerms, [housingOccupied, housingCapacity], "grouped", "Term", "Beds")
housingTerms = ["Fall 2024", "Spring 2025", "Fall 2025", "Spring 2026", "Fall 2026"]
housingOccupied = Series("Occupied", [6820, 6650, 7100, 6920, 7340])
housingCapacity = Series("Capacity", [7200, 7200, 7500, 7500, 7780])
eventsList = ListBlock(eventItems, "number", "default")
eventItems = [evt1, evt2, evt3, evt4, evt5, evt6, evt7, evt8]
evt1 = ListItem("Fall Career Fair", "Sep 15 · 10am-4pm · Rec Center · 120+ employers", null, null, { type: "continue_conversation", context: "Show details for Fall Career Fair" })
evt2 = ListItem("Homecoming Weekend", "Oct 3-5 · Alumni events, football, reunions", null, null, { type: "continue_conversation", context: "Show details for Homecoming Weekend" })
evt3 = ListItem("Research Symposium", "Oct 22 · Student poster sessions · Library Atrium", null, null, { type: "continue_conversation", context: "Show details for Research Symposium" })
evt4 = ListItem("Mental Health Awareness Week", "Nov 10-14 · Workshops, counseling open houses", null, null, { type: "continue_conversation", context: "Show details for Mental Health Awareness Week" })
evt5 = ListItem("International Festival", "Nov 21 · Cultural performances, food, global orgs", null, null, { type: "continue_conversation", context: "Show details for International Festival" })
evt6 = ListItem("Finals Stress Relief", "Dec 9-13 · Therapy dogs, midnight breakfast, study breaks", null, null, { type: "continue_conversation", context: "Show details for Finals Stress Relief" })
evt7 = ListItem("Winter Commencement", "Dec 19 · 10am & 2pm ceremonies · Arena", null, null, { type: "continue_conversation", context: "Show details for Winter Commencement" })
evt8 = ListItem("Board of Trustees Meeting", "Dec 12 · Closed session · Admin Building", null, null, { type: "continue_conversation", context: "Show details for Board of Trustees Meeting" })
secAlumni = SectionItem("alumni", "Alumni Giving (4 Years)", [alumniChart, alumniTable])
alumniChart = BarChart(alumniYears, [alumniDonors, alumniDollars], "grouped", "Fiscal Year", "Count / $M")
alumniYears = ["FY2023", "FY2024", "FY2025", "FY2026"]
alumniDonors = Series("Donors", [12450, 13100, 13850, 14620])
alumniDollars = Series("Dollars ($M)", [28.4, 31.2, 34.7, 38.9])
alumniTable = Table([colAyYear, colAyDonors, colAyDollars, colAyAvg, colAyPartRate])
colAyYear = Col("Year", alumniYears, "string")
colAyDonors = Col("Donors", [12450, 13100, 13850, 14620], "number")
colAyDollars = Col("Total ($M)", [28.4, 31.2, 34.7, 38.9], "number")
colAyAvg = Col("Avg Gift", ["$2,281", "$2,382", "$2,505", "$2,661"], "string")
colAyPartRate = Col("Participation", ["14.2%", "14.8%", "15.4%", "16.1%"], "string")
secWaitlist = SectionItem("waitlist", "Waitlisted Students by Program", [waitlistTable])
waitlistTable = Table([colWlProg, colWlCount, colWlCapacity, colWlPct, colWlAction])
colWlProg = Col("Program", ["Computer Science", "Engineering", "Business", "Biology", "Psychology", "Economics", "Arts & Humanities", "Chemistry", "Physics"], "string")
colWlCount = Col("Waitlisted", [340, 210, 156, 134, 98, 72, 54, 38, 29], "number")
colWlCapacity = Col("Seats Available", [12, 8, 15, 10, 22, 18, 30, 14, 11], "number")
colWlPct = Col("Waitlist/Seat", ["28.3x", "26.3x", "10.4x", "13.4x", "4.5x", "4.0x", "1.8x", "2.7x", "2.6x"], "string")
colWlAction = Col("Action", ["Review", "Review", "Review", "Review", "Review", "Review", "Review", "Review", "Review"], "string")
courseApprovalForm = Form("course-approval", courseApprovalButtons, [fcCourseTitle, fcCourseDept, fcCourseCredits, fcCourseDesc, fcCoursePrereq, fcCourseInstructor, fcCourseSchedule, fcCourseCapacity, fcCourseJustification])
courseApprovalButtons = Buttons([btnApproveCourse, btnSaveDraft], "row")
btnApproveCourse = Button("Submit for Approval", { type: "continue_conversation", context: "Submit new course proposal for approval workflow" }, "primary")
btnSaveDraft = Button("Save as Draft", { type: "continue_conversation", context: "Save course proposal as draft" }, "secondary")
fcCourseTitle = FormControl("Course Title", courseTitleInput, "e.g. CS 498: Advanced Machine Learning Systems")
courseTitleInput = Input("course-title", "Course title and number", "text", { required: true, maxLength: 100 })
fcCourseDept = FormControl("Department", courseDeptSelect, "Select the offering department")
courseDeptSelect = Select("course-dept", deptOptions, "Select department", { required: true })
fcCourseCredits = FormControl("Credits", courseCreditsSelect, "Credit hours")
courseCreditsSelect = Select("course-credits", creditOptions, "Select credits", { required: true })
creditOptions = [cr1, cr2, cr3, cr4]
cr1 = SelectItem("1", "1 Credit")
cr2 = SelectItem("2", "2 Credits")
cr3 = SelectItem("3", "3 Credits")
cr4 = SelectItem("4", "4 Credits")
fcCourseDesc = FormControl("Description", courseDescArea, "Catalog description (max 500 chars)")
courseDescArea = TextArea("course-description", "Course description for catalog", 4, { required: true, maxLength: 500 })
fcCoursePrereq = FormControl("Prerequisites", coursePrereqInput, "Comma-separated course codes (e.g. CS 201, MATH 201)")
coursePrereqInput = Input("course-prereqs", "Prerequisite courses", "text", { maxLength: 200 })
fcCourseInstructor = FormControl("Proposed Instructor", courseInstructorInput, "Faculty member who will teach")
courseInstructorInput = Input("course-instructor", "Instructor name", "text", { required: true, maxLength: 100 })
fcCourseSchedule = FormControl("Schedule", courseScheduleSelect, "Meeting pattern")
courseScheduleSelect = Select("course-schedule", scheduleOptions, "Select schedule", { required: true })
scheduleOptions = [sch1, sch2, sch3, sch4, sch5]
sch1 = SelectItem("mwf-10", "MWF 10:00-10:50 AM")
sch2 = SelectItem("mwf-11", "MWF 11:00-11:50 AM")
sch3 = SelectItem("tth-930", "TTh 9:30-10:45 AM")
sch4 = SelectItem("tth-11", "TTh 11:00 AM-12:15 PM")
sch5 = SelectItem("m-6", "M 6:00-8:50 PM (evening)")
fcCourseCapacity = FormControl("Enrollment Capacity", courseCapacityInput, "Maximum students")
courseCapacityInput = Input("course-capacity", "e.g. 30", "number", { required: true, min: 1, max: 300 })
fcCourseJustification = FormControl("Justification", courseJustifyArea, "Why is this course needed? (curriculum gap, demand, accreditation, etc.)")
courseJustifyArea = TextArea("course-justification", "Justification for new course", 4, { required: true, maxLength: 1000 })
messageForm = Form("student-message", messageButtons, [fcMsgAudience, fcMsgSubject, fcMsgBody, fcMsgChannel])
messageButtons = Buttons([btnSendMsg, btnPreviewMsg], "row")
btnSendMsg = Button("Send Message", { type: "continue_conversation", context: "Send message to selected student group" }, "primary")
btnPreviewMsg = Button("Preview", { type: "continue_conversation", context: "Preview message before sending" }, "secondary")
fcMsgAudience = FormControl("Recipient Group", msgAudienceCards, "Select target audience")
msgAudienceCards = OptionCards("msg-audience", "single", audienceOptions, { required: true })
audienceOptions = [aud1, aud2, aud3, aud4, aud5, aud6, aud7, aud8]
aud1 = OptionCard("all", "All Students", "24,847 recipients", aud1icon)
aud1icon = Icon("users", "people")
aud2 = OptionCard("undergrad", "Undergraduates", "18,620 recipients", aud2icon)
aud2icon = Icon("graduation-cap", "education")
aud3 = OptionCard("grad", "Graduate Students", "6,227 recipients", aud3icon)
aud3icon = Icon("book-open", "education")
aud4 = OptionCard("probation", "Academic Probation", "1,247 recipients", aud4icon)
aud4icon = Icon("alert-triangle", "shapes")
aud5 = OptionCard("housing", "On-Campus Residents", "7,340 recipients", aud5icon)
aud5icon = Icon("home", "home")
aud6 = OptionCard("finaid", "Financial Aid Recipients", "9,120 recipients", aud6icon)
aud6icon = Icon("circle-dollar-sign", "finance")
aud7 = OptionCard("intl", "International Students", "2,840 recipients", aud7icon)
aud7icon = Icon("globe", "travel")
aud8 = OptionCard("seniors", "Graduating Seniors", "3,450 recipients", aud8icon)
aud8icon = Icon("award", "shapes")
fcMsgSubject = FormControl("Subject Line", msgSubjectInput, "Clear, concise subject (max 100 chars)")
msgSubjectInput = Input("msg-subject", "Subject line", "text", { required: true, maxLength: 100 })
fcMsgBody = FormControl("Message Body", msgBodyArea, "Plain text or markdown supported")
msgBodyArea = TextArea("msg-body", "Message content", 6, { required: true, maxLength: 5000 })
fcMsgChannel = FormControl("Delivery Channels", msgChannelChips, "Select all that apply")
msgChannelChips = Chips("msg-channels", "multiple", channelOptions, {}, ["email"])
channelOptions = [chEmail, chPush, chSms, chPortal]
chEmail = ChipItem("email", "Email", chEmailIcon)
chEmailIcon = Icon("mail", "communication")
chPush = ChipItem("push", "Mobile Push", chPushIcon)
chPushIcon = Icon("bell", "communication")
chSms = ChipItem("sms", "SMS", chSmsIcon)
chSmsIcon = Icon("message-square", "communication")
chPortal = ChipItem("portal", "Student Portal Banner", chPortalIcon)
chPortalIcon = Icon("layout-dashboard", "shapes")