> For AI agents: the complete documentation index is available at /core-sdk/map/web/llms.txt, the full documentation bundle is available at /core-sdk/map/web/llms-full.txt.

# Change Log

##v10.3.0 (2026-09-18)

### 🎉 New

- Add `Map.getLatestVisitedOrdinal()`.
- Add `RoutePainter.setNavigationFilter()`.
- Add `IRouteStyle.outdoorLine.inactiveOpacity`.
- Add `IRouteStyle.traveledLine` for route style setting.
- Add `RoutePainter.renderProgress()` for traveledLine rendering.
- Add `IMapxusUtils.findNearestPathInstruction()`.

### 🐛 Fixes

- Fix disappearing symbols on overlapping routes.
- Fix indoor elements not being filtered after map drag.
- Fix floor not switching after dynamic switchFloorScope change.

### ⚠️ Deprecated

- Mark `IRouteStyle.outdoorLineColor` & `IRouteStyle.outdoorLineOpacity` deprecated, add `IRouteStyle.outdoorLine` new instead.
- Mark `IRouteStyle.dashedLineColor`, `IRouteStyle.dashedLineWidth` & `IRouteStyle.disableDashedLine` deprecated, add `IRouteStyle.dashedLine` new instead.
- Mark `IRouteStyle.indoorLineColor` & `IRouteStyle.inactiveRouteOpacity` deprecated, add `IRouteStyle.indoorLine` new instead.

##v10.2.1 (2026-07-08)

### 🐛 Fixes

- Fix "`Map.selectFloorById()` cannot work to switch floor of current building while building feature is out of bbox".

##v10.2.0 (2026-06-22)

### 🎉 New

- Add `VehicleType.ELEVATOR` of `RouteService.search()` param.
- Part of search APIs upgraded to v6.
- Add `PresetLanguage.FRENCH` and `PresetLanguage.ITALIAN`.
- Support indoor map translating in FRENCH and ITALIAN language.

##v10.1.1 (2026-04-21)

### 🐛 Fixes

- Fix "map initial language might not be same with browser".

##v10.1.0 (2026-03-19)

### 🎉 New

- Add class `CategoryService`.
- Add function `Map.queryIndoorInfoByPoint`.

### ⚠️ Deprecated

- Mark `PoisService.searchCategories` deprecated, use `CategoryService.searchCategories` instead.
- Mark `Map.queryIndoorFeaturesByPoint` deprecated, use `Map.queryIndoorInfoByPoint` instead.

##v10.0.1 (2026-01-27)

### 🎉 New

- Update version range of peerDependency `@mapxus/mapxus-auth`.

### 🐛 Fixes

- Fix "Tile resources use the old token(still valid) to fetch after token changed".
- Fix "Map cannot show after style request throw the error 401".

### 🚀 Optimization

- Use the new version format in request headers of map style resources.
- Integrate environment variables.

##v10.0.0 (2025-10-28)

### ⚠️ Breaking Changes

| Class/Variable                                          | Removed                                        | New                                         |
| ------------------------------------------------------- | ---------------------------------------------- | ------------------------------------------- |
| AccessControl                                           | AccessControl                                  |                                             |
| enum                                                    | AccessControlOrigin                            |                                             |
| IMapxusUtils                                            | getAccessToken                                 |                                             |
|                                                         | getIdentifier                                  |                                             |
|                                                         | setGetTokenAsync                               |                                             |
|                                                         | setupTokenManager                              |                                             |
|                                                         | \_\_internal                                   |                                             |
| IMapOption                                              | appId                                          |                                             |
|                                                         | secret                                         |                                             |
|                                                         | platform                                       |                                             |
|                                                         | getTokenAsync                                  |                                             |
| VenuesService/BuildingsService/PoisService/RouteService | res.data.result                                | res.result                                  |
|                                                         | error \{response: \{status, data: \{message}}} | error \{status, message}                    |
| interface                                               | TPromisePois\<IPoi \| ISharedPoi>              | Promise\<TPoiResponse\<TPoi \| TSharedPoi>> |
|                                                         | TPromiseBuildings                              | Promise\<TBuildingResponse\<TBuilding>>     |
|                                                         | TPromiseVenues                                 | Promise\<TVenueResponse\<TVenue>>           |
|                                                         | TPromiseRoute                                  | Promise\<IResponse\<IResponseRoute>>        |

### 🎉 New

- Used Mapxus Auth SDK for permission management.

### 🐛 Fixes

- Fix "`MapxusMapEvents` undefined in ESM lib format".

##v9.3.0 (2025-09-23)

### 🎉 New

- Add `mapOption.floorSwitchScope` and `map.setFloorSwitchScope()` to support switching floor by venue or global.

### 🐛 Fixes

- Fix "Failed to retrieve symbol layout during dynamic map theme switching".
- Fix typedoc script for missing `Utils` API.
- Declare style export path.

### 🚀 Optimization

- Upgrade to typescript\@5.9.2.
- Improve selected history record and floors layering handle.
- Split dts chuncks.

##v9.2.1 (2025-08-26)

### 🐛 Fixes

- Fix "Selecting building might display 2 floors".
- Fix types export path.

### 🚀 Optimization

- Add types "@types/geojson".
- Export classes "IndoorClickSelection" and "OutdoorClickSelection".

