mirror of
https://github.com/supabase/supabase.git
synced 2026-09-08 19:08:44 +08:00
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? This fixes the following: - Our `<MetricCard />` and `<LogsBarChart />` which use `<ChartTitle />` were rendering the wrong font style for the title. The `font-mono` class being overwritten by recent changes, this helps sort cascade so it renders correct. - In our design system, the warning variable for charts was rendering black, this should be fixed to be our warning yellow. - There was an odd padding on `<MetricsCard />` content area, meaning our line chart wasn't flush to the edges, this required a small extension to `twMerge` so it could resolve. Please have a look around studio in places we have charts to double check nothing is broken. Also compare live design system vs. this branch by checking Logs Bar Chart, Charts and Metrics Card pages. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Style** * Refined heading typography for more consistent font and weight styling. * Improved class merging for custom spacing utilities. * **Bug Fixes** * Adjusted composed chart Y-axis sizing for clearer layouts. * Improved warning color fallbacks in log bar charts. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
143 lines
3.9 KiB
TypeScript
143 lines
3.9 KiB
TypeScript
'use client'
|
|
|
|
import { BarChart2, ExternalLink } from 'lucide-react'
|
|
import { useEffect, useState } from 'react'
|
|
import {
|
|
Chart,
|
|
ChartActions,
|
|
ChartBar,
|
|
ChartCard,
|
|
ChartContent,
|
|
ChartEmptyState,
|
|
ChartHeader,
|
|
ChartLine,
|
|
ChartLoadingState,
|
|
ChartTitle,
|
|
} from 'ui-patterns/Chart'
|
|
|
|
export default function ComposedChartBasic() {
|
|
const [isLoading, setIsLoading] = useState(true)
|
|
|
|
const actions = [
|
|
{
|
|
label: 'Open in Logs Explorer',
|
|
onClick: () => {
|
|
alert('Ta da! You clicked me! 🎉')
|
|
},
|
|
icon: <ExternalLink size={12} />,
|
|
},
|
|
]
|
|
|
|
const data = Array.from({ length: 40 }, (_, i) => {
|
|
const date = new Date()
|
|
date.setMinutes(date.getMinutes() - i * 3) // Each point 3 minutes apart
|
|
|
|
const progress = i / 40
|
|
const standard_score = Math.floor(55 + progress * 55 + (Math.random() - 0.5) * 12)
|
|
const performance = Math.floor(35 + progress * 35 + (Math.random() - 0.5) * 10)
|
|
const efficiency = Math.floor(25 + progress * 25 + (Math.random() - 0.5) * 12)
|
|
|
|
return {
|
|
timestamp: date.toISOString(),
|
|
standard_score: Math.max(0, Math.min(100, standard_score)),
|
|
performance: Math.max(0, Math.min(100, performance)),
|
|
efficiency: Math.max(0, Math.min(100, efficiency)),
|
|
}
|
|
}).reverse()
|
|
|
|
const chartConfig = {
|
|
standard_score: {
|
|
label: 'Standard Score',
|
|
color: 'hsl(var(--brand-default))',
|
|
},
|
|
performance: {
|
|
label: 'Performance',
|
|
color: 'hsl(var(--chart-2))',
|
|
},
|
|
efficiency: {
|
|
label: 'Efficiency',
|
|
color: 'hsl(var(--chart-5))',
|
|
},
|
|
}
|
|
|
|
useEffect(() => {
|
|
setTimeout(() => {
|
|
setIsLoading(false)
|
|
}, 1000)
|
|
}, [])
|
|
|
|
return (
|
|
<div className="flex flex-col gap-6 w-8/12">
|
|
<Chart isLoading={isLoading}>
|
|
<ChartCard>
|
|
<ChartHeader>
|
|
<ChartTitle tooltip="This is a tooltip">Standard Bar Chart</ChartTitle>
|
|
<ChartActions actions={actions} />
|
|
</ChartHeader>
|
|
<ChartContent
|
|
isEmpty={data.length === 0}
|
|
emptyState={
|
|
<ChartEmptyState
|
|
icon={<BarChart2 size={16} />}
|
|
title="No data to show"
|
|
description="It may take up to 24 hours for data to refresh"
|
|
/>
|
|
}
|
|
loadingState={<ChartLoadingState />}
|
|
>
|
|
<div className="h-40">
|
|
<ChartBar
|
|
data={data}
|
|
dataKey="standard_score"
|
|
showGrid={false}
|
|
showYAxis={true}
|
|
YAxisProps={{
|
|
tickFormatter: (value) => `${value}k`,
|
|
width: 36,
|
|
}}
|
|
isFullHeight={true}
|
|
/>
|
|
</div>
|
|
</ChartContent>
|
|
</ChartCard>
|
|
</Chart>
|
|
|
|
<Chart isLoading={isLoading}>
|
|
<ChartCard>
|
|
<ChartHeader>
|
|
<ChartTitle tooltip="This is a tooltip">Standard Line Chart</ChartTitle>
|
|
<ChartActions actions={actions} />
|
|
</ChartHeader>
|
|
<ChartContent
|
|
isEmpty={data.length === 0}
|
|
emptyState={
|
|
<ChartEmptyState
|
|
icon={<BarChart2 size={16} />}
|
|
title="No data to show"
|
|
description="It may take up to 24 hours for data to refresh"
|
|
/>
|
|
}
|
|
loadingState={<ChartLoadingState />}
|
|
>
|
|
<div className="h-40">
|
|
<ChartLine
|
|
data={data}
|
|
dataKey="standard_score"
|
|
dataKeys={['standard_score', 'performance', 'efficiency']}
|
|
config={chartConfig}
|
|
showGrid={true}
|
|
showYAxis={true}
|
|
YAxisProps={{
|
|
tickFormatter: (value) => `${value}k`,
|
|
width: 36,
|
|
}}
|
|
isFullHeight={true}
|
|
/>
|
|
</div>
|
|
</ChartContent>
|
|
</ChartCard>
|
|
</Chart>
|
|
</div>
|
|
)
|
|
}
|