apexcharts-skill 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,7 @@
6
6
  - **Box Plot** (`'boxPlot'`) — Statistical distribution chart showing min, Q1, median, Q3, max
7
7
  - **Violin** (`'violin'`, **new in v6**): Statistical distribution chart showing a density curve per category, optionally with the raw sample points overlaid as jitter
8
8
  - **Histogram** (`'histogram'`, **new in v6.9**): Bins raw observations into columns; the series carries the sample, the chart does the aggregating
9
+ - **Raincloud** (`'raincloud'`, **new in v7.1, premium, Tier 2**): A distribution shown three ways at once: a half-violin for the shape, a box for the summary, and the observations themselves as "rain" underneath
9
10
 
10
11
  ## Tree-Shakeable Import
11
12
 
@@ -20,12 +21,17 @@ import ApexCharts from 'apexcharts/violin'
20
21
  import ApexCharts from 'apexcharts/histogram'
21
22
  // Registers: histogram (v6.9), the bar engine plus the stats feature
22
23
 
24
+ import ApexCharts from 'apexcharts/raincloud'
25
+ // Registers: raincloud (v7.1), the violin engine plus the raincloud feature
26
+
23
27
  // The statistics (histogram binning, boxPlot/violin raw-sample summaries,
24
28
  // rowSeries()) live behind one optional feature. apexcharts/histogram already
25
29
  // includes it; boxPlot/violin raw samples need it explicitly when tree-shaking:
26
30
  import 'apexcharts/features/stats'