##v9.2.0 (2025-08-21)

### 🎉 New

- Add new themes `ThemeType.ROSE_TEA` , `ThemeType.PEAR_SORBET`, `ThemeType.CITY_WALK` and `ThemeType.MOCHA_MOUSSE`.
- Add `PoisService.searchByFloors()`.
- `IPoiSearchCustomizedOptions` add optional params `floorIds` and `sharedFloorIds`.
- Sections just show the upper layers when they are above POIs and show all layers when they are below POIs.
- Add `mapOption.fitBounds`.
- Add optional parameter "fitBounds" of `map.selectFloorById()/selectSharedFloorById()/selectBuildigById()/selectVenueById()`.
- Add new styles `ThemeType.SECTION_DISPLAY_BY_COLOR` and `ThemeType.SECTION_DISPLAY_BY_CATEGORY`.
- Add `map.indoorClickSelection.enable()` and `map.indoorClickSelection.disable()`.
- Add `map.outdoorClickSelection.enable()` and `map.outdoorClickSelection.disable()`.

### 🐛 Fixes

- Fix "unselected floor did not keep its history".
- Fix "cannot change to outdoor while selecting shared level".

### 🚀 Optimization

- Improve export interfaces.
- Add `sharedFloorId` to determine the conditions for initialization to the outdoors.
- `TinyEmitter` replaced `node:events EventEmitter`.

### ⚠️ Deprecated

- Mark themes `ThemeType.CHRISTMAS`, `ThemeType.HALLOWEEN`, `ThemeType.MAPPY_BEE`, `ThemeType.MAPXUS`, `ThemeType.LANDS_D`, and `ThemeType.COMMON` deprecated.
- Mark `PoisService.searchByFloor()` deprecated, use `PoisService.searchByFloors()` instead.
- Mark `IPoiSearchCustomizedOptions.floorId` deprecated.
- Mark `mapOption.fitBuildingBounds` deprecated, use `mapOption.fitBounds` instead.

##v9.1.0 (2025-07-10)

### 🎉 New

- `selectFloorById()/selectSharedFloorById()/selectBuildingById()/selectVenueById()` functions add optional parameter "animate", animation disabled in map initialization.
- Add `map.switchFloorByOrdinal()`.
- Add `map.queryIndoorFeaturesByPoint()`.
- Add `map.enableIndoorClickSelection` and `map.enableOutdoorClickSelection`.
- Add section layers display.
- Add parameter `sections?: ISection[]` of `map.onPoiClickListener()`.
- Add interface `IMapxusMap` of `MapxusMap.Map`.
- Add `map.setTheme()`.

### 🐛 Fixes

- Fix "Marker.updateData() cannot update marker data".
- Fix "Building might show 2 floors at the same time".

### ⚠️ Deprecated

- Mark `map.getIndoorFeaturesByCoordinates()` deprecated, use `map.queryIndoorFeaturesByPoint()` instead.
- Mark `map.switchTheme()` deprecated, use `map.setTheme()` instead.
- Mark `map.switchBuilding` and `map.switchOutdoor` deprecated.
- Mark `map.getIndoor()` deprecated.

##v9.0.2 (2025-06-30)

### 🐛 Fixes

- Fix "No floorSelector when call map.selectSharedFloorById(floorId, \{ dragPan: false }) to select the shared floor in bbox".

##v9.0.1 (2025-06-26)

### 🐛 Fixes

- Fix "Cannot select building by clicking map while the style has no shared\_level layer".
- Fix overlapped shared floors selecting priority.
- Translate symbol names earlier in initialization.
- Building search API port upgraded from v4 to v5 for shared floor.

##v9.0.0 (2025-06-12)

### ⚠️ Breaking Changes

| Class/Type       | Removed(properties/methods)                                                  | New alternatives                                                                              |
| ---------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| Map              | floorSwitchMode                                                              |                                                                                               |
|                  | getter `floor` returns "IFloor \| null"                                      | getter `floor` returns "IFloor \| ISharedFloor \| null"                                       |
|                  | onMapChangeListener((\{floor: IFloor, ...}) => \{})                          | onMapChangeListener((\{floor: IFloor \| ISharedFloor \| null, ...}) => \{})                   |
|                  | onMapClickListener((\{floor: IFloor, ...}) => \{})                           | onMapClickListener((\{floor: IFloor \| ISharedFloor \| null, ...}) => \{})                    |
|                  | onPoiClickListener((IPoiEvent) => \{})                                       | onPoiClickListener((IPoiClickEvent) => \{})                                                   |
|                  | onPointClickListener((IPointEvent) => \{})                                   | onPointClickListener((IPointClickEvent) => \{})                                               |
| Enum             | FloorSwitchMode                                                              |                                                                                               |
| Indoor           | floorSwitchMode                                                              |                                                                                               |
| Layer id         | "custom-level-fill"                                                          | MapxusMap.ASSISTANT\_LAYER\_INDOOR\_FLOORS  <br /> MapxusMap.ASSISTANT\_LAYER\_SHARED\_FLOORS |
| VenuesService    | searchByDistance(keywords, center, distance, offset, page)                   | searchByDistance(\{center, distance, keywords?, offset?, page?})                              |
|                  | searchByBbox(keywords, bbox, offset, page)                                   | searchByBounds(\{bounds, keywords?, offset?, page?})                                          |
|                  | searchByGlobal(keywords, offset, page)                                       | searchByGlobal(\{keywords?, offset?, page?})                                                  |
| BuildingsService | searchByDistance(keywords, center, distance, offset, page)                   | searchByDistance(\{center, distance, keywords?, offset?, page?})                              |
|                  | searchByBbox(keywords, bbox, offset, page)                                   | searchByBounds(\{bounds, keywords?, offset?, page?})                                          |
|                  | searchByGlobal(keywords, offset, page)                                       | searchByGlobal(\{keywords?, offset?, page?})                                                  |
| Type             | IFloor \{code: string \| null; id: string \| null; ordinal: string \| null;} | IFloor \{code: string; id: string; ordinal: string;}                                          |
|                  | IMapClickEvent \{floor: IFloor, ...}                                         | IMapClickEvent \{floor: IFloor \| ISharedFloor \| null, ...}                                  |
|                  | IPoiEvent                                                                    | IPoiClickEvent                                                                                |
|                  | IPointEvent                                                                  | IPointClickEvent                                                                              |

