Area Chart With Custom Events

The example demonstrates how to add custom event handlers to an Area Chart and how to write proper types.
import type { MouseEvent, TouchEvent } from 'react';
import {
  AreaChart,
  Area,
  XAxis,
  YAxis,
  CartesianGrid,
  Tooltip,
  MouseHandlerDataParam,
  RelativePointer,
  getRelativeCoordinate,
} from 'recharts';
import { generateMockData, RechartsDevtools } from '@recharts/devtools';

const data = generateMockData(20, 456);

export default function AreaChartWithCustomEvents() {
  return (
    <AreaChart
      style={{ width: '100%', maxWidth: '700px', maxHeight: '70vh', aspectRatio: 1.618 }}
      responsive
      data={data}
      margin={{
        top: 20,
        right: 0,
        left: 0,
        bottom: 0,
      }}
      onClick={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart clicked:', mouseEventData, event, chartPointer);
      }}
      onMouseEnter={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart mouse enter:', mouseEventData, event, chartPointer);
      }}
      onMouseMove={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart mouse move:', mouseEventData, event, chartPointer);
      }}
      onMouseLeave={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart mouse leave', mouseEventData, event, chartPointer);
      }}
      onMouseDown={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart mouse down:', mouseEventData, event, chartPointer);
      }}
      onMouseUp={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart mouse up:', mouseEventData, event, chartPointer);
      }}
      onDoubleClick={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart double click:', mouseEventData, event, chartPointer);
      }}
      onContextMenu={(mouseEventData: MouseHandlerDataParam, event: MouseEvent<SVGGraphicsElement>) => {
        const chartPointer: RelativePointer = getRelativeCoordinate(event);
        console.log('AreaChart context menu:', mouseEventData, event, chartPointer);
      }}
      onTouchStart={(mouseEventData: MouseHandlerDataParam, event: TouchEvent<SVGGraphicsElement>) => {
        const chartPointer: ReadonlyArray<RelativePointer> = getRelativeCoordinate(event);
        console.log('AreaChart touch start:', mouseEventData, event, chartPointer);
      }}
      onTouchMove={(mouseEventData: MouseHandlerDataParam, event: TouchEvent<SVGGraphicsElement>) => {
        const chartPointer: ReadonlyArray<RelativePointer> = getRelativeCoordinate(event);
        console.log('AreaChart touch move:', mouseEventData, event, chartPointer);
      }}
      onTouchEnd={(mouseEventData: MouseHandlerDataParam, event: TouchEvent<SVGGraphicsElement>) => {
        const chartPointer: ReadonlyArray<RelativePointer> = getRelativeCoordinate(event);
        console.log('AreaChart touch end:', mouseEventData, event, chartPointer);
      }}
    >
      <CartesianGrid />
      <XAxis dataKey="label" />
      <YAxis width="auto" />
      <Tooltip />
      <Area type="step" dataKey="x" />
      <RechartsDevtools />
    </AreaChart>
  );
}