/** * @file chart.types.ts * Core type definitions for chart state and actions * Based on Phase 11 plan: Interactive Charts & Visualizations */ /** * Chart state manages data, visualization config, and interactivity */ export interface ChartState { data: T[]; filteredData: T[]; spec: PlotSpec; dimensions: { width: number; height: number; }; selection: SelectionState; transform: ZoomTransform; targetTransform?: ZoomTransform; isAnimating: boolean; transitionDuration: number; } /** * Selection state for different selection modes */ export interface SelectionState { type: 'none' | 'point' | 'range' | 'brush'; selectedData: T[]; selectedIndices: number[]; brushExtent?: [[number, number], [number, number]]; range?: [number, number]; } /** * Zoom transform state */ export interface ZoomTransform { x: number; y: number; k: number; } /** * Observable Plot specification * This will be passed to Plot.plot() */ export interface PlotSpec { marks?: any[]; width?: number; height?: number; marginLeft?: number; marginRight?: number; marginTop?: number; marginBottom?: number; x?: any; y?: any; color?: any; [key: string]: any; } /** * Chart actions */ export type ChartAction = { type: 'setData'; data: T[]; } | { type: 'filterData'; predicate: (d: T) => boolean; } | { type: 'clearFilters'; } | { type: 'selectPoint'; data: T; index: number; } | { type: 'selectRange'; range: [number, number]; } | { type: 'brushStart'; position: [number, number]; } | { type: 'brushMove'; extent: [[number, number], [number, number]]; } | { type: 'brushEnd'; } | { type: 'clearSelection'; } | { type: 'zoom'; transform: ZoomTransform; } | { type: 'zoomAnimated'; targetTransform: ZoomTransform; } | { type: 'zoomProgress'; transform: ZoomTransform; } | { type: 'zoomComplete'; } | { type: 'resetZoom'; } | { type: 'resize'; dimensions: { width: number; height: number; }; } | { type: 'updateSpec'; spec: Partial; }; /** * Chart configuration */ export interface ChartConfig { x?: string | ((d: any) => any); y?: string | ((d: any) => any); color?: string | ((d: any) => any); size?: string | ((d: any) => any); xDomain?: [number, number] | 'auto'; yDomain?: [number, number] | 'auto'; enableZoom?: boolean; enableBrush?: boolean; enableTooltip?: boolean; enableAnimations?: boolean; transitionDuration?: number; } /** * Data transform operations */ export type DataTransform = (data: T[]) => T[]; export interface DataTransforms { filter: (predicate: (d: any) => boolean) => DataTransform; groupBy: (key: string | ((d: any) => string)) => DataTransform; aggregate: (operation: 'sum' | 'mean' | 'median' | 'count', field: string) => DataTransform; sortBy: (field: string, order: 'asc' | 'desc') => DataTransform; bin: (field: string, thresholds: number | number[]) => DataTransform; rollup: (window: number, operation: (values: number[]) => number) => DataTransform; } //# sourceMappingURL=chart.types.d.ts.map