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 = string | number | ((obj: T) => any); export type PresentationAttributesWithProps = AriaAttributes & DOMAttributesWithProps & Omit, keyof DOMAttributesWithProps>; export type PresentationAttributesAdaptChildEvent = AriaAttributes & DOMAttributesAdaptChildEvent & Omit, keyof DOMAttributesAdaptChildEvent>; 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> = { bivarianceHack(props: P, event: E): void; }['bivarianceHack']; type ReactEventHandler = EventHandler>; type ClipboardEventHandler = EventHandler>; type CompositionEventHandler = EventHandler>; type DragEventHandler = EventHandler>; type FocusEventHandler = EventHandler>; type FormEventHandler = EventHandler>; type KeyboardEventHandler = EventHandler>; type MouseEventHandler = EventHandler>; type TouchEventHandler = EventHandler>; type PointerEventHandler = EventHandler>; type UIEventHandler = EventHandler>; type WheelEventHandler = EventHandler>; type AnimationEventHandler = EventHandler>; type TransitionEventHandler = EventHandler>; export interface DOMAttributesWithProps { children?: ReactNode; dangerouslySetInnerHTML?: { __html: string; }; // Clipboard Events onCopy?: ClipboardEventHandler; onCopyCapture?: ClipboardEventHandler; onCut?: ClipboardEventHandler; onCutCapture?: ClipboardEventHandler; onPaste?: ClipboardEventHandler; onPasteCapture?: ClipboardEventHandler; // Composition Events onCompositionEnd?: CompositionEventHandler; onCompositionEndCapture?: CompositionEventHandler; onCompositionStart?: CompositionEventHandler; onCompositionStartCapture?: CompositionEventHandler; onCompositionUpdate?: CompositionEventHandler; onCompositionUpdateCapture?: CompositionEventHandler; // Focus Events onFocus?: FocusEventHandler; onFocusCapture?: FocusEventHandler; onBlur?: FocusEventHandler; onBlurCapture?: FocusEventHandler; // Form Events onChange?: FormEventHandler; onChangeCapture?: FormEventHandler; onBeforeInput?: FormEventHandler; onBeforeInputCapture?: FormEventHandler; onInput?: FormEventHandler; onInputCapture?: FormEventHandler; onReset?: FormEventHandler; onResetCapture?: FormEventHandler; onSubmit?: FormEventHandler; onSubmitCapture?: FormEventHandler; onInvalid?: FormEventHandler; onInvalidCapture?: FormEventHandler; // Image Events onLoad?: ReactEventHandler; onLoadCapture?: ReactEventHandler; onError?: ReactEventHandler; // also a Media Event onErrorCapture?: ReactEventHandler; // also a Media Event // Keyboard Events onKeyDown?: KeyboardEventHandler; onKeyDownCapture?: KeyboardEventHandler; onKeyPress?: KeyboardEventHandler; onKeyPressCapture?: KeyboardEventHandler; onKeyUp?: KeyboardEventHandler; onKeyUpCapture?: KeyboardEventHandler; // Media Events onAbort?: ReactEventHandler; onAbortCapture?: ReactEventHandler; onCanPlay?: ReactEventHandler; onCanPlayCapture?: ReactEventHandler; onCanPlayThrough?: ReactEventHandler; onCanPlayThroughCapture?: ReactEventHandler; onDurationChange?: ReactEventHandler; onDurationChangeCapture?: ReactEventHandler; onEmptied?: ReactEventHandler; onEmptiedCapture?: ReactEventHandler; onEncrypted?: ReactEventHandler; onEncryptedCapture?: ReactEventHandler; onEnded?: ReactEventHandler; onEndedCapture?: ReactEventHandler; onLoadedData?: ReactEventHandler; onLoadedDataCapture?: ReactEventHandler; onLoadedMetadata?: ReactEventHandler; onLoadedMetadataCapture?: ReactEventHandler; onLoadStart?: ReactEventHandler; onLoadStartCapture?: ReactEventHandler; onPause?: ReactEventHandler; onPauseCapture?: ReactEventHandler; onPlay?: ReactEventHandler; onPlayCapture?: ReactEventHandler; onPlaying?: ReactEventHandler; onPlayingCapture?: ReactEventHandler; onProgress?: ReactEventHandler; onProgressCapture?: ReactEventHandler; onRateChange?: ReactEventHandler; onRateChangeCapture?: ReactEventHandler; onSeeked?: ReactEventHandler; onSeekedCapture?: ReactEventHandler; onSeeking?: ReactEventHandler; onSeekingCapture?: ReactEventHandler; onStalled?: ReactEventHandler; onStalledCapture?: ReactEventHandler; onSuspend?: ReactEventHandler; onSuspendCapture?: ReactEventHandler; onTimeUpdate?: ReactEventHandler; onTimeUpdateCapture?: ReactEventHandler; onVolumeChange?: ReactEventHandler; onVolumeChangeCapture?: ReactEventHandler; onWaiting?: ReactEventHandler; onWaitingCapture?: ReactEventHandler; // MouseEvents onAuxClick?: MouseEventHandler; onAuxClickCapture?: MouseEventHandler; onClick?: MouseEventHandler; onClickCapture?: MouseEventHandler; onContextMenu?: MouseEventHandler; onContextMenuCapture?: MouseEventHandler; onDoubleClick?: MouseEventHandler; onDoubleClickCapture?: MouseEventHandler; onDrag?: DragEventHandler; onDragCapture?: DragEventHandler; onDragEnd?: DragEventHandler; onDragEndCapture?: DragEventHandler; onDragEnter?: DragEventHandler; onDragEnterCapture?: DragEventHandler; onDragExit?: DragEventHandler; onDragExitCapture?: DragEventHandler; onDragLeave?: DragEventHandler; onDragLeaveCapture?: DragEventHandler; onDragOver?: DragEventHandler; onDragOverCapture?: DragEventHandler; onDragStart?: DragEventHandler; onDragStartCapture?: DragEventHandler; onDrop?: DragEventHandler; onDropCapture?: DragEventHandler; onMouseDown?: MouseEventHandler; onMouseDownCapture?: MouseEventHandler; onMouseEnter?: MouseEventHandler; onMouseLeave?: MouseEventHandler; onMouseMove?: MouseEventHandler; onMouseMoveCapture?: MouseEventHandler; onMouseOut?: MouseEventHandler; onMouseOutCapture?: MouseEventHandler; onMouseOver?: MouseEventHandler; onMouseOverCapture?: MouseEventHandler; onMouseUp?: MouseEventHandler; onMouseUpCapture?: MouseEventHandler; // Selection Events onSelect?: ReactEventHandler; onSelectCapture?: ReactEventHandler; // Touch Events onTouchCancel?: TouchEventHandler; onTouchCancelCapture?: TouchEventHandler; onTouchEnd?: TouchEventHandler; onTouchEndCapture?: TouchEventHandler; onTouchMove?: TouchEventHandler; onTouchMoveCapture?: TouchEventHandler; onTouchStart?: TouchEventHandler; onTouchStartCapture?: TouchEventHandler; // Pointer Events onPointerDown?: PointerEventHandler; onPointerDownCapture?: PointerEventHandler; onPointerMove?: PointerEventHandler; onPointerMoveCapture?: PointerEventHandler; onPointerUp?: PointerEventHandler; onPointerUpCapture?: PointerEventHandler; onPointerCancel?: PointerEventHandler; onPointerCancelCapture?: PointerEventHandler; onPointerEnter?: PointerEventHandler; onPointerEnterCapture?: PointerEventHandler; onPointerLeave?: PointerEventHandler; onPointerLeaveCapture?: PointerEventHandler; onPointerOver?: PointerEventHandler; onPointerOverCapture?: PointerEventHandler; onPointerOut?: PointerEventHandler; onPointerOutCapture?: PointerEventHandler; onGotPointerCapture?: PointerEventHandler; onGotPointerCaptureCapture?: PointerEventHandler; onLostPointerCapture?: PointerEventHandler; onLostPointerCaptureCapture?: PointerEventHandler; // UI Events onScroll?: UIEventHandler; onScrollCapture?: UIEventHandler; // Wheel Events onWheel?: WheelEventHandler; onWheelCapture?: WheelEventHandler; // Animation Events onAnimationStart?: AnimationEventHandler; onAnimationStartCapture?: AnimationEventHandler; onAnimationEnd?: AnimationEventHandler; onAnimationEndCapture?: AnimationEventHandler; onAnimationIteration?: AnimationEventHandler; onAnimationIterationCapture?: AnimationEventHandler; // Transition Events onTransitionEnd?: TransitionEventHandler; onTransitionEndCapture?: TransitionEventHandler; } type AdaptChildEventHandler> = { bivarianceHack(data: P, index: number, event: E): void; }['bivarianceHack']; type AdaptChildReactEventHandler = AdaptChildEventHandler>; type AdaptChildClipboardEventHandler = AdaptChildEventHandler>; type AdaptChildCompositionEventHandler = AdaptChildEventHandler>; type AdaptChildDragEventHandler = AdaptChildEventHandler>; type AdaptChildFocusEventHandler = AdaptChildEventHandler>; type AdaptChildFormEventHandler = AdaptChildEventHandler>; type AdaptChildKeyboardEventHandler = AdaptChildEventHandler>; type AdaptChildMouseEventHandler = AdaptChildEventHandler>; type AdaptChildTouchEventHandler = AdaptChildEventHandler>; type AdaptChildPointerEventHandler = AdaptChildEventHandler>; type AdaptChildUIEventHandler = AdaptChildEventHandler>; type AdaptChildWheelEventHandler = AdaptChildEventHandler>; type AdaptChildAnimationEventHandler = AdaptChildEventHandler>; type AdaptChildTransitionEventHandler = AdaptChildEventHandler>; export type DOMAttributesAdaptChildEvent = { children?: ReactNode; dangerouslySetInnerHTML?: { __html: string; }; // Clipboard Events onCopy?: AdaptChildClipboardEventHandler; onCopyCapture?: AdaptChildClipboardEventHandler; onCut?: AdaptChildClipboardEventHandler; onCutCapture?: AdaptChildClipboardEventHandler; onPaste?: AdaptChildClipboardEventHandler; onPasteCapture?: AdaptChildClipboardEventHandler; // Composition Events onCompositionEnd?: AdaptChildCompositionEventHandler; onCompositionEndCapture?: AdaptChildCompositionEventHandler; onCompositionStart?: AdaptChildCompositionEventHandler; onCompositionStartCapture?: AdaptChildCompositionEventHandler; onCompositionUpdate?: AdaptChildCompositionEventHandler; onCompositionUpdateCapture?: AdaptChildCompositionEventHandler; // Focus Events onFocus?: AdaptChildFocusEventHandler; onFocusCapture?: AdaptChildFocusEventHandler; onBlur?: AdaptChildFocusEventHandler; onBlurCapture?: AdaptChildFocusEventHandler; // Form Events onChange?: AdaptChildFormEventHandler; onChangeCapture?: AdaptChildFormEventHandler; onBeforeInput?: AdaptChildFormEventHandler; onBeforeInputCapture?: AdaptChildFormEventHandler; onInput?: AdaptChildFormEventHandler; onInputCapture?: AdaptChildFormEventHandler; onReset?: AdaptChildFormEventHandler; onResetCapture?: AdaptChildFormEventHandler; onSubmit?: AdaptChildFormEventHandler; onSubmitCapture?: AdaptChildFormEventHandler; onInvalid?: AdaptChildFormEventHandler; onInvalidCapture?: AdaptChildFormEventHandler; // Image Events onLoad?: AdaptChildReactEventHandler; onLoadCapture?: AdaptChildReactEventHandler; onError?: AdaptChildReactEventHandler; // also a Media Event onErrorCapture?: AdaptChildReactEventHandler; // also a Media Event // Keyboard Events onKeyDown?: AdaptChildKeyboardEventHandler; onKeyDownCapture?: AdaptChildKeyboardEventHandler; onKeyPress?: AdaptChildKeyboardEventHandler; onKeyPressCapture?: AdaptChildKeyboardEventHandler; onKeyUp?: AdaptChildKeyboardEventHandler; onKeyUpCapture?: AdaptChildKeyboardEventHandler; // Media Events onAbort?: AdaptChildReactEventHandler; onAbortCapture?: AdaptChildReactEventHandler; onCanPlay?: AdaptChildReactEventHandler; onCanPlayCapture?: AdaptChildReactEventHandler; onCanPlayThrough?: AdaptChildReactEventHandler; onCanPlayThroughCapture?: AdaptChildReactEventHandler; onDurationChange?: AdaptChildReactEventHandler; onDurationChangeCapture?: AdaptChildReactEventHandler; onEmptied?: AdaptChildReactEventHandler; onEmptiedCapture?: AdaptChildReactEventHandler; onEncrypted?: AdaptChildReactEventHandler; onEncryptedCapture?: AdaptChildReactEventHandler; onEnded?: AdaptChildReactEventHandler; onEndedCapture?: AdaptChildReactEventHandler; onLoadedData?: AdaptChildReactEventHandler; onLoadedDataCapture?: AdaptChildReactEventHandler; onLoadedMetadata?: AdaptChildReactEventHandler; onLoadedMetadataCapture?: AdaptChildReactEventHandler; onLoadStart?: AdaptChildReactEventHandler; onLoadStartCapture?: AdaptChildReactEventHandler; onPause?: AdaptChildReactEventHandler; onPauseCapture?: AdaptChildReactEventHandler; onPlay?: AdaptChildReactEventHandler; onPlayCapture?: AdaptChildReactEventHandler; onPlaying?: AdaptChildReactEventHandler; onPlayingCapture?: AdaptChildReactEventHandler; onProgress?: AdaptChildReactEventHandler; onProgressCapture?: AdaptChildReactEventHandler; onRateChange?: AdaptChildReactEventHandler; onRateChangeCapture?: AdaptChildReactEventHandler; onSeeked?: AdaptChildReactEventHandler; onSeekedCapture?: AdaptChildReactEventHandler; onSeeking?: AdaptChildReactEventHandler; onSeekingCapture?: AdaptChildReactEventHandler; onStalled?: AdaptChildReactEventHandler; onStalledCapture?: AdaptChildReactEventHandler; onSuspend?: AdaptChildReactEventHandler; onSuspendCapture?: AdaptChildReactEventHandler; onTimeUpdate?: AdaptChildReactEventHandler; onTimeUpdateCapture?: AdaptChildReactEventHandler; onVolumeChange?: AdaptChildReactEventHandler; onVolumeChangeCapture?: AdaptChildReactEventHandler; onWaiting?: AdaptChildReactEventHandler; onWaitingCapture?: AdaptChildReactEventHandler; // MouseEvents onAuxClick?: AdaptChildMouseEventHandler; onAuxClickCapture?: AdaptChildMouseEventHandler; onClick?: AdaptChildMouseEventHandler; onClickCapture?: AdaptChildMouseEventHandler; onContextMenu?: AdaptChildMouseEventHandler; onContextMenuCapture?: AdaptChildMouseEventHandler; onDoubleClick?: AdaptChildMouseEventHandler; onDoubleClickCapture?: AdaptChildMouseEventHandler; onDrag?: AdaptChildDragEventHandler; onDragCapture?: AdaptChildDragEventHandler; onDragEnd?: AdaptChildDragEventHandler; onDragEndCapture?: AdaptChildDragEventHandler; onDragEnter?: AdaptChildDragEventHandler; onDragEnterCapture?: AdaptChildDragEventHandler; onDragExit?: AdaptChildDragEventHandler; onDragExitCapture?: AdaptChildDragEventHandler; onDragLeave?: AdaptChildDragEventHandler; onDragLeaveCapture?: AdaptChildDragEventHandler; onDragOver?: AdaptChildDragEventHandler; onDragOverCapture?: AdaptChildDragEventHandler; onDragStart?: AdaptChildDragEventHandler; onDragStartCapture?: AdaptChildDragEventHandler; onDrop?: AdaptChildDragEventHandler; onDropCapture?: AdaptChildDragEventHandler; onMouseDown?: AdaptChildMouseEventHandler; onMouseDownCapture?: AdaptChildMouseEventHandler; onMouseEnter?: AdaptChildMouseEventHandler; onMouseLeave?: AdaptChildMouseEventHandler; onMouseMove?: AdaptChildMouseEventHandler; onMouseMoveCapture?: AdaptChildMouseEventHandler; onMouseOut?: AdaptChildMouseEventHandler; onMouseOutCapture?: AdaptChildMouseEventHandler; onMouseOver?: AdaptChildMouseEventHandler; onMouseOverCapture?: AdaptChildMouseEventHandler; onMouseUp?: AdaptChildMouseEventHandler; onMouseUpCapture?: AdaptChildMouseEventHandler; // Selection Events onSelect?: AdaptChildReactEventHandler; onSelectCapture?: AdaptChildReactEventHandler; // Touch Events onTouchCancel?: AdaptChildTouchEventHandler; onTouchCancelCapture?: AdaptChildTouchEventHandler; onTouchEnd?: AdaptChildTouchEventHandler; onTouchEndCapture?: AdaptChildTouchEventHandler; onTouchMove?: AdaptChildTouchEventHandler; onTouchMoveCapture?: AdaptChildTouchEventHandler; onTouchStart?: AdaptChildTouchEventHandler; onTouchStartCapture?: AdaptChildTouchEventHandler; // Pointer Events onPointerDown?: AdaptChildPointerEventHandler; onPointerDownCapture?: AdaptChildPointerEventHandler; onPointerMove?: AdaptChildPointerEventHandler; onPointerMoveCapture?: AdaptChildPointerEventHandler; onPointerUp?: AdaptChildPointerEventHandler; onPointerUpCapture?: AdaptChildPointerEventHandler; onPointerCancel?: AdaptChildPointerEventHandler; onPointerCancelCapture?: AdaptChildPointerEventHandler; onPointerEnter?: AdaptChildPointerEventHandler; onPointerEnterCapture?: AdaptChildPointerEventHandler; onPointerLeave?: AdaptChildPointerEventHandler; onPointerLeaveCapture?: AdaptChildPointerEventHandler; onPointerOver?: AdaptChildPointerEventHandler; onPointerOverCapture?: AdaptChildPointerEventHandler; onPointerOut?: AdaptChildPointerEventHandler; onPointerOutCapture?: AdaptChildPointerEventHandler; onGotPointerCapture?: AdaptChildPointerEventHandler; onGotPointerCaptureCapture?: AdaptChildPointerEventHandler; onLostPointerCapture?: AdaptChildPointerEventHandler; onLostPointerCaptureCapture?: AdaptChildPointerEventHandler; // UI Events onScroll?: AdaptChildUIEventHandler; onScrollCapture?: AdaptChildUIEventHandler; // Wheel Events onWheel?: AdaptChildWheelEventHandler; onWheelCapture?: AdaptChildWheelEventHandler; // Animation Events onAnimationStart?: AdaptChildAnimationEventHandler; onAnimationStartCapture?: AdaptChildAnimationEventHandler; onAnimationEnd?: AdaptChildAnimationEventHandler; onAnimationEndCapture?: AdaptChildAnimationEventHandler; onAnimationIteration?: AdaptChildAnimationEventHandler; onAnimationIterationCapture?: AdaptChildAnimationEventHandler; // Transition Events onTransitionEnd?: AdaptChildTransitionEventHandler; onTransitionEndCapture?: AdaptChildTransitionEventHandler; }; 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 = D3ScaleContinuousNumeric; 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; /** Whether or not display the axis */ hide?: boolean; /** The scale type or functor of scale */ scale?: ScaleType | Function; /** The option for tick */ tick?: SVGProps | ReactElement | ((props: any) => ReactElement) | boolean; /** The count of ticks */ tickCount?: number; /** The option for axisLine */ axisLine?: boolean | SVGProps; /** The option for tickLine */ tickLine?: boolean | SVGProps; /** 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; /** 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 | Component | FunctionComponent | boolean, includeEvents?: boolean, isSvg?: boolean, ) => { if (!props || typeof props === 'function' || typeof props === 'boolean') { return null; } let inputProps = props as Record; if (isValidElement(props)) { inputProps = props.props as Record; } if (!_.isObject(inputProps)) { return null; } const out: Record = {}; Object.keys(inputProps).forEach(key => { // viewBox only exist in 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 | Component | FunctionComponent | boolean, newHandler?: (e?: Event) => any, ): Record any> => { if (!props || typeof props === 'function' || typeof props === 'boolean') { return null; } let inputProps = props as Record; if (isValidElement(props)) { inputProps = props.props as Record; } if (!_.isObject(inputProps)) { return null; } const out: Record 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, data: any, index: number, ): Record any> => { if (!_.isObject(props) || typeof props !== 'object') { return null; } let out: Record 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; }