Share this

Highcharts v13 Beta Is Here

Nancy Dillon Avatar

by

9 minutes read

Highcharts v13 is now available as a public beta. 

This major release is about making charts easier to configure, easier to brand, and harder to make look accidental, and we’d love for you to try it before the final version lands in early June. 

Changes include a new palette option, DataTable-based chart data, experimental autoloading for modules, as well as numerous design and UX refinements that make everyday charts feel more polished.

Read on for more details.

Centralized color management with palette

Highcharts v13 introduces a new palette option that enables you to define a central color system for your entire chart or collection of charts, making branding easier, dark mode cleaner, and the maintenance of large chart libraries less repetitive.

Use palette to define your series colors and light and dark mode values for backgrounds, chart elements (axes, titles, labels, etc.) and highlight colors for UI states and more.

Highcharts.setOptions({
    palette: {
        colors: ['#e32412', '#fadb8b', '#2364b9', '#059649'],
        light: {
            backgroundColor: '#f6f5f4',
            highlightColor: '#e32412'
        },
        dark: {
            backgroundColor: '#1b1918',
            highlightColor: '#fadb8b'
        }
    }
});

As you can see from the code sample above, the colors array for your series and point colors is now an option under palette. You can define one shared set and then override individual colors for light or dark mode with palette.light.colors and palette.dark.colors

There’s also a colorScheme option that accepts ‘light’, ‘dark’, ‘light dark’, or ‘inherit’ so charts can follow a user’s system preference, inherit from the page, or be pinned to a specific mode.

At runtime, Highcharts exposes palette colors values as CSS variables and applies them to your chart. A nice side effect is that chart-specific styling can now reference CSS vars instead of duplicating hard-coded strings:

title: {
    style: {
        color: 'var(--highcharts-neutral-color-60)'
    }
}

This kind of change seems modest when dealing with a single chart, but for teams managing dashboards, you’ll be glad it exists by the time you get to chart number 200.

The best part: designers get a single place to define color, developers get fewer one-off overrides, and users get charts that adapt more naturally to light and dark environments.

The new palette layer replaces the former Adaptive theme.

Additional resources:

Bring your own data table

Highcharts v13 makes it easy to use tabular data as a data source. 

Until now, most charts were configured with series.data, a convenient method for small examples, but awkward when your actual source is a database table, CSV, API response, or shared dashboard dataset.

Instead of restructuring your source data to fit the series format, the new dataTable, series.dataTable, and series.dataMapping options let map your existing columns directly to chart points.

const dataTable = new Highcharts.DataTable({
    columns: {
        Year: [2020, 2021, 2022, 2023],
        Cost: [11, 13, 12, 14],
        Revenue: [12, 15, 14, 18]
    }
});
Highcharts.chart('container', {
    dataTable,
    plotOptions: {
        series: {
            dataMapping: { x: 'Year' }
        }
    },
    series: [
        { dataMapping: { y: 'Cost' } },
        { dataMapping: { y: 'Revenue' } }
    ]
});

One table, multiple series, no repeated arrays. 

Mappings shared across series, like the x column, live in plotOptions.series, leaving each series to only declare what makes it unique.

If your columns are already named ‘x,’ ‘y,’ ‘name,’ etc., Highcharts will map them automatically. If not, just use the dataMapping option to assign them explicitly.

You can also attach a table directly to a series with series.dataTable, pass either a Highcharts.DataTable instance or a configuration object, and use typed arrays for heavier datasets. 

 series: [{
        name: 'Options + array',
        dataTable: {
            columns: {
                x: [2026, 2027, 2028, 2029],
                y: [4, 2, 5, 1],
                z: [2, 1, 4, 2]
            }
        }
    }, {
        name: 'Instance + array',
        dataTable: new DataTable({
            columns: {
                x: [2026, 2027, 2028, 2029],
                y: [3, 6, 5, 7]
            }
        })
    }, {
        name: 'Options + typed array',
        dataTable: {
            columns: {
                x: new Uint16Array([2026, 2027, 2028, 2029]),
                y: new Uint8Array([6, 4, 7, 3])
            }
        }
    }, {
        name: 'Instance + typed array',
        dataTable: new DataTable({
            columns: {
                x: new Uint16Array([2026, 2027, 2028, 2029]),
                y: new Uint8Array([9, 5, 9, 4])
            }
        })
    }]

There’s a performance angle too. When used with the Boost module, configuring data through a DataTable with TypedArray columns is about 20% faster than series.data in a 500k-point chart. That’s a big payoff for a tiny syntax change, especially when data-heavy dashboards are involved.

Additional resources:

Experimental Autoload: a patient friend who finds the missing pieces

Ever create a bubble chart with no bubbles because you forgot to  include highcharts-more.js?

Our new experimental highcharts-autoload.js bundle solves this problem by inspecting your chart options and loading the required modules before your chart renders.

This is especially useful when chart options are assembled dynamically: from a CMS, a chart editor, a saved dashboard configuration, or a friendly LLM that enthusiastically suggests a more exotic chart type but spaces out on the required modules.  

For example, in the ESM build setup below, the configuration includes features that normally require additional modules (bubble series, exporting and accessibility.) Autoload resolves those dependencies asynchronously, then creates the chart. 

