Files
supabase/apps/www/components/Charts/DeveloperGrowthChart.tsx
Saxon FletcherandClaude Opus 4.8 fb02182e86 Color system (#47288)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES/NO

## What kind of change does this PR introduce?

Bug fix, feature, docs update, ...

## What is the current behavior?

Please link any relevant issues here.

## What is the new behavior?

Feel free to include screenshots if it includes visual changes.

## Additional context

Add any other context or screenshots.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Refreshed theming across the UI to use modern color expressions and
shared theme variables (including OKLCH-based gradients), improving
consistency for charts, code blocks, overlays, icons, and decorative
backgrounds.
* **Bug Fixes**
* Improved light/dark color and gradient consistency across axis/grid
styling, reference lines, buttons/badges, sidebar accents, loaders, and
other visual components.
* **Documentation**
* Updated styling/theming guidance to align with the revised semantic
token system and the updated theme variable usage patterns.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 15:00:43 +10:00

132 lines
7.3 KiB
TypeScript

'use client'
import { Area, AreaChart, ResponsiveContainer, XAxis, YAxis } from 'recharts'
const data = [
{ month: '2020-03', newDevelopers: 11, cumulativeDevelopers: 11 },
{ month: '2020-04', newDevelopers: 43, cumulativeDevelopers: 54 },
{ month: '2020-05', newDevelopers: 1020, cumulativeDevelopers: 1074 },
{ month: '2020-06', newDevelopers: 463, cumulativeDevelopers: 1537 },
{ month: '2020-07', newDevelopers: 194, cumulativeDevelopers: 1731 },
{ month: '2020-08', newDevelopers: 438, cumulativeDevelopers: 2169 },
{ month: '2020-09', newDevelopers: 208, cumulativeDevelopers: 2377 },
{ month: '2020-10', newDevelopers: 278, cumulativeDevelopers: 2655 },
{ month: '2020-11', newDevelopers: 560, cumulativeDevelopers: 3215 },
{ month: '2020-12', newDevelopers: 2450, cumulativeDevelopers: 5665 },
{ month: '2021-01', newDevelopers: 1476, cumulativeDevelopers: 7141 },
{ month: '2021-02', newDevelopers: 1639, cumulativeDevelopers: 8780 },
{ month: '2021-03', newDevelopers: 2156, cumulativeDevelopers: 10936 },
{ month: '2021-04', newDevelopers: 4149, cumulativeDevelopers: 15085 },
{ month: '2021-05', newDevelopers: 5148, cumulativeDevelopers: 20233 },
{ month: '2021-06', newDevelopers: 3713, cumulativeDevelopers: 23946 },
{ month: '2021-07', newDevelopers: 5225, cumulativeDevelopers: 29171 },
{ month: '2021-08', newDevelopers: 4945, cumulativeDevelopers: 34116 },
{ month: '2021-09', newDevelopers: 4699, cumulativeDevelopers: 38815 },
{ month: '2021-10', newDevelopers: 5426, cumulativeDevelopers: 44241 },
{ month: '2021-11', newDevelopers: 5732, cumulativeDevelopers: 49973 },
{ month: '2021-12', newDevelopers: 7326, cumulativeDevelopers: 57299 },
{ month: '2022-01', newDevelopers: 8997, cumulativeDevelopers: 66296 },
{ month: '2022-02', newDevelopers: 7345, cumulativeDevelopers: 73641 },
{ month: '2022-03', newDevelopers: 7092, cumulativeDevelopers: 80733 },
{ month: '2022-04', newDevelopers: 6832, cumulativeDevelopers: 87565 },
{ month: '2022-05', newDevelopers: 8260, cumulativeDevelopers: 95825 },
{ month: '2022-06', newDevelopers: 7383, cumulativeDevelopers: 103208 },
{ month: '2022-07', newDevelopers: 8611, cumulativeDevelopers: 111819 },
{ month: '2022-08', newDevelopers: 10412, cumulativeDevelopers: 122231 },
{ month: '2022-09', newDevelopers: 12814, cumulativeDevelopers: 135045 },
{ month: '2022-10', newDevelopers: 11597, cumulativeDevelopers: 146642 },
{ month: '2022-11', newDevelopers: 14469, cumulativeDevelopers: 161111 },
{ month: '2022-12', newDevelopers: 17947, cumulativeDevelopers: 179058 },
{ month: '2023-01', newDevelopers: 19400, cumulativeDevelopers: 198458 },
{ month: '2023-02', newDevelopers: 19748, cumulativeDevelopers: 218206 },
{ month: '2023-03', newDevelopers: 23798, cumulativeDevelopers: 242004 },
{ month: '2023-04', newDevelopers: 25803, cumulativeDevelopers: 267807 },
{ month: '2023-05', newDevelopers: 27584, cumulativeDevelopers: 295391 },
{ month: '2023-06', newDevelopers: 27800, cumulativeDevelopers: 323191 },
{ month: '2023-07', newDevelopers: 32598, cumulativeDevelopers: 355789 },
{ month: '2023-08', newDevelopers: 33368, cumulativeDevelopers: 389157 },
{ month: '2023-09', newDevelopers: 32046, cumulativeDevelopers: 421203 },
{ month: '2023-10', newDevelopers: 35087, cumulativeDevelopers: 456290 },
{ month: '2023-11', newDevelopers: 34990, cumulativeDevelopers: 491280 },
{ month: '2023-12', newDevelopers: 31492, cumulativeDevelopers: 522772 },
{ month: '2024-01', newDevelopers: 37766, cumulativeDevelopers: 560538 },
{ month: '2024-02', newDevelopers: 38748, cumulativeDevelopers: 599286 },
{ month: '2024-03', newDevelopers: 43861, cumulativeDevelopers: 643147 },
{ month: '2024-04', newDevelopers: 46842, cumulativeDevelopers: 689989 },
{ month: '2024-05', newDevelopers: 48851, cumulativeDevelopers: 738840 },
{ month: '2024-06', newDevelopers: 43734, cumulativeDevelopers: 782574 },
{ month: '2024-07', newDevelopers: 46589, cumulativeDevelopers: 829163 },
{ month: '2024-08', newDevelopers: 51743, cumulativeDevelopers: 880906 },
{ month: '2024-09', newDevelopers: 59597, cumulativeDevelopers: 940503 },
{ month: '2024-10', newDevelopers: 65080, cumulativeDevelopers: 1005583 },
{ month: '2024-11', newDevelopers: 79022, cumulativeDevelopers: 1084605 },
{ month: '2024-12', newDevelopers: 128379, cumulativeDevelopers: 1212984 },
{ month: '2025-01', newDevelopers: 183374, cumulativeDevelopers: 1396358 },
{ month: '2025-02', newDevelopers: 216920, cumulativeDevelopers: 1613278 },
{ month: '2025-03', newDevelopers: 281763, cumulativeDevelopers: 1895041 },
{ month: '2025-04', newDevelopers: 345266, cumulativeDevelopers: 2240307 },
{ month: '2025-05', newDevelopers: 367844, cumulativeDevelopers: 2608151 },
{ month: '2025-06', newDevelopers: 400607, cumulativeDevelopers: 3008758 },
{ month: '2025-07', newDevelopers: 473642, cumulativeDevelopers: 3482400 },
{ month: '2025-08', newDevelopers: 537866, cumulativeDevelopers: 4020266 },
{ month: '2025-09', newDevelopers: 516752, cumulativeDevelopers: 4537018 },
{ month: '2025-10', newDevelopers: 401057, cumulativeDevelopers: 4938075 },
{ month: '2025-11', newDevelopers: 419106, cumulativeDevelopers: 5357181 },
{ month: '2025-12', newDevelopers: 502051, cumulativeDevelopers: 5859232 },
{ month: '2026-01', newDevelopers: 650802, cumulativeDevelopers: 6510034 },
{ month: '2026-02', newDevelopers: 616304, cumulativeDevelopers: 7126338 },
{ month: '2026-03', newDevelopers: 846186, cumulativeDevelopers: 7972524 },
{ month: '2026-04', newDevelopers: 27476, cumulativeDevelopers: 8000000 },
]
const formatYAxis = (value: number): string => {
if (value >= 1_000_000) return `${value / 1_000_000}M`
if (value >= 1_000) return `${Math.round(value / 1_000)}K`
return String(value)
}
const isYearBoundary = (month: string, index: number): boolean => {
return index === 0 || month.endsWith('-01')
}
const DeveloperGrowthChart = () => {
return (
<div className="my-8 -mx-4 sm:mx-0">
<ResponsiveContainer width="100%" height={400}>
<AreaChart data={data} margin={{ top: 8, right: 8, left: 0, bottom: 0 }}>
<defs>
<linearGradient id="developerGrowthFill" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stopColor="hsl(var(--brand-600))" stopOpacity={0.3} />
<stop offset="100%" stopColor="hsl(var(--brand-600))" stopOpacity={0.02} />
</linearGradient>
</defs>
<XAxis
dataKey="month"
tick={{ fontSize: 12, fill: 'var(--foreground-lighter)' }}
tickLine={false}
axisLine={{ stroke: 'var(--border-default)' }}
tickFormatter={(value) => value.substring(0, 4)}
ticks={data.filter((d, i) => isYearBoundary(d.month, i)).map((d) => d.month)}
/>
<YAxis
tick={{ fontSize: 12, fill: 'var(--foreground-lighter)' }}
tickLine={false}
axisLine={false}
tickFormatter={formatYAxis}
width={40}
/>
<Area
type="monotone"
dataKey="cumulativeDevelopers"
stroke="hsl(var(--brand-600))"
strokeWidth={2}
fill="url(#developerGrowthFill)"
/>
</AreaChart>
</ResponsiveContainer>
</div>
)
}
export default DeveloperGrowthChart