import type { StoreApi } from 'zustand' export type TransformType = 'data' | 'config' export interface TransformDescriptor { id: string type: TransformType order: number disables?: string[] replaceMergeKeys?: string[] } export type TransformFn = (input: unknown) => unknown export interface Transform extends TransformDescriptor { fn: TransformFn enabled: boolean } export interface TransformPair { descriptor: TransformDescriptor fn: TransformFn } export interface WidgetState { rawData: unknown data: unknown dataTransforms: readonly Transform[] configTransforms: readonly Transform[] transformStates: Record isLoading: boolean isFetching: boolean error: unknown /** * Original formatter as supplied by the consumer (Provider's `formatter` * prop). Always live-synced — never overridden by actions. Actions that need * to display a different formatter (e.g. {@link RelativeData}'s percent * formatter) should write to {@link WidgetState.formatter} and read this * field when restoring the absolute view. */ rawFormatter?: (value: number) => string /** * Active formatter — what consumer code (tooltips, axis labels, legends, * etc.) reads. Defaults to {@link WidgetState.rawFormatter}; actions may * override it temporarily and restore it from `rawFormatter` later. */ formatter?: (value: number) => string labelFormatter?: (value: string | number) => string | number } export interface WidgetInit { data: unknown isLoading?: boolean isFetching?: boolean error?: unknown formatter?: (value: number) => string labelFormatter?: (value: string | number) => string | number } export type WidgetStoreApi = StoreApi