|block| { layout: grid; columns: repeat(2); gap: 25; padding: 5; } [
|chart| "Revenue by quarter ($M)" {
width: 350; height: 240; categories: "Q1" "Q2" "Q3" "Q4";
} [
|bars| "2023" { data: 12 19 15 25; fill: --orange-soft; }
|bars| "2024" { data: 18 24 22 31; fill: --sky-soft; }
]
|chart| "Active users (k)" {
width: 350; height: 240; categories: "Jan" "Feb" "Mar" "Apr" "May" "Jun";
} [
|axis#ms| { side: left; }
|mark| "Goal" { at: 48; axis: ms; stroke: --red; stroke-style: dashed; }
|line| "web" {
data: 16 18 22 28 35 42; curve: smooth; marker: dot; stroke: --teal; tags: "" "UI change" "" "" "Redesign" "";
}
|line| "app" {
data: 8 14 20 30 42 58; curve: smooth; marker: dot; stroke: --purple;
}
]
|chart| "Profiles" {
width: 350; height: 240; direction: radial; categories: "Speed" "Range" "Armor" "Cost" "Stealth" "humor";
} [
|axis| { range: 0 6; }
|area| "Cruiser" { data: 3 4 5 5 4 4; fill: --green-soft; }
|line| "Scout" { data: 5 4 3 4 5 5; stroke: --rose; }
|line| "Truck" { data: 4 5 3 3 4 5; stroke: --blue; }
]
|chart| "Reactor temperature (°C)" { width: 340; height: 240; } [
|axis#t| { side: bottom; range: 0 6; }
|axis| { side: left; }
|band| "Warm-up" { span: 0 1.5; axis: t; fill: --sky; }
|band| "Hold" { span: 1.5 4; axis: t; fill: --amber; }
|band| "Cool" { span: 4 6; axis: t; fill: --teal; }
|area| "core" {
data: 0 20, 1 120, 2 300, 3 320, 4 260, 5 80; fill: --rose;
}
]
|pie| "Spend by channel" { width: 350; height: 240; } [
|slice| "Ads" { value: 40; }
|slice| "SEO" { value: 25; }
|slice| "Email" { value: 20; }
|slice| "Direct" { value: 15; }
]
|chart| "Markets (share vs. growth)" { width: 350; height: 240; } [
|axis| "growth %" { side: bottom; }
|axis| "share %" { side: left; }
|bubble| "EU" { at: 12 40; value: 8; }
|bubble| "US" { at: 25 55; value: 20; }
|bubble| "APAC" { at: 38 30; value: 14; }
|bubble| "LatAm" { at: 30 15; value: 6; }
|bubble| "ME" { at: 16 22; value: 5; }
|bubble| "China" { at: 45 48; value: 17; }
]
]