### 🎉 New

- Upgrade `maplibre-gl@4.5.0` to `maplibre-gl@5.2.0`.
- Upgrade map default style to `mapxus_v7`.
- Venue/POI search APIs upgrade to v5 for adding data about shared floor.
- RouteService API upgraded to v4 to add `on_shared_floor` property in response.
- Add "shared floor" concept.
- Add 2.5D layer.
- New overlap floors solution.
- Add `lineOffset` option of selected highlight.
- Class `RoutePainter` add option `outdoorLineOpacity`: `inactiveRouteOpacity` and `outdoorLineOpacity` will
  be 1 if the parameter is greater than 1, and it will be 0 if the parameter is less than 0.

### 🐛 Fixes

- Fix 'mapbox-gl-rtl-text plugin causes an error in react js strict mode'.
- Fix "outdoorLineOpacity(set to be not 1) will change to 1 when map switched outdoor".

### 🚀 Optimization

- Reduce indoor tiles filter frequency.
- Throw error when `IRouteSearchOptions.points` has empty point of `RouteService.search()`.
- Indoor sources are identified based on source ids starting with "indoor-".

### ⚠️ Deprecated

- Mark class `AccessControl` deprecated, use `getAccessToken(): Promise<{accessToken, expiredTime}>` instead.

##v8.7.0 (2025-05-06)

### 🎉 New

- Upgrade token API with encypted body.
- Mapxus map supports calling by passing `IMapOption.getTokenAsync`.
- Add global event listener `MapxusMapEvents.on("unauthorized", callback)` for invalid token.
- Add global event listener `MapxusMapEvents.on("initError", callback)` for invalid `poiId/floorId/buildingId/venueId` in initialization.

### 🐛 Fixes

- Fix "click event will interrupt the map initialization process".
- Only convert the language of symbols in non-string text-fields.
- Fix the judgment of whether it is a PC browser or a mobile browser.

### 🚀 Optimization

- `appId` and `secret` must not be empty when provided.
- Improve indoor tiles filter frequency.

### ⚠️ Deprecated

- Mark class `AccessControl` deprecated, use `getAccessToken(): Promise<{accessToken, expiredTime}>` instead.

##v8.6.1 (2025-04-10)

### 🐛 Fixes

- Add `mapbox-gl-rtl-text` plugin to support right-to-left languages for Arabic.

##v8.6.0 (2025-03-20)

### 🎉 New

- Add multi-language `PresetLanguage.CHINESE_TRADITIONAL_TW`.
- Remove opacity setting of style layers 'mapxus-venue-fill/mapxus-building-line-color/mapxus-building-line'.

### 🐛 Fixes

- Fix 'Request headers have no identifier and sdkVersion while using API without indoor map'.
- Fix 'BuildingFilterControl cannot close the building list on mobile side'.

##v8.5.0 (2025-02-26)

### 🎉 New

- Add `Map.platform` to get the corresponding platform token.

### 🐛 Fixes

- Fix 'token automatic renewal mechanism cannot work after machine sleep for a long time'.

##v8.4.0 (2025-02-18)

### 🎉 New

- Add `Map.mapxusLogoEnabled` to set whether to show the Mapxus logo or not.
- Add `Map.transformRequest` and `Map.setTransformRequest()` to transform style resource request parameters.

### ⚠️ Deprecated

- Mark `ThemeType.MAPXUS_V2` deprecated(use `ThemeType.MAPXUS_DEFAULT` instead).
- Mark `Map.collapseCopyright` deprecated.

##v8.3.0 (2025-01-21)

### 🎉 New

- Class `RoutePainter` add option `outdoorLineOpacity`.

##v8.2.0 (2024-12-26)

### ⚠️ Breaking Changes

- The parameter `searchByOrientation` of `PoisService.searchByOrientation()` changed type `DistanceSearchType` to `OrientationDistanceSearchType`.

### 🎉 New

