root = Card([healthSummary, quarterSelector, activeProjects, overdueMilestones, budgetChart, utilizationChart, risksTable, upcomingDeadlines, deliveryPaceChart, blockedItems, actions])
healthSummary = Callout("success", "Portfolio Health", "8 of 10 projects on track; 2 at risk due to resource constraints and scope creep")
quarterSelector = Card([quarterLabel, quarterSelect], "clear", "row", "m", "center")
quarterLabel = TextContent("Quarter:", "default")
quarterSelect = Select("quarter", quarterOptions, "Select quarter", null, "medium")
quarterOptions = [q1Opt, q2Opt, q3Opt, q4Opt]
q1Opt = SelectItem("2024-q1", "Q1 2024")
q2Opt = SelectItem("2024-q2", "Q2 2024")
q3Opt = SelectItem("2024-q3", "Q3 2024")
q4Opt = SelectItem("2024-q4", "Q4 2024")
activeProjects = Card([activeHeader, projectsTable], "sunk")
activeHeader = CardHeader("Active Projects", "Owner, deadline, and health status")
projectsTable = Table([projNameCol, projOwnerCol, projDeadlineCol, projHealthCol])
projNameCol = Col("Project", ["Apollo CRM", "Orion Analytics", "Nova Mobile", "Titan Infrastructure", "Luna Marketing", "Solar API", "Comet Data", "Nebula Platform"])
projOwnerCol = Col("Owner", ["Sarah Chen", "Marcus Johnson", "Priya Patel", "David Kim", "Emily Ross", "James Wu", "Lisa Park", "Robert Taylor"])
projDeadlineCol = Col("Deadline", ["2024-03-15", "2024-04-01", "2024-03-28", "2024-05-15", "2024-03-20", "2024-04-10", "2024-03-31", "2024-05-01"])
projHealthCol = Col("Health", ["On Track", "At Risk", "On Track", "On Track", "Critical", "On Track", "At Risk", "On Track"])
overdueMilestones = Card([overdueHeader, overdueTable], "sunk")
overdueHeader = CardHeader("Overdue Milestones", "Milestones past their due date")
overdueTable = Table([msNameCol, msProjectCol, msDueCol, msDaysLateCol])
msNameCol = Col("Milestone", ["API v2 Release", "Security Audit", "Mobile Beta Launch", "Data Migration"])
msProjectCol = Col("Project", ["Solar API", "Titan Infrastructure", "Nova Mobile", "Comet Data"])
msDueCol = Col("Original Due", ["2024-02-10", "2024-02-15", "2024-02-20", "2024-02-25"])
msDaysLateCol = Col("Days Late", [18, 13, 8, 3])
budgetChart = Card([budgetHeader, budgetBar], "sunk")
budgetHeader = CardHeader("Budget: Spent vs Allocated", "Per project (USD thousands)")
budgetBar = HorizontalBarChart(budgetLabels, [budgetSpentSeries, budgetAllocSeries], "grouped", "USD (k)", "Project")
budgetLabels = ["Apollo", "Orion", "Nova", "Titan", "Luna", "Solar", "Comet", "Nebula"]
budgetSpentSeries = Series("Spent", [420, 380, 290, 510, 180, 340, 270, 460])
budgetAllocSeries = Series("Allocated", [500, 500, 350, 600, 250, 400, 300, 550])
utilizationChart = Card([utilHeader, utilBar], "sunk")
utilHeader = CardHeader("Team Utilization", "Percentage of capacity used per team")
utilBar = BarChart(utilLabels, [utilSeries], "linear", "Team", "Utilization %")
utilLabels = ["Frontend", "Backend", "DevOps", "QA", "Design", "Product"]
utilSeries = Series("Utilization", [85, 92, 78, 88, 72, 95])
risksTable = Card([risksHeader, risksTableData], "sunk")
risksHeader = CardHeader("Risks by Severity", "Open risks across the portfolio")
risksTableData = Table([riskIdCol, riskDescCol, riskProjectCol, riskSeverityCol, riskOwnerCol])
riskIdCol = Col("ID", ["R-001", "R-002", "R-003", "R-004", "R-005", "R-006"])
riskDescCol = Col("Description", ["Key engineer leaving", "Vendor delay on API", "Scope creep on mobile", "Infrastructure scaling", "Compliance gap", "Data quality issues"])
riskProjectCol = Col("Project", ["Orion Analytics", "Solar API", "Nova Mobile", "Titan Infra", "Luna Marketing", "Comet Data"])
riskSeverityCol = Col("Severity", ["High", "Medium", "High", "Medium", "Critical", "Low"])
riskOwnerCol = Col("Owner", ["Marcus Johnson", "James Wu", "Priya Patel", "David Kim", "Emily Ross", "Lisa Park"])
upcomingDeadlines = Card([deadlinesHeader, deadlinesList], "sunk")
deadlinesHeader = CardHeader("Deadlines: Next 2 Weeks", "Project milestones due by 2024-03-14")
deadlinesList = ListBlock(deadlineItems, "number")
deadlineItems = [dl1, dl2, dl3, dl4, dl5]
dl1 = ListItem("Apollo CRM - UAT Complete", "Due 2024-03-10", null, null)
dl2 = ListItem("Nova Mobile - App Store Submit", "Due 2024-03-12", null, null)
dl3 = ListItem("Luna Marketing - Campaign Launch", "Due 2024-03-13", null, null)
dl4 = ListItem("Comet Data - Pipeline Cutover", "Due 2024-03-14", null, null)
dl5 = ListItem("Solar API - Load Test Sign-off", "Due 2024-03-14", null, null)
deliveryPaceChart = Card([paceHeader, paceLine], "sunk")
paceHeader = CardHeader("Delivery Pace (Last 6 Sprints)", "Story points completed per sprint")
paceLine = LineChart(paceLabels, [paceSeries], "natural", "Sprint", "Story Points")
paceLabels = ["Sprint 18", "Sprint 19", "Sprint 20", "Sprint 21", "Sprint 22", "Sprint 23"]
paceSeries = Series("Velocity", [320, 345, 310, 360, 335, 350])
blockedItems = Card([blockedHeader, blockedList], "sunk")
blockedHeader = CardHeader("Blocked Work Items", "Items unable to progress due to dependencies")
blockedList = ListBlock(blockedItemsData, "number")
blockedItemsData = [bi1, bi2, bi3, bi4]
bi1 = ListItem("Apollo: Payment Integration", "Blocked on vendor sandbox access", null, null)
bi2 = ListItem("Orion: Real-time Dashboard", "Blocked on data warehouse schema", null, null)
bi3 = ListItem("Nova: Push Notifications", "Blocked on Apple cert renewal", null, null)
bi4 = ListItem("Titan: DR Failover Test", "Blocked on infra team capacity", null, null)
actions = Buttons([exportBtn, requestPeopleBtn, archiveBtn], "row")
exportBtn = Button("Export Review", null, "primary")
requestPeopleBtn = Button("Request More People", null, "secondary")
archiveBtn = Button("Archive Finished Project", null, "tertiary")