root = Card([healthSummary, quarterSelector, activeProjectsSection, overdueMilestonesSection, budgetSection, utilizationSection, risksSection, upcomingDeadlinesSection, deliveryPaceSection, blockedItemsSection, actionsSection], "card", "column", "l")
healthSummary = Callout("success", "Portfolio Health", "12 of 15 projects on track; 2 at risk, 1 critical — overall status: GREEN")
quarterSelector = Card([quarterLabel, quarterSelect], "clear", "row", "m", "center", "between")
quarterLabel = TextContent("View quarter:", "small-heavy")
quarterSelect = Select("quarter", quarterOptions, "Select quarter", null, "medium")
quarterOptions = [q1, q2, q3, q4]
q1 = SelectItem("2024-q1", "Q1 2024")
q2 = SelectItem("2024-q2", "Q2 2024")
q3 = SelectItem("2024-q3", "Q3 2024")
q4 = SelectItem("2024-q4", "Q4 2024")
activeProjectsSection = Card([activeProjectsHeader, activeProjectsTable], "sunk", "column", "m")
activeProjectsHeader = Heading("Active Projects", "h3")
activeProjectsTable = Table([projNameCol, projOwnerCol, projDeadlineCol, projHealthCol])
projNameCol = Col("Project", ["Apollo CRM", "Orion API", "Nebula Mobile", "Zenith Analytics", "Polaris Platform", "Aurora Dashboard", "Comet Integration", "Vanguard Security"])
projOwnerCol = Col("Owner", ["S. Chen", "M. Rodriguez", "A. Patel", "J. Kim", "R. Thompson", "L. Nguyen", "D. Okafor", "P. Silva"])
projDeadlineCol = Col("Deadline", ["2024-03-15", "2024-03-22", "2024-04-05", "2024-03-28", "2024-04-12", "2024-03-18", "2024-04-20", "2024-03-30"])
projHealthCol = Col("Health", ["On Track", "At Risk", "On Track", "Critical", "On Track", "At Risk", "On Track", "On Track"])
overdueMilestonesSection = Card([overdueHeader, overdueTable], "sunk", "column", "m")
overdueHeader = Heading("Overdue Milestones", "h3")
overdueTable = Table([msProjectCol, msNameCol, msDueCol, msDaysLateCol])
msProjectCol = Col("Project", ["Orion API", "Zenith Analytics", "Aurora Dashboard"])
msNameCol = Col("Milestone", ["Auth v2 Release", "Data Pipeline MVP", "Widget Library"])
msDueCol = Col("Due Date", ["2024-02-20", "2024-02-25", "2024-02-28"])
msDaysLateCol = Col("Days Late", [18, 13, 10])
budgetSection = Card([budgetHeader, budgetChart], "sunk", "column", "m")
budgetHeader = Heading("Budget: Spent vs Allocated", "h3")
budgetChart = HorizontalBarChart(budgetLabels, [budgetAllocatedSeries, budgetSpentSeries], "grouped", "USD (thousands)", "Project")
budgetLabels = ["Apollo CRM", "Orion API", "Nebula Mobile", "Zenith Analytics", "Polaris Platform", "Aurora Dashboard", "Comet Integration", "Vanguard Security"]
budgetAllocatedSeries = Series("Allocated", [450, 320, 280, 190, 410, 150, 220, 380])
budgetSpentSeries = Series("Spent", [380, 295, 210, 185, 320, 140, 180, 310])
utilizationSection = Card([utilHeader, utilChart], "sunk", "column", "m")
utilHeader = Heading("Team Utilization", "h3")
utilChart = BarChart(utilLabels, [utilSeries], "grouped", "Team", "Utilization %")
utilLabels = ["Platform", "Mobile", "Frontend", "Backend", "QA", "DevOps", "Design", "Data"]
utilSeries = Series("Utilization", [87, 92, 78, 85, 71, 68, 76, 82])
risksSection = Card([risksHeader, risksTable], "sunk", "column", "m")
risksHeader = Heading("Risks by Severity", "h3")
risksTable = Table([riskProjectCol, riskDescCol, riskSeverityCol, riskOwnerCol])
riskProjectCol = Col("Project", ["Orion API", "Zenith Analytics", "Aurora Dashboard", "Polaris Platform", "Comet Integration"])
riskDescCol = Col("Risk", ["Vendor API deprecation", "Data migration complexity", "Performance regression", "Scope creep", "Third-party license renewal"])
riskSeverityCol = Col("Severity", ["Critical", "High", "High", "Medium", "Medium"])
riskOwnerCol = Col("Owner", ["M. Rodriguez", "J. Kim", "L. Nguyen", "R. Thompson", "D. Okafor"])
upcomingDeadlinesSection = Card([deadlinesHeader, deadlinesTable], "sunk", "column", "m")
deadlinesHeader = Heading("Deadlines — Next 2 Weeks", "h3")
deadlinesTable = Table([dlProjectCol, dlMilestoneCol, dlDateCol, dlStatusCol])
dlProjectCol = Col("Project", ["Apollo CRM", "Orion API", "Nebula Mobile", "Aurora Dashboard", "Vanguard Security"])
dlMilestoneCol = Col("Milestone", ["Beta Launch", "Auth v2 Release", "App Store Submit", "Widget Library", "Pen Test Complete"])
dlDateCol = Col("Date", ["2024-03-15", "2024-03-22", "2024-03-18", "2024-03-18", "2024-03-30"])
dlStatusCol = Col("Status", ["On Track", "Overdue", "On Track", "At Risk", "On Track"])
deliveryPaceSection = Card([paceHeader, paceChart], "sunk", "column", "m")
paceHeader = Heading("Delivery Pace — Last 6 Sprints", "h3")
paceChart = LineChart(paceLabels, [velocitySeries, committedSeries], "natural", "Sprint", "Story Points")
paceLabels = ["Sprint 18", "Sprint 19", "Sprint 20", "Sprint 21", "Sprint 22", "Sprint 23"]
velocitySeries = Series("Delivered", [42, 38, 45, 41, 44, 47])
committedSeries = Series("Committed", [40, 42, 44, 43, 45, 48])
blockedItemsSection = Card([blockedHeader, blockedTable], "sunk", "column", "m")
blockedHeader = Heading("Blocked Work Items", "h3")
blockedTable = Table([blockedProjectCol, blockedItemCol, blockedReasonCol, blockedSinceCol])
blockedProjectCol = Col("Project", ["Orion API", "Zenith Analytics", "Aurora Dashboard", "Polaris Platform"])
blockedItemCol = Col("Work Item", ["OAPI-342: OAuth flow", "ZEN-187: ETL pipeline", "AUR-92: Chart rendering", "POL-205: Deployment"])
blockedReasonCol = Col("Blocker", ["Vendor API down", "Schema mismatch", "Design approval pending", "Infra quota exceeded"])
blockedSinceCol = Col("Days Blocked", [5, 3, 2, 7])
actionsSection = Card([actionsHeader, exportBtn, requestPeopleForm, archiveForm], "clear", "column", "m")
actionsHeader = Heading("Actions", "h3")
exportBtn = Button("Export Portfolio Review", ["export-review"], "primary")
requestPeopleForm = Form("request-people", requestPeopleButtons, [projectSelectField, roleField, countField, justificationField])
projectSelectField = FormControl("Project", projectSelect, "Select project needing resources")
projectSelect = Select("project", projectOptions, "Choose project", null, "medium")
projectOptions = [optApollo, optOrion, optNebula, optZenith, optPolaris, optAurora, optComet, optVanguard]
optApollo = SelectItem("apollo", "Apollo CRM")
optOrion = SelectItem("orion", "Orion API")
optNebula = SelectItem("nebula", "Nebula Mobile")
optZenith = SelectItem("zenith", "Zenith Analytics")
optPolaris = SelectItem("polaris", "Polaris Platform")
optAurora = SelectItem("aurora", "Aurora Dashboard")
optComet = SelectItem("comet", "Comet Integration")
optVanguard = SelectItem("vanguard", "Vanguard Security")
roleField = FormControl("Role Needed", roleSelect)
roleSelect = Select("role", roleOptions, "Select role", null, "medium")
roleOptions = [roleFe, roleBe, roleQa, roleDevops, roleDesign, roleData]
roleFe = SelectItem("frontend", "Frontend Engineer")
roleBe = SelectItem("backend", "Backend Engineer")
roleQa = SelectItem("qa", "QA Engineer")
roleDevops = SelectItem("devops", "DevOps Engineer")
roleDesign = SelectItem("design", "Product Designer")
roleData = SelectItem("data", "Data Engineer")
countField = FormControl("Headcount", countInput, "Number of additional people")
countInput = Input("count", "1", "number")
justificationField = FormControl("Justification", justificationArea, "Business case for additional resources")
justificationArea = TextArea("justification", "Describe impact on timeline, scope, or risk...", 3)
requestPeopleButtons = Buttons([submitRequestBtn, cancelRequestBtn])
submitRequestBtn = Button("Submit Request", null, "primary")
cancelRequestBtn = Button("Cancel", null, "tertiary")
archiveForm = Form("archive-project", archiveButtons, [archiveProjectSelect, confirmField])
archiveProjectSelect = FormControl("Project to Archive", archiveSelect, "Only finished projects appear")
archiveSelect = Select("archive_project", archiveOptions, "Select completed project", null, "medium")
archiveOptions = [archApollo, archNebula, archPolaris]
archApollo = SelectItem("apollo", "Apollo CRM (Completed 2024-02-10)")
archNebula = SelectItem("nebula", "Nebula Mobile (Completed 2024-02-15)")
archPolaris = SelectItem("polaris", "Polaris Platform (Completed 2024-02-28)")
confirmField = FormControl("Confirmation", confirmCheckbox, "Type project name to confirm")
confirmCheckbox = CheckBoxGroup("confirm", [confirmItem])
confirmItem = CheckBoxItem("I confirm this project is complete and ready for archival", "Archive confirmation", "confirm_ack", false)
archiveButtons = Buttons([archiveBtn, cancelArchiveBtn])
archiveBtn = Button("Archive Project", null, "primary", "destructive")
cancelArchiveBtn = Button("Cancel", null, "tertiary")