- Add class `AccessControl` to get token individually.
- Mapxus map instance destroyed automatically and triggered `map.destroyed()` when called `maplibre.remove()`.
- Marker class allows other symbols to be overlapped on its icons.
- RoutePainter class allows other symbols to be overlapped on its marker icons.
- Add `PoisService.search()` to search POIs by all optional parameters.
- Add `BuildingsService.search()` to search buildings by all optional parameters.
- Add `VenuesService.search()` to search venues by all optional parameters.

##v8.1.1 (2024-11-19)

### 🐛 Fixes

- Fix 'RoutePainter.setStyle() cannot set from/to markers and lineSymbol as null'.

##v8.1.0 (2024-11-19)

### 🎉 New

- `RoutePainter` expanded route custom style settings.

> - `new RoutePainter(maplibreMap)` -> `new RoutePainter(maplibreMap, routeStyle?)`.
> - Add `RoutePainter.setStyle()` to update route style in real time.
> - Mark these functions deprecated: `setMarkerIcons()`, `setMarkerIconSize()`, `setIndoorLineColor()`,
>   `setOutdoorLineColor()`, `setDashedLineColor()`, `setBusLineColor()`. Use `setStyle()` instead.

- `Marker.setOpacityByVenue(venueId, ordinal)` -> `Marker.setOpacityByVenue(venueId, ordinal, inactiveOpacity?)`.
  `Marker.setOpacityByBuilding(buildingId, ordinal)` -> `Marker.setOpacityByBuilding(buildingId, ordinal, inactiveOpacity?)`.

##v8.0.0 (2024-11-15)

### ⚠️ Breaking Changes

- Remove the deprecated functions or properties which marked before version 7.10.0(v7.2.0 \~ v7.9.0).

### 🎉 New

- Map added new multi-languages: `fil|id|pt|th|vi|ar`.
- Add function `map.getLanguage()`.
- Building names of BuildingFilterControl follow with the map language.

##v7.11.0 (2024-10-31)

### 🎉 New

- Add function `MapxusMap.getIdentifier()`.

### 🚀 Optimization

- Token API added request header parameters: 'identifier' and  'sdkVersion'.
- `Marker.updateData()` added null value check of marker source.

##v7.10.0 (2024-09-25)

### ⚠️ Breaking Changes

- `PoisService.searchCategories()` added new search range parameters `bounds` and `keywords`.

> - parameter `{venueId?, buildingId?, floorId?}` -> `{venueId} | {buildingId} | {floorId} | {bounds, keywords?}`

### 🐛 Fixes

- Fix 'fitBounds() would rotate the map while the bearing of map was not 0'.

### ⚠️ Deprecated

- Mark the functions or properties deprecated which will not be applied in the coming version on SharedLevel conception:
  `map.floorSwitchMode`, `enum FloorSwitchMode`, `indoor.floorSwitchMode`.

##v7.9.0 (2024-08-20)

### ⚠️ Breaking Changes

- Remove the deprecated function `indoor.panToBuilding()` which marked in version 7.6.0.

### 🐛 Fixes

- Fix overlapped buildings display.
- Fix "RoutePainter cannot render the route when it starts with a connector".
- Fix "when init indoor by zoom 13.5 it gets a data error".
- Fix "when set `map.fitBuildingBounds` true map will pan to center after fit bounds".
- Fix "when call `map.selectFloorById(floorId, {dragPan: false})` building is missing floors data in `map.onMapChangeListener` callback".

### 🚀 Optimization

- Add `map.autoSelectBuilding` to enable buildings to be automatically selected by panning them to the center of viewport.
- `map.selectVenueById()` selects the historical building first.

### ⚠️ Deprecated

- Mark `indoor.getLevelByPoint()` deprecated.
- Mark the parameter `buildingId`(\{points: \{buildingId?}}) of `RouteService.search()` deprecated.

## v7.8.0 (2024-07-18)

### ⚠️ Breaking Changes

- Upgrade `maplibre-gl@4.1.3` to `maplibre-gl@4.5.0`.
- Script and style are packaged separately.

```html
<!-- dependent maplibre-gl -->
<script src="https://unpkg.com/maplibre-gl@4.5.0/dist/maplibre-gl.js"></script>
<link href="https://unpkg.com/maplibre-gl@4.5.0/dist/maplibre-gl.css" rel="stylesheet" />
<!-- mapxus map -->
<script src="https://web-sdk.mapxus.com/prod/mapxus-map-7.8.0.js"></script>
<link href="https://web-sdk.mapxus.com/prod/mapxus-map-7.8.0.css" rel="stylesheet" />
```

```javascript
import "maplibre-gl/dist/maplibre-gl.css";
import "@mapxus/mapxus-map/dist/index.css";
import "your custom style.css";
import {Map as MaplibreMap} from "maplibre-gl";
import {Map} from "@mapxus/mapxus-map";

const maplibreMap = new MaplibreMap({
  container: "map",
  zoom: 17
});
const map = new Map({
  map: maplibreMap,
  appId: "your app id",
  secret: "your secret",
  buildingId: "tsuenwanplaza_hk_369d01"
});
```

### 🚀 Optimization

- `routePainter.setMarkerIcons()` allows to set the marker icons null.
- `searchByIds()` APIs of venue/building/poi service added empty string checking for parameters.

### ⚠️ Deprecated

- Mark class `Evented` exporting deprecated, it will be private.

## v7.7.3 (2024-07-12)

