/** * Chart theme utility — maps Fluent UI v9 design tokens to Recharts-compatible * CSS colour strings. * * Recharts renders SVG elements and sets colour values as SVG attributes, not * CSS properties. SVG attributes do not support CSS custom-property * references (`var(…)`), so token values must be resolved to their actual * colour strings at render time via `getComputedStyle`. * * Call `resolveFluentToken` inside a component (not at module level) so that * the resolved value reflects the theme that is active when the component * renders. */ import { tokens } from "@fluentui/react-components"; // --------------------------------------------------------------------------- // Runtime resolver // --------------------------------------------------------------------------- /** * Resolves a Fluent UI v9 token string (e.g. `tokens.colorNeutralForeground2`) * to the literal CSS colour value defined in the active theme. * * @param tokenValue - A Fluent v9 token string such as * `"var(--colorNeutralForeground2)"`. * @returns The resolved colour string (e.g. `"#605e5c"`), or the original * token value if resolution fails. */ export function resolveFluentToken(tokenValue: string): string { const match = /var\((--[^,)]+)/.exec(tokenValue); if (match == null || match[1] == null) return tokenValue; // FluentProvider injects CSS custom properties on its own wrapper
, // not on :root. Query that element so we resolve actual colour values. const el = document.querySelector(".fui-FluentProvider") ?? document.documentElement; const resolved = getComputedStyle(el) .getPropertyValue(match[1]) .trim(); return resolved !== "" ? resolved : tokenValue; } // --------------------------------------------------------------------------- // Categorical palette // --------------------------------------------------------------------------- /** * Five distinct categorical colours for pie/bar slices and line series, * expressed as Fluent UI v9 CSS custom-property references. * * Resolve at render time with `resolveFluentToken` before passing to * Recharts components. */ export const CHART_PALETTE: readonly string[] = [ tokens.colorPaletteBlueBorderActive, tokens.colorPaletteRedBorderActive, tokens.colorPaletteGreenBorderActive, tokens.colorPaletteGoldBorderActive, tokens.colorPalettePurpleBorderActive, ] as const; // --------------------------------------------------------------------------- // Structural colours // --------------------------------------------------------------------------- /** Fluent token for axis labels and tick text — resolves per active theme. */ export const CHART_AXIS_TEXT_TOKEN: string = tokens.colorNeutralForeground2; /** Fluent token for CartesianGrid lines — resolves per active theme. */ export const CHART_GRID_LINE_TOKEN: string = tokens.colorNeutralStroke2; /** Fluent token for tooltip background — resolves per active theme. */ export const CHART_TOOLTIP_BG_TOKEN: string = tokens.colorNeutralBackground1; /** Fluent token for tooltip text — resolves per active theme. */ export const CHART_TOOLTIP_TEXT_TOKEN: string = tokens.colorNeutralForeground1;