import type { Point2D } from "../engine/shared/types"; export interface ViewportConfig { maxX: number; maxY: number; width?: number; height?: number; padding?: { top: number; right: number; bottom: number; left: number; }; xStep?: number; yStep?: number; } export interface ViewportTransform { width: number; height: number; padding: { top: number; right: number; bottom: number; left: number; }; plotWidth: number; plotHeight: number; maxX: number; maxY: number; toScreenX: (x: number) => number; toScreenY: (y: number) => number; toModelX: (sx: number) => number; toModelY: (sy: number) => number; } export interface RegionLayerSpec { id: string; points: Point2D[]; fill: string; stroke?: string; opacity?: number; label?: string; } export interface PolylineLayerSpec { id: string; points: Point2D[]; color: string; width?: number; dashed?: boolean; label?: string; labelPos?: Point2D; opacity?: number; } export interface CurveLayerSpec { id: string; fn: (x: number) => number | null; xMin?: number; xMax?: number; color: string; width?: number; dashed?: boolean; label?: string; labelAtX?: number; steps?: number; } export interface GuideLayerSpec { id: string; point?: Point2D; verticalX?: number; horizontalY?: number; color?: string; dashed?: boolean; labelX?: string; labelY?: string; topLabel?: string; } export interface PointLayerSpec { id: string; x: number; y: number; label: string; sublabel?: string; color: string; radius?: number; labelOffset?: { dx: number; dy: number; }; } export interface ArrowLayerSpec { id: string; from: Point2D; to: Point2D; color: string; label?: string; dashed?: boolean; } export interface LegendItem { label: string; color: string; style?: "solid" | "dashed" | "area" | "point"; } export interface GraphSpec { title: string; subtitle?: string; xAxis: { label: string; unit?: string; max: number; step?: number; }; yAxis: { label: string; unit?: string; max: number; step?: number; }; regions?: RegionLayerSpec[]; polylines?: PolylineLayerSpec[]; curves?: CurveLayerSpec[]; guides?: GuideLayerSpec[]; arrows?: ArrowLayerSpec[]; points?: PointLayerSpec[]; legends?: LegendItem[]; tooltipEvaluator?: (x: number, y: number) => { label: string; value: string }[]; }