UNPKG

recharts

Version:
1,208 lines (1,130 loc) 35.6 kB
import { AriaAttributes, SVGProps, SyntheticEvent, ClipboardEvent, CompositionEvent, DragEvent, FocusEvent, FormEvent, KeyboardEvent, MouseEvent, TouchEvent, PointerEvent, UIEvent, WheelEvent, AnimationEvent, TransitionEvent, ReactNode, Component, isValidElement, FunctionComponent, ReactElement, } from 'react'; import _ from 'lodash'; import { ScaleContinuousNumeric as D3ScaleContinuousNumeric } from 'd3-scale'; export type StackOffsetType = 'sign' | 'expand' | 'none' | 'wiggle' | 'silhouette'; export type LayoutType = 'horizontal' | 'vertical' | 'centric' | 'radial'; export type PolarLayoutType = 'radial' | 'centric'; export type AxisType = 'xAxis' | 'yAxis' | 'angleAxis' | 'radiusAxis'; export type DataKey<T> = string | number | ((obj: T) => any); export type PresentationAttributesWithProps<P, T> = AriaAttributes & DOMAttributesWithProps<P, T> & Omit<SVGProps<T>, keyof DOMAttributesWithProps<P, T>>; export type PresentationAttributesAdaptChildEvent<P, T> = AriaAttributes & DOMAttributesAdaptChildEvent<P, T> & Omit<SVGProps<T>, keyof DOMAttributesAdaptChildEvent<P, T>>; export type SymbolType = 'circle' | 'cross' | 'diamond' | 'square' | 'star' | 'triangle' | 'wye'; export type LegendType = | 'plainline' | 'line' | 'square' | 'rect' | 'circle' | 'cross' | 'diamond' | 'star' | 'triangle' | 'wye' | 'none'; export type TooltipType = 'none'; export interface Coordinate { x: number; y: number; } export interface ChartCoordinate extends Coordinate { xAxis?: any; yAxis?: any; width?: any; height?: any; offset?: ChartOffset; angle?: number; radius?: number; cx?: number; cy?: number; startAngle?: number; endAngle?: number; innerRadius?: number; outerRadius?: number; } export type ScaleType = | 'auto' | 'linear' | 'pow' | 'sqrt' | 'log' | 'identity' | 'time' | 'band' | 'point' | 'ordinal' | 'quantile' | 'quantize' | 'utc' | 'sequential' | 'threshold'; // // Event Handler Types -- Copied from @types/react/index.d.ts and adapted for Props. // type EventHandler<P, E extends SyntheticEvent<any>> = { bivarianceHack(props: P, event: E): void; }['bivarianceHack']; type ReactEventHandler<P, T = Element> = EventHandler<P, SyntheticEvent<T>>; type ClipboardEventHandler<P, T = Element> = EventHandler<P, ClipboardEvent<T>>; type CompositionEventHandler<P, T = Element> = EventHandler<P, CompositionEvent<T>>; type DragEventHandler<P, T = Element> = EventHandler<P, DragEvent<T>>; type FocusEventHandler<P, T = Element> = EventHandler<P, FocusEvent<T>>; type FormEventHandler<P, T = Element> = EventHandler<P, FormEvent<T>>; type KeyboardEventHandler<P, T = Element> = EventHandler<P, KeyboardEvent<T>>; type MouseEventHandler<P, T = Element> = EventHandler<P, MouseEvent<T>>; type TouchEventHandler<P, T = Element> = EventHandler<P, TouchEvent<T>>; type PointerEventHandler<P, T = Element> = EventHandler<P, PointerEvent<T>>; type UIEventHandler<P, T = Element> = EventHandler<P, UIEvent<T>>; type WheelEventHandler<P, T = Element> = EventHandler<P, WheelEvent<T>>; type AnimationEventHandler<P, T = Element> = EventHandler<P, AnimationEvent<T>>; type TransitionEventHandler<P, T = Element> = EventHandler<P, TransitionEvent<T>>; export interface DOMAttributesWithProps<P, T> { children?: ReactNode; dangerouslySetInnerHTML?: { __html: string; }; // Clipboard Events onCopy?: ClipboardEventHandler<P, T>; onCopyCapture?: ClipboardEventHandler<P, T>; onCut?: ClipboardEventHandler<P, T>; onCutCapture?: ClipboardEventHandler<P, T>; onPaste?: ClipboardEventHandler<P, T>; onPasteCapture?: ClipboardEventHandler<P, T>; // Composition Events onCompositionEnd?: CompositionEventHandler<P, T>; onCompositionEndCapture?: CompositionEventHandler<P, T>; onCompositionStart?: CompositionEventHandler<P, T>; onCompositionStartCapture?: CompositionEventHandler<P, T>; onCompositionUpdate?: CompositionEventHandler<P, T>; onCompositionUpdateCapture?: CompositionEventHandler<P, T>; // Focus Events onFocus?: FocusEventHandler<P, T>; onFocusCapture?: FocusEventHandler<P, T>; onBlur?: FocusEventHandler<P, T>; onBlurCapture?: FocusEventHandler<P, T>; // Form Events onChange?: FormEventHandler<P, T>; onChangeCapture?: FormEventHandler<P, T>; onBeforeInput?: FormEventHandler<P, T>; onBeforeInputCapture?: FormEventHandler<P, T>; onInput?: FormEventHandler<P, T>; onInputCapture?: FormEventHandler<P, T>; onReset?: FormEventHandler<P, T>; onResetCapture?: FormEventHandler<P, T>; onSubmit?: FormEventHandler<P, T>; onSubmitCapture?: FormEventHandler<P, T>; onInvalid?: FormEventHandler<P, T>; onInvalidCapture?: FormEventHandler<P, T>; // Image Events onLoad?: ReactEventHandler<P, T>; onLoadCapture?: ReactEventHandler<P, T>; onError?: ReactEventHandler<P, T>; // also a Media Event onErrorCapture?: ReactEventHandler<P, T>; // also a Media Event // Keyboard Events onKeyDown?: KeyboardEventHandler<P, T>; onKeyDownCapture?: KeyboardEventHandler<P, T>; onKeyPress?: KeyboardEventHandler<P, T>; onKeyPressCapture?: KeyboardEventHandler<P, T>; onKeyUp?: KeyboardEventHandler<P, T>; onKeyUpCapture?: KeyboardEventHandler<P, T>; // Media Events onAbort?: ReactEventHandler<P, T>; onAbortCapture?: ReactEventHandler<P, T>; onCanPlay?: ReactEventHandler<P, T>; onCanPlayCapture?: ReactEventHandler<P, T>; onCanPlayThrough?: ReactEventHandler<P, T>; onCanPlayThroughCapture?: ReactEventHandler<P, T>; onDurationChange?: ReactEventHandler<P, T>; onDurationChangeCapture?: ReactEventHandler<P, T>; onEmptied?: ReactEventHandler<P, T>; onEmptiedCapture?: ReactEventHandler<P, T>; onEncrypted?: ReactEventHandler<P, T>; onEncryptedCapture?: ReactEventHandler<P, T>; onEnded?: ReactEventHandler<P, T>; onEndedCapture?: ReactEventHandler<P, T>; onLoadedData?: ReactEventHandler<P, T>; onLoadedDataCapture?: ReactEventHandler<P, T>; onLoadedMetadata?: ReactEventHandler<P, T>; onLoadedMetadataCapture?: ReactEventHandler<P, T>; onLoadStart?: ReactEventHandler<P, T>; onLoadStartCapture?: ReactEventHandler<P, T>; onPause?: ReactEventHandler<P, T>; onPauseCapture?: ReactEventHandler<P, T>; onPlay?: ReactEventHandler<P, T>; onPlayCapture?: ReactEventHandler<P, T>; onPlaying?: ReactEventHandler<P, T>; onPlayingCapture?: ReactEventHandler<P, T>; onProgress?: ReactEventHandler<P, T>; onProgressCapture?: ReactEventHandler<P, T>; onRateChange?: ReactEventHandler<P, T>; onRateChangeCapture?: ReactEventHandler<P, T>; onSeeked?: ReactEventHandler<P, T>; onSeekedCapture?: ReactEventHandler<P, T>; onSeeking?: ReactEventHandler<P, T>; onSeekingCapture?: ReactEventHandler<P, T>; onStalled?: ReactEventHandler<P, T>; onStalledCapture?: ReactEventHandler<P, T>; onSuspend?: ReactEventHandler<P, T>; onSuspendCapture?: ReactEventHandler<P, T>; onTimeUpdate?: ReactEventHandler<P, T>; onTimeUpdateCapture?: ReactEventHandler<P, T>; onVolumeChange?: ReactEventHandler<P, T>; onVolumeChangeCapture?: ReactEventHandler<P, T>; onWaiting?: ReactEventHandler<P, T>; onWaitingCapture?: ReactEventHandler<P, T>; // MouseEvents onAuxClick?: MouseEventHandler<P, T>; onAuxClickCapture?: MouseEventHandler<P, T>; onClick?: MouseEventHandler<P, T>; onClickCapture?: MouseEventHandler<P, T>; onContextMenu?: MouseEventHandler<P, T>; onContextMenuCapture?: MouseEventHandler<P, T>; onDoubleClick?: MouseEventHandler<P, T>; onDoubleClickCapture?: MouseEventHandler<P, T>; onDrag?: DragEventHandler<P, T>; onDragCapture?: DragEventHandler<P, T>; onDragEnd?: DragEventHandler<P, T>; onDragEndCapture?: DragEventHandler<P, T>; onDragEnter?: DragEventHandler<P, T>; onDragEnterCapture?: DragEventHandler<P, T>; onDragExit?: DragEventHandler<P, T>; onDragExitCapture?: DragEventHandler<P, T>; onDragLeave?: DragEventHandler<P, T>; onDragLeaveCapture?: DragEventHandler<P, T>; onDragOver?: DragEventHandler<P, T>; onDragOverCapture?: DragEventHandler<P, T>; onDragStart?: DragEventHandler<P, T>; onDragStartCapture?: DragEventHandler<P, T>; onDrop?: DragEventHandler<P, T>; onDropCapture?: DragEventHandler<P, T>; onMouseDown?: MouseEventHandler<P, T>; onMouseDownCapture?: MouseEventHandler<P, T>; onMouseEnter?: MouseEventHandler<P, T>; onMouseLeave?: MouseEventHandler<P, T>; onMouseMove?: MouseEventHandler<P, T>; onMouseMoveCapture?: MouseEventHandler<P, T>; onMouseOut?: MouseEventHandler<P, T>; onMouseOutCapture?: MouseEventHandler<P, T>; onMouseOver?: MouseEventHandler<P, T>; onMouseOverCapture?: MouseEventHandler<P, T>; onMouseUp?: MouseEventHandler<P, T>; onMouseUpCapture?: MouseEventHandler<P, T>; // Selection Events onSelect?: ReactEventHandler<P, T>; onSelectCapture?: ReactEventHandler<P, T>; // Touch Events onTouchCancel?: TouchEventHandler<P, T>; onTouchCancelCapture?: TouchEventHandler<P, T>; onTouchEnd?: TouchEventHandler<P, T>; onTouchEndCapture?: TouchEventHandler<P, T>; onTouchMove?: TouchEventHandler<P, T>; onTouchMoveCapture?: TouchEventHandler<P, T>; onTouchStart?: TouchEventHandler<P, T>; onTouchStartCapture?: TouchEventHandler<P, T>; // Pointer Events onPointerDown?: PointerEventHandler<P, T>; onPointerDownCapture?: PointerEventHandler<P, T>; onPointerMove?: PointerEventHandler<P, T>; onPointerMoveCapture?: PointerEventHandler<P, T>; onPointerUp?: PointerEventHandler<P, T>; onPointerUpCapture?: PointerEventHandler<P, T>; onPointerCancel?: PointerEventHandler<P, T>; onPointerCancelCapture?: PointerEventHandler<P, T>; onPointerEnter?: PointerEventHandler<P, T>; onPointerEnterCapture?: PointerEventHandler<P, T>; onPointerLeave?: PointerEventHandler<P, T>; onPointerLeaveCapture?: PointerEventHandler<P, T>; onPointerOver?: PointerEventHandler<P, T>; onPointerOverCapture?: PointerEventHandler<P, T>; onPointerOut?: PointerEventHandler<P, T>; onPointerOutCapture?: PointerEventHandler<P, T>; onGotPointerCapture?: PointerEventHandler<P, T>; onGotPointerCaptureCapture?: PointerEventHandler<P, T>; onLostPointerCapture?: PointerEventHandler<P, T>; onLostPointerCaptureCapture?: PointerEventHandler<P, T>; // UI Events onScroll?: UIEventHandler<P, T>; onScrollCapture?: UIEventHandler<P, T>; // Wheel Events onWheel?: WheelEventHandler<P, T>; onWheelCapture?: WheelEventHandler<P, T>; // Animation Events onAnimationStart?: AnimationEventHandler<P, T>; onAnimationStartCapture?: AnimationEventHandler<P, T>; onAnimationEnd?: AnimationEventHandler<P, T>; onAnimationEndCapture?: AnimationEventHandler<P, T>; onAnimationIteration?: AnimationEventHandler<P, T>; onAnimationIterationCapture?: AnimationEventHandler<P, T>; // Transition Events onTransitionEnd?: TransitionEventHandler<P, T>; onTransitionEndCapture?: TransitionEventHandler<P, T>; } type AdaptChildEventHandler<P, E extends SyntheticEvent<any>> = { bivarianceHack(data: P, index: number, event: E): void; }['bivarianceHack']; type AdaptChildReactEventHandler<P, T = Element> = AdaptChildEventHandler<P, SyntheticEvent<T>>; type AdaptChildClipboardEventHandler<P, T = Element> = AdaptChildEventHandler<P, ClipboardEvent<T>>; type AdaptChildCompositionEventHandler<P, T = Element> = AdaptChildEventHandler<P, CompositionEvent<T>>; type AdaptChildDragEventHandler<P, T = Element> = AdaptChildEventHandler<P, DragEvent<T>>; type AdaptChildFocusEventHandler<P, T = Element> = AdaptChildEventHandler<P, FocusEvent<T>>; type AdaptChildFormEventHandler<P, T = Element> = AdaptChildEventHandler<P, FormEvent<T>>; type AdaptChildKeyboardEventHandler<P, T = Element> = AdaptChildEventHandler<P, KeyboardEvent<T>>; type AdaptChildMouseEventHandler<P, T = Element> = AdaptChildEventHandler<P, MouseEvent<T>>; type AdaptChildTouchEventHandler<P, T = Element> = AdaptChildEventHandler<P, TouchEvent<T>>; type AdaptChildPointerEventHandler<P, T = Element> = AdaptChildEventHandler<P, PointerEvent<T>>; type AdaptChildUIEventHandler<P, T = Element> = AdaptChildEventHandler<P, UIEvent<T>>; type AdaptChildWheelEventHandler<P, T = Element> = AdaptChildEventHandler<P, WheelEvent<T>>; type AdaptChildAnimationEventHandler<P, T = Element> = AdaptChildEventHandler<P, AnimationEvent<T>>; type AdaptChildTransitionEventHandler<P, T = Element> = AdaptChildEventHandler<P, TransitionEvent<T>>; export type DOMAttributesAdaptChildEvent<P, T> = { children?: ReactNode; dangerouslySetInnerHTML?: { __html: string; }; // Clipboard Events onCopy?: AdaptChildClipboardEventHandler<P, T>; onCopyCapture?: AdaptChildClipboardEventHandler<P, T>; onCut?: AdaptChildClipboardEventHandler<P, T>; onCutCapture?: AdaptChildClipboardEventHandler<P, T>; onPaste?: AdaptChildClipboardEventHandler<P, T>; onPasteCapture?: AdaptChildClipboardEventHandler<P, T>; // Composition Events onCompositionEnd?: AdaptChildCompositionEventHandler<P, T>; onCompositionEndCapture?: AdaptChildCompositionEventHandler<P, T>; onCompositionStart?: AdaptChildCompositionEventHandler<P, T>; onCompositionStartCapture?: AdaptChildCompositionEventHandler<P, T>; onCompositionUpdate?: AdaptChildCompositionEventHandler<P, T>; onCompositionUpdateCapture?: AdaptChildCompositionEventHandler<P, T>; // Focus Events onFocus?: AdaptChildFocusEventHandler<P, T>; onFocusCapture?: AdaptChildFocusEventHandler<P, T>; onBlur?: AdaptChildFocusEventHandler<P, T>; onBlurCapture?: AdaptChildFocusEventHandler<P, T>; // Form Events onChange?: AdaptChildFormEventHandler<P, T>; onChangeCapture?: AdaptChildFormEventHandler<P, T>; onBeforeInput?: AdaptChildFormEventHandler<P, T>; onBeforeInputCapture?: AdaptChildFormEventHandler<P, T>; onInput?: AdaptChildFormEventHandler<P, T>; onInputCapture?: AdaptChildFormEventHandler<P, T>; onReset?: AdaptChildFormEventHandler<P, T>; onResetCapture?: AdaptChildFormEventHandler<P, T>; onSubmit?: AdaptChildFormEventHandler<P, T>; onSubmitCapture?: AdaptChildFormEventHandler<P, T>; onInvalid?: AdaptChildFormEventHandler<P, T>; onInvalidCapture?: AdaptChildFormEventHandler<P, T>; // Image Events onLoad?: AdaptChildReactEventHandler<P, T>; onLoadCapture?: AdaptChildReactEventHandler<P, T>; onError?: AdaptChildReactEventHandler<P, T>; // also a Media Event onErrorCapture?: AdaptChildReactEventHandler<P, T>; // also a Media Event // Keyboard Events onKeyDown?: AdaptChildKeyboardEventHandler<P, T>; onKeyDownCapture?: AdaptChildKeyboardEventHandler<P, T>; onKeyPress?: AdaptChildKeyboardEventHandler<P, T>; onKeyPressCapture?: AdaptChildKeyboardEventHandler<P, T>; onKeyUp?: AdaptChildKeyboardEventHandler<P, T>; onKeyUpCapture?: AdaptChildKeyboardEventHandler<P, T>; // Media Events onAbort?: AdaptChildReactEventHandler<P, T>; onAbortCapture?: AdaptChildReactEventHandler<P, T>; onCanPlay?: AdaptChildReactEventHandler<P, T>; onCanPlayCapture?: AdaptChildReactEventHandler<P, T>; onCanPlayThrough?: AdaptChildReactEventHandler<P, T>; onCanPlayThroughCapture?: AdaptChildReactEventHandler<P, T>; onDurationChange?: AdaptChildReactEventHandler<P, T>; onDurationChangeCapture?: AdaptChildReactEventHandler<P, T>; onEmptied?: AdaptChildReactEventHandler<P, T>; onEmptiedCapture?: AdaptChildReactEventHandler<P, T>; onEncrypted?: AdaptChildReactEventHandler<P, T>; onEncryptedCapture?: AdaptChildReactEventHandler<P, T>; onEnded?: AdaptChildReactEventHandler<P, T>; onEndedCapture?: AdaptChildReactEventHandler<P, T>; onLoadedData?: AdaptChildReactEventHandler<P, T>; onLoadedDataCapture?: AdaptChildReactEventHandler<P, T>; onLoadedMetadata?: AdaptChildReactEventHandler<P, T>; onLoadedMetadataCapture?: AdaptChildReactEventHandler<P, T>; onLoadStart?: AdaptChildReactEventHandler<P, T>; onLoadStartCapture?: AdaptChildReactEventHandler<P, T>; onPause?: AdaptChildReactEventHandler<P, T>; onPauseCapture?: AdaptChildReactEventHandler<P, T>; onPlay?: AdaptChildReactEventHandler<P, T>; onPlayCapture?: AdaptChildReactEventHandler<P, T>; onPlaying?: AdaptChildReactEventHandler<P, T>; onPlayingCapture?: AdaptChildReactEventHandler<P, T>; onProgress?: AdaptChildReactEventHandler<P, T>; onProgressCapture?: AdaptChildReactEventHandler<P, T>; onRateChange?: AdaptChildReactEventHandler<P, T>; onRateChangeCapture?: AdaptChildReactEventHandler<P, T>; onSeeked?: AdaptChildReactEventHandler<P, T>; onSeekedCapture?: AdaptChildReactEventHandler<P, T>; onSeeking?: AdaptChildReactEventHandler<P, T>; onSeekingCapture?: AdaptChildReactEventHandler<P, T>; onStalled?: AdaptChildReactEventHandler<P, T>; onStalledCapture?: AdaptChildReactEventHandler<P, T>; onSuspend?: AdaptChildReactEventHandler<P, T>; onSuspendCapture?: AdaptChildReactEventHandler<P, T>; onTimeUpdate?: AdaptChildReactEventHandler<P, T>; onTimeUpdateCapture?: AdaptChildReactEventHandler<P, T>; onVolumeChange?: AdaptChildReactEventHandler<P, T>; onVolumeChangeCapture?: AdaptChildReactEventHandler<P, T>; onWaiting?: AdaptChildReactEventHandler<P, T>; onWaitingCapture?: AdaptChildReactEventHandler<P, T>; // MouseEvents onAuxClick?: AdaptChildMouseEventHandler<P, T>; onAuxClickCapture?: AdaptChildMouseEventHandler<P, T>; onClick?: AdaptChildMouseEventHandler<P, T>; onClickCapture?: AdaptChildMouseEventHandler<P, T>; onContextMenu?: AdaptChildMouseEventHandler<P, T>; onContextMenuCapture?: AdaptChildMouseEventHandler<P, T>; onDoubleClick?: AdaptChildMouseEventHandler<P, T>; onDoubleClickCapture?: AdaptChildMouseEventHandler<P, T>; onDrag?: AdaptChildDragEventHandler<P, T>; onDragCapture?: AdaptChildDragEventHandler<P, T>; onDragEnd?: AdaptChildDragEventHandler<P, T>; onDragEndCapture?: AdaptChildDragEventHandler<P, T>; onDragEnter?: AdaptChildDragEventHandler<P, T>; onDragEnterCapture?: AdaptChildDragEventHandler<P, T>; onDragExit?: AdaptChildDragEventHandler<P, T>; onDragExitCapture?: AdaptChildDragEventHandler<P, T>; onDragLeave?: AdaptChildDragEventHandler<P, T>; onDragLeaveCapture?: AdaptChildDragEventHandler<P, T>; onDragOver?: AdaptChildDragEventHandler<P, T>; onDragOverCapture?: AdaptChildDragEventHandler<P, T>; onDragStart?: AdaptChildDragEventHandler<P, T>; onDragStartCapture?: AdaptChildDragEventHandler<P, T>; onDrop?: AdaptChildDragEventHandler<P, T>; onDropCapture?: AdaptChildDragEventHandler<P, T>; onMouseDown?: AdaptChildMouseEventHandler<P, T>; onMouseDownCapture?: AdaptChildMouseEventHandler<P, T>; onMouseEnter?: AdaptChildMouseEventHandler<P, T>; onMouseLeave?: AdaptChildMouseEventHandler<P, T>; onMouseMove?: AdaptChildMouseEventHandler<P, T>; onMouseMoveCapture?: AdaptChildMouseEventHandler<P, T>; onMouseOut?: AdaptChildMouseEventHandler<P, T>; onMouseOutCapture?: AdaptChildMouseEventHandler<P, T>; onMouseOver?: AdaptChildMouseEventHandler<P, T>; onMouseOverCapture?: AdaptChildMouseEventHandler<P, T>; onMouseUp?: AdaptChildMouseEventHandler<P, T>; onMouseUpCapture?: AdaptChildMouseEventHandler<P, T>; // Selection Events onSelect?: AdaptChildReactEventHandler<P, T>; onSelectCapture?: AdaptChildReactEventHandler<P, T>; // Touch Events onTouchCancel?: AdaptChildTouchEventHandler<P, T>; onTouchCancelCapture?: AdaptChildTouchEventHandler<P, T>; onTouchEnd?: AdaptChildTouchEventHandler<P, T>; onTouchEndCapture?: AdaptChildTouchEventHandler<P, T>; onTouchMove?: AdaptChildTouchEventHandler<P, T>; onTouchMoveCapture?: AdaptChildTouchEventHandler<P, T>; onTouchStart?: AdaptChildTouchEventHandler<P, T>; onTouchStartCapture?: AdaptChildTouchEventHandler<P, T>; // Pointer Events onPointerDown?: AdaptChildPointerEventHandler<P, T>; onPointerDownCapture?: AdaptChildPointerEventHandler<P, T>; onPointerMove?: AdaptChildPointerEventHandler<P, T>; onPointerMoveCapture?: AdaptChildPointerEventHandler<P, T>; onPointerUp?: AdaptChildPointerEventHandler<P, T>; onPointerUpCapture?: AdaptChildPointerEventHandler<P, T>; onPointerCancel?: AdaptChildPointerEventHandler<P, T>; onPointerCancelCapture?: AdaptChildPointerEventHandler<P, T>; onPointerEnter?: AdaptChildPointerEventHandler<P, T>; onPointerEnterCapture?: AdaptChildPointerEventHandler<P, T>; onPointerLeave?: AdaptChildPointerEventHandler<P, T>; onPointerLeaveCapture?: AdaptChildPointerEventHandler<P, T>; onPointerOver?: AdaptChildPointerEventHandler<P, T>; onPointerOverCapture?: AdaptChildPointerEventHandler<P, T>; onPointerOut?: AdaptChildPointerEventHandler<P, T>; onPointerOutCapture?: AdaptChildPointerEventHandler<P, T>; onGotPointerCapture?: AdaptChildPointerEventHandler<P, T>; onGotPointerCaptureCapture?: AdaptChildPointerEventHandler<P, T>; onLostPointerCapture?: AdaptChildPointerEventHandler<P, T>; onLostPointerCaptureCapture?: AdaptChildPointerEventHandler<P, T>; // UI Events onScroll?: AdaptChildUIEventHandler<P, T>; onScrollCapture?: AdaptChildUIEventHandler<P, T>; // Wheel Events onWheel?: AdaptChildWheelEventHandler<P, T>; onWheelCapture?: AdaptChildWheelEventHandler<P, T>; // Animation Events onAnimationStart?: AdaptChildAnimationEventHandler<P, T>; onAnimationStartCapture?: AdaptChildAnimationEventHandler<P, T>; onAnimationEnd?: AdaptChildAnimationEventHandler<P, T>; onAnimationEndCapture?: AdaptChildAnimationEventHandler<P, T>; onAnimationIteration?: AdaptChildAnimationEventHandler<P, T>; onAnimationIterationCapture?: AdaptChildAnimationEventHandler<P, T>; // Transition Events onTransitionEnd?: AdaptChildTransitionEventHandler<P, T>; onTransitionEndCapture?: AdaptChildTransitionEventHandler<P, T>; }; const SVGContainerPropKeys = ['viewBox', 'children']; const SVGElementPropKeys = [ 'className', 'color', 'height', 'id', 'lang', 'max', 'media', 'method', 'min', 'name', 'style', 'target', 'type', 'width', 'role', 'tabIndex', 'accentHeight', 'accumulate', 'additive', 'alignmentBaseline', 'allowReorder', 'alphabetic', 'amplitude', 'arabicForm', 'ascent', 'attributeName', 'attributeType', 'autoReverse', 'azimuth', 'baseFrequency', 'baselineShift', 'baseProfile', 'bbox', 'begin', 'bias', 'by', 'calcMode', 'capHeight', 'clip', 'clipPath', 'clipPathUnits', 'clipRule', 'colorInterpolation', 'colorInterpolationFilters', 'colorProfile', 'colorRendering', 'contentScriptType', 'contentStyleType', 'cursor', 'cx', 'cy', 'd', 'decelerate', 'descent', 'diffuseConstant', 'direction', 'display', 'divisor', 'dominantBaseline', 'dur', 'dx', 'dy', 'edgeMode', 'elevation', 'enableBackground', 'end', 'exponent', 'externalResourcesRequired', 'fill', 'fillOpacity', 'fillRule', 'filter', 'filterRes', 'filterUnits', 'floodColor', 'floodOpacity', 'focusable', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontWeight', 'format', 'from', 'fx', 'fy', 'g1', 'g2', 'glyphName', 'glyphOrientationHorizontal', 'glyphOrientationVertical', 'glyphRef', 'gradientTransform', 'gradientUnits', 'hanging', 'horizAdvX', 'horizOriginX', 'href', 'ideographic', 'imageRendering', 'in2', 'in', 'intercept', 'k1', 'k2', 'k3', 'k4', 'k', 'kernelMatrix', 'kernelUnitLength', 'kerning', 'keyPoints', 'keySplines', 'keyTimes', 'lengthAdjust', 'letterSpacing', 'lightingColor', 'limitingConeAngle', 'local', 'markerEnd', 'markerHeight', 'markerMid', 'markerStart', 'markerUnits', 'markerWidth', 'mask', 'maskContentUnits', 'maskUnits', 'mathematical', 'mode', 'numOctaves', 'offset', 'opacity', 'operator', 'order', 'orient', 'orientation', 'origin', 'overflow', 'overlinePosition', 'overlineThickness', 'paintOrder', 'panose1', 'pathLength', 'patternContentUnits', 'patternTransform', 'patternUnits', 'pointerEvents', 'points', 'pointsAtX', 'pointsAtY', 'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'r', 'radius', 'refX', 'refY', 'renderingIntent', 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart', 'result', 'rotate', 'rx', 'ry', 'seed', 'shapeRendering', 'slope', 'spacing', 'specularConstant', 'specularExponent', 'speed', 'spreadMethod', 'startOffset', 'stdDeviation', 'stemh', 'stemv', 'stitchTiles', 'stopColor', 'stopOpacity', 'strikethroughPosition', 'strikethroughThickness', 'string', 'stroke', 'strokeDasharray', 'strokeDashoffset', 'strokeLinecap', 'strokeLinejoin', 'strokeMiterlimit', 'strokeOpacity', 'strokeWidth', 'surfaceScale', 'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textAnchor', 'textDecoration', 'textLength', 'textRendering', 'to', 'transform', 'u1', 'u2', 'underlinePosition', 'underlineThickness', 'unicode', 'unicodeBidi', 'unicodeRange', 'unitsPerEm', 'vAlphabetic', 'values', 'vectorEffect', 'version', 'vertAdvY', 'vertOriginX', 'vertOriginY', 'vHanging', 'vIdeographic', 'viewTarget', 'visibility', 'vMathematical', 'widths', 'wordSpacing', 'writingMode', 'x1', 'x2', 'x', 'xChannelSelector', 'xHeight', 'xlinkActuate', 'xlinkArcrole', 'xlinkHref', 'xlinkRole', 'xlinkShow', 'xlinkTitle', 'xlinkType', 'xmlBase', 'xmlLang', 'xmlns', 'xmlnsXlink', 'xmlSpace', 'y1', 'y2', 'y', 'yChannelSelector', 'z', 'zoomAndPan', 'ref', 'key', 'angle', ]; const EventKeys = [ 'dangerouslySetInnerHTML', 'onCopy', 'onCopyCapture', 'onCut', 'onCutCapture', 'onPaste', 'onPasteCapture', 'onCompositionEnd', 'onCompositionEndCapture', 'onCompositionStart', 'onCompositionStartCapture', 'onCompositionUpdate', 'onCompositionUpdateCapture', 'onFocus', 'onFocusCapture', 'onBlur', 'onBlurCapture', 'onChange', 'onChangeCapture', 'onBeforeInput', 'onBeforeInputCapture', 'onInput', 'onInputCapture', 'onReset', 'onResetCapture', 'onSubmit', 'onSubmitCapture', 'onInvalid', 'onInvalidCapture', 'onLoad', 'onLoadCapture', 'onError', 'onErrorCapture', 'onKeyDown', 'onKeyDownCapture', 'onKeyPress', 'onKeyPressCapture', 'onKeyUp', 'onKeyUpCapture', 'onAbort', 'onAbortCapture', 'onCanPlay', 'onCanPlayCapture', 'onCanPlayThrough', 'onCanPlayThroughCapture', 'onDurationChange', 'onDurationChangeCapture', 'onEmptied', 'onEmptiedCapture', 'onEncrypted', 'onEncryptedCapture', 'onEnded', 'onEndedCapture', 'onLoadedData', 'onLoadedDataCapture', 'onLoadedMetadata', 'onLoadedMetadataCapture', 'onLoadStart', 'onLoadStartCapture', 'onPause', 'onPauseCapture', 'onPlay', 'onPlayCapture', 'onPlaying', 'onPlayingCapture', 'onProgress', 'onProgressCapture', 'onRateChange', 'onRateChangeCapture', 'onSeeked', 'onSeekedCapture', 'onSeeking', 'onSeekingCapture', 'onStalled', 'onStalledCapture', 'onSuspend', 'onSuspendCapture', 'onTimeUpdate', 'onTimeUpdateCapture', 'onVolumeChange', 'onVolumeChangeCapture', 'onWaiting', 'onWaitingCapture', 'onAuxClick', 'onAuxClickCapture', 'onClick', 'onClickCapture', 'onContextMenu', 'onContextMenuCapture', 'onDoubleClick', 'onDoubleClickCapture', 'onDrag', 'onDragCapture', 'onDragEnd', 'onDragEndCapture', 'onDragEnter', 'onDragEnterCapture', 'onDragExit', 'onDragExitCapture', 'onDragLeave', 'onDragLeaveCapture', 'onDragOver', 'onDragOverCapture', 'onDragStart', 'onDragStartCapture', 'onDrop', 'onDropCapture', 'onMouseDown', 'onMouseDownCapture', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseMoveCapture', 'onMouseOut', 'onMouseOutCapture', 'onMouseOver', 'onMouseOverCapture', 'onMouseUp', 'onMouseUpCapture', 'onSelect', 'onSelectCapture', 'onTouchCancel', 'onTouchCancelCapture', 'onTouchEnd', 'onTouchEndCapture', 'onTouchMove', 'onTouchMoveCapture', 'onTouchStart', 'onTouchStartCapture', 'onPointerDown', 'onPointerDownCapture', 'onPointerMove', 'onPointerMoveCapture', 'onPointerUp', 'onPointerUpCapture', 'onPointerCancel', 'onPointerCancelCapture', 'onPointerEnter', 'onPointerEnterCapture', 'onPointerLeave', 'onPointerLeaveCapture', 'onPointerOver', 'onPointerOverCapture', 'onPointerOut', 'onPointerOutCapture', 'onGotPointerCapture', 'onGotPointerCaptureCapture', 'onLostPointerCapture', 'onLostPointerCaptureCapture', 'onScroll', 'onScrollCapture', 'onWheel', 'onWheelCapture', 'onAnimationStart', 'onAnimationStartCapture', 'onAnimationEnd', 'onAnimationEndCapture', 'onAnimationIteration', 'onAnimationIterationCapture', 'onTransitionEnd', 'onTransitionEndCapture', ]; // Animation Types => TODO: Should be moved when react-smooth is typescriptified. export type AnimationTiming = 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'linear'; /** the offset of a chart, which define the blank space all around */ export interface ChartOffset { top?: number; bottom?: number; left?: number; right?: number; width?: number; height?: number; brushBottom?: number; } export interface Padding { top?: number; bottom?: number; left?: number; right?: number; } export interface GeometrySector { cx?: number; cy?: number; innerRadius?: number; outerRadius?: number; startAngle?: number; endAngle?: number; cornerRadius?: number; forceCornerRadius?: boolean; cornerIsExternal?: boolean; } export type D3Scale<T> = D3ScaleContinuousNumeric<T, number>; export type AxisDomainItem = string | number | Function | 'auto' | 'dataMin' | 'dataMax'; /** The domain of axis */ export type AxisDomain = string[] | number[] | [AxisDomainItem, AxisDomainItem]; /** The props definition of base axis */ export interface BaseAxisProps { /** The type of axis */ type?: 'number' | 'category'; /** The key of data displayed in the axis */ dataKey?: DataKey<any>; /** Whether or not display the axis */ hide?: boolean; /** The scale type or functor of scale */ scale?: ScaleType | Function; /** The option for tick */ tick?: SVGProps<SVGTextElement> | ReactElement<SVGElement> | ((props: any) => ReactElement<SVGElement>) | boolean; /** The count of ticks */ tickCount?: number; /** The option for axisLine */ axisLine?: boolean | SVGProps<SVGLineElement>; /** The option for tickLine */ tickLine?: boolean | SVGProps<SVGTextElement>; /** The size of tick line */ tickSize?: number; /** The formatter function of tick */ tickFormatter?: (value: any, index: number) => string; /** * When domain of the axis is specified and the type of the axis is 'number', * if allowDataOverflow is set to be false, * the domain will be adjusted when the minimum value of data is smaller than domain[0] or * the maximum value of data is greater than domain[1] so that the axis displays all data values. * If set to true, graphic elements (line, area, bars) will be clipped to conform to the specified domain. */ allowDataOverflow?: boolean; /** * Allow the axis has duplicated categorys or not when the type of axis is "category". */ allowDuplicatedCategory?: boolean; /** * Allow the ticks of axis to be decimals or not. */ allowDecimals?: boolean; /** The domain of scale in this axis */ domain?: AxisDomain; /** The name of data displayed in the axis */ name?: string; /** The unit of data displayed in the axis */ unit?: string | number; /** The type of axis */ axisType?: AxisType; range?: Array<number>; /** axis react component */ AxisComp?: any; /** Needed to allow usage of the label prop on the X and Y axis */ label?: string | number | ReactElement | object; } export type AxisInterval = number | 'preserveStart' | 'preserveEnd' | 'preserveStartEnd'; export interface TickItem { value?: any; coordinate: number; index?: number; } export interface Margin { top?: number; right?: number; bottom?: number; left?: number; } export interface CartesianViewBox { x?: number; y?: number; width?: number; height?: number; } export interface PolarViewBox { cx?: number; cy?: number; innerRadius?: number; outerRadius?: number; startAngle?: number; endAngle?: number; clockWise?: boolean; } export type ViewBox = CartesianViewBox | PolarViewBox; export const filterProps = ( props: Record<string, any> | Component | FunctionComponent | boolean, includeEvents?: boolean, isSvg?: boolean, ) => { if (!props || typeof props === 'function' || typeof props === 'boolean') { return null; } let inputProps = props as Record<string, any>; if (isValidElement(props)) { inputProps = props.props as Record<string, any>; } if (!_.isObject(inputProps)) { return null; } const out: Record<string, any> = {}; Object.keys(inputProps).forEach(key => { // viewBox only exist in <svg /> if ( SVGElementPropKeys.includes(key) || (isSvg && SVGContainerPropKeys.includes(key)) || (includeEvents && EventKeys.includes(key)) ) { out[key] = (inputProps as any)[key]; } }); return out; }; export const adaptEventHandlers = ( props: Record<string, any> | Component | FunctionComponent | boolean, newHandler?: (e?: Event) => any, ): Record<string, (e?: Event) => any> => { if (!props || typeof props === 'function' || typeof props === 'boolean') { return null; } let inputProps = props as Record<string, any>; if (isValidElement(props)) { inputProps = props.props as Record<string, any>; } if (!_.isObject(inputProps)) { return null; } const out: Record<string, (e: Event) => void> = {}; Object.keys(inputProps).forEach(key => { if (EventKeys.includes(key)) { out[key] = newHandler || ((e: Event) => inputProps[key](inputProps, e)); } }); return out; }; const getEventHandlerOfChild = (originalHandler: Function, data: any, index: number) => (e: Event): void => { originalHandler(data, index, e); return null; }; export const adaptEventsOfChild = ( props: Record<string, any>, data: any, index: number, ): Record<string, (e?: Event) => any> => { if (!_.isObject(props) || typeof props !== 'object') { return null; } let out: Record<string, (e: Event) => void> = null; Object.keys(props).forEach((key: string) => { const item = (props as any)[key]; if (EventKeys.includes(key) && typeof item === 'function') { if (!out) out = {}; out[key] = getEventHandlerOfChild(item, data, index); } }); return out; }; export interface CategoricalChartOptions { chartName?: string; GraphicalChild?: any; defaultTooltipEventType?: string; validateTooltipEventTypes?: string[]; axisComponents?: BaseAxisProps[]; legendContent?: any; formatAxisMap?: any; defaultProps?: any; } export interface TreemapNode { x: number; y: number; width: number; height: number; depth: number; index: number; children?: any; name: string; value: number; [k: string]: any; } export interface SankeyNode { x: number; y: number; dx: number; dy: number; depth: number; value: number; } export interface SankeyLink { target: number; source: number; value: number; sy: number; dy: number; ty: number; }