### 🐛 Fixes

- Fix `map.selectFloorById() cannot change floor when target floor in the same building`.
- Fix `map.getIndoorFeaturesByCoordinates() could not find features`.
- Fix `map.switchTheme() could not work`.

## v7.7.2 (2024-06-26)

### 📝 Changes

- `map.selectVenueById()`,`map.selectBuildingById()` and `map.selectFloorById()` whether to pan the map decided by the optional parameter `{dragPan?: boolean}`, default to be "true".

## v7.7.1 (2024-06-19)

### 🐛 Fixes

- Fix buildings overlap rendering issue.

## v7.7.0 (2024-06-18)

### 📝 Changes

- `map.selectVenueById()`,`map.selectBuildingById()` and `map.selectFloorById()` add optional
  parameter `{dragPan?: boolean}` to set whether to pan the map while changing the selected indoor state;

> - `map.selectVenueById(id, callback?)` -> `map.selectVenueById(id, {dragPan?: boolean}?)`.
> - `map.selectBuildingById(id, callback?)` -> `map.selectBuildingById(id, {dragPan?: boolean}?)`.
> - `map.selectFloorById(id, callback?)` -> `map.selectFloorById(id, {dragPan?: boolean}?)`.
> - `indoor.selectBuilding(feature, floorId?)` -> `indoor.selectBuilding(feature, {floorId?, dragPan?}?)`.
> - Remove the deprecated function `map.disableFloorControl()` and `map.enableFloorControl()`.
> - Mark `floorsControl.setVisibility()` deprecated, add `floorsControl.setEnabled()`.
> - Mark `map.setFloorSelectorStyle()` deprecated, add `map.floorSelector.setStyle()`.

- `map.selectVenueById()` default to center selected building if it is not in bbox.
- `map.selectBuildingById()` default to center selected building if it is not in bbox.
- `map.selectFloorById()` default to center selected building if the selected floor is not in bbox.
- `map.getFeaturesById()` add an optional parameter `{layerIds?: string[], filter? (feature) => boolean}` to help filter features.
- Improve tiles filter and render.
- Update collapsed-copyright style.

## v7.6.0 (2024-05-27)

### ⚠️ Breaking Changes

- Upgrade to `maplibre-gl@4.1.3`.

> If you import maplibre-gl package by script tag, you must upgrade them to version 4.1.3



> **By NPM, there’s no need to upgrade maplibre-gl manually**, it will be upgraded automatically by upgrading @mapxus/mapxus-map.

### 🐛 Fixes

- Fix 'click outside level but inside building fill could not exit indoor in mask-building-mode'.
- Fix 'token API retry in loop when 401'.
- Fix the building list layout of BuildingFilterControl after changed position.

### 🚀 Optimization

- Add parameter type `null` for `map.setSelectedBuildingBorderStyle()` to remove the selected building border style.
- Add `IMapOption?.language`, `map.setLanguage()`, `map.convertBrowserLangToPresetLang()` and `MapxusMap.VERSION`.
- Improve the map initialization process.

> - Add `map.switchBuilding` event handler
> - Add `map.switchOutdoor` event handler
> - Add `map.floorSelector` event handler
> - Add `map.buildingSelector` event handler
> - Add `map.getMaplibre()`
> - Add `map.setLanguage()`
> - Add `map.setOutdoorMapShown()`
> - Add `map.setFloorSelectorStyle()`
> - Add `IMapOption.floorSelectorStyle`
> - Add `IMapOption.floorSelectorEnabled`
> - Add `IMapOption.buildingSelectorEnabled`
> - Add `IMapOption.outdoorMapShown`
> - Add enum `PresetLanguage`
> - Add type `IFloorSelectorStyle`
> - Add `indoor.setAllowBuildingSwitch()`
> - Add `indoor.setAllowOutdoorSwitch()`
> - Add `indoor.setOutdoorMapShown()`
> - Add `indoorOption.outdoorMapShown`
> - Add `indoorOption.startWithIndoorView`
> - Add `indoorOption.maskNonSelectedAreas`
> - Add `indoorOption.selectedBuildingBorderStyle`
> - Add `buildingFilterControl.setVisibility()`
> - Add `buildinfFilterControl.changePosition()`
> - Add optional argument `buildingSelectorEnabled` of `BuildingFilterControl.constructor()`
> - Add `floorsControl.changePosition()`
> - Add `floorsControl.position`
> - Add `floorsControl.enabled`
> - Add optional argument `options` of `FloorsControl.contructor()`

- Improve indoor resources request transformation.
- Upgrade default map style to `mapxus_mims2_v5`.
- Upgrade `PoisService.searchByIds()` API to v4.
- Upgrade venue and building service APIs to v4.
- Upgrade `maplibre-gl@4.1.1` to `maplibre-gl@4.1.3`.
- Remove `@types/geojson` from dependencies.
- Enable font settings from the map's style for CJK characters.
- Remove the hard-coded style of POI name.

### ⚠️ Deprecated

