root = Card([regionSelector, headerRow, loadCapacityRow, generationSplitRow, priceEmissionsRow, forecastRow, plantsTableRow, outagesRow, maintenanceRow, alertsRow, curtailmentRow], "clear", "column", "l")
regionSelector = Select("region", regionOptions, "All regions", [], "medium")
regionOptions = [optAll, optNorth, optSouth, optEast, optWest, optCentral]
optAll = SelectItem("all", "All regions")
optNorth = SelectItem("north", "North")
optSouth = SelectItem("south", "South")
optEast = SelectItem("east", "East")
optWest = SelectItem("west", "West")
optCentral = SelectItem("central", "Central")
headerRow = Card([titleBlock, liveBadge], "clear", "row", "m", "center", "between")
titleBlock = Card([mainTitle, subtitle], "clear", "column", "xs")
mainTitle = Heading("Grid Operations Console", "h2")
subtitle = TextContent("Real-time network monitoring • Last updated: 14:32 UTC", "small")
liveBadge = Badge("LIVE", "destructive")
loadCapacityRow = Card([loadCard, capacityCard], "clear", "row", "m", "stretch", "start")
loadCard = Card([loadHeader, loadValue, loadTrend], "card", "column", "s")
loadHeader = Heading("Current Load", "h4")
loadValue = TextContent("42,847 MW", "large-heavy")
loadTrend = TextContent("▲ +2.3% vs 1hr ago • Peak today: 48,200 MW at 18:00", "small")
capacityCard = Card([capHeader, capProgress, capDetail], "card", "column", "s")
capHeader = Heading("Network Capacity", "h4")
capProgress = Progress(78, "78% utilized — 12,153 MW headroom")
capDetail = TextContent("N-1 secure limit: 55,000 MW • Thermal limit: 62,000 MW", "small")
generationSplitRow = Card([genChartCard, genLegendCard], "clear", "row", "m", "stretch", "start")
genChartCard = Card([genChartTitle, genChart], "card", "column", "s")
genChartTitle = Heading("Generation Mix", "h4")
genChart = PieChart(genLabels, genValues, "donut", "circular")
genLabels = ["Gas", "Coal", "Wind", "Solar", "Hydro", "Nuclear", "Biomass", "Imports"]
genValues = [14200, 9800, 8500, 5200, 3100, 2800, 900, 1147]
genLegendCard = Card([genLegendTitle, genLegendItems], "card", "column", "s")
genLegendTitle = Heading("Output by Source", "h4")
genLegendItems = Card([genGas, genCoal, genWind, genSolar, genHydro, genNuclear, genBio, genImport], "clear", "column", "xs")
genGas = TextContent("Gas: 14,200 MW (33.1%)", "small")
genCoal = TextContent("Coal: 9,800 MW (22.9%)", "small")
genWind = TextContent("Wind: 8,500 MW (19.8%)", "small")
genSolar = TextContent("Solar: 5,200 MW (12.1%)", "small")
genHydro = TextContent("Hydro: 3,100 MW (7.2%)", "small")
genNuclear = TextContent("Nuclear: 2,800 MW (6.5%)", "small")
genBio = TextContent("Biomass: 900 MW (2.1%)", "small")
genImport = TextContent("Imports: 1,147 MW (2.7%)", "small")
priceEmissionsRow = Card([priceCard, emissionsCard], "clear", "row", "m", "stretch", "start")
priceCard = Card([priceHeader, priceValue, priceChange], "card", "column", "s")
priceHeader = Heading("Wholesale Price", "h4")
priceValue = TextContent("$87.40 / MWh", "large-heavy")
priceChange = TextContent("▼ -$3.20 vs 1hr ago • Day-ahead: $91.20", "small")
emissionsCard = Card([emisHeader, emisValue, emisDetail], "card", "column", "s")
emisHeader = Heading("CO₂ Emissions Today", "h4")
emisValue = TextContent("18,420 tCO₂", "large-heavy")
emisDetail = TextContent("Intensity: 429 gCO₂/kWh • Renewable share: 35.2%", "small")
forecastRow = Card([forecastTitle, forecastChart], "card", "column", "s")
forecastTitle = Heading("24-Hour Demand Forecast", "h4")
forecastChart = AreaChart(forecastLabels, [forecastActual, forecastPredicted], "natural", "Hour", "MW")
forecastLabels = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"]
forecastActual = Series("Actual", [38200, 36800, 35500, 34800, 34500, 35200, 37800, 41200, 43500, 42800, 42100, 41800, 41500, 41200, 41800, 42500, 43800, 45200, 46800, 47200, 46500, 44800, 42200, 39800])
forecastPredicted = Series("Forecast", [null, null, null, null, null, null, null, null, null, null, null, null, null, 41200, 41800, 42500, 43800, 45200, 46800, 47200, 46500, 44800, 42200, 39800])
plantsTableRow = Card([plantsTitle, plantsTable], "card", "column", "s")
plantsTitle = Heading("Generation Plants — Live Output", "h4")
plantsTable = Table([plantName, plantRegion, plantType, plantOutput, plantStatus, plantAvail])
plantName = Col("Plant", ["Northridge CCGT", "Blackrock Coal", "Windmere Farm", "Solaris PV", "Highland Hydro", "Atomix Nuclear", "Greenfield Biomass", "Interconnector FR"])
plantRegion = Col("Region", ["North", "Central", "West", "South", "North", "Central", "East", "Imports"])
plantType = Col("Type", ["Gas", "Coal", "Wind", "Solar", "Hydro", "Nuclear", "Biomass", "Import"])
plantOutput = Col("Output (MW)", [4200, 3800, 2800, 1900, 1200, 2800, 900, 1147], "number")
plantStatus = Col("Status", ["Online", "Online", "Online", "Online", "Online", "Online", "Online", "Online"])
plantAvail = Col("Availability", ["92%", "87%", "98%", "100%", "95%", "99%", "94%", "100%"])
outagesRow = Card([outagesTitle, outagesTable], "card", "column", "s")
outagesTitle = Heading("Active Outages", "h4")
outagesTable = Table([outageId, outageRegion, outageCause, outageCustomers, outageSince, outageEta])
outageId = Col("ID", ["OUT-2024-0847", "OUT-2024-0851", "OUT-2024-0853"])
outageRegion = Col("Region", ["East — Riverside", "South — Coastal", "West — Valley"])
outageCause = Col("Cause", ["Transformer fault", "Storm damage", "Planned maintenance"])
outageCustomers = Col("Customers", [12400, 8700, 3200], "number")
outageSince = Col("Since", ["13:15 UTC", "11:42 UTC", "08:00 UTC"])
outageEta = Col("Est. Restore", ["16:30 UTC", "18:00 UTC", "15:00 UTC"])
maintenanceRow = Card([maintTitle, maintTable], "card", "column", "s")
maintTitle = Heading("Planned Maintenance — This Month", "h4")
maintTable = Table([maintPlant, maintRegion, maintStart, maintEnd, maintImpact, maintStatus])
maintPlant = Col("Plant", ["Northridge CCGT Unit 2", "Blackrock Coal Unit 4", "Highland Hydro Dam", "Windmere Farm Row 3"])
maintRegion = Col("Region", ["North", "Central", "North", "West"])
maintStart = Col("Start", ["2024-02-18", "2024-02-22", "2024-02-25", "2024-02-28"])
maintEnd = Col("End", ["2024-02-20", "2024-02-26", "2024-02-27", "2024-03-02"])
maintImpact = Col("Capacity Impact", ["-800 MW", "-1,200 MW", "-400 MW", "-600 MW"])
maintStatus = Col("Status", ["Approved", "Pending approval", "Scheduled", "Scheduled"])
alertsRow = Card([alertsTitle, alertsList], "card", "column", "s")
alertsTitle = Heading("Live Alerts", "h4")
alertsList = Card([alert1, alert2, alert3, alert4], "clear", "column", "xs")
alert1 = Callout("warning", "Frequency Deviation", "Grid frequency at 49.92 Hz — outside normal band. Primary response activated.")
alert2 = Callout("info", "Wind Ramp Event", "Wind output dropping 800 MW/hr in West region. Ramping gas peakers.")
alert3 = Callout("error", "Interconnector Trip", "FR interconnector tripped at 14:18 UTC. Lost 1,147 MW import. Investigating.")
alert4 = Callout("success", "Voltage Support", "SVC at East substation engaged. Voltage stabilized at 400 kV.")
curtailmentRow = Card([curtailTitle, curtailForm], "card", "column", "s")
curtailTitle = Heading("Order Curtailment", "h4")
curtailForm = Form("curtailment-order", curtailButtons, [curtailPlant, curtailAmount, curtailReason])
curtailPlant = FormControl("Plant", curtailPlantSelect, "Select plant to curtail")
curtailPlantSelect = Select("curtail_plant", curtailPlantOptions, "Choose plant", [], "medium")
curtailPlantOptions = [curtailOpt1, curtailOpt2, curtailOpt3, curtailOpt4, curtailOpt5, curtailOpt6, curtailOpt7]
curtailOpt1 = SelectItem("northridge_ccgt", "Northridge CCGT (Gas, North) — 4,200 MW")
curtailOpt2 = SelectItem("blackrock_coal", "Blackrock Coal (Coal, Central) — 3,800 MW")
curtailOpt3 = SelectItem("windmere_farm", "Windmere Farm (Wind, West) — 2,800 MW")
curtailOpt4 = SelectItem("solaris_pv", "Solaris PV (Solar, South) — 1,900 MW")
curtailOpt5 = SelectItem("highland_hydro", "Highland Hydro (Hydro, North) — 1,200 MW")
curtailOpt6 = SelectItem("atomix_nuclear", "Atomix Nuclear (Nuclear, Central) — 2,800 MW")
curtailOpt7 = SelectItem("greenfield_bio", "Greenfield Biomass (Biomass, East) — 900 MW")
curtailAmount = FormControl("Curtailment (MW)", curtailAmountInput, "Amount to reduce, up to plant output")
curtailAmountInput = Input("curtail_mw", "Enter MW", "number", [], "")
curtailReason = FormControl("Reason", curtailReasonSelect, "Regulatory or operational reason")
curtailReasonSelect = Select("curtail_reason", curtailReasonOptions, "Select reason", [], "medium")
curtailReasonOptions = [reasonFreq, reasonVoltage, reasonThermal, reasonMarket, reasonEmergency]
reasonFreq = SelectItem("frequency", "Frequency control")
reasonVoltage = SelectItem("voltage", "Voltage constraint")
reasonThermal = SelectItem("thermal", "Thermal limit")
reasonMarket = SelectItem("market", "Market instruction")
reasonEmergency = SelectItem("emergency", "System emergency")
curtailButtons = Buttons([curtailSubmit, curtailCancel], "row")
curtailSubmit = Button("Submit Curtailment Order", null, "primary", "destructive")
curtailCancel = Button("Cancel", null, "tertiary")