Every row is one synthetic order line: a timestamp, a channel, a region, a product family, a SKU, a unit price and an order value, drawn from a fixed seed. Nothing is fetched. Charts generate and draw one after another as they scroll into view, so the page stays usable while a million rows load. Hover, the legend and zoom all work at every size.
What this takes
A chart never draws more than 10,000 marks, whatever the row count. A line on a time axis keeps about one point per 2 px. Scatter and beeswarm switch to density cells, coloured by how many rows each holds. Bar, boxplot, sunburst and sankey combine rows into categories first, so a million rows over thirty-six categories is thirty-six bars.
A bar chart over many categories keeps the largest and folds the rest into Other; set
limit to choose how many stay. Aggregating on a server before the browser
sees the rows is faster than any of this.
The rows themselves are the main cost. A million row objects take about 100 MB of JavaScript heap (95 MB measured here in Chromium), and this page keeps one copy that every chart reads.