const { default: Highcharts } = await import(
    'https://code.highcharts.com/esm/highcharts-autoload.js'
);
await Highcharts.chart('container', {
    chart: { type: 'bubble' },
    exporting: { enabled: true },
    accessibility: { enabled: true },
    series: [{
        data: [[1, 2, 10], [2, 3, 15], [3, 1, 8]]
    }]
});

And Autoload does more than fetch required modules. If your configuration uses styledMode or includes Stock Tools, Autoload will pull in all the necessary CSS and UI dependencies too.

Of course, Autoload isn’t meant to replace deliberate bundling. If you know exactly which modules your product uses, a regular build still gives you full control. 

Additional resources:

A proper glow-up for gauges

If you’ve ever created a modern-looking gauge with Highcharts, you’ve probably accumulated a small bag of tricks: where to place the pane, how wide the arc should be, and how to shape the dial. 

In Highcharts v13, the defaults handle more of that work with one goal in mind: to make gauges look good before you touch a single option.

Panes fit the plot area more intelligently, gauge labels are positioned in accordance with the circular layout, and the default dial looks much closer to something you’d actually ship.

With these smart defaults, out-of-the-box gauge configurations are now very small:

Highcharts.chart('container', {
    chart: { type: 'gauge' },
    yAxis: {
        min: 0,
        max: 100,
        plotBands: [
            {
                from: 0,
                to: 70,
                color: '#d2b4de',
            },
            {
                from: 70,
                to: 100,
                color: '#8e44ad',
            }
        ]
    },
    series: [{ name: 'Score', data: [68] }]
});

From here, you can layer on the parts that carry business meaning: plot bands for ranges, pane.innerSize for a ring layout, pane.borderRadius for rounded arc ends, or a solidgauge series for KPI and progress-style displays. 

Our gauge inspiration demo (essentially a gauge mood board) shows an array of possibilities, from default gauges to concentric KPI rings to custom dial paths.

Additional resources:

Datetime axes that know where you are in time

For a while, Highcharts has used an internal “higher ranks” logic for labels, where years rank higher than months, months higher than days, etc. For example, when a Highcharts Stock chart crosses into a new year, month-based labels may switch over to years since the higher-ranked unit takes precedence. 

In Highcharts v13, new boundary formatting makes this switchover fully configurable and extended across all time units.

Highcharts.stockChart('container', {
    xAxis: {
        dateTimeLabelFormats: {
            month: { main: '%b' },
            year: { boundary: '<b>%Y</b>' }
        }
    },
    series: [{ data }]
});

In the example above, monthly ticks (“Jan,” “Feb,” “Mar”) appear in normal-weight font, while the year uses a bolded label.

This works at every resolution: minute ticks can highlight hour boundaries, hourly ticks can highlight days, and so on up the chain. There is also a templating route where axis labels have a “boundary” value in their formatting context, so you can branch directly in labels.format:

xAxis: {
    labels: {
        format: `{#if (eq boundary "month")}
            {value:%b <b>%Y</b>}
        {else}
            {value:%e %b}
        {/if}`
    }
}

It’s the same helpful “new section starts here” behavior, now explicitly defined in the chart configuration rather than a hidden heuristic.

Additional resources:

Modern, readable data labels

Highcharts has always helped data label readability by defaulting to contrasting text color and applying text outlines where appropriate. 

But in Highcharts v13, we’ve come up with a calmer option: dataLabels.backgroundColor that can now be set to “contrast.”

plotOptions: {
    column: {
        stacking: 'normal',
        dataLabels: {
            enabled: true,
            inside: true,
            backgroundColor: 'contrast',
            style: { textOutline: 'none' }
        }
    }
}

Set it to ‘contrast’ to add a plain, semi-transparent background behind each label, giving the text a stable reading surface regardless of what’s underneath. This is especially useful for stacked columns, pies and maps where labels appear over a wide variety of colors.

The related dataLabels.distance option has also been generalized to apply across more series types, making it easier to nudge labels without series-specific workarounds.

Additional resources:

Other Design and UX Improvements

Highcharts v13 also includes a handful of smaller “hey, that’s cool” changes, the kind users may not name, but will definitely feel:

Smoother point animations. Points now fade in and out from the correct position in the coordinate system when added, removed, or updated, resulting in a noticeable cleaner impression in dynamic charts.

Better legend symbols. Symbols now more accurately reflect the actual styling of their series, making legends more useful as visual keys rather than decorative labels.

Rounded plot area corners. Setting chart.plotBorderRadius gives cartesian charts and maps a softer frame, with axes, plot bands, and grid lines clipped to match.

Gantt treegrid facelift. Updated default colors and a tighter fit with the rest of the grid-axis styling.

Try It

This beta phase is the perfect time to test Highcharts v13 with your existing charts and let us know where the edges still feel sharp.

Install via npm:

npm install highcharts@beta

Or get the code via jsDelivr:

https://cdn.jsdelivr.net/npm/highcharts@beta/highcharts.js

The final release is targeted for early June. If something looks off, let us know.  

Stay in touch

No spam, just good stuff

We're on discord. Join us for challenges, fun and whatever else we can think of
XSo MeXSo Me Dark
Linkedin So MeLinkedin So Me Dark
Facebook So MeFacebook So Me Dark
Github So MeGithub So Me Dark
Youtube So MeYoutube So Me Dark
Instagram So MeInstagram So Me Dark
Stackoverflow So MeStackoverflow So Me Dark
Discord So MeDiscord So Me Dark

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.