Skip to content

Commit 718483f

Browse files
CopilotBoshen
andcommitted
Add individual charts for each library in minification benchmarks
Co-authored-by: Boshen <[email protected]>
1 parent 1ab1f9e commit 718483f

File tree

2 files changed

+129
-36
lines changed

2 files changed

+129
-36
lines changed

apps/dashboard/src/App.css

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,40 @@
317317
border: 1px solid rgba(220, 38, 38, 0.2);
318318
}
319319

320+
/* Library Charts Grid */
321+
.library-charts-grid {
322+
display: grid;
323+
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
324+
gap: 1.5rem;
325+
margin-bottom: 2rem;
326+
padding: 0 2rem;
327+
}
328+
329+
.library-chart-container {
330+
background: #ffffff;
331+
border: 1px solid #e5e7eb;
332+
border-radius: 0.75rem;
333+
padding: 1.5rem;
334+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
335+
transition: all 0.3s ease;
336+
}
337+
338+
.library-chart-container:hover {
339+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
340+
transform: translateY(-2px);
341+
}
342+
343+
.library-title {
344+
margin: 0 0 1rem 0;
345+
font-size: 1.125rem;
346+
font-weight: 600;
347+
color: #111827;
348+
text-transform: capitalize;
349+
text-align: center;
350+
padding-bottom: 0.5rem;
351+
border-bottom: 2px solid #e5e7eb;
352+
}
353+
320354
/* Responsive Design */
321355
@media (max-width: 768px) {
322356
.page-nav {
@@ -340,6 +374,16 @@
340374
.stats-grid {
341375
grid-template-columns: 1fr;
342376
}
377+
378+
.library-charts-grid {
379+
grid-template-columns: 1fr;
380+
padding: 0 1rem;
381+
gap: 1rem;
382+
}
383+
384+
.library-chart-container {
385+
padding: 1rem;
386+
}
343387
}
344388

345389
/* Remove default styles */

apps/dashboard/src/MinificationBenchmarks.tsx

Lines changed: 85 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,52 @@
1-
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'
1+
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'
22
import { Zap, Gauge } from 'lucide-react'
33
import minificationData from '../../../minification-benchmarks-data.json'
44

55
// Transform minification data for charts
66
// Get popular minifiers for comparison
77
const popularMinifiers = ['terser', 'esbuild', '@swc/core', 'uglify-js', 'oxc-minify']
88

9-
// Transform minification time data across libraries for popular minifiers
9+
// Get library names from the data
10+
const libraries = Object.keys(minificationData)
11+
12+
// Transform minification data for individual library charts
13+
const getLibraryData = (library: string, metric: 'time' | 'compression') => {
14+
const libraryData = (minificationData as any)[library]
15+
const data: any[] = []
16+
17+
popularMinifiers.forEach(minifier => {
18+
const minifierData = libraryData.minified?.[minifier]
19+
if (minifierData?.result?.data) {
20+
let value: number
21+
if (metric === 'time') {
22+
value = Math.round(minifierData.result.data.time || 0)
23+
} else {
24+
// compression ratio
25+
const originalSize = libraryData.size
26+
const minifiedBytes = minifierData.result.data.minifiedBytes || 0
27+
value = Math.round(((originalSize - minifiedBytes) / originalSize) * 100 * 10) / 10
28+
}
29+
30+
data.push({
31+
name: minifier === '@swc/core' ? 'SWC' :
32+
minifier === 'uglify-js' ? 'UglifyJS' :
33+
minifier === 'oxc-minify' ? 'OXC' :
34+
minifier === 'esbuild' ? 'ESBuild' :
35+
minifier === 'terser' ? 'Terser' : minifier,
36+
value,
37+
fill: minifier === 'terser' ? '#8b5cf6' :
38+
minifier === 'esbuild' ? '#059669' :
39+
minifier === '@swc/core' ? '#0ea5e9' :
40+
minifier === 'uglify-js' ? '#dc2626' :
41+
minifier === 'oxc-minify' ? '#f59e0b' : '#6b7280'
42+
})
43+
}
44+
})
45+
46+
return data
47+
}
48+
49+
// Transform minification time data across libraries for popular minifiers (for overview stats)
1050
const minificationTimeData = Object.keys(minificationData).map(library => {
1151
const libraryData = (minificationData as any)[library]
1252
const result: any = { name: library }
@@ -51,6 +91,8 @@ function MinificationBenchmarks({ selectedMetric, setSelectedMetric }: Minificat
5191
]
5292

5393
const currentMetric = minificationMetrics.find(m => m.id === selectedMetric) || minificationMetrics[0]
94+
const metricType = selectedMetric === 'minTime' ? 'time' : 'compression'
95+
const unit = selectedMetric === 'minTime' ? 'ms' : '%'
5496

5597
return (
5698
<>
@@ -74,40 +116,47 @@ function MinificationBenchmarks({ selectedMetric, setSelectedMetric }: Minificat
74116
</nav>
75117

76118
<main className="dashboard-main">
77-
<div className="chart-container">
78-
<h2>{currentMetric.name}</h2>
79-
<ResponsiveContainer width="100%" height={400}>
80-
{/* Minification charts - multi-bar charts for comparing minifiers */}
81-
<BarChart data={currentMetric.data}>
82-
<CartesianGrid strokeDasharray="3 3" stroke="#e5e7eb" />
83-
<XAxis
84-
dataKey="name"
85-
tick={{ fill: '#374151', fontSize: 12 }}
86-
axisLine={{ stroke: '#d1d5db' }}
87-
tickLine={{ stroke: '#d1d5db' }}
88-
/>
89-
<YAxis
90-
tick={{ fill: '#374151', fontSize: 12 }}
91-
axisLine={{ stroke: '#d1d5db' }}
92-
tickLine={{ stroke: '#d1d5db' }}
93-
/>
94-
<Tooltip
95-
contentStyle={{
96-
backgroundColor: 'white',
97-
border: '1px solid #d1d5db',
98-
borderRadius: '0.5rem',
99-
color: '#111827',
100-
boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)'
101-
}}
102-
/>
103-
<Legend wrapperStyle={{ color: '#374151' }} />
104-
<Bar dataKey="terser" fill="#8b5cf6" name="Terser" />
105-
<Bar dataKey="esbuild" fill="#059669" name="ESBuild" />
106-
<Bar dataKey="@swc/core" fill="#0ea5e9" name="SWC" />
107-
<Bar dataKey="uglify-js" fill="#dc2626" name="UglifyJS" />
108-
<Bar dataKey="oxc-minify" fill="#f59e0b" name="OXC" />
109-
</BarChart>
110-
</ResponsiveContainer>
119+
{/* Individual Charts for Each Library */}
120+
<div className="library-charts-grid">
121+
{libraries.map(library => {
122+
const libraryData = getLibraryData(library, metricType)
123+
124+
return (
125+
<div key={library} className="library-chart-container">
126+
<h3 className="library-title">{library}</h3>
127+
<ResponsiveContainer width="100%" height={300}>
128+
<BarChart data={libraryData} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>
129+
<CartesianGrid strokeDasharray="3 3" stroke="#e5e7eb" />
130+
<XAxis
131+
dataKey="name"
132+
tick={{ fill: '#374151', fontSize: 11 }}
133+
axisLine={{ stroke: '#d1d5db' }}
134+
tickLine={{ stroke: '#d1d5db' }}
135+
angle={-45}
136+
textAnchor="end"
137+
height={60}
138+
/>
139+
<YAxis
140+
tick={{ fill: '#374151', fontSize: 11 }}
141+
axisLine={{ stroke: '#d1d5db' }}
142+
tickLine={{ stroke: '#d1d5db' }}
143+
/>
144+
<Tooltip
145+
contentStyle={{
146+
backgroundColor: 'white',
147+
border: '1px solid #d1d5db',
148+
borderRadius: '0.5rem',
149+
color: '#111827',
150+
boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)'
151+
}}
152+
formatter={(value: any) => [`${value}${unit}`, currentMetric.name]}
153+
/>
154+
<Bar dataKey="value" />
155+
</BarChart>
156+
</ResponsiveContainer>
157+
</div>
158+
)
159+
})}
111160
</div>
112161

113162
<div className="stats-grid">

0 commit comments

Comments
 (0)