⚠️ Breaking changes
- `Eventedfire` and `Eventedlistens` are now marked as private. Though `Evented` is still exported, and `fire` and `listens` are still functional, we encourage you to seek alternatives; a future version may remove their API accessibility or change its behavior. If you are writing a class that needs event emitting functionality, consider using [`EventEmitter`](https://nodejs.org/api/events.html#events_class_eventemitter) or similar libraries instead.
- The `"to-string"` expression operator now converts `null` to an empty string rather than to `"null"`. [6534](https://github.com/mapbox/mapbox-gl-js/pull/6534)
✨ Features and improvements
- :rainbow: Add `line-gradient` property [6303](https://github.com/mapbox/mapbox-gl-js/pull/6303)
- Add `abs`, `round`, `floor`, and `ceil` expression operators [6496](https://github.com/mapbox/mapbox-gl-js/pull/6496)
- Add `collator` expression for controlling case and diacritic sensitivity in string comparisons [6270](https://github.com/mapbox/mapbox-gl-js/pull/6270)
- Rename `caseSensitive` and `diacriticSensitive` expressions to `case-sensitive` and `diacritic-sensitive` for consistency [6598](https://github.com/mapbox/mapbox-gl-js/pull/6598)
- Prevent `collator` expressions for evaluating as constant to account for potential environment-specific differences in expression evaluation [6596](https://github.com/mapbox/mapbox-gl-js/pull/6596)
- Add CSS linting to test suite (h/t [jasonbarry](https://github.com/jasonbarry))) [#6071](https://github.com/mapbox/mapbox-gl-js/pull/6071)
- Add support for configurable maxzoom in `raster-dem` tilesets [6103](https://github.com/mapbox/mapbox-gl-js/pull/6103)
- Add `MapisZooming` and `MapisRotating` methods [6128](https://github.com/mapbox/mapbox-gl-js/pull/6128), [#6183](https://github.com/mapbox/mapbox-gl-js/pull/6183)
- Add support for Mapzen Terrarium tiles in `raster-dem` sources [6110](https://github.com/mapbox/mapbox-gl-js/pull/6110)
- Add `preventDefault` method on `mousedown`, `touchstart`, and `dblclick` events [6218](https://github.com/mapbox/mapbox-gl-js/pull/6218)
- Add `originalEvent` property on `zoomend` and `moveend` for user-initiated scroll events (h/t [stepankuzmin](https://github.com/stepankuzmin))) [#6175](https://github.com/mapbox/mapbox-gl-js/pull/6175)
- Accept arguments of type `value` in [`"length"` expressions](https://www.mapbox.com/mapbox-gl-js/style-spec/#expressions-length) [6244](https://github.com/mapbox/mapbox-gl-js/pull/6244)
- Introduce `MapWheelEvent`[6237](https://github.com/mapbox/mapbox-gl-js/pull/6237)
- Add setter for `ScaleControl` units (h/t [ryanhamley](https://github.com/ryanhamley))) [#6138](https://github.com/mapbox/mapbox-gl-js/pull/6138), [#6274](https://github.com/mapbox/mapbox-gl-js/pull/6274)
- Add `open` event for `Popup` [6311](https://github.com/mapbox/mapbox-gl-js/pull/6311)
- Explicit `"object"` type assertions are no longer required when using expressions [6235](https://github.com/mapbox/mapbox-gl-js/pull/6235)
- Add `anchor` option to `Marker` [6350](https://github.com/mapbox/mapbox-gl-js/pull/6350)
- `HTMLElement` is now passed to `Marker` as part of the `options` object, but the old function signature is still supported for backwards compatibility [6356](https://github.com/mapbox/mapbox-gl-js/pull/6356)
- Add support for custom colors when using the default `Marker` SVG element (h/t [andrewharvey](https://github.com/andrewharvey))) [#6416](https://github.com/mapbox/mapbox-gl-js/pull/6416)
- Allow `CanvasSource` initialization from `HTMLElement` [6424](https://github.com/mapbox/mapbox-gl-js/pull/6424)
- Add `is-supported-script` expression [6260](https://github.com/mapbox/mapbox-gl-js/pull/6260)
🐛 Bug fixes
- Align `raster-dem` tiles to pixel grid to eliminate blurry rendering on some devices [6059](https://github.com/mapbox/mapbox-gl-js/pull/6059)
- Fix label collision circle debug drawing on overzoomed tiles [6073](https://github.com/mapbox/mapbox-gl-js/pull/6073)
- Improve error reporting for some failed requests [6126](https://github.com/mapbox/mapbox-gl-js/pull/6126), [#6032](https://github.com/mapbox/mapbox-gl-js/pull/6032)
- Fix several `MapqueryRenderedFeatures` bugs:
- account for `{text, icon}-offset` when querying[6135](https://github.com/mapbox/mapbox-gl-js/pull/6135)
- correctly query features that extend across tile boundaries [5756](https://github.com/mapbox/mapbox-gl-js/pull/6283)
- fix querying of `circle` layer features with `-pitch-scaling: 'viewport'` or `-pitch-alignment: 'map'` [6036](https://github.com/mapbox/mapbox-gl-js/pull/6036)
- eliminate flicker effects when using query results to set a hover effect by switching from tile-based to viewport-based symbol querying [6497](https://github.com/mapbox/mapbox-gl-js/pull/6497)
- Preserve browser history state when updating the `Map` hash [6140](https://github.com/mapbox/mapbox-gl-js/pull/6140)
- Fix undefined behavior when `MapaddLayer` is invoked with an `id` of a preexisting layer [6147](https://github.com/mapbox/mapbox-gl-js/pull/6147)
- Fix bug where `icon-image` would not be rendered if `text-field` is an empty string [6164](https://github.com/mapbox/mapbox-gl-js/pull/6164)
- Ensure all camera methods fire `rotatestart` and `rotateend` events [6187](https://github.com/mapbox/mapbox-gl-js/pull/6187)
- Always hide duplicate labels [6166](https://github.com/mapbox/mapbox-gl-js/pull/6166)
- Fix `DragHandler` bugs where a left-button mouse click would end a right-button drag rotate and a drag gesture would not end if the control key is down on `mouseup` [6193](https://github.com/mapbox/mapbox-gl-js/pull/6193)
- Add support for calling `{DragPanHandler, DragRotateHandler}disable` while a gesture is in progress [6232](https://github.com/mapbox/mapbox-gl-js/pull/6232)
- Fix `GeolocateControl` user location dot sizing when `Map`'s `<div>` inherits `box-sizing: border-box;` (h/t [andrewharvey](https://github.com/andrewharvey))) [#6227](https://github.com/mapbox/mapbox-gl-js/pull/6232)
- Fix bug causing an off-by-one error in `array` expression error messages (h/t [drewbo](https://github.com/drewbo))) [#6269](https://github.com/mapbox/mapbox-gl-js/pull/6269)
- Improve error message when an invalid access token triggers a 401 error [6283](https://github.com/mapbox/mapbox-gl-js/pull/6283)
- Fix bug where lines with `line-width` larger than the sprite height of the `line-pattern` property would render other sprite images [6246](https://github.com/mapbox/mapbox-gl-js/pull/6246)
- Fix broken touch events for `DragPanHandler` on mobile using Edge (note that zoom/rotate/pitch handlers still do not support Edge touch events [1928](https://github.com/mapbox/mapbox-gl-js/pull/1928)) [#6325](https://github.com/mapbox/mapbox-gl-js/pull/6325)
- Fix race condition in `VectorTileWorkerSourcereloadTile` causing a rendering timeout [6308](https://github.com/mapbox/mapbox-gl-js/issues/6308)
- Fix bug causing redundant `gl.stencilFunc` calls due to incorrect state checking (h/t [yangdonglai](https://github.com/yangdonglai))) [#6330](https://github.com/mapbox/mapbox-gl-js/pull/6330)
- Fix bug where `mousedown` or `touchstart` would cancel camera animations in non-interactive maps [6338](https://github.com/mapbox/mapbox-gl-js/pull/6338)
- Fix bug causing a full-screen flicker when the map is pitched and a symbol layer uses non-zero `text-translate` [6365](https://github.com/mapbox/mapbox-gl-js/issues/6365)
- Fix bug in `to-rgba` expression causing division by zero [6388](https://github.com/mapbox/mapbox-gl-js/pull/6388)
- Fix bug in cross-fading for `*-pattern` properties with non-integer zoom stops [6430](https://github.com/mapbox/mapbox-gl-js/pull/6430)
- Fix bug where calling `Mapremove` on a map with constructor option `hash: true` throws an error (h/t [allthesignals](https://github.com/allthesignals))) [#6490](https://github.com/mapbox/mapbox-gl-js/pull/6497)
- Fix bug causing flickering when panning across the anti-meridian [6438](https://github.com/mapbox/mapbox-gl-js/pull/6438)
- Fix error when using tiles of non-power-of-two size [6444](https://github.com/mapbox/mapbox-gl-js/pull/6444)
- Fix bug causing `MapmoveLayer(layerId, beforeId)` to remove the layer when `layerId === beforeId` [6542](https://github.com/mapbox/mapbox-gl-js/pull/6542)
* Fix Rollup build for style-spec module [6575](https://github.com/mapbox/mapbox-gl-js/pull/6575)
* Fix bug causing `MapquerySourceFeatures` to throw an `Uncaught TypeError`(https://github.com/mapbox/mapbox-gl-js/pull/6555)
* Fix issue where label collision detection was inaccurate for some symbol layers that shared layout properties with another layer [6558](https://github.com/mapbox/mapbox-gl-js/pull/6558)
* Restore `target` property for `mouse{enter,over,leave,out}` events [6623](https://github.com/mapbox/mapbox-gl-js/pull/6623)