27
31
  ```
28
32
 
33
+ **⚠️ Raincloud is Tier 2 (v7.1).** Unlike every other chart type, it is **not in the default `apexcharts` bundle**. On the full bundle add `import 'apexcharts/raincloud'` (or `import 'apexcharts/features/raincloud'`); from a script tag add `dist/features/raincloud.js` after `apexcharts.js`. It is also premium, so it renders an `APEXCHARTS` watermark until an entitled license is set.
34
+
29
35
  **Raw samples (v6.9):** boxPlot, violin, and histogram can all take the raw observations and compute the statistics themselves (quartiles for boxPlot, KDE density for violin, bin counts for histogram). Precomputed summaries keep working exactly as before. With the full `apexcharts` bundle the stats feature is always present; with tree-shaking entries it must be imported (without it, a raw-sample boxPlot/violin datum has nothing to summarize and a histogram warns and draws nothing).
30
36
 
31
37
  ---
@@ -216,6 +222,65 @@ The series carries **raw observations** (a flat number array, or `{ y }` objects
216
222
  - `overlap: true` (the default with multiple series) also softens the fill and drops the bin separator stroke so the overlapping region reads; both remain overridable. A single series is unaffected either way.
217
223
  - Do NOT pass pre-aggregated counts; that is a plain `bar` chart. The histogram's job is the binning.
218
224
 
225
+ ### Raincloud (v7.1, premium, Tier 2)
226
+
227
+ `chart.type: 'raincloud'` shows a distribution three ways at once: the **half-violin** is the shape, the **box** is the summary, and the **rain** underneath is the observations themselves. You hand it the raw values and it does the rest.
228
+
229
+ ```js
230
+ import ApexCharts from 'apexcharts'
231
+ import 'apexcharts/raincloud' // Tier 2: required even on the full bundle
232
+
233
+ new ApexCharts(el, {
234
+ chart: { type: 'raincloud', height: 350 },
235
+ series: [{
236
+ name: 'Weight gain',
237
+ data: [
238
+ { x: 'Control', points: [3.1, 4.7, 2.9, 5.2, 3.8, 4.1] },
239
+ { x: 'Treatment', points: [6.4, 7.1, 5.8, 6.9, 7.6, 6.2] },
240
+ ],
241
+ }],
242
+ }).render()
243
+ ```
244
+
245
+ Raincloud is a **preset over the violin engine**, so it is configured through `plotOptions.violin`. The type sets three of those defaults for you:
246
+
247
+ | `plotOptions.violin` key | Raincloud preset | Plain violin default |
248
+ |---|---|---|
249
+ | `side` | `'right'` (or `'top'` when horizontal), a half-violin | `'both'` |
250
+ | `box.show` | `true` (the "umbrella") | `false` |
251
+ | `box.whiskers` | `'tukey'` (1.5×IQR fences clamped to the data) | `'minmax'` |
252
+ | `points.position` | `'left'` (or `'bottom'` when horizontal), the "rain" gets its own lane | `'center'` |
253
+
254
+ Everything else is the violin surface, so override it there:
255
+
256
+ ```js
257
+ plotOptions: {
258
+ violin: {
259
+ box: {
260
+ width: '15%', // fraction of the category slot reserved for the box lane
261
+ capWidth: 0.5, // whisker cap length, 0..1 of the box lane width
262
+ fillColor: undefined,// defaults to the series colour
263
+ strokeWidth: 1,
264
+ },
265
+ points: {
266
+ laneWidth: '40%', // fraction of the category slot for the off-centre lane
267
+ jitter: 0.5, // 0..1 of the half-width to scatter within
268
+ size: 3,
269
+ maxPoints: undefined,// cap per violin; observations beyond it are stride-thinned
270
+ fillColor: 'series-dark', // or 'series', or any literal colour
271
+ strokeColor: '#fff',
272
+ strokeWidth: 1,
273
+ },
274
+ kde: { bandwidth: undefined, resolution: 64 },
275
+ normalize: 'individual', // or 'group' to keep widths proportional across categories
276
+ },
277
+ }
278
+ ```
279
+
280
+ The rain **is** the outlier display, so the box draws no outlier dots of its own. Off-centre dots ignore `constrainToViolin`. A `y.summary` supplied by hand as `[whiskerLow, q1, median, q3, whiskerHigh]` is drawn exactly as given rather than derived.
281
+
282
+ **The alias rewrites `chart.type` to `'violin'` at runtime.** Code that reads the live config (a formatter reading `w.config.chart.type`, a `chart.getState()` consumer, a plugin) sees `'violin'`, not `'raincloud'`; the requested type is kept on `chart.requestedType`. Branch on `requestedType` if you need to tell a raincloud from a plain violin. This is also how licensing distinguishes them: plain violins are free and never watermark.
283
+
219
284
  ### `rowSeries()`: the rows behind a summary mark (v6.9)
220
285
 
221
286
  A histogram bin, a box, and a violin all stand for rows the chart is already holding. `chart.rowSeries()` returns them as a unit-chart series (one cluster per mark, one datum per row), so a summary can be opened into its observations:
@@ -318,3 +383,6 @@ plotOptions: {
318
383
  8. **Feeding a histogram pre-binned counts**: the series must carry raw observations. If you already have counts per bucket, use a `bar` chart; a histogram would bin your counts as if they were measurements.
319
384
  9. **`whiskers: 'tukey'` on a precomputed boxPlot summary**: `plotOptions.boxPlot.whiskers` only applies when the summary is derived from `points`. A five-number `y` is drawn exactly as given.
320
385
  10. **Raw samples with tree-shaking but no stats feature**: `apexcharts/candlestick` and `apexcharts/violin` alone cannot summarize `points`. Add `import 'apexcharts/features/stats'` (the `apexcharts/histogram` entry and the full bundle already include it).
386
+ 11. **Expecting `raincloud` to work on the full bundle** *(v7.1)*: it is the one chart type that is Tier 2. `import ApexCharts from 'apexcharts'` alone gives you a console warning and no raincloud. Add `import 'apexcharts/raincloud'`.
387
+ 12. **Looking for `plotOptions.raincloud`**: there is none. Raincloud is a preset over the violin engine, so configure it through `plotOptions.violin` (`side`, `box`, `points`, `kde`, `normalize`).
388
+ 13. **Giving a raincloud a `y`**: it takes the raw sample per category: `data: [{ x, points: [number] }]`. A precomputed `y.summary` is honored for the box, but the density and the rain need the observations.
@@ -1,14 +1,32 @@
1
- # Tree-Shaking & Bundle Optimization — ApexCharts
1
+ # Bundle Tiers, Tree-Shaking & Optimization: ApexCharts
2
+
3
+ ## ⚠️ What changed in v7.0
4
+
5
+ **In v6, the default bundle contained every feature. In v7 it does not.** Nine features are **Tier 2**: shipped in the package, absent from every bundle, and reachable only through an explicit import. This applies to the default `apexcharts` bundle, not just to tree-shaken builds, and it is the most common v6 → v7 upgrade failure.
6
+
7
+ ```js
8
+ import ApexCharts from 'apexcharts'
9
+ import 'apexcharts/features/trellis' // Tier 2: required even on the default bundle
10
+ ```
11
+
12
+ | | gzip |
13
+ |---|---|
14
+ | 6.10.0 default bundle | 291,654 B |
15
+ | 7.0.0 default bundle | 252,005 B (**-13.6%**) |
16
+ | 7.1.0 default bundle | 264,326 B (three new chart types) |
17
+
18
+ If you use none of the nine, upgrading is `npm install apexcharts@7` and nothing else.
2
19
 
3
20
  ## Overview
4
21
 
5
- ApexCharts supports three import strategies with different bundle sizes:
22
+ ApexCharts supports four import strategies with different bundle sizes:
6
23
 
7
24
  | Strategy | Import | Includes |
8
25
  |---|---|---|
9
- | Full bundle | `import ApexCharts from 'apexcharts'` | All chart types + all features |
10
- | Per-type entry | `import ApexCharts from 'apexcharts/line'` | Specific chart family + core (no optional features) |
26
+ | Default bundle | `import ApexCharts from 'apexcharts'` | Every chart type except `raincloud`, plus the **Tier 1** features. **Not** the nine Tier 2 features. |
27
+ | Per-type entry | `import ApexCharts from 'apexcharts/line'` | Specific chart family + core (no optional features at all) |
11
28
  | Bare core | `import ApexCharts from 'apexcharts/core'` | Core class only — must manually register everything |
29
+ | Lean core, no bundler *(v7.0)* | `<script src=".../dist/apexcharts.core.js">` | Script-tag equivalent of bare core, assembled from separate tags. See below. |
12
30
 
13
31
  ---
14
32
 
@@ -26,9 +44,13 @@ Each entry point registers a family of related chart types:
26
44
  | `apexcharts/bar` | bar, column, rangeBar |
27
45
  | `apexcharts/column` | same as /bar |
28
46
  | `apexcharts/rangeBar` | same as /bar |
47
+ | `apexcharts/waterfall` | waterfall *(new in v7.1)*: the bar engine plus the waterfall feature |
48
+ | `apexcharts/dumbbell` | dumbbell *(new in v7.1)*: the bar engine plus the dumbbell feature |
49
+ | `apexcharts/streamgraph` | streamgraph *(new in v7.1)*: the rangeArea engine plus the streamgraph feature |
29
50
  | `apexcharts/candlestick` | candlestick, boxPlot |
30
51
  | `apexcharts/boxPlot` | same as /candlestick |
31
52
  | `apexcharts/violin` | violin *(new in v6)* |
53
+ | `apexcharts/raincloud` | raincloud *(new in v7.1, premium)*: the violin engine plus the raincloud feature. **Tier 2**: the only chart type absent from the default bundle. |
32
54
  | `apexcharts/histogram` | histogram *(new in v6.9)*: the bar engine plus the stats feature |
33
55
  | `apexcharts/pie` | pie, donut, polarArea |
34
56
  | `apexcharts/donut` | same as /pie |
@@ -40,8 +62,19 @@ Each entry point registers a family of related chart types:
40
62
  | `apexcharts/sunburst` | sunburst *(new in v6.7, free)* |
41
63
  | `apexcharts/unit` | unit, **waffle** *(new in v6.6, premium: watermarked until licensed)* |
42
64
  | `apexcharts/unit-shapes` | *(new in v6.10)* not a chart entry: named shape exports for the unit chart (`heart`, `house`, ... plus `outlined`, `glyphs`, `preview`), tree-shaken per shape (~4 KB gzipped each). See `references/circular-charts.md`. |
65
+ | `apexcharts/pictograms` | *(new in v7.0)* not a chart entry: a drawn glyph per unit for the unit chart (`person`, `house`, `heart`, `tree`, `droplet`, `star`, `car`, `bag`, `book`, `cup`, `bulb`, `plane`), plus `definePictogram` / `registerMarks` / `catalog`. Import the glyph you use, not `catalog`, which ships all of them. |
66
+
67
+ **First-class aliases:** `funnel` and `pyramid` render through the bar engine, so `apexcharts/bar` covers them. `gauge` renders through radialBar, so `apexcharts/radialBar` covers it. There is no separate `apexcharts/funnel`, `apexcharts/pyramid`, or `apexcharts/gauge` entry.
43
68
 
44
- **v6 first-class aliases:** `funnel` and `pyramid` render through the bar engine, so `apexcharts/bar` covers them. `gauge` renders through radialBar, so `apexcharts/radialBar` covers it. There is no separate `apexcharts/funnel`, `apexcharts/pyramid`, or `apexcharts/gauge` entry. `histogram` also renders through the bar engine but has its own `apexcharts/histogram` entry because it bundles the stats feature; `apexcharts/bar` + `import 'apexcharts/features/stats'` is equivalent.
69
+ **Entries that bundle a feature.** Four types render through an existing engine but have their own entry because that entry also pulls in a feature module. Each is equivalent to the engine entry plus the feature:
70
+
71
+ | Entry | Equivalent to |
72
+ |---|---|
73
+ | `apexcharts/histogram` | `apexcharts/bar` + `import 'apexcharts/features/stats'` |
74
+ | `apexcharts/waterfall` | `apexcharts/bar` + `import 'apexcharts/features/waterfall'` |
75
+ | `apexcharts/dumbbell` | `apexcharts/bar` + `import 'apexcharts/features/dumbbell'` |
76
+ | `apexcharts/streamgraph` | `apexcharts/rangeArea` + `import 'apexcharts/features/streamgraph'` |
77
+ | `apexcharts/raincloud` | `apexcharts/violin` + `import 'apexcharts/features/raincloud'` |
45
78
 
46
79
  ### Using Multiple Chart Types
47
80
 
@@ -53,9 +86,16 @@ import 'apexcharts/bar' // side-effect: registers bar types onto the same clas
53
86
 
54
87
  ---
55
88
 
56
- ## Optional Features
89
+ ## Optional Features: Tier 1 vs Tier 2
90
+
91
+ Two questions decide whether you need a `features/*` import:
92
+
93
+ 1. **Which entry point did you start from?** `apexcharts/core` and the per-type entries carry no optional features at all, so every feature you want needs its import.
94
+ 2. **Which tier is the feature?** Tier 1 is in the default `apexcharts` bundle. **Tier 2 is in no bundle**, so it needs its import even there.
57
95
 
58
- Features are optional modules that add functionality. When using per-type entries or core, features must be explicitly imported.
96
+ ### Tier 1: in the default `apexcharts` bundle
97
+
98
+ Import these only when you started from `/core` or a per-type entry.
59
99
 
60
100
  | Feature | Import | What It Adds |
61
101
  |---|---|---|
@@ -65,33 +105,78 @@ Features are optional modules that add functionality. When using per-type entrie
65
105
  | Exports | `import 'apexcharts/features/exports'` | `dataURI()`, `getSvgString()`, `exportToCSV()` |
66
106
  | Keyboard | `import 'apexcharts/features/keyboard'` | Keyboard navigation (accessibility) |
67
107
  | Stats *(v6.9)* | `import 'apexcharts/features/stats'` | Histogram binning, boxPlot/violin raw-sample summaries, `rowSeries()` |
68
- | Morph *(v6)* | `import 'apexcharts/features/morph'` | Animated chart-type morphs |
69
- | Drilldown *(v6)* | `import 'apexcharts/features/drilldown'` | Hierarchical drill-down |
70
- | History / Rewind *(v6)* | `import 'apexcharts/features/history'` | Undo/redo (`chart.history`) |
71
- | Perspectives *(v6)* | `import 'apexcharts/features/perspectives'` | Shareable view state |
72
- | Storyboard *(v6)* | `import 'apexcharts/features/storyboard'` | Scrollytelling (includes perspectives) |
73
- | Facet *(v6)* | `import 'apexcharts/features/facet'` | Design tokens + OS-aware themes |
74
- | Weave *(v6)* | `import 'apexcharts/features/weave'` | Public plugin platform |
75
- | Renderer / Strata *(v6)* | `import 'apexcharts/features/renderer-canvas'` | Hybrid SVG + canvas renderer |
76
- | Marks *(v6)* | `import 'apexcharts/features/marks'` | Custom series types (`registerSeriesType`) |
77
- | Link *(v6)* | `import 'apexcharts/features/link'` | Crossfilter / linked views |
78
- | Ink *(v6)* | `import 'apexcharts/features/ink'` | On-chart annotation authoring |
79
- | Measure *(v6)* | `import 'apexcharts/features/measure'` | Measure / delta ruler |
80
- | Context menu *(v6)* | `import 'apexcharts/features/context-menu'` | Right-click / long-press context menu |
81
- | All | `import 'apexcharts/features/all'` | All of the above |
82
-
83
- **Important:** Tooltip is always included in core (it cannot be tree-shaken). Easing (Cadence) and real-time streaming are also core, so they need no feature import. See `v6-features.md` for the config and API of each v6 feature.
108
+ | Morph | `import 'apexcharts/features/morph'` | Animated chart-type morphs |
109
+ | Drilldown | `import 'apexcharts/features/drilldown'` | Hierarchical drill-down |
110
+ | Facet | `import 'apexcharts/features/facet'` | Design tokens + OS-aware themes |
111
+ | Weave | `import 'apexcharts/features/weave'` | Public plugin platform |
112
+ | Marks | `import 'apexcharts/features/marks'` | Custom series types (`registerSeriesType`) |
113
+ | Waterfall *(v7.1)* | `import 'apexcharts/features/waterfall'` | The `waterfall` chart type |
114
+ | Dumbbell *(v7.1)* | `import 'apexcharts/features/dumbbell'` | The `dumbbell` chart type |
115
+ | Streamgraph *(v7.1)* | `import 'apexcharts/features/streamgraph'` | The `streamgraph` chart type |
116
+ | All Tier 1 | `import 'apexcharts/features/all'` | Every row above, and **only** those |
117
+
118
+ Tier 1 is a **budget, not an index**: upstream, a module earns a place only if it is under ~5 KB gzipped on top of core, needs no peer dependency or separate asset, and is useful to a majority of charts. The first seven predate the budget and are grandfathered.
119
+
120
+ ### Tier 2: in NO bundle; always an explicit import
121
+
122
+ Required whatever entry point you used, the default `apexcharts` bundle included.
123
+
124
+ | Feature | Import | gzip | Premium | What It Adds |
125
+ |---|---|---|---|---|
126
+ | Trellis *(v7.0)* | `import 'apexcharts/features/trellis'` | 25.7 KB | yes | Small multiples: a grid of real charts sharing scale, legend, toolbar, crosshair |
127
+ | Storyboard | `import 'apexcharts/features/storyboard'` | 8.0 KB | yes | Scrollytelling (registers Perspectives too) |
128
+ | Perspectives | `import 'apexcharts/features/perspectives'` | 6.7 KB | yes | Shareable view state |
129
+ | Ink | `import 'apexcharts/features/ink'` | 6.2 KB | yes | On-chart annotation authoring |
130
+ | Renderer / Strata | `import 'apexcharts/features/renderer-canvas'` | 6.0 KB | no | Hybrid SVG + canvas renderer |
131
+ | Link | `import 'apexcharts/features/link'` | 5.3 KB | yes | Crossfilter / linked views |
132
+ | Measure | `import 'apexcharts/features/measure'` | 4.6 KB | yes | Measure / delta ruler |
133
+ | History / Rewind | `import 'apexcharts/features/history'` | 3.2 KB | yes | Undo/redo (`chart.history`) |
134
+ | Context menu | `import 'apexcharts/features/context-menu'` | 2.3 KB | yes | Right-click / long-press context menu |
135
+ | Raincloud *(v7.1)* | `import 'apexcharts/features/raincloud'` | n/a | yes | The `raincloud` chart type (or use the `apexcharts/raincloud` entry) |
136
+
137
+ Storyboard registers Perspectives, so importing both costs no more than Storyboard alone.
138
+
139
+ **`apexcharts/features/all` does not include Tier 2**, by design: upstream has a tier-budget test that fails the build if a Tier 2 feature reappears in it.
140
+
141
+ **Nothing fails silently on Tier 2.** Each module warns in the console when its configuration is present but the module is not, and the warning names both the ESM and script-tag route. Where the chart can still draw something sensible it does and says what it did instead: a trellis renders as a single chart, `renderer: 'canvas'` falls back to SVG.
142
+
143
+ ---
144
+
145
+ ## Script tags: the lean core channel (v7.0)
146
+
147
+ Tree-shaking only ever helped people with a build step. A page using a `<script>` tag had one artifact and no way to decline any of it. `dist/apexcharts.core.js` is the chart class with no chart types and no optional features, assembled from separate tags:
148
+
149
+ ```html
150
+ <script src=".../dist/apexcharts.core.js"></script>
151
+ <script src=".../dist/line.js"></script>
152
+ <script src=".../dist/features/legend.js"></script>
153
+ ```
154
+
155
+ **136,921 B gzipped**, against 252,005 for the full bundle. Purely additive: `apexcharts.js` is unchanged, and a page that wants everything should keep loading it rather than assembling it from parts.
156
+
157
+ Every Tier 2 feature has a `dist/features/<name>.js` artifact for this channel too, and a full-bundle page still needs it:
158
+
159
+ ```html
160
+ <script src=".../dist/apexcharts.js"></script>
161
+ <script src=".../dist/features/trellis.js"></script>
162
+ ```
163
+
164
+ **Important:** Tooltip is always included in core (it cannot be tree-shaken). Easing (Cadence) and real-time streaming are also core, so they need no feature import. See `feature-platform.md` for the config and API of each feature.
84
165
 
85
166
  **Runtime dependency (v6.9):** ApexCharts is no longer dependency-free: it depends on `apex-commons` at runtime (license manager, crossfilter engine, spring primitives shared across the ApexCharts family). npm resolves it automatically, and the browser (script-tag) bundles inline it, so no configuration is needed; bundlers just see one more resolvable package. The `apexcharts/unit` and `apexcharts/unit-shapes` sub-entry points resolve for bundlers and script tags alike (from a script tag, `dist/unit-shapes.js` exposes the global `ApexUnitShapes`).
86
167
 
87
168
  ### What Happens If You Forget a Feature
88
169
 
89
- Features fail **silently**. If you use a per-type entry without importing legend:
170
+ It depends on the tier.
171
+
172
+ **Tier 1 features fail silently.** If you use a per-type entry without importing legend:
90
173
  - No legend appears, no error thrown
91
174
  - `chart.toolbar` is undefined, toolbar doesn't render
92
175
  - `addXaxisAnnotation()` does nothing
93
176
  - `dataURI()` / `exportToCSV()` throw because the feature isn't registered
94
177
 
178
+ **Tier 2 features announce themselves.** Each warns in the console when its configuration is present but the module is not, naming both the ESM and the script-tag route, and degrades predictably where it can: a `trellis` config renders as one ordinary chart, `renderer: 'canvas'` falls back to SVG. If a v7 chart is quietly missing a feature you configured, **check the console before the config**.
179
+
95
180
  ---
96
181
 
97
182
  ## Bare Core Usage
@@ -171,7 +256,10 @@ export default {
171
256
 
172
257
  ## Common Pitfalls
173
258
 
174
- 1. **Missing feature imports** — features fail silently. If legend/toolbar/annotations don't appear, check imports.
175
- 2. **Importing `apexcharts` AND `apexcharts/line`** — creates duplicate bundles. Use one strategy.
176
- 3. **Vite duplicate bundle issue** — without `optimizeDeps.include`, Vite may bundle ApexCharts twice.
177
- 4. **Calling `dataURI()` without exports feature** — throws an error. Import `apexcharts/features/exports` first.
259
+ 1. **Assuming the default bundle still has everything *(v7)***: the nine Tier 2 features and the `raincloud` type need their own import on top of `import ApexCharts from 'apexcharts'`. This is the most common v6 → v7 upgrade failure.
260
+ 2. **Reaching for `apexcharts/features/all` to fix it**: that is the Tier 1 set by design and pulls in no Tier 2 module.
261
+ 3. **Missing feature imports on a tree-shaken build**: Tier 1 features fail silently. If legend/toolbar/annotations don't appear, check imports.
262
+ 4. **Importing `apexcharts` AND `apexcharts/line`**: creates duplicate bundles. Use one strategy. *(v7.0 fixed the related internal bug where the default bundle inlined its own core copy while add-ons resolved `apexcharts/core`, so an app importing both got two classes, ~130 KB gzipped of duplicate core, and a feature that never registered. They now share one core.)*
263
+ 5. **Vite duplicate bundle issue**: without `optimizeDeps.include`, Vite may bundle ApexCharts twice.
264
+ 6. **Calling `dataURI()` without exports feature**: throws an error. Import `apexcharts/features/exports` first.
265
+ 7. **`require('apexcharts/line')` used to throw** `h.use is not a function` in every published version with sub-path entries, because rollup's default CJS interop assumes `require()` returns the export itself. Fixed in **7.0.0**; below that, use ESM `import` for sub-path entries.