import type { ChartAnimationOptions, ChartCursorPresentation, DomChartDefinition, ChartFocusState, ChartHostControl, ChartHostControlExtensionToken, ChartMotionTransition, ChartMarkRenderer, ChartPoint, ChartScene, ChartSvgRenderer, ChartTextMeasurer, ChartTooltipBodyContext, ChartTooltipExtensionToken, ChartTooltipOptions, ChartTooltipPlacement, ChartTooltipPortalExtensionToken, ChartTooltipPortalOptions, ChartTooltipPosition, ChartValue, RenderChartOptions, RenderChartSvgOptions } from './types.js'; export interface ChartHostControlExtension extends ChartHostControlExtensionToken { create: (context: ChartHostControlExtensionContext) => ChartHostControlInstance; } export interface ChartHostControlExtensionContext { container: HTMLElement; surface: ChartSurface; } export interface ChartHostControlInstance { update: (control: ChartHostControl, scene: ChartScene) => void; contains?: (target: EventTarget | null) => boolean; destroy: () => void; } export interface ChartSurfaceRenderOptions extends RenderChartOptions { animation?: ChartAnimationOptions; } export interface ChartPointerResolution { /** Pointer position in the chart scene coordinate system. */ position: ChartTooltipPosition; /** Primary point selected by the definition's focus strategy. */ point: ChartPoint; /** Complete focus group, with the primary point first. */ points: readonly ChartPoint[]; } export interface ChartControlledFocusOptions { /** Semantic input source exposed to focus marks and tooltips. */ source?: 'pointer' | 'programmatic'; /** Makes an enabled tooltip interactive until focus is cleared. */ pinned?: boolean; } export interface ChartInteractionController { /** Converts browser client coordinates into the chart scene coordinate system. */ clientToScene: (clientX: number, clientY: number) => ChartTooltipPosition | null; /** Resolves browser client coordinates through the current presentation. */ resolvePointer: (clientX: number, clientY: number) => ChartPointerResolution | null; /** Paints or clears application-owned focus without selecting a point. */ setControlledFocus: (target: ChartPointerResolution | ChartPoint | null, options?: ChartControlledFocusOptions) => void; } export interface ChartSurface { readonly renderer: ChartRenderer; readonly element: Element; /** Ordered child surfaces when this surface composes multiple renderers. */ readonly layers?: readonly ChartSurface[]; /** Topmost surface element owned by the chart's default renderer. */ readonly defaultElement?: Element; render: (scene: ChartScene, options: ChartSurfaceRenderOptions) => void; /** Optional client-coordinate conversion used by controlled pointer gestures. */ clientToScene?: (scene: ChartScene, clientX: number, clientY: number) => { x: number; y: number; } | null; /** Renderer-owned point geometry while a scene transition is active. */ getPresentationPoints?: () => readonly ChartPoint[] | undefined; /** Notifies the host when renderer-owned point geometry advances. */ subscribePresentationPoints?: (listener: (points: readonly ChartPoint[]) => void) => () => void; /** * Paints focus and may return a destination scene for interaction during a * transition. A returned scene preserves the rendered scene's layout. */ paintFocus: (focus: ChartFocusState | null, pointer?: ChartTooltipPosition | null, cursor?: ChartCursorPresentation | null) => ChartScene | void; destroy: () => void; } export interface ChartTooltipMotionSnapshot { wasHidden: boolean; showPresence: boolean; previousLeft?: number; previousTop?: number; movementX: number; movementY: number; velocityX: number; velocityY: number; presence?: { opacity: number; scale: number; }; } export interface ChartTooltipMotionController { beforePaint: (element: HTMLElement) => ChartTooltipMotionSnapshot; afterPaint: (element: HTMLElement, snapshot: ChartTooltipMotionSnapshot, transition: false | ChartMotionTransition | undefined) => void; hide: (element: HTMLElement, transition: false | ChartMotionTransition | undefined, complete: () => void) => boolean; destroy: (element: HTMLElement | undefined) => void; } export interface ChartRendererTooltipMotionCapability { readonly protocol: 1; createController: (context: { container: HTMLElement; transition: () => false | ChartMotionTransition | undefined; }) => ChartTooltipMotionController; } export interface ChartRendererCapabilities { readonly tooltipMotion?: ChartRendererTooltipMotionCapability; } export interface ChartRenderer { readonly id: string; readonly capabilities?: ChartRendererCapabilities; prerender: (scene: ChartScene, options: RenderChartOptions) => string; mount: (container: HTMLElement, requestRender: (force?: boolean) => void) => ChartSurface; } export interface ChartLayerRenderer extends ChartRenderer, ChartMarkRenderer { compose: (defaultRenderer: ChartRenderer) => ChartRenderer; } /** A definition-agnostic renderer that acquires chart types from its host. */ export interface UniversalChartRenderer { readonly id: string; readonly capabilities?: ChartRendererCapabilities; prerender: (scene: ChartScene, options: RenderChartOptions) => string; mount: (container: HTMLElement, requestRender: (force?: boolean) => void) => ChartSurface; } export interface UniversalChartLayerRenderer extends UniversalChartRenderer, ChartMarkRenderer { compose: (defaultRenderer: ChartRenderer) => ChartRenderer; } export interface ChartRendererRenderContext { container: HTMLElement; scene: ChartScene; surface: ChartSurface; interaction: ChartInteractionController; } export interface ChartTooltipBodyTarget extends ChartTooltipBodyContext { element: HTMLElement; } export interface ChartTooltipExtension extends ChartTooltipExtensionToken<'dom'> { create: (context: ChartTooltipExtensionContext) => ChartTooltipExtensionInstance; } export interface ChartTooltipExtensionContext { container: HTMLElement; motion?: ChartTooltipMotionController; dismiss: () => void; bodyChange: () => ((target: ChartTooltipBodyTarget | null) => void) | undefined; } export interface ChartTooltipPaintContext { point: ChartPoint; points: readonly ChartPoint[]; scene: ChartScene; surface: ChartSurface; pointer: ChartTooltipPosition | null; focus: ChartFocusState; pinned: boolean; } export interface ChartTooltipExtensionInstance { update: (options: ChartTooltipOptions) => void; paint: (context: ChartTooltipPaintContext) => void; hide: () => void; contains: (target: EventTarget | null) => boolean; destroy: () => void; } export interface ChartTooltipPortalExtension extends ChartTooltipPortalExtensionToken { create: (context: ChartTooltipPortalExtensionContext, options: ChartTooltipPortalOptions) => ChartTooltipPortalExtensionInstance; } export interface ChartTooltipPortalExtensionContext { container: HTMLElement; element: HTMLElement; schedulePosition: () => void; } export interface ChartTooltipPortalPositionContext { scene: ChartScene; surface: ChartSurface; anchor: ChartTooltipPosition; placement?: 'auto' | ChartTooltipPlacement | readonly ChartTooltipPlacement[]; offset?: number; } export interface ChartTooltipPortalExtensionInstance { update: (options: ChartTooltipPortalOptions) => void; position: (context: ChartTooltipPortalPositionContext) => boolean; hide: () => void; destroy: () => void; } export interface ChartRenderContext { container: HTMLElement; svg: SVGSVGElement; scene: ChartScene; surface: ChartSurface; interaction: ChartInteractionController; } export interface ChartHostCommonOptions extends RenderChartSvgOptions { height?: number; aspectRatio?: number; width?: number; initialWidth?: number; onFocusChange?: (point: ChartPoint | null) => void; onFocusGroupChange?: (points: readonly ChartPoint[]) => void; onSelect?: (point: ChartPoint | null) => void; onRender?: (context: ChartRenderContext) => void; renderSvg?: ChartSvgRenderer, NoInfer, NoInfer>; measureText?: ChartTextMeasurer; } export interface ChartRendererHostCommonOptions extends RenderChartOptions { renderer: ChartRenderer, NoInfer, NoInfer>; height?: number; aspectRatio?: number; width?: number; initialWidth?: number; onFocusChange?: (point: ChartPoint | null) => void; onFocusGroupChange?: (points: readonly ChartPoint[]) => void; onSelect?: (point: ChartPoint | null) => void; onRender?: (context: ChartRendererRenderContext) => void; onTooltipBodyChange?: (target: ChartTooltipBodyTarget, NoInfer, NoInfer> | null) => void; measureText?: ChartTextMeasurer; } export type ChartRendererHostOptions = ChartRendererHostCommonOptions & { definition: DomChartDefinition; }; export type ChartHostOptions = ChartHostCommonOptions & { definition: DomChartDefinition; }; export interface ChartHost { readonly interaction: ChartInteractionController; update: (options: ChartHostOptions) => void; getScene: () => ChartScene; destroy: () => void; } export interface ChartRendererHost { readonly interaction: ChartInteractionController; update: (options: ChartRendererHostOptions) => void; getScene: () => ChartScene; destroy: () => void; }