Skip to content

Releases: Leaflet/Leaflet


18 May 11:12
Choose a tag to compare

馃悶 Bug fixes

  • Fix tile gaps in Chromium-based browsers (#8891 by @IvanSanchez)
  • Fix vector drifts when zoomAnimation is false and zooming via flyTo or pinch (#8794 by @plainheart)
  • Ensure toGeoJSON() still works with an empty array (#8737 by @Falke-Design)
  • Ensure LineUtil and PolyUtil only iterate over array values and not properties (#8840 by @Falke-Design)
  • Fix rounding errors in center calculation of LineUtil and PolyUtil for small layers (#8784 by @Falke-Design)
  • Prevent unwanted layer toggle while expanding the Layers control on mobile (#8910 by @Falke-Design)
  • Fix an error when a focusing on a Tooltip-bound FeatureGroup that contains a layer without a getElement method (#8890 by @Falke-Design)
  • Fix Tooltip is not showing when loaded dynamically while moving the map (#8672 by @theGOTOguy)
  • Fix noMoveStart option not applying to fitBounds (#8911 by @AbdullahSohail-SE)
  • Fix outlines showing up when interacting with the map on Safari 16.4+ (#8917 by @jonkoops)


18 Nov 17:54
Choose a tag to compare

馃檶 Accessibility

  • Expand the layers control on Enter keydown (#8556 by @larsgw)
  • Align the scale control's alpha transparency with the attribution control (#8547 by @Malvoz)
  • Allow the scale control's text to overflow the container (#8548 by @Malvoz)

馃悶 Bug fixes


04 Oct 15:11
Choose a tag to compare

馃悶 Bug fixes

  • 鈿狅笍 Drop ESM entrypoint from package because of numerous compatibility issues with plugins (import leaflet/dist/leaflet-src.esm.js explicitly instead to take advantage; ESM by default will come in v2) (#8493 by @jonkoops)
  • Fix a bug where tooltips could throw an error with canvas renderer (#8498 by @Falke-Design)
  • Fix a bug with incorrect marker popup location when there are multiple markers registered to the same popup (#8523 by @raychanks).

馃И Tests

  • Fix unit tests suite stopping abruptly on Mac (#8478)

馃摑 Docs


23 Sep 09:05
Choose a tag to compare
  • Fix Events listens not propagating to parent objects, in particular fixing compatibility with Leaflet.markercluster plugin (#8211 by @Falke-Design)


22 Sep 08:51
Choose a tag to compare

Note on future versions

The v1.9 release is setting the stage for the first major version bump of Leaflet since 2016! A lot has changed since then, and it's time for Leaflet to grow together with the web platform.

After this release, we are branching off the 1.x code and putting it in maintenance mode 鈥 reserving potential 1.x releases only for critical bugfixes. Although version 2.0 is still far away and will take some time to take shape, we plan to make the following changes:

  • Dropping support for Internet Explorer.
    This has been a long time coming, but now that Internet Explorer is officially end-of-life, it's time to say goodbye. Going forward, Leaflet will move to an evergreen strategy that targets browsers like Firefox, Chrome, Edge and Safari.
  • Embracing modern JavaScript.
    To maintain backwards compatibility, Leaflet is written entirely in ES5, a version of JavaScript supported by legacy browsers. So we have not been able to make use of many great JavaScript features (e.g. standardized classes, instead having to rely on our own implementation). By adopting a more modern version of the ECMAScript standard, we can start working towards aligning Leaflet with what is expected from a modern JavaScript library.
  • Standardized modules.
    When we released Leaflet v1, the landscape in the JavaScript world was very different and full of competing module standards such as CommonJS, AMD and UMD. Today, ECMAScript modules have become the clear way forward to unite the JavaScript ecosystem under one banner. Moving forward, Leaflet will only be distributed in a single standardized module system, greatly reducing complexity of our distributed code.
  • Removing the Leaflet global.
    As a developer using Leaflet, the capital letter L is probably intimately familiar to you. This is the Leaflet global where all of Leaflet's functionality lives. To allow compiler tooling to better eliminate dead-code through a process called tree-shaking, we are removing this global variable. To preserve backwards compatibility with older plugins, we will provide a shim that can be imported manually that will restore this functionality.

v1.9.0 changelog

鈿狅笍 Breaking Changes

  • (This change has been reverted in v1.9.2) Expose ESM entrypoint with Leaflet global (#8329 by @jonkoops).
  • Update color-adjust to print-color-adjust (#8211 by @Malvoz)

鉂囷笍 API changes


馃檶 Accessibility

  • Improve Tooltip accessibility (focus and voice over) (#8247 by @alekzvik)
  • Fix links in accessibility guide (#8198 by @Malvoz)
  • Remove role="presentation" from image tiles (#8172 by @Malvoz)

馃悶 Bug fixes

  • Fix invalid GeoJSON on unbalanced arrays (#7637 by @steff1986)
  • Fix 2 step zooming while using mouse wheel scrolling (#8298 by @Falke-Design)
  • Fix wrong assigned parameter while calling map._move over requestAnimFrame (#8328 by @AMDvsTMD)
  • Fix _isClickDisabled to not throw no error if parent is removed from DOM (#8288 by @Falke-Design)
  • Fix DomEvent.DoubleTap to ignore clicks on <label>s with a for attribute (#8227 by @IvanSanchez)
  • Fix calling once() twice if same event is fired inside once (#8190 by @Falke-Design)
  • Fix map.getCenter() returning a mutable object (#8167 by @mourner)
  • Fix regression about popup close button modifying the URL (#8160 by @IvanSanchez)
  • Fix min/maxZoom when used in combination with detectRetina (#7328 by @bozdoz)

馃摑 Docs

馃敡 Workflow

馃И Tests

v1.9.x updates:

We've since released:

  • v1.9.1 to address compatibility with Leaflet.markercluster plugin.
  • v1.9.2 to fix ESM compatibility issues with other plugins, and fix and issue tooltips & canvas renderer.

Stand With Ukraine


18 Apr 10:50
Choose a tag to compare

v1.8.0 is a culmination of 1.5 years of development, a huge release focused on bug fixes, major reliability and accessibility improvements, cleaning up legacy code, and numerous improvements to documentation, development workflow and release process. A culmination of hundreds of contributions, and a preparation for bigger changes to come. 馃崈

I'm making this release just as an air raid alert is sounding outside, in Kyiv, warning about an imminent Russian air strike. This release is dedicated to Ukrainian fight for freedom and democracy against the Russian invasion 馃嚭馃嚘 (see how you can support Ukraine here).

From now on, releases will become much more frequent. Thanks to our amazing community for all your help and patience. 鉂わ笍馃檹 Special thanks to @johnd0e who revived Leaflet development after long stagnation and made the biggest contributions, @Falke-Design for doing the bulk of the work organizing development and preparing the release, @Malvoz for his numerous accessibility contributions, and @jonkoops for help with workflow automations. 鉂わ笍

鈿狅笍 Breaking Changes

  • Improve reliability of contextmenu event simulation on mobile Safari by introducing a new TapHold handler, replacing legacy Tap (#7026 by @johnd0e)
  • Reorganize DivOverlay/Popup/Tooltip APIs (#7540 by @johnd0e)
  • Improve error / argument handling for event listeners (#7518 by @johnd0e)
  • Improve reliability of touch events simulation on non-touch devices (DomEvent.Pointer) (#7059, #7084, #7415 by @johnd0e)
  • Improve reliability of dblclick event simulation on touch devices (DomEvent.DoubleTap) (#7027 by @johnd0e)
  • Improve reliability of disableClickPropagation (#7439 by @johnd0e)
  • Improve Map hasLayer() and LayerGroup hasLayer() to require a layer as argument (#6999 by @johnd0e)
  • Fix Class.include to not overwrite options (#7756 by @johnd0e)
  • Fix Class.extend to not modify source props object (#6766 by @johnd0e)
  • Improve Browser.touch touch devices detection (#7029 by @johnd0e)
  • Get rid of legacy Android hacks (#7022 by @johnd0e)
  • Allow fonts to respect users' browser settings by making the font-size relative to the map container. (You can change the font size on leaflet-container to adjust it if needed.) (#7800 by @Chandu-4444)

鉂囷笍 API changes


  • Improve memory footprint by removing will-change CSS property on tile images (#7872 by @janjaap)
  • Improve reliability of icons path detection heuristics (#7092 by @johnd0e)
  • Improve performance of adding tiled sources by avoiding excessive updates in GridLayer.onAdd (#7570 by @johnd0e)
  • Improve handling of edge cases in panInside (#7469 by @daverayment)
  • Minify marker icon SVG (#7600 by @rala72)
  • Allow template keys with spaces in TileLayer URL (#7216 by @lubojr)
  • Improve behavior of Tooltip bound to ImageOverlay (#7306 by @IvanSanchez)
  • Remove the gap between Popup tip and content dialog (#7920 by @Malvoz)
  • Fire mousemove through Canvas to map if it has no layers (#7809 by @johnd0e)
  • Add print styles to prevent printers from removing background-images in controls (#7851 by @Malvoz)
  • Move attribution code from Layer to Control.Attribution (#7764 by @johnd0e)
  • Refactor vmlCreate() so that it does not expose closure to TypeError (#7279 by @darcyparker)
  • Improve reliability of Control.Layers by not relying on Browser android and touch properties (#7057 by @johnd0e)
  • Improve reliability of Tooltip by not relying on Browser touch checks (#7535 by @johnd0e)
  • Make Browser mutable for easier automated testing (#7335 by @bozdoz)
  • Replace div with span in Control.Layers container to fix an HTML validation error (#7914 by @tmiaa)
  • Add a Ukrainian flag to default attribution 馃嚭馃嚘 (by @mourner in #8109)

馃檶 Accessibility

  • Increase default font sizes and decrease attribution transparency for improved legibility (#8057, by @mourner)
  • Improve accessibility of popup close button (#7908, by @Malvoz)
  • Auto pan to markers on focus by default for improved keyboard operability (#8042 by @IvanSanchez)
  • Add accessibility section to plugins guide (#7277 by @Malvoz)
  • Update Marker to default to role="button" & alt="marker" for an improved screen reader experience (#7895 by @tmiaa)
  • Set role="button" for appropriate semantics on the <a> layers control (#7850 by @Malvoz)
  • Generally enable outlines for keyboard users by not stripping outline on focus for keyboard events (#7259 by @jafin)
  • Enable outlines on leaflet-container for keyboard users (#7996 by @Malvoz)
  • Multiple enhancements to popup's close button ([#7794](https://gi...


04 Apr 15:52
Choose a tag to compare
v1.8.0-beta.3 Pre-release

馃悶 Bug fixes


  • Add a Ukrainian flag to default attribution 馃嚭馃嚘 (by @mourner in #8109)

馃И Tests and workflow

(Skipped v1.8.0-beta.2 because of a publishing blunder)


26 Mar 17:01
Choose a tag to compare
v1.8.0-beta.1 Pre-release

Changes since v1.8.0-beta.0:

馃悶 Bug fixes

  • Fix Uncaught TypeError: t is undefined error with markers in some editing/drawing plugins (#8084, by @Falke-Design)
  • Fix broken bundle when using Leaflet with Rollup/Webpack (#8050, by @Falke-Design)
  • Fix SVG performance regression (#8058, by @mourner)


  • Increase default font sizes and decrease attribution transparency for improved legibility (#8057, by @mourner)
  • Improve unit tests organization (#7852, by @Falke-Design)

馃摑 Docs


09 Mar 09:46
Choose a tag to compare
v1.8.0-beta.0 Pre-release

(changelog moved to v1.8.0 final)


04 Sep 08:38
Choose a tag to compare

Bug fixes

  • Fix build toolchain to reflect uglifyjs upgrade from v2 to v3 (by @ivansanchez)

1.7.0 (2020-09-03)

API changes

  • VideoOverlay now can take a muted option (#7071 by @ronikar)
  • The featureGroup factory method now takes options, as the FeatureGroup constructor (#7160 by @frogcat)


  • Use passive event listeners for touchstart/touchend events (#7008 by @yneet)
  • Better detection of PointerEvents-capable browsers in L.Browser, and related changes to Tap, Drag, and TouchZoom handlers (#7010, (#7033, (#7036, (#7068, (#7195 by @johnd0e)
  • Add more browser profiles for the automated tests (#7115 by @johnd0e)

Bug fixes

  • Fix canvas renderer not clearing the canvas on some zoom transformations, was affecting opacity of items (#6915 by @chipta)
  • Fix detection of passive events in L.Browser (#6930 by @Ivan-Perez)
  • Prefix MS-specific CSS style to prevent warnings (by @ivansanchez, kudos to @zachricha for #6960)
  • Clean up moveend listener from map.setMaxBounds (#6958 by @simon04)
  • Fix wrong scope of bind call in ESM environments (#6970 by @shintonik)
  • Check that closePopup exists before calling it automatically (#6962 by @pke)
  • Fix exception when calling layerGroup.hasLayer() with wrong layerId (#6998 by @johnd0e)
  • Remove click filter targeting Android 4.x browsers (#7013 by @johnd0e)
  • Fix touch zoom handler context (#7036 by @johnd0e)
  • Tests for Bounds.overlaps() and Bounds.intersects() (#7075 by @mondeja)
  • Fix event propagation in a popup's container (#7091 by @johnd0e)
  • Fix tile flickering when maxNativeZoom === maxZoom (#7094 by @johnd0e)
  • Fix GridLayer's zoom-level loading algorithm (#7123 by @johnd0e)
  • Fix tooltipAnchor behavior for different tooltip directions (#7155 by @Istador)

Docs & Web Site