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]; // Helper to extract item config from a payload. 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 && 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); }