| Class                 | Deprecated Function                                                                            | Replacement Function               |
| --------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------- |
| Map                   | enableSwitchBuilding()                                                                         | switchBuilding.enable()            |
|                       | disableSwitchBuilding()                                                                        | switchBuilding.disable()           |
|                       | enableSwitch()                                                                                 | switchOutdoor.enable()             |
|                       | disableSwitch()                                                                                | switchOutdoor.disable()            |
|                       | getMap()                                                                                       | getMaplibre()                      |
|                       | enableFloorControl()                                                                           | floorSelector.enable()             |
|                       | disableFloorControl()                                                                          | floorSelector.disable()            |
|                       | enableBuildingSelector()                                                                       | buildingSelector.enable()          |
|                       | disableBuildingSelector()                                                                      | buildingSelector.disable()         |
|                       | transformPoiTextFieldLanguage()                                                                | setLanguage()                      |
|                       | setOutdoorLayerHidden()                                                                        | setOutdoorMapShown()               |
|                       | setFloorsControlStyle()                                                                        | setFloorSelectorStyle()            |
|                       | IMapOption.enableFloorControl                                                                  | IMapOption.floorSelectorEnabled    |
|                       | IMapOption.enableBuildingSelector                                                              | IMapOption.buildingSelectorEnabled |
|                       | IMapOption.hiddenOutdoor                                                                       | IMapOption.outdoorMapShown         |
|                       | IMapOption.floorsControlStyle                                                                  | IMapOption.floorSelectorStyle      |
|                       | optional parameter `callback` of selectFloorById(), selectBuildingById() and selectVenueById() |                                    |
| PoisService           | IPoi.description                                                                               |                                    |
| Type                  | TPresetLanguage                                                                                | PresetLanguage                     |
|                       | IFloorsControlStyle                                                                            | IFloorSelectorStyle                |
| Const                 | MapxusMap.version                                                                              | MapxusMap.VERSION                  |
| Indoor                | enableSwitchBuilding()                                                                         | setAllowBuildingSwitch()           |
|                       | disableSwitchBuilding()                                                                        | setAllowBuildingSwitch()           |
|                       | enableSwitch()                                                                                 | setAllowOutdoorSwitch()            |
|                       | disableSwitch()                                                                                | setAllowOutdoorSwitch()            |
|                       | setMaskNonSelectedAreas()                                                                      | indoorOption.maskNonSelectedAreas  |
|                       | hiddenOutdoorLayer()                                                                           | setOutdoorMapShown()               |
|                       | indoorOption.isHiddenOutdoor                                                                   | indoorOption.outdoorMapShown       |
|                       | indoorOption.isInitialIndoor                                                                   | indoorOption.startWithIndoorView   |
|                       | the optional parameter `callback` of panToBuilding()                                           |                                    |
| FloorsControl         | setPosition()                                                                                  | changePosition()                   |
|                       | the optional parameter `callback` deprecated of switchByOrdinal()                              |                                    |
| BuildingFilterControl | setLayoutHidden()                                                                              | setVisibility()                    |
|                       | moveBuildingFilter()                                                                           | changePosition()                   |
|                       | second optional argument `position` of `constructor()`                                         |                                    |

## v7.5.0 (2024-03-27)

### ⚠️ Breaking Changes

- Add RoutePainter.setMarkerIcons() for setting all marker icons.

> - Upgrade maplibre-gl\@3.6.2 to maplibre-gl\@4.1.1.
> - RoutePainter.setFromMarkerIcon(icon, callback?) -> async setMarkerIcons(\{from: icon}).
> - RoutePainter.setToMarkerIcon(icon, callback?) -> async setMarkerIcons(\{to: icon}).
> - Marker.setIconImage(icon, callback?) -> async setIcon(icon).
> - Remove deprecated Marker.setIconImageUrl().
> - Remove RoutePainter.setFromMarkerIcon().
> - Remove RoutePainter.setToMarkerIcon().

- RouteService.search() supports route planning query for more than 2 points.

> RouteService.search(fromCoordinate, toCoordinate, fromFloorId, toFloorId, fromBuildingId, toBuildingId, vehicle, locale?, toDoor?)\
> -> search(\{points, vehicle?, locale?, toDoor?}).

- RoutePainter.render() supports route drawing of more than 2 points.

> RoutePainter.render(path, fromCoordinate, toCoordinate)\
> -> render(path, markerLocations).

- Update the parameters of PoisService.searchByDistance().

> searchByDistance(category, center, distance, offset, page)\
> -> searchByDistance(\{center, distance, keywords?, offset?, page?}).

- Update types

> - WayFindingVehicleType -> VehicleType.
> - IPresetLanguage -> TPresetLanguage.
> - IMultiLangName -> IMultilingualName.
> - IMultiLangAddress -> IMultilingualAddress.

### 🚀 Optimization

- Upgrade axios\@1.6.2 to axios\@1.6.7.
- Add PoisService.searchByOrientation().
- Add PoisService.searchByFloor().
- Add PoisService.searchByBounds().
- Add PoisService.searchByVenue().
- Add PoisService.searchByBuilding().
- Add Marker.updateData() to update marker features.
- Add Marker.on(eventKey, callback) to add mouse event listeners.
- Add VehicleType.EMERGENCY for route search.
- Add PoisService.searchByCategory().

### ⚠️ Deprecated

