From 2d8ae17fda7e385462eb2c5cbe8fd767a2436f8f Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 10 Jun 2026 15:51:18 -0600 Subject: [PATCH 01/20] Update changelog --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a82ce94..e152aff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,23 @@ where X.Y.Z is the semver of most recent react-plotly.js release. ## [Unreleased] +## [4.0.0] - 2026-06-11 + +### Added + +- Added native ESM output alongside CJS [[#367](https://github.com/plotly/react-plotly.js/pull/367)] + - Published artifacts now live under `dist/` instead of at the repo root; the `main` entry moved from `react-plotly.js` to `./dist/index.cjs` + - Dropped the unminified UMD bundle + - `import Plot from 'react-plotly.js'` now resolves correctly in Rolldown and any other strict ESM environment +- Added TypeScript declaration files (`index.d.ts` / `factory.d.ts`) [[#368](https://github.com/plotly/react-plotly.js/pull/368)] + +### Changed + +- Update linting dependencies [[#366](https://github.com/plotly/react-plotly.js/pull/366)] +- Refactored the wrapper from a class component to a functional component using hooks [[#369](https://github.com/plotly/react-plotly.js/pull/369)] + - Refs forwarded to `` now resolve to the rendered `
` element (the plotly graph div) directly via `forwardRef`, instead of to the class instance + - **Migration:** replace `ref.current.el` with `ref.current` + ## [3.0.0] - 2026-06-09 ### Added From 3bfd1c8bb10f4d3e0cb11f6eeb83abde12d99415 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 10 Jun 2026 15:51:42 -0600 Subject: [PATCH 02/20] Update README per v4 changes --- README.md | 227 ++++++++++++++++++++++++++++-------------- plotly-react-logo.png | Bin 0 -> 3171 bytes 2 files changed, 155 insertions(+), 72 deletions(-) create mode 100644 plotly-react-logo.png diff --git a/README.md b/README.md index 5552775..0ede7f5 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,9 @@ # react-plotly.js -![plotly-react-logo](https://images.plot.ly/plotly-documentation/thumbnail/react.png) +![plotly-react-logo](plotly-react-logo.png) > A [plotly.js](https://github.com/plotly/plotly.js) React component from -> [Plotly](https://plot.ly/). The basis of Plotly's -> [React component suite](https://plot.ly/products/react/). - -👉 [DEMO](http://react-plotly.js-demo.getforge.io/) - -👉 [Demo source code](https://github.com/plotly/react-plotly.js-demo-app) +> [Plotly](https://plotly.com/).
@@ -24,9 +19,14 @@ - [Quick start](#quick-start) - [State management](#state-management) - [Refreshing the Plot](#refreshing-the-plot) -- [API](#api) +- [API](#api-reference) - [Basic props](#basic-props) - [Event handler props](#event-handler-props) +- [Examples](#examples) + - [Responsive plot](#responsive-plot) + - [Event handlers](#event-handlers) + - [TypeScript](#typescript) + - [Grabbing the graph div via `ref`](#grabbing-the-graph-div-via-ref) - [Customizing the `plotly.js` bundle](#customizing-the-plotlyjs-bundle) - [Loading from a ` + + + ``` -And instantiate the component with +React is pinned to 18 here because React 19 stopped shipping UMD builds; consumers wanting React 19 should load it via [importmap](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap) or use a bundler. + +The factory is exposed as the global `createPlotlyComponent`. Build the component and mount it: ```javascript const Plot = createPlotlyComponent(Plotly); - -ReactDOM.render( +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( React.createElement(Plot, { data: [{x: [1, 2, 3], y: [2, 1, 3]}], - }), - document.getElementById('root') + }) ); ``` -You can see an example of this method in action -[here](https://codepen.io/rsreusser/pen/qPgwwJ?editors=1010). - ## Development To get started: @@ -240,18 +315,26 @@ To get started: $ npm install ``` -To transpile from ES2015 + JSX into the ES5 npm-distributed version: +To build the published artifacts (`dist/index.{mjs,cjs}`, `dist/factory.{mjs,cjs}`, the UMD bundle, and the declaration files) via [tsup](https://tsup.egoist.dev/): ```bash -$ npm run prepublishOnly +$ npm run build ``` -To run the tests: +To run lint + typecheck + jest: ```bash $ npm run test ``` +To watch source files and rebuild on change: + +```bash +$ npm run watch +``` + +Releases are cut from `master` per the steps in [`RELEASE.md`](./RELEASE.md). + ## License -© 2017-2020 Plotly, Inc. MIT License. +© 2017-2026 Plotly, Inc. MIT License. diff --git a/plotly-react-logo.png b/plotly-react-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..29a5c5cd16d5ecd58ce19ad1bbcd76695d70e7a9 GIT binary patch literal 3171 zcmb7`_dgVl1aMS4xAxc z5rWIUGxqdG$WXp(8_;#Ca3YM5+E;2N*Ld#1js3z)t!YdQRGW~3?mC{IqkWMXN9Ym5 z!#0niGM=}_+psK`h!D>&D3?Y}J&?yKEun|~UDgk;6gJ`Mh#}DLqhFrpPa06`cllPh zSUX$`2eLPx^sV3KJ3{j{Xa!W6b`*)FtpmKh&(RYcT}lh5&h}201O6y}A!CBbAf=Vm zw{%aqJnR%)(>MIpW|-|``J>vQP~Q6r;|MZtTyDwjYK6|0qHC@Ii_h3p|(RDSY9edg@*cw$0;0sr4qkT z@sE%!)q3*Oa`l6fhY8{N6#s#r_bcJo^7pE6p}M&?-~3m$m&+`IF&Q}Rb^*;|K9P&+ zCs6|E#?H&Tiiy1#CL+U&uyB2bgkSvcIv>%}08J&j^m;$q7kDxaA9!()3qJc98)xKG z5%yLdLR(N9{j2;w-UmaX5j)G<{)6ZM?((OT28o)EOfM%V+IkLaEh>`wdD~`|Q{0x~7~Y_^`p*2me^U`h z#bA!MIe@qj*_~;CfBWjOArmZ5XtOD66o&XT-cQI%F!YzK@81QQ3k(z@WMZ?cf}JFxo}13u zK>DEb;oDL7mvaVUNLA*qa5FZ=E*THy^F|V=-!9HLxe+2W0}Ul?e!%==KT~RtlN8bO z@p}n3nC#W%?Su=G&+8EU2Q|lXkg+q@lA-rj{2-c~jx+Px;1Mvj) z_1nS68uV(FJ4i;WM`(+6qd7SNDz8+lu+GB0W458znxc|b=eN;kn`O>oJ%MxvYOoBu z0f{f0TE2#Il?S>ZKo$L^`W1IA|H!(6GXnyb1OXRI3l7Nty^>yXT4{ST`gGy~@c}rl z+hU*z5U1cn;nA_FnWC%)RfGqE^7EOj0H+iU$6@(;HO4RR6niU_$;?=k{zi%lEZW+G zBak-v;RM^*mEkohC#Y-y&UQt_q1$!kkQ$7_~+s; zEq~VRdsDB+#Wn>>9DV-H>Cz$*zslcf+DP7SFs5)^x9^TkWJwq-bem_%GpSX)AJvEi z35Vjhh0o+z+pVlV&gaT|^s&s;@Q+ZpUtNpjb}`eu2Zb)QE2`PkW0&a#*Z%WE&oEDR zexmc`PnPNP+T%Ev^dl~$CjNuilotg{7r(j4;gaI~c3ZCMwChsJ$^DPlAv%;e+ozW= z<0ep0RqN($=@hV=teMa_UZ@E_-xi6ho1G3r-XJX<#a5rXgu_o@Ui}#!63gR7qX&m! z+1a&jUeJIbx>hmmxUJLQt(=6$*Zc|y4?;=O4H8SsI*2qe7HZ8}s?$q|o|adD!3mT| z!_WdTt;pIrlM7u9vzerv%INZD!Taw+}LvY0jq+PKVjx9TY zM2}7Kw_s;MVD2ia_2w#d9?WR=#rVE(!yCA;v-~ivh8i?bX zPRFo*z&bxSZfuL4cAt!p&{+fK{cO@bPW#jnC;9e)C=}n;UEYzKU9g~_J*EwoHhFPc zA?tCwdX)A*jIq~3SpJ{8?X9qgNVcEF>mFR?HP6g+lsmi%w;^7S5tvUaUoj7IX1MwG zh>`)JrSy2?0*y+tAnA1_ElvT6Fz88sgY_&VIw5^RyQmJpHz-YJ;k-9@{-f?*!ooq_ zydT9XB7tTy*6b&;{!T#5YCRNh35hd=on0+^*~f>dp=R>k2)CW@6mGc|y`V;vq!6`# zmft95l)QsAHQX@#tuOtSJ&MwF?SuGPBSq67KQ*dc_^pSpvw9<75=ie(bp1cM%W@!K z3qUEKxx#hg`bjJ1F^>)cv%+@S!ySIk;4omvgerbNghp}5WCilD(BX}3W3*dBia>x7f503mXY_9$loWB`*gsX=;exbiO%@yu;^As&ZXel(gttxs zCP+p>6-k2)4EK9{l5$YO`R#4b8ETrLb3#$2;}*FD^^YA_k3A&+og|wh5-~n#PVP*U zDKX>657q5HJZ{E%p^5^hoVP7z<+sr1;A6+dbwdA-#R1!_gcuh%@T4b=G+=yS6w{wWj1(kE+0`^Xb6TUSn_4%o(XM&gXl#Z+*Lb307-N@s{b1Tgk3@ zp$cuC%d|>KBBVal$AaBb%*>MY@=i_o7viOeA8~KgEo*GmKp=b~?>|2J#HJiC%Ild0K2p!4RAsH+0F=F7#U%-mN3BRAKMMD}IJh(7y1 z9^~CQ@d@HW#S`=lcAtqN>N%#G&RGH8u6+8{4>Ow)d> z>D-fL$xtz7=is7wn2jK+lBaA%P# z$92cNxZjaIpZP2=3Y2_R{ovK&bE~Nd4D>n();j0uc-#B-1YD{a+T5XY;&Vw9_fGO8h{{6jtN7UVmPI!Rd-^dfj< zfbP6;&^$ARlZ8TPJS}lV%Pn(?Z3RLr9~j7$f$%dB{e^n&29Of@_7^KK>d`Ub zL&O6~1bWs87^PxH{1E}L+aLu41LLEvk`#tQvas+F~ zLn!^L5D83ocA`6t>gGN}LwPr2eUDHgf?M!j0|(rO*C>caf_&*F;iw&{n-Dxw#^9jb z$MD+P{DldhPi&~?Pyd|K?4<7m+hJmpa0!%eHH$c`e{0L|CEZF4CHzA9b7sbn$o>*wRmIXy7 z0nfb4u9)}>8G}b{Xi{Gas@dsIYaUPNO6>R1=hy{sgz+$e<5R88;wQ?zlwr}bPhSQk zG^jdb2S3v%33lxT{{?FFxPXHFh1}08xHaMlrRaYxooL?&lKpi#Jv}e@e{&Mh6U-s9 zS%96wo&It{wg}cwi;`|TSK}zqGVe&&+x+KKe*HS_C8Y^D4IB+kr7isZl=Tx9QJm}6 zS%3u3TunW}%&b{U;*6~txO+BhH1{okbg8itv3t>Wp%yIuN^CB|JLLMk19V{enqM>! GZ~h1R Date: Wed, 10 Jun 2026 15:59:51 -0600 Subject: [PATCH 03/20] Add RELEASE document --- RELEASE.md | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 RELEASE.md diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..7ec718a --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,105 @@ +# Releasing react-plotly.js + +This document covers how to cut a new release of `react-plotly.js` to npm. +It's evergreen — substitute `X.Y.Z` with the target version (e.g. `3.0.0`) +and `vX.Y.Z` with the git tag (e.g. `v3.0.0`). + +## Prerequisites + +- npm publish access to the [`react-plotly.js`](https://www.npmjs.com/package/react-plotly.js) package. Granted by an existing maintainer via the npm `plotly` org. +- npm two-factor authentication configured (`npm profile get`). Publishes require an OTP. +- Push access to `plotly/react-plotly.js` on GitHub, including tag-creation permission. +- A clean local clone of the repo, ideally with `node_modules` reinstalled fresh against `master`. + +## Release sequence + +### 1. Pre-flight checks + +From the branch that will become the release and in a clean state (typically `master`, or an integration branch like `vN` that's about to merge into `master`): + +```bash +npm install # fresh install against the current lockfile +npm test # lint + typecheck + jest +npm run build # verifies the tsup build pipeline (ESM + CJS + UMD bundles) +npm run clean # removes build artifacts (also runs as part of prepublishOnly) +``` + +`npm test` and `npm run build` must succeed. CI on the source branch should also be green. + +### 2. Update the changelog + +`CHANGELOG.md` follows [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/). For each release: + +1. Rename the `## [Unreleased]` heading to `## [X.Y.Z] - YYYY-MM-DD` using the actual release date. +2. Add a fresh empty `## [Unreleased]` heading above it. + +Section order within a release: `Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security` (omit any that have no entries). Use past-tense verbs. Link each entry to the PR that introduced it, and credit external contributors with `, with thanks to @user for the contribution!` at the end of the line. + +### 3. Bump the version + +```bash +npm version X.Y.Z --no-git-tag-version +``` + +`--no-git-tag-version` prevents npm from tagging immediately; the tag is created later, after the release PR has merged. + +### 4. Open the release PR + +Branch the release off the appropriate parent — the integration branch (e.g. `vN`) for a major cumulative release, or `master` for a minor/patch. Branch name convention: `release-X.Y.Z`. + +```bash +git checkout vN # or master, depending on the release type +git pull +git checkout -b release-X.Y.Z +git add * +git commit -m "chore: release X.Y.Z" +git push -u origin release-X.Y.Z +gh pr create --base master --title "chore: release X.Y.Z" \ + --body "See CHANGELOG.md entry for [$X.Y.Z]." +``` + +When branching from an integration branch, the PR carries all of that branch's commits plus the release-prep commits — reviewers see the full changeset alongside the version bump. + +### 5. Merge and tag + +Once the PR is reviewed, CI is green, and merged into `master`: + +```bash +git checkout master +git pull +git tag vX.Y.Z +git push origin vX.Y.Z +``` + +The tag must point at the merge commit on `master`. + +### 6. Publish to npm + +```bash +npm publish +``` + +This triggers `prepublishOnly`, which runs `npm run build` (tsup, which cleans `dist/` and emits the ESM + CJS + UMD bundles + declaration files) against the current working tree before publishing. npm will prompt for the OTP from your authenticator. + +After publish, confirm: + +```bash +npm view react-plotly.js version # should report X.Y.Z +npm view react-plotly.js dist-tags # `latest` should be X.Y.Z +``` + +### 7. Create the GitHub release + +Via the GitHub UI: *Releases → Draft a new release*, target tag `vX.Y.Z`, paste the relevant `CHANGELOG.md` section into the body. + +## Pre-release versions + +For release candidates or beta builds, append a pre-release identifier and publish under a non-`latest` dist-tag so existing consumers aren't auto-upgraded: + +```bash +npm version X.Y.Z-rc.0 --no-git-tag-version +# ...PR + merge + tag as above, with tag vX.Y.Z-rc.0... +npm publish --tag next +``` + +Consumers can opt in with `npm install react-plotly.js@next`. From 06917bb9b62307bf6121a2ca51863b04368f62b2 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 10 Jun 2026 16:01:07 -0600 Subject: [PATCH 04/20] chore: Version updates for v4.0.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c5defe..6f37d29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "react-plotly.js", - "version": "3.0.0", + "version": "4.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "react-plotly.js", - "version": "3.0.0", + "version": "4.0.0", "license": "MIT", "devDependencies": { "@babel/core": "^7.19.0", diff --git a/package.json b/package.json index ce0382d..d9bb854 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-plotly.js", - "version": "3.0.0", + "version": "4.0.0", "license": "MIT", "description": "A plotly.js react component from Plotly", "author": "Plotly, Inc.", From 26d8d0c999df11eb25317c4fc548ec71c3221003 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Thu, 18 Jun 2026 12:30:54 -0600 Subject: [PATCH 05/20] Update CHANGELOG --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e152aff..ec23f94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ where X.Y.Z is the semver of most recent react-plotly.js release. ## [Unreleased] -## [4.0.0] - 2026-06-11 +## [4.0.0] - 2026-06-18 ### Added @@ -28,6 +28,12 @@ where X.Y.Z is the semver of most recent react-plotly.js release. - Refs forwarded to `` now resolve to the rendered `
` element (the plotly graph div) directly via `forwardRef`, instead of to the class instance - **Migration:** replace `ref.current.el` with `ref.current` +### Fixed + +- `onPurge` now fires and `Plotly.purge` runs on unmount [[#372](https://github.com/plotly/react-plotly.js/pull/372)] +- Plot is re-initialized correctly after React StrictMode's dev-only simulated unmount/remount [[#372](https://github.com/plotly/react-plotly.js/pull/372)] +- TypeScript declarations now expose ref forwarding so consumers can attach a typed `ref` prop without a TS error [[#373](https://github.com/plotly/react-plotly.js/pull/373)] + ## [3.0.0] - 2026-06-09 ### Added From 2bde8365ac02415c8469964452edb2e6f91ea31a Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Thu, 18 Jun 2026 13:15:19 -0600 Subject: [PATCH 06/20] chore: Update docs references from master to main --- CHANGELOG.md | 2 +- README.md | 2 +- RELEASE.md | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec23f94..06a68fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ For more context information, please read through the To see all merged commits on the default branch that will be part of the next plotly.js release, go to: - + where X.Y.Z is the semver of most recent react-plotly.js release. diff --git a/README.md b/README.md index 0ede7f5..16ee701 100644 --- a/README.md +++ b/README.md @@ -333,7 +333,7 @@ To watch source files and rebuild on change: $ npm run watch ``` -Releases are cut from `master` per the steps in [`RELEASE.md`](./RELEASE.md). +Releases are cut from `main` per the steps in [`RELEASE.md`](./RELEASE.md). ## License diff --git a/RELEASE.md b/RELEASE.md index 7ec718a..28d4737 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -9,13 +9,13 @@ and `vX.Y.Z` with the git tag (e.g. `v3.0.0`). - npm publish access to the [`react-plotly.js`](https://www.npmjs.com/package/react-plotly.js) package. Granted by an existing maintainer via the npm `plotly` org. - npm two-factor authentication configured (`npm profile get`). Publishes require an OTP. - Push access to `plotly/react-plotly.js` on GitHub, including tag-creation permission. -- A clean local clone of the repo, ideally with `node_modules` reinstalled fresh against `master`. +- A clean local clone of the repo, ideally with `node_modules` reinstalled fresh against `main`. ## Release sequence ### 1. Pre-flight checks -From the branch that will become the release and in a clean state (typically `master`, or an integration branch like `vN` that's about to merge into `master`): +From the branch that will become the release and in a clean state (typically `main`, or an integration branch like `vN` that's about to merge into `main`): ```bash npm install # fresh install against the current lockfile @@ -45,16 +45,16 @@ npm version X.Y.Z --no-git-tag-version ### 4. Open the release PR -Branch the release off the appropriate parent — the integration branch (e.g. `vN`) for a major cumulative release, or `master` for a minor/patch. Branch name convention: `release-X.Y.Z`. +Branch the release off the appropriate parent — the integration branch (e.g. `vN`) for a major cumulative release, or `main` for a minor/patch. Branch name convention: `release-X.Y.Z`. ```bash -git checkout vN # or master, depending on the release type +git checkout vN # or main, depending on the release type git pull git checkout -b release-X.Y.Z git add * git commit -m "chore: release X.Y.Z" git push -u origin release-X.Y.Z -gh pr create --base master --title "chore: release X.Y.Z" \ +gh pr create --base main --title "chore: release X.Y.Z" \ --body "See CHANGELOG.md entry for [$X.Y.Z]." ``` @@ -62,16 +62,16 @@ When branching from an integration branch, the PR carries all of that branch's c ### 5. Merge and tag -Once the PR is reviewed, CI is green, and merged into `master`: +Once the PR is reviewed, CI is green, and merged into `main`: ```bash -git checkout master +git checkout main git pull git tag vX.Y.Z git push origin vX.Y.Z ``` -The tag must point at the merge commit on `master`. +The tag must point at the merge commit on `main`. ### 6. Publish to npm From 6e66ccdbadf40d8ec870496d20b1c50d8b42e601 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 11:39:08 -0600 Subject: [PATCH 07/20] Move events and related functions into separate file --- src/events.js | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/factory.js | 55 ++--------------------------------------- 2 files changed, 68 insertions(+), 53 deletions(-) create mode 100644 src/events.js diff --git a/src/events.js b/src/events.js new file mode 100644 index 0000000..56774de --- /dev/null +++ b/src/events.js @@ -0,0 +1,66 @@ +// The single source of truth for the plotly.js events this wrapper forwards. +// +// The naming convention is: +// - events are attached as `'plotly_' + name.toLowerCase()` +// - react props are `'on' + name` +// +// `triggersUpdate` marks events that plotly.js emits *after* mutating the +// figure itself (drill-downs, zooms, restyles). For those the wrapper has to +// re-read the graph div and fire `onUpdate`. Keeping the flag on the same +// record as the name is deliberate: a new drill-down event cannot be added +// without deciding whether it updates the figure. +// +// The `on*` prop types in `factory.d.ts` are maintained by hand against this list +export const events = [ + {name: 'AfterExport'}, + {name: 'AfterPlot'}, + {name: 'Animated', triggersUpdate: true}, + {name: 'AnimatingFrame'}, + {name: 'AnimationInterrupted'}, + {name: 'AutoSize'}, + {name: 'BeforeExport'}, + {name: 'BeforeHover'}, + {name: 'ButtonClicked'}, + {name: 'Click'}, + {name: 'ClickAnnotation'}, + {name: 'ClickAnywhere'}, + {name: 'Deselect'}, + {name: 'DoubleClick', triggersUpdate: true}, + {name: 'Framework'}, + {name: 'Hover'}, + {name: 'HoverAnywhere'}, + {name: 'IcicleClick', triggersUpdate: true}, + {name: 'LegendClick'}, + {name: 'LegendDoubleClick'}, + {name: 'Relayout', triggersUpdate: true}, + {name: 'Relayouting', triggersUpdate: true}, + {name: 'Restyle', triggersUpdate: true}, + {name: 'Redraw', triggersUpdate: true}, + {name: 'Selected'}, + {name: 'Selecting'}, + {name: 'SliderChange'}, + {name: 'SliderEnd'}, + {name: 'SliderStart'}, + {name: 'SunburstClick', triggersUpdate: true}, + {name: 'Transitioning'}, + {name: 'TransitionInterrupted'}, + {name: 'TreemapClick', triggersUpdate: true}, + {name: 'Unhover'}, + {name: 'WebGlContextLost'}, +]; + +/** The plotly.js event name a given entry is attached as. */ +export function getPlotlyEventName(eventName) { + return 'plotly_' + eventName.toLowerCase(); +} + +/** The React prop name a given entry is read from. */ +export function getPropName(eventName) { + return 'on' + eventName; +} + +export const eventNames = events.map((event) => event.name); + +export const updateEvents = events + .filter((event) => event.triggersUpdate) + .map((event) => getPlotlyEventName(event.name)); diff --git a/src/factory.js b/src/factory.js index 99c4860..823a4b9 100644 --- a/src/factory.js +++ b/src/factory.js @@ -1,53 +1,6 @@ import React, {forwardRef, useCallback, useEffect, useRef} from 'react'; -// The naming convention is: -// - events are attached as `'plotly_' + eventName.toLowerCase()` -// - react props are `'on' + eventName` -const eventNames = [ - 'AfterExport', - 'AfterPlot', - 'Animated', - 'AnimatingFrame', - 'AnimationInterrupted', - 'AutoSize', - 'BeforeExport', - 'BeforeHover', - 'ButtonClicked', - 'Click', - 'ClickAnnotation', - 'ClickAnywhere', - 'Deselect', - 'DoubleClick', - 'Framework', - 'Hover', - 'HoverAnywhere', - 'LegendClick', - 'LegendDoubleClick', - 'Relayout', - 'Relayouting', - 'Restyle', - 'Redraw', - 'Selected', - 'Selecting', - 'SliderChange', - 'SliderEnd', - 'SliderStart', - 'SunburstClick', - 'Transitioning', - 'TransitionInterrupted', - 'Unhover', - 'WebGlContextLost', -]; - -const updateEvents = [ - 'plotly_restyle', - 'plotly_redraw', - 'plotly_relayout', - 'plotly_relayouting', - 'plotly_doubleclick', - 'plotly_animated', - 'plotly_sunburstclick', -]; +import {eventNames, getPlotlyEventName, getPropName, updateEvents} from './events.js'; // Check if a window is available since SSR (server-side rendering) // breaks unnecessarily if you try to use it server-side. @@ -59,10 +12,6 @@ const isBrowser = typeof window !== 'undefined'; const DEFAULT_DATA = Object.freeze([]); const DEFAULT_STYLE = Object.freeze({position: 'relative', display: 'inline-block'}); -function getPlotlyEventName(eventName) { - return 'plotly_' + eventName.toLowerCase(); -} - export default function plotComponentFactory(Plotly) { return forwardRef(function PlotlyComponent( { @@ -248,7 +197,7 @@ export default function plotComponentFactory(Plotly) { function syncEventHandlers() { eventNames.forEach((eventName) => { - const prop = eventProps['on' + eventName]; + const prop = eventProps[getPropName(eventName)]; const handler = handlersRef.current[eventName]; const hasHandler = Boolean(handler); if (prop && !hasHandler) { From e6f9c0cf4c4b0b9c0f26e0cc5e7ccd73f10be68b Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 11:39:47 -0600 Subject: [PATCH 08/20] Add missing types --- src/factory.d.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/factory.d.ts b/src/factory.d.ts index 34e75ea..cac00fe 100644 --- a/src/factory.d.ts +++ b/src/factory.d.ts @@ -49,6 +49,7 @@ export interface PlotParams { onFramework?: EventCallback; onHover?: EventCallback; onHoverAnywhere?: EventCallback; + onIcicleClick?: EventCallback; onLegendClick?: EventCallback; onLegendDoubleClick?: EventCallback; onRelayout?: EventCallback; @@ -63,6 +64,7 @@ export interface PlotParams { onSunburstClick?: EventCallback; onTransitioning?: EventCallback; onTransitionInterrupted?: EventCallback; + onTreemapClick?: EventCallback; onUnhover?: EventCallback; onWebGlContextLost?: EventCallback; } From dc508ad22b3b5b78be4549f1141777ac0b8e3ab9 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 11:49:56 -0600 Subject: [PATCH 09/20] Add events tests, fix plotly mock --- src/__mocks__/plotly.js | 17 ++++++++--- src/__tests__/events.test.js | 45 ++++++++++++++++++++++++++++++ src/__tests__/react-plotly.test.js | 30 ++++++++++++++++++++ 3 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/__tests__/events.test.js diff --git a/src/__mocks__/plotly.js b/src/__mocks__/plotly.js index fe1ad31..5a77948 100644 --- a/src/__mocks__/plotly.js +++ b/src/__mocks__/plotly.js @@ -3,6 +3,17 @@ const state = {}; const ASYNC_DELAY = 1; +// Real plotly.js binds node's EventEmitter onto the graph div, so a gd exposes +// `removeListener` (see plotly.js src/lib/events.js). The `event-emitter` +// package only gives us `off`, and the wrapper treats a missing +// `removeListener` as "not a plotly graph div" — which silently disabled the +// whole update-event path under test. Alias it so the mock matches reality. +function attachEmitter(gd) { + EventEmitter(gd); // eslint-disable-line new-cap + gd.removeListener = gd.off; + return gd; +} + export default { plot: jest.fn((gd) => { state.gd = gd; @@ -11,16 +22,14 @@ export default { }, ASYNC_DELAY); }), newPlot: jest.fn((gd) => { - state.gd = gd; - EventEmitter(state.gd); // eslint-disable-line new-cap + state.gd = attachEmitter(gd); setTimeout(() => { state.gd.emit('plotly_afterplot'); }, ASYNC_DELAY); }), react: jest.fn((gd) => { - state.gd = gd; - EventEmitter(state.gd); // eslint-disable-line new-cap + state.gd = attachEmitter(gd); setTimeout(() => { state.gd.emit('plotly_afterplot'); diff --git a/src/__tests__/events.test.js b/src/__tests__/events.test.js new file mode 100644 index 0000000..794ce5a --- /dev/null +++ b/src/__tests__/events.test.js @@ -0,0 +1,45 @@ +import {readFileSync} from 'node:fs'; +import {join} from 'node:path'; +import {events, eventNames, getPlotlyEventName, getPropName, updateEvents} from '../events'; + +// `events` drives the runtime wiring. The two hand-maintained copies — the +// `on*` props in `factory.d.ts` and the README table — can't be derived from +// it, so they're checked here instead. The declarations are shipped to +// consumers but unused by this library, which is why a text comparison is +// enough; nothing here needs the type system. +describe('events', () => { + test('has no duplicate event names', () => { + expect(new Set(eventNames).size).toBe(eventNames.length); + }); + + test('every update event is one of the forwarded events', () => { + const forwarded = eventNames.map(getPlotlyEventName); + expect(updateEvents.length).toBeGreaterThan(0); + expect(forwarded).toEqual(expect.arrayContaining(updateEvents)); + }); + + test('PlotParams declares a prop for every event', () => { + const dts = readFileSync(join(__dirname, '..', 'factory.d.ts'), 'utf8'); + + // Lines look like: onAfterPlot?: EventCallback; + const propPattern = /^\s*(on\w+)\?: EventCallback;$/gm; + const declared = [...dts.matchAll(propPattern)].map(([, prop]) => prop); + + expect(declared).toEqual(events.map((event) => getPropName(event.name))); + }); + + test('README table matches the event list', () => { + const readme = readFileSync(join(__dirname, '..', '..', 'README.md'), 'utf8'); + + // Rows look like: | `onAfterPlot` | `Function` | `plotly_afterplot` | + const rowPattern = /^\|\s*`(on\w+)`\s*\|\s*`Function`\s*\|\s*`(plotly_\w+)`\s*\|$/gm; + const documented = [...readme.matchAll(rowPattern)].map(([, prop, event]) => [prop, event]); + + const expected = events.map((event) => [ + getPropName(event.name), + getPlotlyEventName(event.name), + ]); + + expect(documented).toEqual(expected); + }); +}); diff --git a/src/__tests__/react-plotly.test.js b/src/__tests__/react-plotly.test.js index bace500..5ee764c 100644 --- a/src/__tests__/react-plotly.test.js +++ b/src/__tests__/react-plotly.test.js @@ -2,6 +2,7 @@ import React, {StrictMode, useState} from 'react'; import {act, render} from '@testing-library/react'; import createComponent from '../factory'; +import {eventNames, getPlotlyEventName, getPropName} from '../events'; import once from 'onetime'; describe('', () => { @@ -203,6 +204,35 @@ describe('', () => { }) .catch((err) => done(err)); }); + + // Every forwarded event should reach its `on*` prop. Driving this from + // the event list means a new entry is covered without touching the test. + test.each(eventNames)('forwards plotly_%s to its prop', (eventName) => { + let received; + const handler = (evt) => { + received = evt; + }; + + return createPlot({[getPropName(eventName)]: handler}).then((plot) => { + plot.gd.emit(getPlotlyEventName(eventName), {eventName}); + expect(received).toEqual({eventName}); + }); + }); + + // The drill-down traces all share plotly.js' sunburst click handler, + // which mutates `trace.level` — so onUpdate has to fire for each of them + // or consumers never see the new level. See issue #375. + test.each(['SunburstClick', 'TreemapClick', 'IcicleClick'])( + 'fires onUpdate for %s drill-downs', + (eventName) => { + const onUpdate = jest.fn(); + + return createPlot({onUpdate}).then((plot) => { + plot.gd.emit(getPlotlyEventName(eventName)); + expect(onUpdate).toHaveBeenCalled(); + }); + } + ); }); describe('StrictMode', () => { From 1edac4af57a8441feb201cb5717e00fdf1fe466b Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 16:51:46 -0600 Subject: [PATCH 10/20] Remove cancelable events from updateEvents to avoid two listeners issue --- src/__tests__/react-plotly.test.js | 28 +++++++++++++++++++--------- src/events.js | 17 +++++++++-------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/__tests__/react-plotly.test.js b/src/__tests__/react-plotly.test.js index 5ee764c..58e1ba2 100644 --- a/src/__tests__/react-plotly.test.js +++ b/src/__tests__/react-plotly.test.js @@ -219,20 +219,30 @@ describe('', () => { }); }); - // The drill-down traces all share plotly.js' sunburst click handler, - // which mutates `trace.level` — so onUpdate has to fire for each of them - // or consumers never see the new level. See issue #375. + // Cancelable — the consumer's handler must be the only listener or + // plotly could drop its `return false`. See the note in `events.js`. test.each(['SunburstClick', 'TreemapClick', 'IcicleClick'])( - 'fires onUpdate for %s drill-downs', + 'attaches only the consumer handler to %s', (eventName) => { - const onUpdate = jest.fn(); + const handler = () => false; - return createPlot({onUpdate}).then((plot) => { - plot.gd.emit(getPlotlyEventName(eventName)); - expect(onUpdate).toHaveBeenCalled(); - }); + return createPlot({[getPropName(eventName)]: handler, onUpdate: () => {}}).then( + (plot) => { + const listeners = [].concat(plot.gd.__ee__[getPlotlyEventName(eventName)] || []); + expect(listeners).toEqual([handler]); + } + ); } ); + + test('fires onUpdate when a drill-down animation completes', () => { + const onUpdate = jest.fn(); + + return createPlot({onUpdate}).then((plot) => { + plot.gd.emit('plotly_animated'); + expect(onUpdate).toHaveBeenCalled(); + }); + }); }); describe('StrictMode', () => { diff --git a/src/events.js b/src/events.js index 56774de..0946326 100644 --- a/src/events.js +++ b/src/events.js @@ -4,11 +4,12 @@ // - events are attached as `'plotly_' + name.toLowerCase()` // - react props are `'on' + name` // -// `triggersUpdate` marks events that plotly.js emits *after* mutating the -// figure itself (drill-downs, zooms, restyles). For those the wrapper has to -// re-read the graph div and fire `onUpdate`. Keeping the flag on the same -// record as the name is deliberate: a new drill-down event cannot be added -// without deciding whether it updates the figure. +// `triggersUpdate` marks events plotly.js emits *after* changing the figure; +// the wrapper listens to those and fires `onUpdate`. Never set it on a +// cancelable event — that adds a second listener alongside the consumer's, +// and plotly keeps only the last listener's return value, so a consumer's +// `return false` could be discarded. The drill-down clicks rely on +// `plotly_animated` instead. // // The `on*` prop types in `factory.d.ts` are maintained by hand against this list export const events = [ @@ -29,7 +30,7 @@ export const events = [ {name: 'Framework'}, {name: 'Hover'}, {name: 'HoverAnywhere'}, - {name: 'IcicleClick', triggersUpdate: true}, + {name: 'IcicleClick'}, {name: 'LegendClick'}, {name: 'LegendDoubleClick'}, {name: 'Relayout', triggersUpdate: true}, @@ -41,10 +42,10 @@ export const events = [ {name: 'SliderChange'}, {name: 'SliderEnd'}, {name: 'SliderStart'}, - {name: 'SunburstClick', triggersUpdate: true}, + {name: 'SunburstClick'}, {name: 'Transitioning'}, {name: 'TransitionInterrupted'}, - {name: 'TreemapClick', triggersUpdate: true}, + {name: 'TreemapClick'}, {name: 'Unhover'}, {name: 'WebGlContextLost'}, ]; From f17059b9f2f4b7d77032d08d333afdc111523327 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 17:06:11 -0600 Subject: [PATCH 11/20] Add missing plotly.js events --- src/events.js | 7 +++++-- src/factory.d.ts | 11 ++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/events.js b/src/events.js index 0946326..8f9410e 100644 --- a/src/events.js +++ b/src/events.js @@ -16,23 +16,25 @@ export const events = [ {name: 'AfterExport'}, {name: 'AfterPlot'}, {name: 'Animated', triggersUpdate: true}, + {name: 'Animating'}, {name: 'AnimatingFrame'}, {name: 'AnimationInterrupted'}, {name: 'AutoSize'}, {name: 'BeforeExport'}, {name: 'BeforeHover'}, + {name: 'BeforePlot'}, {name: 'ButtonClicked'}, {name: 'Click'}, {name: 'ClickAnnotation'}, - {name: 'ClickAnywhere'}, {name: 'Deselect'}, {name: 'DoubleClick', triggersUpdate: true}, {name: 'Framework'}, {name: 'Hover'}, - {name: 'HoverAnywhere'}, {name: 'IcicleClick'}, {name: 'LegendClick'}, {name: 'LegendDoubleClick'}, + {name: 'LegendTitleClick'}, + {name: 'LegendTitleDoubleClick'}, {name: 'Relayout', triggersUpdate: true}, {name: 'Relayouting', triggersUpdate: true}, {name: 'Restyle', triggersUpdate: true}, @@ -43,6 +45,7 @@ export const events = [ {name: 'SliderEnd'}, {name: 'SliderStart'}, {name: 'SunburstClick'}, + {name: 'Transitioned'}, {name: 'Transitioning'}, {name: 'TransitionInterrupted'}, {name: 'TreemapClick'}, diff --git a/src/factory.d.ts b/src/factory.d.ts index cac00fe..91631a1 100644 --- a/src/factory.d.ts +++ b/src/factory.d.ts @@ -35,23 +35,25 @@ export interface PlotParams { onAfterExport?: EventCallback; onAfterPlot?: EventCallback; onAnimated?: EventCallback; + onAnimating?: EventCallback; onAnimatingFrame?: EventCallback; onAnimationInterrupted?: EventCallback; onAutoSize?: EventCallback; onBeforeExport?: EventCallback; onBeforeHover?: EventCallback; + onBeforePlot?: EventCallback; onButtonClicked?: EventCallback; onClick?: EventCallback; onClickAnnotation?: EventCallback; - onClickAnywhere?: EventCallback; onDeselect?: EventCallback; onDoubleClick?: EventCallback; onFramework?: EventCallback; onHover?: EventCallback; - onHoverAnywhere?: EventCallback; onIcicleClick?: EventCallback; onLegendClick?: EventCallback; onLegendDoubleClick?: EventCallback; + onLegendTitleClick?: EventCallback; + onLegendTitleDoubleClick?: EventCallback; onRelayout?: EventCallback; onRelayouting?: EventCallback; onRestyle?: EventCallback; @@ -62,6 +64,7 @@ export interface PlotParams { onSliderEnd?: EventCallback; onSliderStart?: EventCallback; onSunburstClick?: EventCallback; + onTransitioned?: EventCallback; onTransitioning?: EventCallback; onTransitionInterrupted?: EventCallback; onTreemapClick?: EventCallback; @@ -80,8 +83,6 @@ export interface PlotParams { */ declare function createPlotlyComponent( Plotly: unknown -): React.ForwardRefExoticComponent< - PlotParams & React.RefAttributes ->; +): React.ForwardRefExoticComponent>; export default createPlotlyComponent; From 10b05f85b8072baed5ec255b687b404fcaf498b6 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 17:06:18 -0600 Subject: [PATCH 12/20] Fix typo --- src/__tests__/react-plotly.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/react-plotly.test.js b/src/__tests__/react-plotly.test.js index 58e1ba2..db23fae 100644 --- a/src/__tests__/react-plotly.test.js +++ b/src/__tests__/react-plotly.test.js @@ -186,7 +186,7 @@ describe('', () => { }); }); - describe('manging event handlers', () => { + describe('managing event handlers', () => { test('should add an event handler when one does not already exist', (done) => { let received; const onRelayout = (evt) => { From 793c875733142df1aac3a009a1cef4fef46082a5 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 17:06:39 -0600 Subject: [PATCH 13/20] Update README events table --- README.md | 89 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 16ee701..2a5a170 100644 --- a/README.md +++ b/README.md @@ -152,41 +152,60 @@ The `onInitialized`, `onUpdate` and `onPurge` props are all functions which will Event handlers for specific [`plotly.js` events](https://plotly.com/javascript/plotlyjs-events/) may be attached through the following props: -| Prop | Type | Plotly Event | -| ------------------------- | ---------- | ------------------------------ | -| `onAfterExport` | `Function` | `plotly_afterexport` | -| `onAfterPlot` | `Function` | `plotly_afterplot` | -| `onAnimated` | `Function` | `plotly_animated` | -| `onAnimatingFrame` | `Function` | `plotly_animatingframe` | -| `onAnimationInterrupted` | `Function` | `plotly_animationinterrupted` | -| `onAutoSize` | `Function` | `plotly_autosize` | -| `onBeforeExport` | `Function` | `plotly_beforeexport` | -| `onBeforeHover` | `Function` | `plotly_beforehover` | -| `onButtonClicked` | `Function` | `plotly_buttonclicked` | -| `onClick` | `Function` | `plotly_click` | -| `onClickAnnotation` | `Function` | `plotly_clickannotation` | -| `onClickAnywhere` | `Function` | `plotly_clickanywhere` | -| `onDeselect` | `Function` | `plotly_deselect` | -| `onDoubleClick` | `Function` | `plotly_doubleclick` | -| `onFramework` | `Function` | `plotly_framework` | -| `onHover` | `Function` | `plotly_hover` | -| `onHoverAnywhere` | `Function` | `plotly_hoveranywhere` | -| `onLegendClick` | `Function` | `plotly_legendclick` | -| `onLegendDoubleClick` | `Function` | `plotly_legenddoubleclick` | -| `onRelayout` | `Function` | `plotly_relayout` | -| `onRelayouting` | `Function` | `plotly_relayouting` | -| `onRestyle` | `Function` | `plotly_restyle` | -| `onRedraw` | `Function` | `plotly_redraw` | -| `onSelected` | `Function` | `plotly_selected` | -| `onSelecting` | `Function` | `plotly_selecting` | -| `onSliderChange` | `Function` | `plotly_sliderchange` | -| `onSliderEnd` | `Function` | `plotly_sliderend` | -| `onSliderStart` | `Function` | `plotly_sliderstart` | -| `onSunburstClick` | `Function` | `plotly_sunburstclick` | -| `onTransitioning` | `Function` | `plotly_transitioning` | -| `onTransitionInterrupted` | `Function` | `plotly_transitioninterrupted` | -| `onUnhover` | `Function` | `plotly_unhover` | -| `onWebGlContextLost` | `Function` | `plotly_webglcontextlost` | +| Prop | Type | Plotly Event | +| -------------------------- | ---------- | ------------------------------- | +| `onAfterExport` | `Function` | `plotly_afterexport` | +| `onAfterPlot` | `Function` | `plotly_afterplot` | +| `onAnimated` | `Function` | `plotly_animated` | +| `onAnimating` | `Function` | `plotly_animating` | +| `onAnimatingFrame` | `Function` | `plotly_animatingframe` | +| `onAnimationInterrupted` | `Function` | `plotly_animationinterrupted` | +| `onAutoSize` | `Function` | `plotly_autosize` | +| `onBeforeExport` | `Function` | `plotly_beforeexport` | +| `onBeforeHover` | `Function` | `plotly_beforehover` | +| `onBeforePlot` | `Function` | `plotly_beforeplot` | +| `onButtonClicked` | `Function` | `plotly_buttonclicked` | +| `onClick` | `Function` | `plotly_click` | +| `onClickAnnotation` | `Function` | `plotly_clickannotation` | +| `onDeselect` | `Function` | `plotly_deselect` | +| `onDoubleClick` | `Function` | `plotly_doubleclick` | +| `onFramework` | `Function` | `plotly_framework` | +| `onHover` | `Function` | `plotly_hover` | +| `onIcicleClick` | `Function` | `plotly_icicleclick` | +| `onLegendClick` | `Function` | `plotly_legendclick` | +| `onLegendDoubleClick` | `Function` | `plotly_legenddoubleclick` | +| `onLegendTitleClick` | `Function` | `plotly_legendtitleclick` | +| `onLegendTitleDoubleClick` | `Function` | `plotly_legendtitledoubleclick` | +| `onRelayout` | `Function` | `plotly_relayout` | +| `onRelayouting` | `Function` | `plotly_relayouting` | +| `onRestyle` | `Function` | `plotly_restyle` | +| `onRedraw` | `Function` | `plotly_redraw` | +| `onSelected` | `Function` | `plotly_selected` | +| `onSelecting` | `Function` | `plotly_selecting` | +| `onSliderChange` | `Function` | `plotly_sliderchange` | +| `onSliderEnd` | `Function` | `plotly_sliderend` | +| `onSliderStart` | `Function` | `plotly_sliderstart` | +| `onSunburstClick` | `Function` | `plotly_sunburstclick` | +| `onTransitioned` | `Function` | `plotly_transitioned` | +| `onTransitioning` | `Function` | `plotly_transitioning` | +| `onTransitionInterrupted` | `Function` | `plotly_transitioninterrupted` | +| `onTreemapClick` | `Function` | `plotly_treemapclick` | +| `onUnhover` | `Function` | `plotly_unhover` | +| `onWebGlContextLost` | `Function` | `plotly_webglcontextlost` | + +To receive `onClick` or `onHover` for positions that are not over a trace, set +`clickanywhere` or `hoveranywhere` in your `layout`. These are layout attributes +rather than distinct events: the ordinary `plotly_click` / `plotly_hover` fire +with an empty `points` array, plus `xvals` / `yvals` — arrays of the cursor +position in data space, one entry per axis. + +```javascript + console.log(e.points, e.xvals, e.yvals)} +/> +``` ## Examples From 8b353e8498e6910ea90c01db4d3e06463fa26dc3 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 28 Jul 2026 17:29:27 -0600 Subject: [PATCH 14/20] Update CHANGELOG --- CHANGELOG.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06a68fe..f8f7053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,22 @@ where X.Y.Z is the semver of most recent react-plotly.js release. ## [Unreleased] +### Added + +- Added missing `onTreemapClick` and `onIcicleClick` event props for the `plotly_treemapclick` and `plotly_icicleclick` events [[#376](https://github.com/plotly/react-plotly.js/pull/376)] +- Added additional missing events: `onLegendTitleClick`, `onLegendTitleDoubleClick`, `onBeforePlot`, `onAnimating`, and `onTransitioned` [[#376](https://github.com/plotly/react-plotly.js/pull/376)] + +### Fixed + +- Returning `false` from `onSunburstClick`, `onTreemapClick`, or `onIcicleClick` now prevents the drill-down [[#376](https://github.com/plotly/react-plotly.js/pull/376)] + - `onUpdate` now fires for these via `plotly_animated`, so it reports the figure after the new `level` is applied and no longer fires when the drill-down is cancelled + +### Removed + +- Removed the errantly added `onClickAnywhere` and `onHoverAnywhere` props [[#376](https://github.com/plotly/react-plotly.js/pull/376)] + - plotly.js has no `plotly_clickanywhere` or `plotly_hoveranywhere` events, so these never fired + - `clickanywhere` and `hoveranywhere` are **layout attributes** that widen the ordinary `plotly_click` / `plotly_hover`, so the feature is reached through `onClick` / `onHover` with the layout flag set — see the README + ## [4.0.0] - 2026-06-18 ### Added @@ -38,7 +54,8 @@ where X.Y.Z is the semver of most recent react-plotly.js release. ### Added -- `onClickAnywhere` and `onHoverAnywhere` event props for the corresponding `plotly_clickanywhere` and `plotly_hoveranywhere` events introduced in plotly.js v3 [[#360](https://github.com/plotly/react-plotly.js/pull/360)] +- `onClickAnywhere` and `onHoverAnywhere` event props [[#360](https://github.com/plotly/react-plotly.js/pull/360)] + - **Correction:** plotly.js v3 introduced `clickanywhere` / `hoveranywhere` as _layout attributes_, not as events, so these props never fired. They are removed in the next release. ### Changed From f58e64d2751c9acac9f0ba74d7cc3db9c6862b73 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 29 Jul 2026 16:13:27 -0600 Subject: [PATCH 15/20] chore: Update files for v4.1.0 --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8f7053..0832539 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ where X.Y.Z is the semver of most recent react-plotly.js release. ## [Unreleased] +## [4.1.0] - 2026-07-29 + ### Added - Added missing `onTreemapClick` and `onIcicleClick` event props for the `plotly_treemapclick` and `plotly_icicleclick` events [[#376](https://github.com/plotly/react-plotly.js/pull/376)] diff --git a/package-lock.json b/package-lock.json index 6f37d29..e97dcb2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "react-plotly.js", - "version": "4.0.0", + "version": "4.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "react-plotly.js", - "version": "4.0.0", + "version": "4.1.0", "license": "MIT", "devDependencies": { "@babel/core": "^7.19.0", diff --git a/package.json b/package.json index d9bb854..0be2c0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-plotly.js", - "version": "4.0.0", + "version": "4.1.0", "license": "MIT", "description": "A plotly.js react component from Plotly", "author": "Plotly, Inc.", From 1967d127a51ac672698cc000a80b1fc11c831acb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2026 22:18:07 +0000 Subject: [PATCH 16/20] Bump form-data from 4.0.5 to 4.0.6 Bumps [form-data](https://github.com/form-data/form-data) from 4.0.5 to 4.0.6. - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6) --- updated-dependencies: - dependency-name: form-data dependency-version: 4.0.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e97dcb2..3828e83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6980,17 +6980,17 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" From 1ff9240cf98f9357836a3bdf17d2c35351983c54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Sep 2026 07:18:22 +0000 Subject: [PATCH 17/20] Bump browserslist from 4.28.2 to 4.28.9 Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.28.2 to 4.28.9. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.28.2...4.28.9) --- updated-dependencies: - dependency-name: browserslist dependency-version: 4.28.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3828e83..6f9ee80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4715,9 +4715,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.35", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.35.tgz", - "integrity": "sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg==", + "version": "2.11.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz", + "integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4784,9 +4784,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", "dev": true, "funding": [ { @@ -4804,11 +4804,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" }, "bin": { "browserslist": "cli.js" @@ -4931,9 +4931,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ { @@ -5877,9 +5877,9 @@ "license": "ISC" }, "node_modules/electron-to-chromium": { - "version": "1.5.371", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.371.tgz", - "integrity": "sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w==", + "version": "1.5.422", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz", + "integrity": "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==", "dev": true, "license": "ISC" }, @@ -10191,9 +10191,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", "dev": true, "license": "MIT", "engines": { @@ -12825,9 +12825,9 @@ "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", "dev": true, "funding": [ { From 140dc8eb49d2fdf364dc1f80270a801164622cf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 10:35:13 +0000 Subject: [PATCH 18/20] Bump js-yaml from 3.14.2 to 3.15.2 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.2 to 3.15.2. - [Changelog](https://github.com/nodeca/js-yaml/blob/3.15.2/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.2...3.15.2) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 3.15.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3828e83..237dc6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2702,9 +2702,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "dev": true, "license": "MIT", "dependencies": { @@ -9470,9 +9470,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, "funding": [ { From 26d7a596171c2a491ab5e20c769038c7f238daf1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:16:26 +0000 Subject: [PATCH 19/20] Bump brace-expansion from 1.1.15 to 1.1.21 Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.15 to 1.1.21. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.15...v1.1.21) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 1.1.21 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f9ee80..3d7be5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4760,9 +4760,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { From aee6b84f44ed2e66aca32a1224ef93e557947fe5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:16:31 +0000 Subject: [PATCH 20/20] Bump maplibre-gl and plotly.js Bumps [maplibre-gl](https://github.com/maplibre/maplibre-gl-js) to 6.9.0 and updates ancestor dependency [plotly.js](https://github.com/plotly/plotly.js). These dependencies need to be updated together. Updates `maplibre-gl` from 4.7.1 to 6.9.0 - [Release notes](https://github.com/maplibre/maplibre-gl-js/releases) - [Changelog](https://github.com/maplibre/maplibre-gl-js/blob/main/CHANGELOG.md) - [Commits](https://github.com/maplibre/maplibre-gl-js/compare/v4.7.1...v6.9.0) Updates `plotly.js` from 3.6.0 to 4.1.1 - [Release notes](https://github.com/plotly/plotly.js/releases) - [Changelog](https://github.com/plotly/plotly.js/blob/main/CHANGELOG.md) - [Commits](https://github.com/plotly/plotly.js/compare/v3.6.0...v4.1.1) --- updated-dependencies: - dependency-name: maplibre-gl dependency-version: 6.9.0 dependency-type: indirect - dependency-name: plotly.js dependency-version: 4.1.1 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 719 ++++++++++++---------------------------------- package.json | 2 +- 2 files changed, 182 insertions(+), 539 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f9ee80..8efed1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "onetime": "^5.1.2", - "plotly.js": "^3.0.0", + "plotly.js": "^4.1.1", "prettier": "^3.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -3154,100 +3154,71 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "dev": true, - "license": "ISC", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==", - "dev": true, - "license": "ISC" - }, "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.3.tgz", + "integrity": "sha512-0SElaV0uMxEnxzBhhX9WTuPyUeMsAN/SS0i16tjuba4/mio63MG9khjC1a0JAiPGXAwvwm4UfHJURCN7nyudQg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", - "dev": true, - "license": "BSD-3-Clause", - "peerDependencies": { - "mapbox-gl": ">=0.32.1 <2.0.0" + "node": ">= 22" } }, "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", "dev": true, "license": "ISC" }, "node_modules/@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", + "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-1.0.0.tgz", + "integrity": "sha512-fqd515fjBmANKGGsQ286E2Wvj/XvDFpGzwJxq4CI6jMQue6Oy04uCKp+JWKF00xRTmk6cEu1jPJ9p3xqH8YWqQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-3.0.0.tgz", + "integrity": "sha512-Qf10S1uIHMk20ri/IVBnpS+esUEkVaR5Hftmz88jTInrpmWgPGJfPe3LVjjlE77trLx8tH6qjTG7uWH9hIq/0Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@mapbox/point-geometry": "~0.1.0" + "@mapbox/point-geometry": "~1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^5.0.0" } }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "node_modules/@maplibre/geojson-vt": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-6.1.1.tgz", + "integrity": "sha512-FVMOcmSP/yqol45t7StApEyTL5/vmqBCuFhH9n+fFuINenhaX+YgHHIt1yJ86S8kln3uJLcMvmEU2cfn6E2eCQ==", "dev": true, "license": "ISC", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "kdbush": "^4.1.0" } }, "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", - "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-26.4.4.tgz", + "integrity": "sha512-hG4RZR4PBd/+6A3ODdZ3AnQRF106ZQk1y3bhwDg8bH/A4Oz2tnRUJVVWs9BZa6gXZ1d3UKe89C+Mm+olGBELvA==", "dev": true, "license": "ISC", "dependencies": { - "@mapbox/jsonlint-lines-primitives": "~2.0.2", - "@mapbox/unitbezier": "^0.0.1", + "@mapbox/jsonlint-lines-primitives": "^2.0.3", + "@mapbox/unitbezier": "^1.0.0", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.8", - "quickselect": "^2.0.0", - "rw": "^1.3.3", + "quickselect": "^3.0.0", "tinyqueue": "^3.0.0" }, "bin": { @@ -3256,19 +3227,27 @@ "gl-style-validate": "dist/gl-style-validate.mjs" } }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "node_modules/@maplibre/mlt": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.3.0.tgz", + "integrity": "sha512-7M2O7ABM80Oi8XPkfkrjKB8mOBIxGoVgkA52Mu4RMWoBvvMdagQ522+WxVYujZsMpqIr3BpzrTbXrm4k8lCzCQ==", "dev": true, - "license": "BSD-2-Clause" + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0" + } }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "node_modules/@maplibre/vt-pbf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.2.tgz", + "integrity": "sha512-j6p0AdjvAR19Z3XaCysle7A4ZSo08tYOzxD0Y9NQylwPAkwJJeYub5b2eVucdeDh7erhv69DahoLOevDRERRUw==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^5.1.0" + } }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", @@ -3288,14 +3267,13 @@ "license": "BSD-3-Clause" }, "node_modules/@plotly/d3-sankey": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", - "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-GvR0JmTO5bN1iyU3Z4lhq/68De+JAh2NBjNkFWPO6ThExLVrnysxir2riqeDMTgiPbx5iBonAy29/OEd8uak5Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "d3-array": "1", - "d3-collection": "1", + "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, @@ -3312,40 +3290,6 @@ "elementary-circuits-directed-graph": "^1.0.4" } }, - "node_modules/@plotly/mapbox-gl": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", - "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, "node_modules/@plotly/point-cluster": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", @@ -3831,22 +3775,6 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/bbox": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.3.5.tgz", - "integrity": "sha512-oG1ya/HtBjAIg4TimbWx+nOYPbY0bCvt82Bq8tm6sBw3qqtbOyRSfDz79Sq90TnH7DXJprJ1qnVGKNtZ6jemfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.5", - "@turf/meta": "7.3.5", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, "node_modules/@turf/centroid": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.3.5.tgz", @@ -3945,6 +3873,13 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/d3": { + "version": "3.5.53", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.53.tgz", + "integrity": "sha512-8yKQA9cAS6+wGsJpBysmnhlaaxlN42Qizqkw+h2nILSlS+MAG2z4JdO6p+PJrJ+ACvimkmLJL281h157e52psQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -3959,16 +3894,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/geojson-vt": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", - "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -4032,25 +3957,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mapbox__point-geometry": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mapbox__vector-tile": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", - "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/mapbox__point-geometry": "*", - "@types/pbf": "*" - } - }, "node_modules/@types/node": { "version": "25.9.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", @@ -4061,13 +3967,6 @@ "undici-types": ">=7.24.0 <7.24.7" } }, - "node_modules/@types/pbf": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { "version": "19.2.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", @@ -4085,16 +3984,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/supercluster": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", - "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -4727,6 +4616,16 @@ "node": ">=6.0.0" } }, + "node_modules/bidi-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.1.0.tgz", + "integrity": "sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/binary-search-bounds": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", @@ -5124,37 +5023,6 @@ "color-space": "^2.0.0" } }, - "node_modules/color-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.2.tgz", - "integrity": "sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - } - }, - "node_modules/color-parse/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color-rgba": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", - "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-parse": "^2.0.0", - "color-space": "^2.0.0" - } - }, "node_modules/color-space": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.3.2.tgz", @@ -5250,12 +5118,15 @@ "dev": true, "license": "MIT" }, - "node_modules/country-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", - "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==", + "node_modules/country-iso-search": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/country-iso-search/-/country-iso-search-0.1.2.tgz", + "integrity": "sha512-7VMhhWPSNg/ivAUwp3BvxEGDycCfqiTggaV+hAW+N5+F+jzbEuY5HqvSMnGeP9CxKXBWO0fydbUgLUHmKj89vA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20" + } }, "node_modules/create-jest": { "version": "29.7.0", @@ -5354,13 +5225,6 @@ "dev": true, "license": "MIT" }, - "node_modules/csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", - "dev": true, - "license": "MIT" - }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -5395,6 +5259,16 @@ "dev": true, "license": "MIT" }, + "node_modules/culori": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/culori/-/culori-4.0.2.tgz", + "integrity": "sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/d": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", @@ -5813,17 +5687,6 @@ "node": ">=12" } }, - "node_modules/draw-svg-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", - "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abs-svg-path": "~0.1.1", - "normalize-svg-path": "~0.1.0" - } - }, "node_modules/dtype": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", @@ -7090,13 +6953,6 @@ "node": ">=6.9.0" } }, - "node_modules/geojson-vt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", - "dev": true, - "license": "ISC" - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -7285,47 +7141,6 @@ "node": ">=10.13.0" } }, - "node_modules/global-prefix": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", - "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^4.1.3", - "kind-of": "^6.0.3", - "which": "^4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, "node_modules/globals": { "version": "17.6.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", @@ -7598,13 +7413,6 @@ "dev": true, "license": "ISC" }, - "node_modules/grid-index": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", - "dev": true, - "license": "ISC" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -7791,27 +7599,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -7888,16 +7675,6 @@ "dev": true, "license": "ISC" }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -8178,9 +7955,9 @@ } }, "node_modules/is-mobile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", - "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz", + "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==", "dev": true, "license": "MIT" }, @@ -9632,16 +9409,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9826,74 +9593,31 @@ "wrappy": "1" } }, - "node_modules/mapbox-gl": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", - "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "peer": true, - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, "node_modules/maplibre-gl": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", - "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-6.9.0.tgz", + "integrity": "sha512-vFMwMK0Zs+NM/rOMSdtu8bO30DIexhBEVi5KC6f70/XtI+L/K2wC3LsDCAXFZ4s8ik5gAuDugfCNbpllpdJ9bA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.6", - "@mapbox/unitbezier": "^0.0.1", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.3.1", - "@types/geojson": "^7946.0.14", - "@types/geojson-vt": "3.2.5", - "@types/mapbox__point-geometry": "^0.1.4", - "@types/mapbox__vector-tile": "^1.3.4", - "@types/pbf": "^3.0.5", - "@types/supercluster": "^7.1.3", - "earcut": "^3.0.0", - "geojson-vt": "^4.0.2", - "gl-matrix": "^3.4.3", - "global-prefix": "^4.0.0", - "kdbush": "^4.0.2", + "@mapbox/point-geometry": "^1.1.0", + "@mapbox/tiny-sdf": "^2.2.0", + "@mapbox/unitbezier": "^1.0.0", + "@mapbox/vector-tile": "^3.0.0", + "@maplibre/geojson-vt": "^6.1.1", + "@maplibre/maplibre-gl-style-spec": "^26.4.2", + "@maplibre/mlt": "^1.2.1", + "@maplibre/vt-pbf": "^4.3.2", + "@types/geojson": "^7946.0.16", + "bidi-js": "^1.1.0", + "earcut": "^3.2.3", + "gl-matrix": "^3.4.4", + "kdbush": "^4.1.0", "murmurhash-js": "^1.0.0", - "pbf": "^3.3.0", - "potpack": "^2.0.0", + "pbf": "^5.1.2", + "potpack": "^2.1.0", "quickselect": "^3.0.0", - "supercluster": "^8.0.1", - "tinyqueue": "^3.0.0", - "vt-pbf": "^3.1.3" + "tinyqueue": "^3.0.0" }, "engines": { "node": ">=16.14.0", @@ -9903,62 +9627,10 @@ "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" } }, - "node_modules/maplibre-gl/node_modules/@mapbox/tiny-sdf": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", - "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/maplibre-gl/node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/geojson-vt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.3.tgz", - "integrity": "sha512-jR1MwkLaZGa8Zftct9ZFruyWFrdl9ZyD2OliXNy9Qq5bBPeg5wHVpBQF9p5GjnicSDQqvBVpysxTPKmWdsfWMA==", - "dev": true, - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/potpack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", - "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/quickselect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", - "dev": true, - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/supercluster": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", - "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "kdbush": "^4.0.2" - } - }, - "node_modules/maplibre-gl/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.2.3.tgz", + "integrity": "sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==", "dev": true, "license": "ISC" }, @@ -10211,11 +9883,14 @@ } }, "node_modules/normalize-svg-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", - "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -10527,9 +10202,9 @@ } }, "node_modules/parse-svg-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", - "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.2.0.tgz", + "integrity": "sha512-Tf7FFIrguPKQwzD4pWnYkR2VOv3raoHeKED80Bm+BYHI3KxC8KsgsGC5+fSMzAGDA6UEk4bHvmi+RsjmL3khpg==", "dev": true, "license": "MIT" }, @@ -10598,13 +10273,12 @@ "license": "MIT" }, "node_modules/pbf": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", - "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-5.1.2.tgz", + "integrity": "sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" }, "bin": { @@ -10737,24 +10411,24 @@ } }, "node_modules/plotly.js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-3.6.0.tgz", - "integrity": "sha512-Fu5IaetcuxaeQPULk4wfIik0MnvIsEb5ynOsPAMfhAnjkPOEDFG7eSb/3ZZq1DW5MwYvZFXaTFHpal4U1Q5Yig==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-4.1.1.tgz", + "integrity": "sha512-fYLAOj091/+M4h1rmtVIkRIpdkz5/P9IdNUeB9wKmCUyvewuUdlCYR5ryqDWP7Cb36Dn4EvSrs6YKvRJ9ukNdQ==", "dev": true, "license": "MIT", "dependencies": { "@plotly/d3": "3.8.2", - "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey": "0.12.3", "@plotly/d3-sankey-circular": "0.33.1", - "@plotly/mapbox-gl": "1.13.4", + "@plotly/point-cluster": "^3.1.9", "@plotly/regl": "^2.1.2", - "@turf/area": "^7.1.0", - "@turf/bbox": "^7.1.0", - "@turf/centroid": "^7.1.0", + "@turf/area": "^7.3.5", + "@turf/centroid": "^7.3.5", + "@turf/meta": "^7.3.5", + "@types/d3": "^3.5.53", "base64-arraybuffer": "^1.0.2", - "color-normalize": "1.5.0", - "color-rgba": "3.0.0", - "country-regex": "^1.1.0", + "country-iso-search": "^0.1.2", + "culori": "^4.0.2", "d3-force": "^1.2.1", "d3-format": "^1.4.5", "d3-geo": "^1.12.1", @@ -10762,33 +10436,32 @@ "d3-hierarchy": "^1.1.9", "d3-interpolate": "^3.0.1", "d3-time": "^1.1.0", - "d3-time-format": "^2.2.3", + "d3-time-format": "^2.3.0", "fast-isnumeric": "^1.1.4", "gl-mat4": "^1.2.0", "gl-text": "^1.4.0", "has-hover": "^1.0.1", "has-passive-events": "^1.0.0", - "is-mobile": "^4.0.0", - "maplibre-gl": "^4.7.1", + "is-mobile": "^5.0.0", + "maplibre-gl": "6.9.0", "mouse-event-offset": "^3.0.2", "native-promise-only": "^0.8.1", - "parse-svg-path": "^0.1.2", + "parse-svg-path": "^0.2.0", "point-in-polygon": "^1.1.0", "polybooljs": "^1.2.2", - "probe-image-size": "^7.2.3", + "probe-image-size": "^7.3.0", "regl-error2d": "^2.0.12", "regl-line2d": "^3.1.3", - "regl-scatter2d": "^3.3.1", + "regl-scatter2d": "^3.4.0", "regl-splom": "^1.0.14", "strongly-connected-components": "^1.0.1", - "svg-path-sdf": "^1.1.3", - "tinycolor2": "^1.4.2", + "svg-path-sdf": "^2.0.0", "topojson-client": "^3.1.0", "webgl-context": "^2.2.0", "world-calendars": "^1.0.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/point-in-polygon": { @@ -10859,9 +10532,9 @@ } }, "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", + "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", "dev": true, "license": "ISC" }, @@ -11038,9 +10711,9 @@ "license": "MIT" }, "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", "dev": true, "license": "ISC" }, @@ -11306,6 +10979,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -11450,13 +11133,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/safe-array-concat": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", @@ -12121,23 +11797,6 @@ "node": ">= 6" } }, - "node_modules/supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", - "dev": true, - "license": "ISC", - "dependencies": { - "kdbush": "^3.0.0" - } - }, - "node_modules/supercluster/node_modules/kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", - "dev": true, - "license": "ISC" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12184,30 +11843,33 @@ "parse-svg-path": "^0.1.2" } }, - "node_modules/svg-path-bounds/node_modules/normalize-svg-path": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", - "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "node_modules/svg-path-bounds/node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", "dev": true, - "license": "MIT", - "dependencies": { - "svg-arc-to-cubic-bezier": "^3.0.0" - } + "license": "MIT" }, "node_modules/svg-path-sdf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", - "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-2.0.0.tgz", + "integrity": "sha512-vcYvz5ZR0hxZvuJE3ft4StgkpuSBPUrrfWdkTRtDhGZ1v+Qel64Sk/uZwYhxWYkjj2WTCMeaM2VYdE/bZR1tjg==", "dev": true, "license": "MIT", "dependencies": { "bitmap-sdf": "^1.0.0", - "draw-svg-path": "^1.0.0", "is-svg-path": "^1.0.1", "parse-svg-path": "^0.1.2", "svg-path-bounds": "^1.0.1" } }, + "node_modules/svg-path-sdf/node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -12264,13 +11926,6 @@ "xtend": "~4.0.1" } }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "dev": true, - "license": "MIT" - }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -12327,9 +11982,9 @@ } }, "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", "dev": true, "license": "ISC" }, @@ -12905,18 +12560,6 @@ "node": ">=10.12.0" } }, - "node_modules/vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" - } - }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", diff --git a/package.json b/package.json index 0be2c0b..f146991 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "onetime": "^5.1.2", - "plotly.js": "^3.0.0", + "plotly.js": "^4.1.1", "prettier": "^3.0.0", "react": "^19.0.0", "react-dom": "^19.0.0",