Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
619 commits
Select commit Hold shift + click to select a range
dd0eacd
Merge remote-tracking branch 'origin/v4.0' into cam/4436/handle-geojs…
camdecoster Jul 7, 2026
7e48373
Merge remote-tracking branch 'origin/v4.0' into cam/7674/compute-map-…
camdecoster Jul 7, 2026
1b3b284
Improve efficiency of getMapFitBounds
camdecoster Jul 7, 2026
e260f36
Use fitBounds in updateMap; consolidate updates to viewInitial
camdecoster Jul 7, 2026
02b14ca
Only compute feature bboxes if whole geojson bbox is falsy
camdecoster Jul 7, 2026
7dbd215
Update comments; use unwrapLonRange for check
camdecoster Jul 7, 2026
44198ae
Linting/formatting
camdecoster Jul 7, 2026
88d8c4e
Add test
camdecoster Jul 7, 2026
8476f59
Merge pull request #7891 from plotly/cam/4436/handle-geojson-antimeri…
camdecoster Jul 7, 2026
35e356e
Linting/formatting
camdecoster Jul 9, 2026
2d1a490
Switch default fitbounds to 'locations' for geo traces
camdecoster Jul 9, 2026
03c1e43
Save fitbounds computed values to layout
camdecoster Jul 9, 2026
a8742c8
Persist view attributes during manual zoom operations
camdecoster Jul 9, 2026
9894fdb
Update tests per new default, view attrs saved to layout
camdecoster Jul 9, 2026
82acb12
Add user view attribute gate for fitbounds
camdecoster Jul 9, 2026
0f9af80
Save center lat/lon for clipped projections
camdecoster Jul 9, 2026
02b0c92
Update tests per gate addition
camdecoster Jul 9, 2026
fe45f65
Add draftlog
camdecoster Jul 9, 2026
047b56a
update test dashboard, plot schema, package.json and make_baselines s…
emilykl Jul 9, 2026
367f430
update jasmine tests for mathjax v3/v4
emilykl Jul 9, 2026
b0d82d6
bugfix: ticks relayout promise
emilykl Jul 9, 2026
164ebfd
initial svg_text_utils refactor to use a better MathJax rendering app…
emilykl Jul 10, 2026
7e25bee
bug fixes: disable automatic line breaks, capture text-anchor at star…
emilykl Jul 10, 2026
c9a3c3a
update jasmine test
emilykl Jul 10, 2026
83bb307
update image baselines
emilykl Jul 10, 2026
88a77d5
update make_exports script to use MathJax v4
emilykl Jul 10, 2026
c262957
add draftlog
emilykl Jul 10, 2026
65683da
update mathjax section in readme
emilykl Jul 10, 2026
ae6b830
fix mathjax3 test dashboard
emilykl Jul 10, 2026
4f6f122
Replace undefined with null for fitbounds computed values
camdecoster Jul 10, 2026
c2b23ea
Use local variables for calculating zoom button actions
camdecoster Jul 10, 2026
93055f0
Update tests
camdecoster Jul 10, 2026
5aa17cf
Update draftlog
camdecoster Jul 10, 2026
195345c
Add test image generation timeout
camdecoster Jul 10, 2026
f04bc14
Add special handling for Albers USA
camdecoster Jul 10, 2026
1a7ae8a
Update src/lib/svg_text_utils.js
emilykl Jul 13, 2026
ce7bc22
Update draftlogs/7898_change.md
emilykl Jul 13, 2026
ee4e480
add additional comments
emilykl Jul 13, 2026
a26c12b
resolve existing issue with font size for mathjax (font never appeare…
emilykl Jul 13, 2026
6dd91b1
update image baselines
emilykl Jul 13, 2026
dc46bce
Revert "update image baselines"
emilykl Jul 13, 2026
aa4d1b4
update image baselines
emilykl Jul 13, 2026
5b03600
add mathjax-font-size mock
emilykl Jul 13, 2026
19b432d
fix, simplify, and upgrade devtools dashboards for mathjax. Add new d…
emilykl Jul 14, 2026
3ff7fc4
Merge remote-tracking branch 'origin/v4.0' into cam/7674/compute-map-…
camdecoster Jul 14, 2026
2758fab
Linting/formatting
camdecoster Jul 14, 2026
53f5470
Switch to computeBbox for getMapFitBounds
camdecoster Jul 14, 2026
b72c849
Add test
camdecoster Jul 14, 2026
b35def4
Add fitbounds attribute to map traces
camdecoster Jul 14, 2026
a91d89d
Re-fit map view on data changes; fix broken zoom button behavior
camdecoster Jul 14, 2026
e2b2024
Add map fitbounds tests
camdecoster Jul 14, 2026
db1ea2f
Update schema and types
camdecoster Jul 14, 2026
098ccff
Clarify some comments
camdecoster Jul 15, 2026
e470048
Add check for projections that don't play well with fitbounds
camdecoster Jul 15, 2026
20adf25
Don't track bearing/pitch for view comparison
camdecoster Jul 15, 2026
b2c9dd4
Update language regarding supplyDefaults
camdecoster Jul 15, 2026
91fbd71
Merge pull request #7884 from plotly/cam/7674/compute-map-default-bounds
camdecoster Jul 15, 2026
5feb26a
Simplify fitbounds default-setting logic
camdecoster Jul 16, 2026
696541d
relax mathjax v3 dev pin
emilykl Jul 16, 2026
99d55cb
add additonal draftlogs
emilykl Jul 16, 2026
67812ff
Bump MathJax 4 patch version
emilykl Jul 16, 2026
6984c76
Update test/image/make_baseline.py
emilykl Jul 16, 2026
ed00b8d
add mathjax-font-size image baseline for mathjax3
emilykl Jul 16, 2026
125f1b5
Merge pull request #7898 from plotly/upgrade-mathjax-v3-v4-2
emilykl Jul 16, 2026
16254c7
Update baseline images
camdecoster Jul 16, 2026
111bef1
Update plot config to show 'upload to cloud' button by default
marthacryan Jul 16, 2026
8718cbc
Add draftlog
marthacryan Jul 16, 2026
5f68b14
Update draftlog for formatting
marthacryan Jul 16, 2026
122cdd4
Skip fitbounds if axis range has been set
camdecoster Jul 16, 2026
7dd5c74
Disable fitbounds for a number of mocks
camdecoster Jul 17, 2026
087b342
Update mocks affected by axis range fix
camdecoster Jul 17, 2026
5ee0a74
Merge branch 'master' into v4.0
emilykl Jul 17, 2026
e85457c
Merge remote-tracking branch 'origin/v4.0' into cam/7855/update-geo-f…
camdecoster Jul 17, 2026
8b66e13
Address PR feedback
camdecoster Jul 20, 2026
0885901
Add link sort attribute
camdecoster Jul 20, 2026
87f1387
Update draftlog
camdecoster Jul 20, 2026
3e126db
Update schema and types
camdecoster Jul 20, 2026
9cf22f1
add new attribute 'anglemode' and refactor arrow-drawing code to hand…
emilykl Jul 20, 2026
ccb2569
Merge pull request #7873 from adamreeve/sankey-order
camdecoster Jul 20, 2026
0b83d62
update mocks after anglemode refactor
emilykl Jul 20, 2026
afe8fda
Reset changes to dist/plot-schema.json
marthacryan Jul 20, 2026
5c8364d
Update expected number of buttons in modebar tests
marthacryan Jul 20, 2026
c80c89e
chore: Update map fitbounds attribute to be enum
camdecoster Jul 20, 2026
f8123c3
Update schema and types
camdecoster Jul 20, 2026
05c0bc6
update plot-schema and generated types
emilykl Jul 20, 2026
80ccb77
update image baselines
emilykl Jul 20, 2026
3d1b217
update jasmine tests
emilykl Jul 20, 2026
13c435f
Remove old test for empty string
marthacryan Jul 20, 2026
e2efedf
Merge branch 'v4.0' of github.com:plotly/plotly.js into update-server…
marthacryan Jul 20, 2026
c4568a6
Update modebar test
marthacryan Jul 20, 2026
ff9d215
Merge pull request #7895 from plotly/cam/7855/update-geo-fitbounds-de…
camdecoster Jul 20, 2026
d2ba006
add attribution to draftlog
emilykl Jul 20, 2026
e51cf1e
update generated types
emilykl Jul 20, 2026
be38b63
Update draftlog
camdecoster Jul 20, 2026
4b4d445
Merge pull request #7913 from plotly/cam/7912/update-map-fitbounds-at…
camdecoster Jul 20, 2026
a556e16
update a few mocks
emilykl Jul 20, 2026
d8d8697
Merge branch 'degzhaus/add_quiver' of https://github.com/degzhaus/plo…
emilykl Jul 20, 2026
36b0e92
update image baselines
emilykl Jul 20, 2026
f46fe61
update share chart button hovertext
emilykl Jul 20, 2026
1baccae
update share button to use link icon
emilykl Jul 20, 2026
f2c03d4
render server name in bold, plus very small css refactor
emilykl Jul 20, 2026
b34dd83
update jasmine test for dialog
emilykl Jul 21, 2026
aa868bb
Merge pull request #7710 from degzhaus/degzhaus/add_quiver
emilykl Jul 21, 2026
2442d56
Merge pull request #7909 from plotly/update-server-config
emilykl Jul 21, 2026
5887787
Add bottom-up and right-left orientations to Sankey
Jun 26, 2026
0758cdb
Add bottom-up and right-left orientations to Sankey
Jun 26, 2026
bdadff8
Add bottom-up and right-left orientations to Sankey
Jun 26, 2026
5ea67d9
Add draft log
Jun 26, 2026
ab1f055
Merge branch 'master' into v4.0
emilykl Jul 21, 2026
92fd39d
Rename draftlog
camdecoster Jul 21, 2026
01f6c43
Update draftlog formatting
camdecoster Jul 21, 2026
ab6a0a2
Add missing draftlog
camdecoster Jul 21, 2026
635a0b8
Update CHANGELOG
camdecoster Jul 21, 2026
b310e72
4.0.0-rc.0
camdecoster Jul 21, 2026
aac9239
Merge pull request #7915 from plotly/release-v4.0.0-rc.0
camdecoster Jul 21, 2026
542c55e
Introduce `direction` attribute instead of more parameters for `orien…
Jul 22, 2026
61a556d
Add tests and mocks for direction argument.
Jul 22, 2026
3b8c586
Adjust test.
Jul 22, 2026
f89f62f
Add updated plot-schema and horizontal baselines
Jul 22, 2026
789ae0c
Reset original node label layout in vertical case; adjust select.js; …
Jul 22, 2026
4b4886b
Merge branch 'v4.0' into Add_bottom-up_and_right-left_orientation_for…
Jul 22, 2026
4d60088
Add 2nd generated schema, add basline images
Jul 23, 2026
445ce41
Merge remote-tracking branch 'origin/master' into v4.0
camdecoster Jul 23, 2026
2cf9235
Upgrade dependencies with minor/patch updates
camdecoster Jul 23, 2026
4cfb759
Rename 'reverse' -> 'reversed' and adjust code, add reversed to mock …
Jul 23, 2026
33e1f38
Adjusted draftlog
Jul 23, 2026
a5e0d69
Rename task files
camdecoster Jul 23, 2026
7992f52
Refactor scripts to module JS
camdecoster Jul 23, 2026
1e65ff3
Update dependencies with new major versions (and biome)
camdecoster Jul 23, 2026
11b2978
Update biome config
camdecoster Jul 23, 2026
b957ecc
Update import per new version
camdecoster Jul 23, 2026
40f9938
Update miscellaneous deps
camdecoster Jul 23, 2026
deff70e
Fix jasmine tests w.r.t. 'reversed', update reversed baselines (title…
Jul 24, 2026
49f3d7a
Update TS and swap tsx for ts-node
camdecoster Jul 24, 2026
a0ee557
Refactor arguments to args for future TS compatibility
camdecoster Jul 24, 2026
abbe697
Refactor circular dep check to remove dependency
camdecoster Jul 24, 2026
5cf89b3
Remove dead dev dependencies
camdecoster Jul 24, 2026
6b0b594
Update dependency to serve static assets in devtools
camdecoster Jul 24, 2026
fd1b307
Update TS (again) and sass
camdecoster Jul 24, 2026
75c70b3
Fix 'reverse' -> 'reversed' everywhere, extend tests slightly
Jul 24, 2026
4d4e767
Remove color-rgba dependency
camdecoster Jul 24, 2026
e70d288
Remove color-normalize dependency
camdecoster Jul 24, 2026
1250113
Always return alpha from normalize
camdecoster Jul 24, 2026
b61b9bb
Update is-mobile
camdecoster Jul 24, 2026
7deb5b3
Switch back to color-normalize, but keep it in one place
camdecoster Jul 24, 2026
d6f8bba
Switch back to older version of color-normalize for deduplication
camdecoster Jul 24, 2026
d27db14
Update draftlog
camdecoster Jul 24, 2026
e9599e7
Merge pull request #7870 from wf-r/Add_bottom-up_and_right-left_orien…
camdecoster Jul 24, 2026
5bc3412
Pin to-px to avoid breaking kaleido calls
camdecoster Jul 27, 2026
b9d6c63
Update sass, svg dependencies
camdecoster Jul 27, 2026
aac981f
Update maplibre-gl to v5
camdecoster Jul 27, 2026
25bf80a
Update calls to match new v5 structure
camdecoster Jul 27, 2026
0cb10fe
Merge pull request #7919 from plotly/cam/7918/update-deps-for-v4
camdecoster Jul 28, 2026
3f62263
Update wording in 'Share Chart' dialog. Provide different wording for…
emilykl Aug 3, 2026
431d559
update jasmine tests for share chart dialog
emilykl Aug 3, 2026
072fe84
add draftlog
emilykl Aug 3, 2026
3a9781d
tweak wording
emilykl Aug 3, 2026
4897de4
lowercase the word 'chart'
emilykl Aug 4, 2026
a569bdd
Update src/components/modebar/cloud_confirm.js
emilykl Aug 5, 2026
6fde56a
chore: Update dependencies for security
camdecoster Aug 5, 2026
573747b
small refactor; create strings file
emilykl Aug 5, 2026
f3b78fb
update invalid protocal error message
emilykl Aug 5, 2026
eb0f826
Merge pull request #7936 from plotly/cam/security-updates-2026-08
camdecoster Aug 5, 2026
aa8c68c
Merge pull request #7928 from plotly/update-cloud-dialog-wording
emilykl Aug 5, 2026
9e4eea3
fix: Add missing country code
camdecoster Aug 6, 2026
21bf8c2
Merge pull request #7940 from plotly/cam/7938/add-missing-country-code
camdecoster Aug 6, 2026
0e16b47
fix: Add missing values to ModeBarDefaultButtons type
camdecoster Aug 6, 2026
f4e742c
Update groupings, comments
camdecoster Aug 6, 2026
bc09b2a
Merge pull request #7941 from plotly/cam/7939/add-values-ModeBarDefau…
camdecoster Aug 6, 2026
5ab9743
update attribute names in src/traces/quiver/
emilykl Aug 6, 2026
003062c
regenerate types and plot-schema
emilykl Aug 6, 2026
d3d7046
update jasmine tests
emilykl Aug 6, 2026
00ba1a5
update image mocks and baselines
emilykl Aug 6, 2026
7c9f063
add draftlog
emilykl Aug 6, 2026
a062dd8
fix: Improve handling of auto-fitting with many features and the anti…
camdecoster Aug 7, 2026
834cd87
Add tests
camdecoster Aug 7, 2026
4a83282
Add draftlog
camdecoster Aug 7, 2026
877b447
Update baseline images
camdecoster Aug 7, 2026
605ee93
Disable fitbounds for 'peirce quincuncial' projection
camdecoster Aug 7, 2026
5cfb6f8
Update various_geo_projections mock
camdecoster Aug 7, 2026
3891636
Update geo_country-names mock
camdecoster Aug 7, 2026
d6c57b5
Update docstring
camdecoster Aug 7, 2026
212c786
Update another baseline image
camdecoster Aug 7, 2026
2844e13
Update one more baseline image
camdecoster Aug 7, 2026
dbded83
Merge pull request #7948 from plotly/cam/7943/handle-polygons-points-…
camdecoster Aug 7, 2026
716bac1
ensure that plot still renders in the case where an unsupported MathJ…
emilykl Aug 9, 2026
dae92a8
add regression tests
emilykl Aug 9, 2026
64eeb40
add draftlog
emilykl Aug 9, 2026
d46b3f4
Switch to culori color library
camdecoster Aug 12, 2026
3525cc8
Update color functions per the new API
camdecoster Aug 13, 2026
c87fa57
Update color function call sites
camdecoster Aug 13, 2026
927ab57
Add text contrast test helper
camdecoster Aug 13, 2026
3cc82a3
Add/update tests
camdecoster Aug 13, 2026
7d93b21
Update color syntax mock
camdecoster Aug 13, 2026
7c85245
Add comments about renaming
camdecoster Aug 13, 2026
fbc644e
Add array support to Color.normalize
camdecoster Aug 13, 2026
7f82b30
clean up MathJax version check
emilykl Aug 13, 2026
6aaf901
Update draftlogs/7951_fix.md
emilykl Aug 13, 2026
fcf6e99
Merge pull request #7951 from plotly/fix-mathjax-issue
emilykl Aug 13, 2026
5cc6516
switch xvals/yvals in hover/click data to return actual data values r…
emilykl Aug 13, 2026
b919eb1
add/update jasmine tests
emilykl Aug 13, 2026
7ab0f92
Default to black for undefined values in Color.stroke, Color.fill
camdecoster Aug 13, 2026
f0d860b
add draftlog
emilykl Aug 13, 2026
a3e909c
Delete obsolete mock
camdecoster Aug 14, 2026
765ffca
Revert changes to fill/stroke, rename parse, switch to previous alpha…
camdecoster Aug 14, 2026
9c0e4b8
Add more tests
camdecoster Aug 14, 2026
ec45487
Delete another obsolete mock
camdecoster Aug 14, 2026
4992e04
Update mock to show whole legend
camdecoster Aug 14, 2026
1c23467
Remove dead code
camdecoster Aug 14, 2026
0403993
Update baseline images
camdecoster Aug 14, 2026
13373c7
Add draftlog
camdecoster Aug 14, 2026
7761e5b
update draftlog
emilykl Aug 17, 2026
4b3532c
Update color coerce description
camdecoster Aug 17, 2026
97aa2c3
Address PR feedback
camdecoster Aug 17, 2026
1b5ad5e
Handle certain edge cases for culori, add tests
camdecoster Aug 17, 2026
635182a
Merge pull request #7962 from plotly/cam/7961/switch-to-culori-library
camdecoster Aug 17, 2026
499a8b2
Merge remote-tracking branch 'origin/master' into v4.0
camdecoster Aug 18, 2026
b4ad58d
fix argument order in tests
emilykl Aug 18, 2026
589e642
Merge pull request #7964 from plotly/hover-click-anywhere-c2d-2
emilykl Aug 18, 2026
cfa6556
Add JSDoc comments for layout types
camdecoster Aug 19, 2026
df4b9de
Update generated types
camdecoster Aug 19, 2026
602daa8
Merge pull request #7974 from plotly/cam/7973/add-jsdoc-layout-types
camdecoster Aug 19, 2026
402f495
add top-level xPixel/yPixel to hover/click event data
emilykl Aug 14, 2026
b818b29
add/update jasmine tests and plot-schema for top-level xPixel/yPixel
emilykl Aug 14, 2026
e9c8d93
when is true, emit plotly_unhover event when cursor leaves plot area
emilykl Aug 14, 2026
c03b91e
add tests for plotly_unhover when hoveranywhere is true
emilykl Aug 14, 2026
d2dfe1f
regenerate plot-schema
emilykl Aug 14, 2026
86be780
add draftlog
emilykl Aug 14, 2026
5755c15
update draftlog
emilykl Aug 18, 2026
a76a603
check that hoveranywhere is still true before emitting unhover event
emilykl Aug 18, 2026
b068fe4
ensure unhover event is not emitted if beforehover handler returns false
emilykl Aug 18, 2026
d658230
make xPixel/yPixel always available even without hoveranywhere/clicka…
emilykl Aug 18, 2026
447bcbc
add tests for hover/click event data keys (also rename hover_label_te…
emilykl Aug 18, 2026
ecd4d82
add xPixel and yPixel keys to PlotMouseEvent type
emilykl Aug 18, 2026
096aa12
typo
emilykl Aug 19, 2026
b0ab6fd
fix arguments to makePlot, and test that hovermode:false works for un…
emilykl Aug 19, 2026
b5e3b02
update schema.d.ts
emilykl Aug 19, 2026
9f2bbf9
rename hover_label test to hover
emilykl Aug 19, 2026
f1ec8fe
update types
emilykl Aug 19, 2026
ba74af7
Merge pull request #7966 from plotly/add-xpixel-ypixel-unhover
emilykl Aug 20, 2026
a3c5fa2
Apply suggestions from code review
emilykl Aug 21, 2026
8e70cff
rename uvref to arrowref
emilykl Aug 21, 2026
42cfce1
combine draftlogs
emilykl Aug 21, 2026
1315d07
fix point distance calculation; it's more accurate now and covers the…
emilykl Aug 22, 2026
ccb1712
update comment
emilykl Aug 24, 2026
328ddc4
update plot-schema
emilykl Aug 24, 2026
a22f34e
update image baselines
emilykl Aug 24, 2026
74a7200
cleanup
emilykl Aug 24, 2026
58f2a0b
Merge remote-tracking branch 'origin/master' into v4.0
camdecoster Aug 24, 2026
01a6cc4
Merge pull request #7945 from plotly/update-quiver-api
emilykl Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 1 addition & 6 deletions .github/actions/setup-workspace/action.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
name: 'Setup Workspace'
description: 'Setup Node.js, install dependencies, and download build artifacts'

inputs:
node-version:
description: 'Node.js version to use'
default: '18'

runs:
using: 'composite'
steps:
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: ${{ inputs.node-version }}
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
Expand Down
49 changes: 33 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@ concurrency:
group: ci-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

env:
NODE_VERSION: '18'

jobs:
detect-changes:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -60,7 +57,7 @@ jobs:

- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: ${{ env.NODE_VERSION }}
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
Expand Down Expand Up @@ -94,33 +91,33 @@ jobs:
- uses: ./.github/actions/setup-workspace
- uses: ./.github/actions/setup-chrome

- name: Run hover_label test in UTC timezone
- name: Run hover test in UTC timezone
uses: ./.github/actions/run-xvfb
env:
TZ: 'UTC'
with:
run: npm run test-jasmine hover_label
run: npm run test-jasmine hover

- name: Run hover_label test in Europe/Berlin timezone
- name: Run hover test in Europe/Berlin timezone
uses: ./.github/actions/run-xvfb
env:
TZ: 'Europe/Berlin'
with:
run: npm run test-jasmine hover_label
run: npm run test-jasmine hover

- name: Run hover_label test in Asia/Tokyo timezone
- name: Run hover test in Asia/Tokyo timezone
uses: ./.github/actions/run-xvfb
env:
TZ: 'Asia/Tokyo'
with:
run: npm run test-jasmine hover_label
run: npm run test-jasmine hover

- name: Run hover_label test in America/Toronto timezone
- name: Run hover test in America/Toronto timezone
uses: ./.github/actions/run-xvfb
env:
TZ: 'America/Toronto'
with:
run: npm run test-jasmine hover_label
run: npm run test-jasmine hover

no-gl-jasmine:
needs: install-and-cibuild
Expand Down Expand Up @@ -270,9 +267,9 @@ jobs:
chrome-version: 'stable'

- name: Run noCI tests
uses: coactions/setup-xvfb@b6b4fcfb9f5a895edadc3bc76318fae0ac17c8b3 # v1
uses: ./.github/actions/run-xvfb
with:
run: ./tasks/noci_test.sh jasmine
run: npm run test-jasmine -- --tags=noCI,noCIdep --nowatch

# ============================================================
# Image baseline generation and comparison
Expand Down Expand Up @@ -579,6 +576,26 @@ jobs:
- name: Run syntax tests on source files
run: .github/scripts/test.sh source-syntax

typecheck:
needs: install-and-cibuild
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: ./.github/actions/setup-workspace

- name: Type-check TypeScript sources
run: npm run typecheck

generated-types-drift:
needs: install-and-cibuild
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: ./.github/actions/setup-workspace

- name: Verify generated types are in sync with schema
run: npm run schema-typegen-diff-check

# ============================================================
# Standalone jobs (no dependencies on install-and-cibuild)
# ============================================================
Expand All @@ -593,7 +610,7 @@ jobs:

- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: ${{ env.NODE_VERSION }}
node-version-file: '.nvmrc'
cache: 'npm'

- name: Set up build environment
Expand Down Expand Up @@ -624,7 +641,7 @@ jobs:

- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: ${{ env.NODE_VERSION }}
node-version-file: '.nvmrc'
cache: 'npm'

- name: Set up build environment
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-dist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:

- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: '22.14.0'
node-version-file: '.nvmrc'
cache: 'npm'

- name: Set up build environment
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ build/*
dist/*.LICENSE.txt
dist/*.css

# Ignore local dev mocks/baselines
test/image/**/dev_*.*

npm-debug.log*
*.sublime*
*~
Expand All @@ -16,3 +19,4 @@ tags
!.github/
!.gitignore
!.npmignore
!.nvmrc
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22.23.0
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,54 @@ To see all merged commits on the master branch that will be part of the next plo

where X.Y.Z is the semver of most recent plotly.js release.

## [4.0.0-rc.0] -- 2026-07-21

### Added
- Add `minscale`, `maxscale` geo plot attributes [[#7371](https://github.com/plotly/plotly.js/pull/7371)], with thanks to @mojoaxel for the contribution!
- Enable TypeScript compatibility within the library and start exporting types [[#7680](https://github.com/plotly/plotly.js/pull/7680)]
- Add `quiver` trace type to visualize vector fields using arrows [[#7710](https://github.com/plotly/plotly.js/pull/7710)], with thanks to @degzhaus for the contribution!
- Use dashed markers in legend for shape traces with dash configured [[#7845](https://github.com/plotly/plotly.js/pull/7845)]
- Add `sort` option to Sankey links and nodes [[#7873](https://github.com/plotly/plotly.js/pull/7873)], with thanks to @adamreeve for the contribution!
- Add support for MathJax v4 [[#7898](https://github.com/plotly/plotly.js/pull/7898)]

### Removed
- **Breaking**: Remove `scattermapbox`, `choroplethmapbox`, `densitymapbox` trace types, the `mapbox` subplot, and the `mapboxAccessToken` config option [[#7860](https://github.com/plotly/plotly.js/pull/7860)]
- These traces have been deprecated since v3. Use the equivalent `*map` traces going forward.
- **Breaking**: Drop support for MathJax v2 [[#7898](https://github.com/plotly/plotly.js/pull/7898)]
- MathJax v3 and v4 are now supported in plotly.js
- Remove config attributes `showLink`, `linkText`, `sendData`, `showSources`, and `showEditInChartStudio`, as well as trace attribute `stream`, since all of these were associated with Chart Studio and are no longer needed [[#7812](https://github.com/plotly/plotly.js/pull/7812)]
- Remove all `*src` attributes, as well as `layout.hidesources` attribute, from the schema [[#7829](https://github.com/plotly/plotly.js/pull/7829)]
- Remove internal `trace._fullInput` property and other dead code related to the removed `transforms` feature. No user-facing changes expected [[#7834](https://github.com/plotly/plotly.js/pull/7834)]

### Changed
- **Breaking**: Switch color processing library from [TinyColor](https://github.com/bgrins/TinyColor) to [color](https://github.com/Qix-/color) [[#7536](https://github.com/plotly/plotly.js/pull/7536)]
- `rgb()`/`rgba()` strings with decimal 0–1 fractions are no longer supported
- `hsv()` color strings are no longer permitted
- Color calculations may differ slightly (by a few RGB units)
- New color formats are now supported: '#ff0000aa', '#f00a', 'rgb(255 0 0)', 'rgba(255 0 0 / 0.5)', 'hsl(0 100% 50% / 0.5)', 'hsla(0, 100%, 50%, 0.5)', 'hwb(0, 0%, 0%)'
- **Breaking**: Set default `layout.axis.tickmode` to `'sync'` when axis is overlaying [[#7684](https://github.com/plotly/plotly.js/pull/7684)]
- **Breaking**: Change `splom.axis.matches` default from `false` to `true` [[#7843](https://github.com/plotly/plotly.js/pull/7843)]
- **Breaking**: Replace `country-regex` with `country-iso-search` to search for country names in choropleth, scattergeo traces [[#7856](https://github.com/plotly/plotly.js/pull/7856)]
- The vast majority of country names are handled exactly the same with the new library; a small number of legacy entries have been removed
- **Breaking**: Update minimum required Node version to 22 [[#7861](https://github.com/plotly/plotly.js/pull/7861)]
- **Breaking:** Change `layout.geo.fitbounds` default from `false` to `'locations'` [[#7895](https://github.com/plotly/plotly.js/pull/7895)]
- `geo` subplots will now auto-fit the initial view to the trace data
- Set `fitbounds: false` explicitly to opt out
- Enable `scattermap` icons to render in color, upgrade Maki icons version to 8.2, and standardize scattermap legend icons to circles [[#7825](https://github.com/plotly/plotly.js/pull/7825)]
- Use plot title as default filename for "Download plot" button [[#7828](https://github.com/plotly/plotly.js/pull/7828)]
- Change signature of `plots.graphJson()` function to remove `mode` argument [[#7829](https://github.com/plotly/plotly.js/pull/7829)]
- Upgrade `plotly/d3-sankey` to 0.12.3. [[#7830](https://github.com/plotly/plotly.js/pull/7830)], with thanks to @adamreeve for the contribution!
- Update `plot_config` to show the "Upload to Cloud" button by default, and set the default server URL to cloud.plotly.com via [[#7909](https://github.com/plotly/plotly.js/pull/7909)]

### Fixed
- Fix `histogram` autobin size for single-point traces in `overlay` mode on data updates via `Plotly.react` [[#7507](https://github.com/plotly/plotly.js/pull/7507)], with thanks to @Lexachoc for the contribution!
- Format tick labels correctly for small numbers in exponential notation [[#7768](https://github.com/plotly/plotly.js/pull/7768)], with thanks to @Hasnaathussain for the contribution!
- Fix crash when ordering categories by value (e.g. `sum descending`) with `null` coordinates [[#7855](https://github.com/plotly/plotly.js/pull/7855)]
- Fix `scattermap`, `densitymap` traces not showing all points by dynamically computing `center`, `zoom` values [[#7884](https://github.com/plotly/plotly.js/pull/7884), [#7913](https://github.com/plotly/plotly.js/pull/7913)], with thanks to @palmerusaf and @DhruvGarg111 for the contributions!
- Fix GeoJSON bounding-box computation for `choropleth` and `scattergeo` traces whose geometry crosses the antimeridian [[#7891](https://github.com/plotly/plotly.js/pull/7891)]
- Snap cartesian axis tick values to multiple of delta so custom `tickformat` (e.g. `"~r"`) no longer shows floating-point artifacts [[#7901](https://github.com/plotly/plotly.js/pull/7901)], with thanks to @arieleli01212 and @kirthi-b for the contribution!


## [3.7.0] -- 2026-07-03

### Changed
Expand Down
10 changes: 6 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ We use the following [labels](https://github.com/plotly/plotly.js/labels) to tra
#### Prerequisites

- git
- [node.js](https://nodejs.org/en/). We recommend using node.js v18.x.
- [node.js](https://nodejs.org/en/). We recommend using node.js v22.x.
Upgrading and managing node versions can be easily done using
[`nvm`](https://github.com/nvm-sh/nvm) or its Windows alternatives.
- [`npm`](https://www.npmjs.com/) v10.x and up to ensure that the
Expand Down Expand Up @@ -405,8 +405,10 @@ All traces modules set:
This object is used to generate the plot-schema JSON.
- `_module.supplyDefaults`: Takes in input trace settings and coerces them into "full" settings
under `gd._fullData`. This one is called during the figure-wide `Plots.supplyDefaults` routine.
Note that the `supplyDefaults` method performance should scale with the number of attributes (**not** the
number of data points - so it should not loop over any data arrays).
As a rule, `supplyDefaults` performance should scale with the number of attributes rather than
the number of data points, so avoid looping over data arrays in this function. That being said,
there are a few exceptions to this rule due to technical requirements (`fitbounds` on map subplots).
The same guidance applies to `_module.supplyLayoutDefaults`.
- `_module.calc`: Converts inputs data into "calculated" (or sanitized) data. This one is called during
the figure-wide `Plots.doCalcdata` routine. The `calc` method is allowed to
scale with the number of data points and is in general more costly than `supplyDefaults`.
Expand All @@ -432,7 +434,7 @@ Other methods used by some trace modules:
selections.
- `_module.convert`: Sometimes separated from `_module.plot` or `_module.calc` to convert the
plotly.js settings to another framework e.g. to `gl-plot3d` for `gl3d` traces, to
`mapbox-gl` for `mapbox` traces. This split can make the logic easier to test.
`maplibre-gl` for `map` traces. This split can make the logic easier to test.
If you make a `convert`, you should call it from either `calc` or `plot`.

## Coding style
Expand Down
3 changes: 2 additions & 1 deletion CUSTOM_BUNDLE.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ Make sure you have the versions of node/npm that's recommended:
- plotly.js before 2.5: Node 12/npm 6
- plotly.js from 2.5: Node 16/npm 8
- plotly.js from 2.35: Node 18/npm 10
- plotly.js from 4.0: Node 22/npm 10

To download a specific node version look [here](https://nodejs.org/en/download/package-manager).
To download a specific node version look [here](https://nodejs.org/en/download).

Note: For CI, it's faster to do `git clone --depth 1` to only get one commit.

Expand Down
14 changes: 10 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,17 +95,23 @@ While non-minified source files may contain characters outside UTF-8, it is reco
> Please note that as of v2 the "plotly-latest" outputs (e.g. https://cdn.plot.ly/plotly-latest.min.js) will no longer be updated on the CDN, and will stay at the last v1 patch v1.58.5. Therefore, to use the CDN with plotly.js v2 and higher, you must specify an exact plotly.js version.

### MathJax
You can load either version two or version three of MathJax files. For example:
plotly.js supports using MathJax v3 or v4 to render mathematical expressions within plots.

MathJax is not included in the plotly.js bundle, so it must be loaded separately as a script on the webpage.

For MathJax v4:
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@4.1.3/tex-svg.js"></script>
```

For MathJax v3:
```html
<script src="https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-svg.js"></script>
```

> When using MathJax version 3, it is also possible to use `chtml` output on the other parts of the page in addition to `svg` output for the plotly graph.
Please refer to `devtools/test_dashboard/index-mathjax3chtml.html` to see an example.
When MathJax is available, any string contained within `$..$` signs will be rendered using the MathJax engine. This applies to plot titles, axis labels, tick label text, and annotations.

plotly.js's use of the MathJax `svg` renderer should not prevent using other MathJax renderers elsewhere on the page, nor will it affect the global MathJax config. See `devtools/test_dashboard/index-mathjax3chtml.html` for an example of a webpage which uses the MathJax `chtml` renderer in the main page, and also displays Plotly charts containing MathJax equations rendered as `svg`.

### Need to have several WebGL graphs on a page?
You may simply load the [virtual-webgl](https://github.com/greggman/virtual-webgl) script for WebGL 1 (not WebGL 2) before loading other scripts.
Expand Down
7 changes: 4 additions & 3 deletions biome.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.2.0/schema.json",
"$schema": "https://biomejs.dev/schemas/2.5.5/schema.json",
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"files": {
"maxSize": 10000000,
Expand All @@ -17,6 +17,7 @@
"!**/stackgl_modules",
"!**/node_modules",
"!**/build",
"!**/.venv/**",
"!**/tasks/test_amdefine.js",
"!**/tasks/test_requirejs.js",
"!**/test/jasmine/assets/jquery-1.8.3.min.js"
Expand All @@ -25,9 +26,9 @@
"linter": {
"enabled": true,
"rules": {
"recommended": false,
"preset": "none",
"complexity": {
"noExtraBooleanCast": "error",
"noExtraBooleanCast": "off",
"noUselessCatch": "error",
"useLiteralKeys": "error",
"noAdjacentSpacesInRegex": "error"
Expand Down
6 changes: 4 additions & 2 deletions build/plotcss.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,13 @@ var rules = {
"X .plotly-cloud-dialog .plotly-cloud-dialog-box": "box-sizing:border-box;min-width:300px;max-width:420px;padding:20px 24px;background-color:#fff;border:1px solid #e0e2e5;border-radius:4px;box-shadow:0 4px 16px rgba(0,0,0,.25);font-size:13px;color:#2a3f5f;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-title": "font-size:16px;font-weight:bold;margin-bottom:12px;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-message": "line-height:1.5;overflow-wrap:break-word;word-wrap:break-word;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-message--hostname": "font-weight:bold;text-decoration:underline;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-message--account": "margin-top:16px;padding:8px;border-radius:3px;font-size:.9em;background-color:#edf1f8;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-buttons": "display:flex;justify-content:flex-end;margin-top:20px;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn": "font-family:inherit;font-size:13px;padding:7px 16px;margin-left:8px;border-radius:3px;border:1px solid rgba(0,0,0,0);cursor:pointer;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn:focus-visible": "outline:2px solid #447adb;outline-offset:1px;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn--cancel": "background-color:#fff;border-color:#e0e2e5;color:#777;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn--cancel:hover": "background-color:#f3f3f3;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn--cancel": "background-color:#f3f3f3;margin-left:auto;color:#777;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn--cancel:hover": "background-color:#e0e2e5;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn--confirm": "background-color:#447adb;color:#fff;",
"X .plotly-cloud-dialog .plotly-cloud-dialog-btn--confirm:hover": "background-color:#1d3b84;",
Y: "font-family:\"Open Sans\",verdana,arial,sans-serif;position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;",
Expand Down
19 changes: 10 additions & 9 deletions devtools/regl_codegen/server.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import ecstatic from 'ecstatic';
import fs from 'node:fs';
import http from 'node:http';
import path from 'node:path';
import { build } from 'esbuild';
import fs from 'fs';
import http from 'http';
import minimist from 'minimist';
import path from 'path';
import sirv from 'sirv';
import { localDevReglCodegenConfig as config } from '../../esbuild-config.js';
import constants from '../../tasks/util/constants.js';
import {
Expand All @@ -19,12 +19,13 @@ var PORT = args.port || 3000;

var reglTraceList = ['parcoords', 'scattergl', 'scatterpolargl', 'splom'];

// Create server
var _static = ecstatic({
root: constants.pathToRoot,
cache: 0,
const _static = sirv(constants.pathToRoot, {
dev: true,
maxAge: 0,
gzip: true,
cors: true
setHeaders: (res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
}
});

var tracesReceived = [];
Expand Down
6 changes: 1 addition & 5 deletions devtools/test_dashboard/devtools.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

/* global Plotly:false */

var Fuse = require('fuse.js/dist/fuse.common.js');
var Fuse = require('fuse.js');
var mocks = require('../../build/test_dashboard_mocks.json');
var credentials = require('../../build/credentials.json');
var Lib = require('../../src/lib');

require('./perf');
Expand All @@ -18,9 +17,6 @@ var Tabs = {

// use local topojson files
topojsonURL: "../../topojson/dist",
// register mapbox access token
// run `npm run preset` if you haven't yet
mapboxAccessToken: credentials.MAPBOX_ACCESS_TOKEN,

// show all logs in console
logging: 2
Expand Down
Loading
Loading