| Class        | Deprecated Function            | Replacement Function |
| ------------ | ------------------------------ | -------------------- |
| PoisService  | searchByBbox                   | searchByBounds       |
|              | searchByVenueId                | searchByVenue        |
|              | searchByBuildingId             | searchByBuilding     |
|              | searchOrientation              | searchByOrientation  |
| Marker       | onEventListener                | on                   |
| RouteService | parameter 'toDoor' of search() |                      |

## v7.4.0 (2024-01-29)

### 🐛 Fixes

- Fix 'FloorsControl has different style in Windows Chrome'.
- Fix the triggering timing of 'map.renderComplete'.
- Fix 'map.enableFloorControl cannot work by calling in map.renderComplete callback'.

### 🚀 Optimization

- PoisService.searchOrientation's parameter 'distanceSearchType' added a new type 'Gate'.
- Throw verification error.
- Improve 'layer ids start with "mapxus-venue" and "mapxus-building" not be filtered'.
- Update properties of venue/building/POI API responses.
- Add public function 'map.getIndoorFeaturesByCoordinates'.
- Class Marker allows icon overlap and be visible.
- Upgrade maplibre-gl\@3.5.1 to maplibre-gl\@3.6.2.
- Upgrade axios\@1.3.4 to axios\@1.6.2.
- Remove default zoom value of map.

## v7.3.0 (2023-11-02)

### ⚠️ Breaking Changes

- API <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.3.0/classes/PoisService.html#searchOrientation" target="_blank">PoisService.searchOrientation</a> parameters changed.
  > Note: Search priority: ordinal > floorId > buildingId
  > `searchOrientation(angle, buildingId, center, distance, distanceSearchType, floorId?) -> searchOrientation({center, angle, distance, buildingId?, floorId?, ordinal? distanceSearchType?})`

### 🐛 Fixes

- Fix 'Cannot select building while map container is not started from left-top corner'.

### 🚀 Optimization

