JavaScript Custom HTML Cursor Chart

This example serves as an example for creating a custom cursor for XY charts.

Custom cursors can be required for different purposes - like major structural changes or very application specific styling requirements.

If lesser changes to default cursors are required then please see read about different methods of configuring cursor behavior - ChartXY API reference has good links and explanations to follow.

Custom cursors are most importantly based on LCJS methods that allow solving nearest data points in series from any supplied location.
Custom user interactions and data point solving require solid understanding of different coordinate systems in web and LCJS, which is the primary reason this example exists;

// Add custom action when user moves mouse over series area.
chart.onSeriesBackgroundMouseMove((_, event) => {
    // `event` is a native JavaScript event, which packs the active mouse location in `clientX` and `clientY` properties.
    const mouseLocationClient = { x: event.clientX, y: event.clientY }

    // Before using client coordinates with LCJS, the coordinates have to be translated relative to the LCJS engine.
    const mouseLocationEngine = chart.engine.clientLocation2Engine(mouseLocationClient.x, mouseLocationClient.y)

    // Now that the coordinates are in the correct coordinate system, they can be used
    // to solve data points, or further translated to any Axis.

    // (1) Translate mouse location an Axis.
    const mouseLocationAxis = translatePoint(
        mouseLocationEngine,
        // Source coordinate system.
        chart.engine.scale,
        // Target coordinate system.
        series[0].scale,
    )

    // (2) Solve nearest data point from a series to the mouse.
    const nearestDataPoint = series.solveNearestFromScreen(mouseLocationEngine)
    // `nearestDataPoint` is either `undefined`, or an object
    // which contains a collection of information about the solved data point.
})

In this example, the custom cursor visual is created with dynamically injected HTML and CSS.

The same approach could be used for interacting with any UI framework, idea being that LCJS is used for solving the data point and translating the location to the document, where any HTML element can be absolute positioned with left & top style.

The location and visibility of result table is animated with a CSS transition.

More custom cursor examples can be found under "cursor" tag in the Interactive Examples gallery.