import type { Tooltip } from "layerchart"; import { getContext, setContext, type Component, type ComponentProps, type Snippet, } from "svelte"; export const THEMES = { light: "", dark: ".dark" } as const; export type ChartConfig = { [k in string]: { label?: string; icon?: Component; } & ( | { color?: string; theme?: never } | { color?: never; theme: Record } ); }; export type ExtractSnippetParams = T extends Snippet<[infer P]> ? P : never; export type TooltipPayload = ExtractSnippetParams< ComponentProps["children"] >["payload"][number]; export function getPayloadConfigFromPayload( config: ChartConfig, payload: TooltipPayload, key: string, ) { if (typeof payload !== "object" || payload === null) return undefined; const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : undefined; let configLabelKey: string = key; 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; } return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config]; } type ChartContextValue = { config: ChartConfig; }; const chartContextKey = Symbol("chart-context"); export function setChartContext(value: ChartContextValue) { return setContext(chartContextKey, value); } export function useChart() { return getContext(chartContextKey); }