root = Card([header, kpiRow, visitorsChart, trafficSourcesChart, campaignsTable, bestCampaignCallout, subscriberGrowthChart, exportBtn])
header = Card([title, dateRangeForm], "clear", "row", "m", "center", "between")
title = CardHeader("Marketing Weekly Dashboard", "Week of Jan 15 - Jan 21, 2024")
dateRangeForm = Form("date-range", dateRangeButtons, [dateRangeField])
dateRangeField = FormControl("Date Range", dateRangeSelect, "Select reporting period")
dateRangeSelect = Select("date_range", dateRangeOptions, "Last 30 days")
dateRangeOptions = [optLast7, optLast30, optLast90, optCustom]
optLast7 = SelectItem("last7", "Last 7 days")
optLast30 = SelectItem("last30", "Last 30 days")
optLast90 = SelectItem("last90", "Last 90 days")
optCustom = SelectItem("custom", "Custom range")
dateRangeButtons = Buttons([applyBtn])
applyBtn = Button("Apply", null, "primary")
kpiRow = Card([visitorsKpi, conversionKpi, subscribersKpi], "clear", "row", "l")
visitorsKpi = Card([visitorsLabel, visitorsValue], "sunk", "column", "xs", "center")
visitorsLabel = TextContent("Total Visitors", "small")
visitorsValue = TextContent("128,450", "large-heavy")
conversionKpi = Card([conversionLabel, conversionValue], "sunk", "column", "xs", "center")
conversionLabel = TextContent("Conversion Rate", "small")
conversionValue = TextContent("3.24%", "large-heavy")
subscribersKpi = Card([subscribersLabel, subscribersValue], "sunk", "column", "xs", "center")
subscribersLabel = TextContent("Email Subscribers", "small")
subscribersValue = TextContent("42,180", "large-heavy")
visitorsChart = Card([visitorsHeading, visitorsAreaChart], "sunk", "column", "m")
visitorsHeading = Heading("Site Visitors (Last 30 Days)", "h3")
visitorsAreaChart = AreaChart(visitorLabels, [visitorSeries], "natural", "Day", "Visitors")
visitorLabels = ["Jan 1", "Jan 2", "Jan 3", "Jan 4", "Jan 5", "Jan 6", "Jan 7", "Jan 8", "Jan 9", "Jan 10", "Jan 11", "Jan 12", "Jan 13", "Jan 14", "Jan 15", "Jan 16", "Jan 17", "Jan 18", "Jan 19", "Jan 20", "Jan 21", "Jan 22", "Jan 23", "Jan 24", "Jan 25", "Jan 26", "Jan 27", "Jan 28", "Jan 29", "Jan 30", "Jan 31"]
visitorSeries = Series("Visitors", [3200, 3450, 3100, 3800, 4200, 3900, 3600, 4100, 4350, 4500, 4200, 3950, 3800, 4100, 4400, 4650, 4300, 4050, 3900, 4200, 4500, 4750, 4400, 4150, 3950, 4200, 4450, 4700, 4350, 4100])
trafficSourcesChart = Card([trafficHeading, trafficBarChart], "sunk", "column", "m")
trafficHeading = Heading("Top 5 Traffic Sources", "h3")
trafficBarChart = HorizontalBarChart(trafficLabels, [trafficSeries], "grouped", "Share %", "Source")
trafficLabels = ["Organic Search", "Direct", "Paid Search", "Referral", "Social"]
trafficSeries = Series("Share %", [42.3, 28.1, 15.7, 8.4, 5.5])
campaignsTable = Card([campaignsHeading, campaignsTableComp], "sunk", "column", "m")
campaignsHeading = Heading("Running Campaigns", "h3")
campaignsTableComp = Table([campNameCol, campTypeCol, campSpendCol, campClicksCol, campConvCol, campROASCol])
campNameCol = Col("Campaign", ["Summer Sale 2024", "Brand Awareness Q1", "Product Launch", "Retargeting", "Newsletter Promo"])
campTypeCol = Col("Type", ["Paid Social", "Display", "Search", "Retargeting", "Email"])
campSpendCol = Col("Spend", [12500, 8200, 15000, 4800, 2100], "number")
campClicksCol = Col("Clicks", [45200, 128000, 38500, 18900, 8200], "number")
campConvCol = Col("Conversions", [1240, 890, 2100, 560, 320], "number")
campROASCol = Col("ROAS", [4.2, 2.8, 5.1, 3.7, 6.4], "number")
bestCampaignCallout = Callout("success", "Best Performing Campaign", "Product Launch leads with 5.1x ROAS and 2,100 conversions. Consider increasing budget by 20% next week.")
subscriberGrowthChart = Card([subscriberHeading, subscriberLineChart], "sunk", "column", "m")
subscriberHeading = Heading("Email Subscriber Growth (This Month)", "h3")
subscriberLineChart = LineChart(subscriberLabels, [subscriberSeries], "natural", "Date", "Subscribers")
subscriberLabels = ["Jan 1", "Jan 5", "Jan 10", "Jan 15", "Jan 20", "Jan 25", "Jan 31"]
subscriberSeries = Series("Subscribers", [38200, 39100, 39850, 40600, 41350, 41900, 42180])
exportBtn = Buttons([exportButton], "row")
exportButton = Button("Export Report (CSV)", null, "primary")