2025-11-24 01:00:50 +01:00
|
|
|
import type { Tooltip } from 'layerchart';
|
|
|
|
|
import { getContext, setContext, type Component, type ComponentProps, type Snippet } from 'svelte';
|
2025-11-21 12:18:04 +01:00
|
|
|
|
2025-11-24 01:00:50 +01:00
|
|
|
export const THEMES = { light: '', dark: '.dark' } as const;
|
2025-11-21 12:18:04 +01:00
|
|
|
|
|
|
|
|
export type ChartConfig = {
|
2025-11-24 01:00:50 +01:00
|
|
|
[k in string]: {
|
|
|
|
|
label?: string;
|
|
|
|
|
icon?: Component;
|
|
|
|
|
} & ({ color?: string; theme?: never } | { color?: never; theme: Record<keyof typeof THEMES, string> });
|
2025-11-21 12:18:04 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export type ExtractSnippetParams<T> = T extends Snippet<[infer P]> ? P : never;
|
|
|
|
|
|
2025-11-24 01:00:50 +01:00
|
|
|
export type TooltipPayload = ExtractSnippetParams<ComponentProps<typeof Tooltip.Root>['children']>['payload'][number];
|
2025-11-21 12:18:04 +01:00
|
|
|
|
|
|
|
|
// Helper to extract item config from a payload.
|
2025-11-24 01:00:50 +01:00
|
|
|
export function getPayloadConfigFromPayload(config: ChartConfig, payload: TooltipPayload, key: string) {
|
|
|
|
|
if (typeof payload !== 'object' || payload === null) return undefined;
|
2025-11-21 12:18:04 +01:00
|
|
|
|
2025-11-24 01:00:50 +01:00
|
|
|
const payloadPayload =
|
|
|
|
|
'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null
|
|
|
|
|
? payload.payload
|
|
|
|
|
: undefined;
|
2025-11-21 12:18:04 +01:00
|
|
|
|
2025-11-24 01:00:50 +01:00
|
|
|
let configLabelKey: string = key;
|
2025-11-21 12:18:04 +01:00
|
|
|
|
2025-11-24 01:00:50 +01:00
|
|
|
if (payload.key === key) {
|
|
|
|
|
configLabelKey = payload.key;
|
|
|
|
|
} else if (payload.name === key) {
|
|
|
|
|
configLabelKey = payload.name;
|
|
|
|
|
} else if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {
|
|
|
|
|
configLabelKey = payload[key as keyof typeof payload] as string;
|
|
|
|
|
} else if (
|
|
|
|
|
payloadPayload !== undefined &&
|
|
|
|
|
key in payloadPayload &&
|
|
|
|
|
typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'
|
|
|
|
|
) {
|
|
|
|
|
configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;
|
|
|
|
|
}
|
2025-11-21 12:18:04 +01:00
|
|
|
|
2025-11-24 01:00:50 +01:00
|
|
|
return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config];
|
2025-11-21 12:18:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ChartContextValue = {
|
2025-11-24 01:00:50 +01:00
|
|
|
config: ChartConfig;
|
2025-11-21 12:18:04 +01:00
|
|
|
};
|
|
|
|
|
|
2025-11-24 01:00:50 +01:00
|
|
|
const chartContextKey = Symbol('chart-context');
|
2025-11-21 12:18:04 +01:00
|
|
|
|
|
|
|
|
export function setChartContext(value: ChartContextValue) {
|
2025-11-24 01:00:50 +01:00
|
|
|
return setContext(chartContextKey, value);
|
2025-11-21 12:18:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useChart() {
|
2025-11-24 01:00:50 +01:00
|
|
|
return getContext<ChartContextValue>(chartContextKey);
|
2025-11-21 12:18:04 +01:00
|
|
|
}
|