root = Card([header, callout, activeProjectsTable, overdueTable, budgetChart, teamPie, risksTable, upcomingList, deliveryChart, blockedList, viewQuarterBtn, requestPeopleBtn, exportBtn, archiveBtn])
header = CardHeader("Project Portfolio Review", "Quarterly overview")
callout = Callout(variant "info", title "Portfolio Health", description "Overall health: 75% on track, 20% at risk, 5% critical")
projectNames = ["Project Alpha", "Project Beta", "Project Gamma"]
ownerNames = ["Alice Johnson", "Bob Smith", "Charlie Lee"]
deadlineDates = ["2025-01-15", "2025-02-20", "2025-03-10"]
healthTags = ["🟢", "🟡", "🔴"]
colProject = Col("Project", projectNames)
colOwner = Col("Owner", ownerNames)
colDeadline = Col("Deadline", deadlineDates)
colHealth = Col("Health", healthTags)
activeProjectsTable = Table(colProject, colOwner, colDeadline, colHealth)
milestoneNames = ["Milestone 1", "Milestone 2", "Milestone 3"]
milestoneDue = ["2025-01-01", "2025-01-10", "2025-01-15"]
milestoneStatus = ["Overdue", "Overdue", "On Track"]
colMilestone = Col("Milestone", milestoneNames)
colDue = Col("Due", milestoneDue)
colStatus = Col("Status", milestoneStatus)
overdueTable = Table(colMilestone, colDue, colStatus)
allocationValues = [120000, 180000, 90000]
spentValues = [85000, 130000, 60000]
allocationSeries = Series("Allocation", allocationValues)
spentSeries = Series("Spent", spentValues)
budgetChart = BarChart(labels projectNames, series [allocationSeries, spentSeries], variant "grouped", xLabel "Project", yLabel "USD")
teamNames = ["Team A", "Team B", "Team C"]
utilizationValues = [40, 35, 25]
teamPie = PieChart(labels teamNames, values utilizationValues, variant "pie", appearance "circular")
riskNames = ["Resource bottleneck", "Scope creep", "Technical debt"]
riskSeverity = ["🔴", "🟠", "🟡"]
colRisk = Col("Risk", riskNames)
colSeverity = Col("Severity", riskSeverity)
risksTable = Table(colRisk, colSeverity)
dlItem1 = ListItem("Project Alpha kickoff", "2025-01-20", null, null)
dlItem2 = ListItem("Sprint Review", "2025-02-05", null, null)
dlItem3 = ListItem("Demo Day", "2025-02-12", null, null)
upcomingList = ListBlock(items [dlItem1, dlItem2, dlItem3])
sprintLabels = ["Sprint 1", "Sprint 2", "Sprint 3", "Sprint 4", "Sprint 5", "Sprint 6"]
sprintValues = [30, 45, 40, 55, 60, 50]
revSeries = Series("Story Points", sprintValues)
deliveryChart = LineChart(labels sprintLabels, series [revSeries], variant "linear", xLabel "Sprint", yLabel "Story Points")
blocked1 = ListItem("API integration", "Waiting on third‑party API", null, null)
blocked2 = ListItem("Database migration", "Pending DBA approval", null, null)
blockedList = ListBlock(items [blocked1, blocked2])
viewQuarterBtn = Button("View different quarter")
requestPeopleBtn = Button("Request more people")
exportBtn = Button("Export review")
archiveBtn = Button("Archive finished project")