✨ Features
- Add ability to insert images into text labels using an `image` expression within a `format` expression: `"text-field": ["format", "Some text", ["image", "my-image"], "some more text"]` ([8904](https://github.com/mapbox/mapbox-gl-js/pull/8904))
- Add support for stretchable images (aka nine-part or nine-patch images). Stretchable images can be used with `icon-text-fit` to draw resized images with unstretched corners and borders. ([8997](https://github.com/mapbox/mapbox-gl-js/pull/8997))
- Add `in` expression. It can check if a value is in an array (`["in", value, array]`) or a substring is in a string (`["in", substring, string]`) ([8876](https://github.com/mapbox/mapbox-gl-js/pull/8876))
- Add `minPitch` and `maxPitch` map options ([8834](https://github.com/mapbox/mapbox-gl-js/pull/8834))
- Add `rotation`, `rotationAlignment` and `pitchAlignment` options to markers ([8836](https://github.com/mapbox/mapbox-gl-js/pull/8836)) (h/t [dburnsii](https://github.com/dburnsii))
- Add methods to Popup to manipulate container class names ([8759](https://github.com/mapbox/mapbox-gl-js/pull/8759)) (h/t [Ashot-KR](https://github.com/Ashot-KR))
- Add configurable inertia settings for panning (h/t [aMoniker](https://github.com/aMoniker))) ([#8887](https://github.com/mapbox/mapbox-gl-js/pull/8887))
- Add ability to localize UI controls ([8095](https://github.com/mapbox/mapbox-gl-js/pull/8095)) (h/t [dmytro-gokun](https://github.com/dmytro-gokun))
- Add LatLngBounds.contains() method ([7512](https://github.com/mapbox/mapbox-gl-js/issues/7512), fixed by [#8200](https://github.com/mapbox/mapbox-gl-js/pull/8200))
- Add option to load rtl-text-plugin lazily ([8865](https://github.com/mapbox/mapbox-gl-js/pull/8865))
- Add `essential` parameter to AnimationOptions that can override `prefers-reduced-motion: reduce` ([8743](https://github.com/mapbox/mapbox-gl-js/issues/8743), fixed by [#8883](https://github.com/mapbox/mapbox-gl-js/pull/8883))
🍏 Improvements
- Allow rendering full world smaller than 512px. To restore the previous limit call `map.setMinZoom(0)` ([9028](https://github.com/mapbox/mapbox-gl-js/pull/9028))
- Add an es modules build for mapbox-gl-style-spec in dist/ ([8247](https://github.com/mapbox/mapbox-gl-js/pull/8247)) (h/t [ahocevar](https://github.com/ahocevar))
- Add 'image/webp,_/_' accept header to fetch/ajax image requests when webp supported ([8262](https://github.com/mapbox/mapbox-gl-js/pull/8262))
- Improve documentation for setStyle, getStyle, and isStyleLoaded ([8807](https://github.com/mapbox/mapbox-gl-js/pull/8807))
🐞 Bug Fixes
- Fix map rendering after addImage and removeImage are used to change a used image ([9016](https://github.com/mapbox/mapbox-gl-js/pull/9016))
- Fix visibility of controls in High Contrast mode in IE ([8874](https://github.com/mapbox/mapbox-gl-js/pull/8874))
- Fix customizable url hash string in IE 11 ([8990](https://github.com/mapbox/mapbox-gl-js/pull/8990)) (h/t [pakastin](https://github.com/pakastin))
- Allow expression stops up to zoom 24 instead of 22 ([8908](https://github.com/mapbox/mapbox-gl-js/pull/8908)) (h/t [nicholas-l](https://github.com/nicholas-l))
- Fix alignment of lines in really overscaled tiles ([9024](https://github.com/mapbox/mapbox-gl-js/pull/9024))
- Fix `Failed to execute 'shaderSource' on 'WebGLRenderingContext'` errors ([9017](https://github.com/mapbox/mapbox-gl-js/pull/9017))
- Make expression validation fail on NaN ([8615](https://github.com/mapbox/mapbox-gl-js/pull/8615))
- Fix setLayerZoomRange bug that caused tiles to be re-requested ([7865](https://github.com/mapbox/mapbox-gl-js/issues/7865), fixed by [#8854](https://github.com/mapbox/mapbox-gl-js/pull/8854))
- Fix `map.showTileBoundaries` rendering ([7314](https://github.com/mapbox/mapbox-gl-js/pull/7314))
- Fix using `generateId` in conjunction with `cluster` in a GeoJSONSource ([8223](https://github.com/mapbox/mapbox-gl-js/issues/8223), fixed by [#8945](https://github.com/mapbox/mapbox-gl-js/pull/8945))
- Fix opening popup on a marker from keyboard ([6835](https://github.com/mapbox/mapbox-gl-js/pull/6835))
- Fix error thrown when request aborted ([7614](https://github.com/mapbox/mapbox-gl-js/issues/7614), fixed by [#9021](https://github.com/mapbox/mapbox-gl-js/pull/9021))
- Fix attribution control when repeatedly removing and adding it ([9052](https://github.com/mapbox/mapbox-gl-js/pull/9052))