- Add optional parameters \{<a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.3.0/interfaces/IMapOption.html#fitBuildingBounds" target="_blank">fitBuildingBounds</a>, <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.3.0/interfaces/IMapOption.html#boundsPadding" target="_blank">boundsPadding</a>} of map constructor to make the selected building boundaries fit the screen.
- Upgrade to maplibre-gl\@3.5.1.
- Update token while it is expired and make error request retries.

## v7.2.0 (2023-09-26)

### ⚠️ Breaking Changes

- Enrich the API <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.2.0/classes/PoisService.html#searchCategories" target="_blank">PoisService.searchCategories</a> parameters.
  > Note: 'venueId', 'buildingId' and 'floorId' are all optional, but at least one needs to be provided.
  > `searchCategories(buildingId, floorId) -> searchCategories({venueId, buildingId, floorId})`

- Add <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.2.0/classes/Marker.html#onEventListener" target="_blank">marker.onEventListener</a> a return object with 'offEventListener' function.
  > `const {offEventListener} = marker.onEventListener(eventKey, callback)`

- Add optional 'callback' parameter to <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.2.0/classes/Marker.html#setIconImage" target="_blank">marker.setIconImage</a>.
  > `setIconImage(url) -> setIconImage(url, callback?)`

- Add optional 'callback' parameter to async functions <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.2.0/classes/RoutePainter.html#setFromMarkerIcon" target="_blank">setFromMarkerIcon</a> and <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.2.0/classes/RoutePainter.html#setToMarkerIcon" target="_blank">setToMarkerIcon</a> of RoutePainter.
  > Note: The callback function will be fired after the icon download completed (if you set an external URL).
  > `setFromMarkerIcon(url) -> setFromMarkerIcon(url, callback?)`
  > `setToMarkerIcon(url) -> setToMarkerIcon(url, callback?)`

### 🎉 New

- Add map constructor optional parameter <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.2.0/interfaces/IMapOption.html" target="_blank">\{maskNonSelectedAreas}</a> to set non-selected areas masked.
- Add API <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.2.0/classes/PoisService.html#searchByVenueId" target="_blank">PoisService.searchByVenueId</a>.
- Layered display of overlapping elements on different floors.

### 🐛 Fixes

- Fix "'map.switchTheme' function could not work".

### 🚀 Optimization

- Improve text overflow style of FloorControl item.
- Remove deprecated functions of v7.1.0, refer to the changelog of v7.1.0 for details.

### ⚠️ Deprecated

- The following APIs are deprecated, remain available in v7.2.0, and are planned for removal in v7.3.0. Please migrate to the replacement APIs below:

| Class  | Deprecated Function | Replacement Function |
| ------ | ------------------- | -------------------- |
| Map    | getFeature          | getFeaturesById      |
| Indoor | getFeature          | getFeaturesById      |
| Marker | setIconImageUrl     | setIconImage         |

## v7.1.0 (2023-08-30)

### ⚠️ Breaking Changes

- <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.1.0/classes/Marker.html" target="_blank">Marker</a> class refactoring.
  > New class, changes involving almost all methods, please refer to the relevant API documentation.

- Change <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.1.0/classes/PoisService.html#searchOrientation" target="_blank">PoisService.searchOrientation</a> last required parameter 'floor' to optional 'floorId'.
  > `searchOrientation(angle, buildingId, center, distance, distanceSearchType, floor) -> searchOrientation(angle, buildingId, center, distance, distanceSearchType, floorId?)`

- Enrich <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.1.0/classes/Map.html#onPoiClickListener" target="_blank">map.onPoiClickListener</a> and <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.1.0/classes/Map.html#onMapClickListener" target="_blank">map.onMapClickListener</a> callback parameters.
  > `onPoiClickListener(({coordinate, poi, building, floorName, floorId, ordinal}) => void) -> onPoiClickListener(({coordinate, poi, venue, building, floor}) => void)`
  > `onMapClickListener(({coordinate, floorName, floorId, ordinal, building}) => void) -> onMapClickListener(({coordinate, floor, building, venue}) => void)`

### 🎉 New

- Add <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.1.0/classes/RoutePainter.html" target="_blank">RoutePainter</a> class.
- Add <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.1.0/classes/BuildingsService.html#searchByFloorId" target="_blank">BuildingsService.searchByFloorId</a> API.
- Add <a href="https://map-service.mapxus.com/dpw/api/v1/api/digitalMap/web/7.1.0/classes/Map.html#selectVenueById" target="_blank">map.selectVenueById</a> function.

### 🐛 Fixes

- Fix "'map.enableFloorControl' function could not work".

### 🚀 Optimization

- Remove deprecated functions of v7.0.0, refer to the changelog of v7.0.0 for details.

### ⚠️ Deprecated

- The following APIs are deprecated, remain available in v7.1.0, and are planned for removal in v7.2.0. Please migrate to the replacement APIs below:

| Class       | Deprecated Function            | Replacement Function             |
| ----------- | ------------------------------ | -------------------------------- |
| Map         | constructor parameter \{floor} | constructor parameter \{floorId} |
|             | floors                         | building.properties.level\_names |
|             | currentFloor                   | floor.code                       |
|             | ordinal                        | floor.ordinal                    |
|             | venueId                        | venue.properties.id              |
|             | selectBuilding                 |                                  |
|             | switchBuilding                 | selectBuildingById               |
|             | switchFloor                    | selectFloorById                  |
|             | hiddenOutdoorLaye              | setOutdoorLayerHidden            |
|             | onFloorChangeListener          | onMapChangeListener              |
|             | onBuildingChangeListener       | onMapChangeListener              |
|             | onVenueChangeListener          | onMapChangeListener              |
| Indoor      | floors                         | building.properties.level\_names |
|             | ordinals                       | building.properties.ordinals     |
|             | buildingId                     | building.properties.id           |
|             | currentFloor                   | floor.code                       |
|             | ordinal                        | floor.ordinal                    |
|             | floorId                        | floor.id                         |
|             | venueId                        | venue.properties.id              |
|             | goToBuilding                   | panToBuilding                    |
|             | switchFloor                    | switchFloorByOrdinal             |
|             | getBuildingByPoint             |                                  |
| PoisService | searchCategory                 | searchCategories                 |

## v7.0.0 (2023-08-08)

### ⚠️ Breaking Changes

- Improve map.onVenueChangeListener callback parameters.
  > `onVenueChangeListener(({venueId, ordinal}) => void) -> onVenueChangeListener(({feature}) => void)`

- Improve map.onFloorChangeListener callback parameters.
  > `onFloorChangeListener(({floor, ordinal, feature}) => void) -> onFloorChangeListener((feature) => void)`

- Route service API upgrade to V3 and change the parameter floorName to be floorId..
  > `search(fromCoord, toCoord, fromFloorName, toFloorName, fromBuildingId, toBuildingId, vehicle, locale) -> search(fromCoord, toCoord, fromFloorId, toFloorId, fromBuildingId, toBuildingId, vehicle, locale)`

- Enrich "map.onMapClickListener" callback parameters.
  > `onMapClickListener(({point, feature}) => void) -> onMapClickListener(({coordinate, floorName, floorId, ordinal, building}) => void)`

### 🎉 New

- New BuildingFilter control style.
- New FloorsSelector style.
- New logo style.
- Add optional copyright.
- Add venue APIs.
- Add function "map.onPointClickListener".
- Add map constructor option parameter 'floorSwitchMode' to filter tiles by venue or building, default value is 'floorSwitchMode.SWITCHED\_BY\_VENUE'.
- Add map constructor option parameter 'floorsControlStyle'.
- Add map constructor option parameter 'selectedBuildingBorderStyle' and function 'setSelectedBuildingBorderStyle' to set building highlight border style.

### 🚀 Optimization

- Change 'Evented.on' and 'Evented.off' parameter types from 'any' to 'string'.
- Improve building and floor displaying priorities.
- Improve "map.selectBuilding" parameter type to be "IFeatureBuilding|null", for changing map outdoor by parameter "null".
- Upgrade to maplibre-gl\@3.1.0.
- Upgrade to typescript\@5.1.6.
- Upgrade to axios\@1.3.4.

### ⚠️ Deprecated

- The following APIs are deprecated, remain available in v7.0.0, and are planned for removal in v7.1.0. Please migrate to the replacement APIs below:

| Class  | Deprecated Function                                                     | Replacement Function                                                           |
| ------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Map    | onIndoorPoiListener((\{lngLat, originalEvent, point, feature}) => void) | onPoiClickListener((\{coordinate, poi, building, floorName, floorId}) => void) |
| Indoor | refLevel                                                                | floorId                                                                        |
