fix(dashboard): theme-aware chart tooltip styles
Replace invalid hsl(var(--accent) / ...) cursors with color-mix against the real --color-foreground token, and style tooltip content/box with --color-popover so it matches the dark theme instead of rendering as a white box on a black cursor. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,24 @@ const STATE_COLORS: Record<PartState, string> = {
|
|||||||
const LINE_BLUE = 'hsl(217 91% 60%)';
|
const LINE_BLUE = 'hsl(217 91% 60%)';
|
||||||
const FAILURE_COLOR = 'hsl(0 84% 60%)';
|
const FAILURE_COLOR = 'hsl(0 84% 60%)';
|
||||||
|
|
||||||
|
const TOOLTIP_CURSOR_FILL = 'color-mix(in oklch, var(--color-foreground) 8%, transparent)';
|
||||||
|
const TOOLTIP_CURSOR_STROKE = 'color-mix(in oklch, var(--color-foreground) 24%, transparent)';
|
||||||
|
const TOOLTIP_CONTENT_STYLE: React.CSSProperties = {
|
||||||
|
backgroundColor: 'var(--color-popover)',
|
||||||
|
border: '1px solid var(--color-border)',
|
||||||
|
borderRadius: '0.375rem',
|
||||||
|
color: 'var(--color-popover-foreground)',
|
||||||
|
fontSize: '0.8rem',
|
||||||
|
boxShadow: '0 4px 16px oklch(0 0 0 / 0.4)',
|
||||||
|
};
|
||||||
|
const TOOLTIP_ITEM_STYLE: React.CSSProperties = {
|
||||||
|
color: 'var(--color-popover-foreground)',
|
||||||
|
};
|
||||||
|
const TOOLTIP_LABEL_STYLE: React.CSSProperties = {
|
||||||
|
color: 'var(--color-muted-foreground)',
|
||||||
|
marginBottom: '0.125rem',
|
||||||
|
};
|
||||||
|
|
||||||
function currency(dollars: number): string {
|
function currency(dollars: number): string {
|
||||||
return dollars.toLocaleString(undefined, { style: 'currency', currency: 'USD' });
|
return dollars.toLocaleString(undefined, { style: 'currency', currency: 'USD' });
|
||||||
}
|
}
|
||||||
@@ -208,7 +226,12 @@ export default function Dashboard() {
|
|||||||
>
|
>
|
||||||
<XAxis dataKey="name" tick={{ fontSize: 12 }} />
|
<XAxis dataKey="name" tick={{ fontSize: 12 }} />
|
||||||
<YAxis tick={{ fontSize: 12 }} allowDecimals={false} />
|
<YAxis tick={{ fontSize: 12 }} allowDecimals={false} />
|
||||||
<Tooltip cursor={{ fill: 'hsl(var(--accent) / 0.2)' }} />
|
<Tooltip
|
||||||
|
cursor={{ fill: TOOLTIP_CURSOR_FILL }}
|
||||||
|
contentStyle={TOOLTIP_CONTENT_STYLE}
|
||||||
|
itemStyle={TOOLTIP_ITEM_STYLE}
|
||||||
|
labelStyle={TOOLTIP_LABEL_STYLE}
|
||||||
|
/>
|
||||||
<Bar dataKey="count" radius={[4, 4, 0, 0]}>
|
<Bar dataKey="count" radius={[4, 4, 0, 0]}>
|
||||||
{data.byState.map((s) => (
|
{data.byState.map((s) => (
|
||||||
<Cell key={s.state} fill={STATE_COLORS[s.state]} />
|
<Cell key={s.state} fill={STATE_COLORS[s.state]} />
|
||||||
@@ -251,6 +274,9 @@ export default function Dashboard() {
|
|||||||
formatter={(v: number) =>
|
formatter={(v: number) =>
|
||||||
v.toLocaleString(undefined, { style: 'currency', currency: 'USD' })
|
v.toLocaleString(undefined, { style: 'currency', currency: 'USD' })
|
||||||
}
|
}
|
||||||
|
contentStyle={TOOLTIP_CONTENT_STYLE}
|
||||||
|
itemStyle={TOOLTIP_ITEM_STYLE}
|
||||||
|
labelStyle={TOOLTIP_LABEL_STYLE}
|
||||||
/>
|
/>
|
||||||
<Legend />
|
<Legend />
|
||||||
</PieChart>
|
</PieChart>
|
||||||
@@ -270,7 +296,12 @@ export default function Dashboard() {
|
|||||||
<BarChart data={data.ageBuckets}>
|
<BarChart data={data.ageBuckets}>
|
||||||
<XAxis dataKey="label" tick={{ fontSize: 12 }} />
|
<XAxis dataKey="label" tick={{ fontSize: 12 }} />
|
||||||
<YAxis tick={{ fontSize: 12 }} allowDecimals={false} />
|
<YAxis tick={{ fontSize: 12 }} allowDecimals={false} />
|
||||||
<Tooltip cursor={{ fill: 'hsl(var(--accent) / 0.2)' }} />
|
<Tooltip
|
||||||
|
cursor={{ fill: TOOLTIP_CURSOR_FILL }}
|
||||||
|
contentStyle={TOOLTIP_CONTENT_STYLE}
|
||||||
|
itemStyle={TOOLTIP_ITEM_STYLE}
|
||||||
|
labelStyle={TOOLTIP_LABEL_STYLE}
|
||||||
|
/>
|
||||||
<Bar dataKey="count" fill="hsl(217 91% 60%)" radius={[4, 4, 0, 0]} />
|
<Bar dataKey="count" fill="hsl(217 91% 60%)" radius={[4, 4, 0, 0]} />
|
||||||
</BarChart>
|
</BarChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
@@ -297,7 +328,12 @@ export default function Dashboard() {
|
|||||||
tick={{ fontSize: 11 }}
|
tick={{ fontSize: 11 }}
|
||||||
width={180}
|
width={180}
|
||||||
/>
|
/>
|
||||||
<Tooltip cursor={{ fill: 'hsl(var(--accent) / 0.2)' }} />
|
<Tooltip
|
||||||
|
cursor={{ fill: TOOLTIP_CURSOR_FILL }}
|
||||||
|
contentStyle={TOOLTIP_CONTENT_STYLE}
|
||||||
|
itemStyle={TOOLTIP_ITEM_STYLE}
|
||||||
|
labelStyle={TOOLTIP_LABEL_STYLE}
|
||||||
|
/>
|
||||||
<Bar dataKey="count" fill="hsl(262 83% 58%)" radius={[0, 4, 4, 0]} />
|
<Bar dataKey="count" fill="hsl(262 83% 58%)" radius={[0, 4, 4, 0]} />
|
||||||
</BarChart>
|
</BarChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
@@ -323,7 +359,12 @@ export default function Dashboard() {
|
|||||||
>
|
>
|
||||||
<XAxis dataKey="label" tick={{ fontSize: 11 }} interval={3} />
|
<XAxis dataKey="label" tick={{ fontSize: 11 }} interval={3} />
|
||||||
<YAxis tick={{ fontSize: 12 }} allowDecimals={false} />
|
<YAxis tick={{ fontSize: 12 }} allowDecimals={false} />
|
||||||
<Tooltip cursor={{ stroke: 'hsl(var(--accent) / 0.4)' }} />
|
<Tooltip
|
||||||
|
cursor={{ stroke: TOOLTIP_CURSOR_STROKE }}
|
||||||
|
contentStyle={TOOLTIP_CONTENT_STYLE}
|
||||||
|
itemStyle={TOOLTIP_ITEM_STYLE}
|
||||||
|
labelStyle={TOOLTIP_LABEL_STYLE}
|
||||||
|
/>
|
||||||
<Line
|
<Line
|
||||||
type="monotone"
|
type="monotone"
|
||||||
dataKey="count"
|
dataKey="count"
|
||||||
|
|||||||
Reference in New Issue
Block a user