root = Card([header, liveAlerts, loadStatus, genSplit, plantTable, outages, forecast, priceBlock, maintenance, regionFocus, curtailment, emissions], "card", "column", "l")

header = CardHeader("Power Network Operations", "Live console — grid status")
liveAlerts = Callout("warning", "Live Alerts", "Line 7 overload risk — load at 94% of capacity. Two feed-in warnings on solar farms.")

loadStatus = Card([loadHeading, loadBars, loadTable], "sunk")
loadHeading = Heading("Current Load & Capacity", "h3")
loadBars = SingleStackedBarChart(["Load / Capacity"], [94])
loadTable = Table([loadMetric, loadValue])
loadMetric = Col("Metric", ["Current Load (MW)", "Capacity (MW)", "Utilization"])
loadValue = Col("Value", ["9,412", "10,000", "94%"])

genSplit = Card([genHeading, genPie], "sunk")
genHeading = Heading("Generation by Source", "h3")
genPie = PieChart(["Coal", "Gas", "Nuclear", "Hydro", "Wind", "Solar"], [1800, 2200, 1600, 1200, 1800, 812], "donut")

plantTable = Card([plantHeading, plantData], "sunk")
plantHeading = Heading("Plant Output & Status", "h3")
plantData = Table([plantName, plantType, outputCol, statusCol])
plantName = Col("Plant", ["Northfield Coal", "Riverside Gas", "Valley Nuclear", "Highland Hydro", "Eastwind Farm", "Sunnyside Solar"])
plantType = Col("Type", ["Coal", "Gas", "Nuclear", "Hydro", "Wind", "Solar"])
outputCol = Col("Output (MW)", [1800, 2200, 1600, 1200, 1800, 812])
statusCol = Col("Status", ["Online", "Online", "Online", "Online", "Warning", "Warning"])

outages = Card([outageHeading, outageList], "sunk")
outageHeading = Heading("Active Outages", "h3")
outageList = ListBlock([outage1, outage2])
outage1 = ListItem("Outage #1042", "Transformer fault — affecting Northwest region", null, "Details")
outage2 = ListItem("Outage #1047", "Cable damage — affecting East region", null, "Details")

forecast = Card([forecastHeading, forecastChart], "sunk")
forecastHeading = Heading("Demand Forecast — Next 24 Hours", "h3")
forecastChart = LineChart(["0h", "4h", "8h", "12h", "16h", "20h", "24h"], [demandSeries], "natural", "Hour", "MW")
demandSeries = Series("Demand (MW)", [8400, 7900, 7600, 8100, 9200, 9800, 8600])

priceBlock = Card([priceHeading, priceValue, priceTrend], "sunk")
priceHeading = Heading("Market Price", "h3")
priceValue = TextContent("$58.40 / MWh", "large-heavy")
priceTrend = TextContent("▲ 3.2% vs previous hour", "small")

maintenance = Card([maintHeading, maintList], "sunk")
maintHeading = Heading("Maintenance Planned This Month", "h3")
maintList = ListBlock([maint1, maint2, maint3])
maint1 = ListItem("Riverside Gas — Unit 2", "May 12–14, 08:00–17:00", null, "Schedule")
maint2 = ListItem("Highland Hydro — Penstock", "May 18, 10:00–14:00", null, "Schedule")
maint3 = ListItem("Northfield Coal — Boiler", "May 22–24, 06:00–18:00", null, "Schedule")

regionFocus = Card([regionHeading, regionForm], "sunk")
regionHeading = Heading("Focus on a Region", "h3")
regionForm = Form("region-focus", regionButtons, [regionSelect])
regionSelect = FormControl("Select region", regionInput)
regionInput = Select("region", [regionNorth, regionSouth, regionEast, regionWest], "Choose region")
regionNorth = SelectItem("north", "North")
regionSouth = SelectItem("south", "South")
regionEast = SelectItem("east", "East")
regionWest = SelectItem("west", "West")
regionButtons = Buttons([regionApply])
regionApply = Button("Apply focus", null, "primary")

curtailment = Card([curtailHeading, curtailForm], "sunk")
curtailHeading = Heading("Order Curtailment", "h3")
curtailForm = Form("curtailment-order", curtailButtons, [curtailPlant, curtailAmount])
curtailPlant = FormControl("Plant", curtailPlantSelect)
curtailPlantSelect = Select("plant", [plantNorth, plantRiverside, plantValley], "Choose plant")
plantNorth = SelectItem("northfield", "Northfield Coal")
plantRiverside = SelectItem("riverside", "Riverside Gas")
plantValley = SelectItem("valley", "Valley Nuclear")
curtailAmount = FormControl("Curtail amount (MW)", curtailSlider)
curtailSlider = Slider("amount", "continuous", 0, 1000, 50, [200], "MW")
curtailButtons = Buttons([curtailSubmit])
curtailSubmit = Button("Submit curtailment order", null, "primary")

emissions = Card([emissionsHeading, emissionsTable], "sunk")
emissionsHeading = Heading("Emissions Today", "h3")
emissionsTable = Table([emissionSource, emissionValue])
emissionSource = Col("Source", ["CO₂ (t)", "SO₂ (t)", "NOₓ (t)"])
emissionValue = Col("Today", [1240, 38, 96])