Files
supabase/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionInvocationsChart.tsx
Saxon Fletcher 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

115 lines
3.6 KiB
TypeScript

import { Rocket } from 'lucide-react'
import { useMemo } from 'react'
import {
Bar,
CartesianGrid,
BarChart as RechartBarChart,
ReferenceLine,
XAxis,
YAxis,
} from 'recharts'
import { ChartContainer, ChartTooltip, ChartTooltipContent } from 'ui'
import {
formatChartTimestamp,
getChartTimeRangeLabels,
INVOCATION_CHART_CONFIG,
} from './EdgeFunctionOverview.utils'
import type { InvocationChartDatum, InvocationUpdateAnnotation } from './EdgeFunctionOverview.utils'
interface EdgeFunctionInvocationsChartProps {
chartData: InvocationChartDatum[]
dateTimeFormat: string
onChartClick: () => void
updateAnnotation?: InvocationUpdateAnnotation
}
export const EdgeFunctionInvocationsChart = ({
chartData,
dateTimeFormat,
onChartClick,
updateAnnotation,
}: EdgeFunctionInvocationsChartProps) => {
const timeRangeLabels = useMemo(
() => getChartTimeRangeLabels(chartData, dateTimeFormat),
[chartData, dateTimeFormat]
)
return (
<div className="flex flex-col gap-1">
<div className="relative h-40 w-full overflow-visible">
<ChartContainer config={INVOCATION_CHART_CONFIG} className="aspect-auto! h-full! w-full!">
<RechartBarChart
data={chartData}
margin={{ top: 0, right: 0, left: 0, bottom: 0 }}
onClick={onChartClick}
>
<CartesianGrid vertical={false} />
<YAxis hide width={0} />
<XAxis
dataKey="timestamp"
tickLine={false}
axisLine={false}
tick={false}
minTickGap={32}
/>
<ChartTooltip
cursor={false}
content={
<ChartTooltipContent
className="text-foreground-light"
labelFormatter={(value) =>
formatChartTimestamp(value as string | number | undefined, dateTimeFormat)
}
indicator="dot"
/>
}
/>
<Bar
dataKey="error_count"
stackId="invocations"
fill="var(--color-error_count)"
maxBarSize={24}
/>
<Bar
dataKey="warning_count"
stackId="invocations"
fill="var(--color-warning_count)"
maxBarSize={24}
/>
<Bar
dataKey="ok_count"
stackId="invocations"
fill="var(--color-ok_count)"
maxBarSize={24}
/>
{updateAnnotation && (
<ReferenceLine
x={updateAnnotation.timestamp}
stroke="var(--foreground-default)"
strokeDasharray="4 4"
strokeWidth={1.5}
/>
)}
</RechartBarChart>
</ChartContainer>
{updateAnnotation && (
<span
className="pointer-events-none absolute bottom-0 z-10 flex h-6 w-6 -translate-x-1/2 translate-y-1/2 items-center justify-center rounded-full border border-foreground/20 bg-background text-foreground shadow-xs"
style={{ left: `${updateAnnotation.position}%` }}
title={`Updated ${formatChartTimestamp(updateAnnotation.updatedAt, dateTimeFormat)}`}
>
<Rocket size={12} strokeWidth={1.75} />
</span>
)}
</div>
{timeRangeLabels && (
<div className="-mt-6 flex items-center justify-between text-[10px] font-mono text-foreground-lighter">
<span>{timeRangeLabels.start}</span>
<span>{timeRangeLabels.end}</span>
</div>
)}
</div>
)
}