@tomtom-org/maps-sdk 0.60.0 → 0.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,331 +1,598 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.62.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#2425](https://github.com/tomtom-internal/maps-sdk-js/pull/2425) [`d4bae68`](https://github.com/tomtom-internal/maps-sdk-js/commit/d4bae6859816468374f9747f6e46a14fe8b931b2) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: **Breaking:** `TrafficAreaAnalyticsModule` colours each metric from a named `palette` or its own `colorStops`, set with `setPalette` and `setColorStops`, and a raw height takes `metersPerUnit`
8
+
9
+ - map: **Breaking:** `AreaAnalyticsColorTheme` is `AreaAnalyticsPalette`, and `areaAnalyticsPalettes` lists its names. Rename the type
10
+ - map: **Breaking:** `AreaAnalyticsMetricConfig.color` is gone: a palette name goes in `palette`, colour stops in `colorStops`, which wins when both are set, and with neither a metric draws `trafficLight`. Migrate `color: 'heat'` to `palette: 'heat'` and `color: { valueType, stops }` to `colorStops: { valueType, stops }`
11
+ - map: **Breaking:** `setColor` is gone: `setPalette(palette, metrics?)` and `setColorStops(colorStops, metrics?)` each set their own field, and `undefined` clears it. Migrate `setColor('heat')` to `setPalette('heat')` and `setColor({ valueType, stops })` to `setColorStops({ valueType, stops })`
12
+ - map: **Breaking:** the config keeps a palette as its name, so `getConfig().metricConfig.speed.palette` reads `'heat'` where `color` read the stops `setColor('heat')` expanded it to, and `AREA_ANALYTICS_DEFAULTS` gives each metric `palette: 'trafficLight'` instead of colour stops. Read a palette's stops with `resolveColorStops(metric, metricConfig)`, which takes the metric and its config instead of a theme or stops
13
+ - map: **Breaking:** a palette on `networkLength` spans the loaded range, as its default colours do, instead of 0 to 5,000 m. Set `colorStops` with `valueType: 'relativeToPredefinedRangePCT'` to keep the fixed range
14
+ - map: **Breaking:** the raw height's `scaleFactor` is `metersPerUnit`, the metres of height per unit of the metric. Migrate `setHeight({ scaleMode: 'raw', scaleFactor: 10 })` to `setHeight({ scaleMode: 'raw', metersPerUnit: 10 })`
15
+ - map: **Breaking:** in `trafficAreaAnalyticsKnobCatalogue`, `metricConfig.<metric>.color` is `metricConfig.<metric>.palette`, an `enum` knob over `areaAnalyticsPalettes` that defaults to `trafficLight`, and `metricConfig.<metric>.height.scaleFactor` is `metricConfig.<metric>.height.metersPerUnit`. Rename the ids
16
+
17
+ - [#2422](https://github.com/tomtom-internal/maps-sdk-js/pull/2422) [`8946cdd`](https://github.com/tomtom-internal/maps-sdk-js/commit/8946cdd59fd4369e04efe3c798e28176446f8d32) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `TrafficIncidentsModule.isIconsVisible()` returns the incident icons setting, replacing `anyIconLayersVisible()`.
18
+
19
+ - **Breaking:** map: `TrafficIncidentsModule.anyIconLayersVisible()` is removed. To read the icons setting, use `isIconsVisible()`; to read a layer itself, use `map.mapLibreMap.getLayoutProperty(layerId, 'visibility')`
20
+ - map: `TrafficIncidentsModule.isIconsVisible()` returns `icons.visible`, as the `icons.visible` knob reads, and `isVisible()` while it is unset: `true` for the icons-only `{ visible: false, icons: { visible: true } }`
21
+ - map: `TrafficIncidentsModule.setVisible()` clears `icons.visible` in a new configuration object, leaving the one `getConfig()`, a `config-change` handler or `TrafficIncidentsModule.get()` was given untouched
22
+
23
+ - [#2436](https://github.com/tomtom-internal/maps-sdk-js/pull/2436) [`a4e54b1`](https://github.com/tomtom-internal/maps-sdk-js/commit/a4e54b1ae883341adfd6eeb3511a0f9f1b3fd9c1) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: Waypoint and place connection labels follow the map's light/dark theme like place and geometry labels, and take colour knobs of their own
24
+
25
+ - `RoutingModule` waypoint labels draw dark grey text on a white halo on a light map and the two swapped on a dark one; `waypoints.label` takes a `LabelConfig`, and `waypoints.label.color` and `waypoints.label.haloColor` join `routingKnobCatalogue`
26
+ - `PlacesModule` connections take `connections.color`, `connections.textColor` and `connections.haloColor`, all three in `placesKnobCatalogue`
27
+ - On a dark map, connection labels and entry points take the same dark grey halo as place labels instead of a near-black one, and a connection label with a custom colour takes a lighter shade of it instead of a darker one
28
+ - Connection labels draw in the map's regular font; they named none, so the map fetched a font TomTom styles do not serve and drew them in a local browser font
29
+
30
+ - [#2431](https://github.com/tomtom-internal/maps-sdk-js/pull/2431) [`4bbf37d`](https://github.com/tomtom-internal/maps-sdk-js/commit/4bbf37d567b98811dc2175e9c3f8c571d65867bf) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - Breaking changes:
31
+ - map: `TrafficIncidentOverlayModule` is `TrafficIncidentDetailsModule`, after the Traffic Incident Details service whose incidents it draws, and its config is `TrafficIncidentDetailsModuleConfig`; its sources and layers are suffixed `traffic-incident-details-N`, no longer `traffic-incident-overlay-N`
32
+ - map: `trafficIncidentOverlayKnobCatalogue`, `trafficIncidentOverlayKnobIds`, `TrafficIncidentOverlayKnob`, `TrafficIncidentOverlayKnobId` and `TrafficIncidentOverlayKnobValueOf` follow the module: `trafficIncidentDetailsKnobCatalogue`, `trafficIncidentDetailsKnobIds`, `TrafficIncidentDetailsKnob`, `TrafficIncidentDetailsKnobId`, `TrafficIncidentDetailsKnobValueOf`
33
+ - map: `StyleModule` is `StylePart` and `styleModules` is `styleParts`, so a part of the style no longer shares its name with the map modules: `include: StyleModule[]` → `include: StylePart[]`
34
+ - map: the `'hillshade'` style part is `'terrain'`, the elevation data both the hillshade and 3D terrain draw from: `include: ['hillshade']` → `include: ['terrain']`
35
+ - map: `TomTomMap.getStyle()` is `getStyleInput()`, as it returns the `StyleInput` the map was given and not the style specification MapLibre's `getStyle()` returns
36
+ - map: `POIsModule.getShown()` returns `{ pois }`, no longer `{ poi }`, and the module's source key is `pois` too
37
+
38
+ - [#2429](https://github.com/tomtom-internal/maps-sdk-js/pull/2429) [`092c6cd`](https://github.com/tomtom-internal/maps-sdk-js/commit/092c6cdd0d1e8d4b3f2aa1c22886ca655980fc8b) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: every module setting changes through `applyConfig`, `updateConfig` or `setKnob`; the setters that changed one setting are removed.
39
+
40
+ - **Breaking:** map: `places.applyMarkerType(type)`, `applyIconConfig(icon)`, `applyLabelConfig(label)`, `applyExtraFeatureProps(props)` are removed: use `places.updateConfig({ markerType, icon, label, extraFeatureProps })`
41
+ - **Breaking:** map: `geometries.applyLabelConfig(label)` is removed: use `geometries.updateConfig({ label })`
42
+ - **Breaking:** map: `moveBeforeLayer(target)` on `GeometriesModule`, `TrafficIncidentOverlayModule` and `TrafficAreaAnalyticsModule` is removed: use `updateConfig({ beforeLayerConfig: target })`. A part a `beforeLayerConfig` record leaves out goes back to its default position
43
+ - **Breaking:** map: `trafficFlow.filter(filters)` and `trafficIncidents.filter(filters)` are removed: use `updateConfig({ filters })`, and `updateConfig({ filters: undefined })` to clear
44
+ - **Breaking:** map: `pois.filterCategories(filter)` is removed: use `pois.updateConfig({ filters: { categories: filter } })`
45
+ - **Breaking:** map: `terrain.setElevationExaggeration(value)` is removed: use `terrain.updateConfig({ elevationExaggeration: value })`
46
+ - **Breaking:** map: `analytics.setMode(mode)`, `setMetric(metric)` and the `mode` getter are removed: use `analytics.updateConfig({ displayMode: mode })`, `updateConfig({ activeMetric: metric })` and `getConfig()?.displayMode`
47
+ - **Breaking:** map: `analytics.filter(filters, metrics)` is `setFilters(filters, metrics)`, and `clearFilter(metrics)` is `setFilters(undefined, metrics)`
48
+ - map: `PlacesModule.applyConfig` and `updateConfig` take the place shape, so `label.title`, `extraFeatureProps` and the icon mapping read your own place properties typed
49
+ - map: a `GeometriesModule` config change that only moves or hides layers keeps the shown geometries instead of preparing them again, and `TrafficAreaAnalyticsModule` masks its region again only when `regionPolygon.inverted` changes
50
+
51
+ - [#2436](https://github.com/tomtom-internal/maps-sdk-js/pull/2436) [`a4e54b1`](https://github.com/tomtom-internal/maps-sdk-js/commit/a4e54b1ae883341adfd6eeb3511a0f9f1b3fd9c1) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: **Breaking:** `ReachableRangesModule` draws `calculateReachableRanges` results in colours from the map, and a geometry `fill.palette` is a list of your own CSS colours instead of a palette name
52
+
53
+ - map: `ReachableRangesModule.create(map, config?)` and `show(ranges)` draw reachable ranges as returned: each band titled from its budget, each origin's bands nested around it, several origins in one `show`, and the `'filled'`, `'outline'` and `'inverted'` fill styles
54
+ - map: without a `palette`, the bands ramp from the map's accent toward its land colour, reversed for `'inverted'`, and repaint when either changes, such as on `StylingModule.setMapColors(deriveMapColors(…))`. On a map no theme has coloured, the ramp runs between the style's light or dark defaults and follows a switch. `palette` takes your own colours, innermost band first
55
+ - map: a geometries `lineLabel` set after `create`, such as through `setKnob` or `updateConfig`, draws the border labels, which it only did when given at `create`
56
+ - map: `reachableRangesKnobCatalogue`, `reachableRangesKnobIds`, `ReachableRangesKnob`, `ReachableRangesKnobId` and `ReachableRangesKnobValueOf` publish its settings as data; `ReachableRangesModuleConfig` and `ReachableRangesModuleSerializableConfig` type its configuration
57
+ - map: `AbstractGeometriesModule` is the base `GeometriesModule` and `ReachableRangesModule` share
58
+ - map: **Breaking:** `reachableRangeGeometryConfig`, `ReachableRangeGeometryConfigOptions`, `prepareReachableRangesForDisplay`, `buildReachableRangeFeatures` and `ReachableRangesDisplayOptions` are gone. Migrate `GeometriesModule.create(map, reachableRangeGeometryConfig({ fillStyle, title }))` to `ReachableRangesModule.create(map, { fillStyle, title })`, and show the ranges unprepared
59
+ - map: **Breaking:** `colorPalettes`, `colorPaletteIDs` and `ColorPaletteOptions` are gone, and `fill.palette` and the `palette` option of `fillStyledGeometryConfig` take `string[]`. Migrate `palette: 'warm'` to a list of colours, such as ones from the map-theme plugin's `deriveMapColors`; the colours are drawn as given on dark styles too
60
+ - map: **Breaking:** `fillStyledGeometryConfig()` without a `palette` draws every feature in one colour, the map's accent or the default, instead of `fadedRainbow`
61
+ - map: **Breaking:** the `fill.palette` knob of `geometriesKnobCatalogue` is of kind `colors` instead of `enum`
62
+ - **Breaking:** services: `budgetTypes`, `BudgetType` and `ReachableRangeBudget` move to core. Migrate `import { type BudgetType } from '@tomtom-org/maps-sdk/services'` to `import { type BudgetType } from '@tomtom-org/maps-sdk/core'`
63
+ - core: `budgetUnits` maps each budget type to the unit it counts in, the one the range titles print: `min`, `km`, `% remaining`, `% spent`, `L`
64
+
65
+ ### Patch Changes
66
+
67
+ - [#2388](https://github.com/tomtom-internal/maps-sdk-js/pull/2388) [`efce482`](https://github.com/tomtom-internal/maps-sdk-js/commit/efce4825b868ca7fa21ad7f30d6c35b55692618c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: hover and click states survive a style change on every data-owned module, and a user event moves a state your code put.
68
+
69
+ - map: the hover and click states of shown features survive a style change on `GeometriesModule`, `CustomGeoJSONModule`, `TrafficIncidentDetailsModule` and `TrafficAreaAnalyticsModule`, and a `GeometriesModule` geometry keeps its id
70
+ - map: a `TrafficAreaAnalyticsModule` style change no longer emits `shown-features`, as on the other modules
71
+ - map: a user click, right click or hover moves its state off a feature that `putEventState` gave it, instead of leaving two features clicked or hovered at once; a click takes `click` and `contextmenu` off the other features of its source, a hover takes `hover`, `hover-move` and `long-hover`
72
+ - map: an event state no longer writes into the feature objects you passed to `show`; `getShown()` returns a new collection after each state change
73
+ - map: a `PlacesModule` hover, click or `putEventState` after a configuration change keeps the titles, icons and properties that change set, instead of drawing the earlier ones again
74
+
75
+ - [#2388](https://github.com/tomtom-internal/maps-sdk-js/pull/2388) [`efce482`](https://github.com/tomtom-internal/maps-sdk-js/commit/efce4825b868ca7fa21ad7f30d6c35b55692618c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: every data-owned module reads and writes the event states of the features it shows — `putEventState`, `cleanEventState`, `cleanEventStates` and `getEventStates`.
76
+
77
+ - map: `PlacesModule`, `RoutingModule`, `GeometriesModule`, `CustomGeoJSONModule`, `TrafficIncidentDetailsModule` and `TrafficAreaAnalyticsModule` act on the main features their `getShown()` returns; `getEventStates()` reads back the ids by event state, what user interactions put as well as yours, as the new `EventStateIds` type
78
+ - map: the named scopes of those modules — `routing.events.waypoints`, `places.events.entryPoints`, `custom.events.<sourceName>`, … — are the new `UserEventsWithStates`, with the same four methods for their own features, so ids that repeat across sources never collide
79
+ - map: `PutEventStateOptions.id` and `CleanEventStateOptions.id` take a number as well as a string, matching a feature's `properties.id`, else its top-level `id`
80
+
81
+ - [#2388](https://github.com/tomtom-internal/maps-sdk-js/pull/2388) [`efce482`](https://github.com/tomtom-internal/maps-sdk-js/commit/efce4825b868ca7fa21ad7f30d6c35b55692618c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: hovered and clicked routes, geometries and traffic incidents stand out by default; routes and geometries take how much from `highlight` factors, also knobs.
82
+
83
+ - map: a hovered or clicked route draws a wider outline, selected or not, in its outline colour, `highlight.outlineWidthFactor` times: 1.2 unless set, clamped to `ROUTE_HIGHLIGHT_OUTLINE_WIDTH_FACTOR_RANGE` (1 to 1.25) so a section halo stays in sight, and a knob in `routingKnobCatalogue`; a `layers.mainLines.routeOutline` or `routeDeselectedOutline` line width you give is drawn as given
84
+ - map: a hovered or clicked geometry draws a denser fill and a wider border, in its own colours, `highlight.fillOpacityFactor` (2, 1 to 4, at most opaque) and `highlight.lineWidthFactor` (1.75, 1 to 3) times the opacity and width in force, a configured `fill.opacity` or `line.width` included; both are knobs in `geometriesKnobCatalogue`, and a `line.layer` line width is drawn as given
85
+ - map: a hovered or clicked `TrafficIncidentDetailsModule` incident draws the focus treatment `setFocus` draws, configured by the same `focus` config; `focus: false` turns it off for focused, hovered and clicked incidents alike
86
+
87
+ - [#2430](https://github.com/tomtom-internal/maps-sdk-js/pull/2430) [`beab2dc`](https://github.com/tomtom-internal/maps-sdk-js/commit/beab2dc8fbba7c008d599dad3b4b826f6f0dc3bd) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `PlacesModule` takes a `beforeLayerConfig` (`PlacesBeforeLayerConfig`), placing its layers in the map's layer stack as one or per part
88
+ - The parts are `places`, for the markers, clusters and entry points, and `connections`, for the connection lines; `all` covers the parts a record leaves out
89
+ - `applyConfig` and `updateConfig` restack the layers, a style change keeps them there and `resetConfig` puts them back. Unconfigured, the layer order is unchanged
90
+
91
+ - [#2428](https://github.com/tomtom-internal/maps-sdk-js/pull/2428) [`028cb20`](https://github.com/tomtom-internal/maps-sdk-js/commit/028cb208e1fdf17fe5a94e563965912a4f6375cc) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `StylingModule` warns about a knob that matches no layer of the loaded style when that knob is set, as documented, instead of warning for every such knob as soon as the module loads (eight warnings on `satellite` before any `set`).
92
+
93
+ - [#2426](https://github.com/tomtom-internal/maps-sdk-js/pull/2426) [`08bd572`](https://github.com/tomtom-internal/maps-sdk-js/commit/08bd572eac716a2bc79dea7df3374ee2e983637a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: a `CustomImage.image` given as an SVG data URI (`data:image/svg+xml;…`) is drawn, instead of failing to decode and leaving places, waypoints and incidents without their icon.
94
+
95
+ ## 0.61.0
96
+
97
+ ### Minor Changes
98
+
99
+ - [#2397](https://github.com/tomtom-internal/maps-sdk-js/pull/2397) [`8a5a28f`](https://github.com/tomtom-internal/maps-sdk-js/commit/8a5a28fb69c567dc3ebc9c6603bb30ee406c1d36) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** services: `discoverPlaces` replaces `alongRouteSearch`, and the search response and wire-format types are not exported.
100
+
101
+ - **Breaking:** services: `alongRouteSearch` is not exported; `discoverPlaces` takes the same params and searches along the route whenever they carry `route`: `alongRouteSearch({ route, maxDetourTimeSeconds, query, filters, sortBy, limit })` → `discoverPlaces({ route, maxDetourTimeSeconds, query, filters, sortBy, limit })`. It resolves to a `DiscoverPlacesResponse`
102
+ - **Breaking:** services: the response types of the three searches `discoverPlaces` runs are not exported: `AlongRouteSearchResponse`, `FuzzySearchResponse` and `GeometrySearchResponse` → `DiscoverPlacesResponse`, `GeometrySearchFeatureCollectionProps` → `SearchSummary`
103
+ - **Breaking:** services: their wire-format types are not exported either, with no replacement: `AlongRouteSearchRequestAPI`, `AlongRouteSearchPayloadAPI`, `AlongRouteSearchResponseAPI`, `AlongRouteSearchResultAPI`, `RoutePointAPI`, `FuzzySearchResponseAPI`, `FuzzySearchResultAPI`, `QueryIntentAPI`, `CoordinateIntentAPI`, `CoordinateIntentDetailsAPI`, `NearbyIntentAPI`, `NearbyIntentDetailsAPI`, `GeometrySearchRequestAPI`, `GeometrySearchPayloadAPI`, `GeometrySearchResponseAPI`, `GeometrySearchResultAPI`, `GeometryAPI`, `PolygonAPI` and `CircleAPI`
104
+
105
+ - [#2396](https://github.com/tomtom-internal/maps-sdk-js/pull/2396) [`ef74201`](https://github.com/tomtom-internal/maps-sdk-js/commit/ef7420146f5ac8c8ae5978b40b6a9e71aa3d36e0) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `EVAvailabilityConfig.threshold` defaults to `0.3` for the availability label colour as well as the pin icon, instead of `0` for the label, which drew every station's label green, one with no free charging point included. Set `threshold: 0` to keep the old label colour
106
+
107
+ - [#2378](https://github.com/tomtom-internal/maps-sdk-js/pull/2378) [`a245526`](https://github.com/tomtom-internal/maps-sdk-js/commit/a245526b2cebc9ebdc4f5bd57dd8ebc8ecf58ac1) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `GeometriesModule` text config is label config, and the geometry config helpers take one options object.
108
+
109
+ - **Breaking:** map: `GeometriesModule.applyTextConfig()` is `applyLabelConfig()`, after the `label` it sets: `geometries.applyTextConfig({ text })` → `geometries.applyLabelConfig({ text })`
110
+ - **Breaking:** map: `GeometryLabel` is `GeometryLabelConfig` and `GeometryLineLabel` is `GeometryLineLabelConfig`, like `GeometryFillConfig` and `GeometryLineConfig`
111
+ - **Breaking:** map: `fillStyledGeometryConfig` takes one options object: `fillStyledGeometryConfig('retro', 'top')` → `fillStyledGeometryConfig({ palette: 'retro', beforeLayerConfig: 'top' })`
112
+ - **Breaking:** map: `reachableRangeGeometryConfig` takes one options object, and its label function is `title`: `reachableRangeGeometryConfig('cold', 'inverted', 'top', fn)` → `reachableRangeGeometryConfig({ palette: 'cold', fillStyle: 'inverted', beforeLayerConfig: 'top', title: fn })`
113
+ - **Breaking:** map: `prepareReachableRangesForDisplay` takes its fill style and title function in an options object: `prepareReachableRangesForDisplay(result, 'inverted', fn)` → `prepareReachableRangesForDisplay(result, { fillStyle: 'inverted', title: fn })`; `ReachableRangeLabelFn` is `ReachableRangeTitleFn`
114
+ - map: `GeometryLineLabelConfig.text` sets the text of the border labels, a string or a MapLibre expression, as `label.text` does for the center labels; both default to the feature's `title`
115
+ - map: `GeometryLabelConfig.text` is optional, so `label: { size: 18 }` restyles the center labels without restating their text
116
+ - map: `FillStyledGeometryConfigOptions`, `ReachableRangeGeometryConfigOptions` and `ReachableRangesDisplayOptions` name the options objects
117
+
118
+ - [#2314](https://github.com/tomtom-internal/maps-sdk-js/pull/2314) [`0b69fd6`](https://github.com/tomtom-internal/maps-sdk-js/commit/0b69fd66030cb3e02e5d19f881239451e9975bca) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: a `GeometriesModule` palette name moves from `fill.color` to the new `fill.palette`.
119
+
120
+ - **Breaking:** map: `GeometryFillConfig.color` takes a colour or a MapLibre expression; a palette name goes in `fill.palette`. Migrate `fill: { color: 'warm' }` to `fill: { palette: 'warm' }`
121
+ - map: `GeometryFillConfig.palette` gives each `GeometriesModule` feature the next colour of a named palette, on the fill and on a border without its own `line.color`. It sits between `fill.color`, which wins over it, and the top-level `color`; `fillStyledGeometryConfig` and `reachableRangeGeometryConfig` set it, and once it is set an accent change leaves the geometries as they are
122
+
123
+ - [#2393](https://github.com/tomtom-internal/maps-sdk-js/pull/2393) [`45c3ddf`](https://github.com/tomtom-internal/maps-sdk-js/commit/45c3ddfb641b10cf10635aa0a71ff741f2a02828) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** core: the geopolitical view is set once in `TomTomConfig`, and `View` / `view` are renamed `GeopoliticalView` / `geopoliticalView`.
124
+
125
+ - **Breaking:** core: `View` is renamed `GeopoliticalView`, and `views` is renamed `geopoliticalViews`
126
+ - **Breaking:** services: the `view` parameter of search, suggestions, geocoding, reverse geocoding and place details is renamed `geopoliticalView`. Migrate `discoverPlaces({ query, view: 'IN' })` to `discoverPlaces({ query, geopoliticalView: 'IN' })`; the request still sends the API's own parameter
127
+ - core: `TomTomConfig.instance.put({ geopoliticalView })` sets the geopolitical view for the map and every service; a map's or a call's own `geopoliticalView` overrides it
128
+ - core: `geopoliticalViews` lists all 20 geopolitical views the TomTom APIs serve, adding `AE`, `BN`, `CL`, `DZ`, `KR`, `MY`, `PH`, `US` and `VN`
129
+ - map: the map draws the borders and names of disputed territories in the configured view, and `TomTomMap.setGeopoliticalView` switches it at runtime, reloading only the visible vector tiles
130
+ - services: a view an API does not serve is left out of its requests, which then use the default view of the caller's country, instead of failing
131
+ - services: `getSearchSuggestions` uses the global geopolitical view when the call sets none
132
+
133
+ - [#2401](https://github.com/tomtom-internal/maps-sdk-js/pull/2401) [`07d7e52`](https://github.com/tomtom-internal/maps-sdk-js/commit/07d7e52a1de9d5422899175414331dc3b75e72fd) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: the knob catalogues gain `enums`, `offset` and `text` knobs, and hold the POI, traffic and routing filters and unit labels.
134
+
135
+ - **Breaking:** map: `KnobKind` gains `enums`, a list of options, `offset`, an `[x, y]` screen displacement within a `range`, and `text`, any string, so an exhaustive `switch` over `KnobKind` or `KnobEntry['kind']` needs a case for each
136
+ - **Breaking:** map: `POICategoryGroup` is the union of the `poiCategoryGroups` names, `'FOOD_DRINKS_GROUP' | 'TRANSPORTATION_GROUP' | …`, no longer `string`, so `FilterablePOICategory` and `filterCategories` reject a name that is no group or category
137
+ - **Breaking:** map: every module's `…KnobValueOf<ID>` is the plain value at the knob's path, without the expressions and objects the config also takes there. The one id this narrows is `metricConfig.<metric>.color`: `TrafficAreaAnalyticsKnobValueOf` gives `AreaAnalyticsColorTheme` alone; type custom colour stops as `AreaAnalyticsColorStopsConfig`
138
+ - map: `poisKnobCatalogue` holds the category filter: `filters.categories.show` (`only` or `all-except`) and `filters.categories.values`, an `enums` knob over the category groups, then every `MapStylePOICategory`
139
+ - map: `trafficFlowKnobCatalogue` and `trafficIncidentsKnobCatalogue` hold the first `filters.any` alternative: road categories and subcategories, road closures on flow, and incident categories, magnitudes and delays on incidents
140
+ - map: a POI category or traffic values filter missing `show` or `values` filters nothing until the other is set, instead of throwing, so the two knobs can be set one at a time
141
+ - map: `trafficAreaAnalyticsKnobCatalogue` holds `regionPolygon.outlineWidth` and each metric's `height.maxHeightMeters`, `height.minHeightMeters` and `height.scaleFactor`
142
+ - map: `routingKnobCatalogue` holds the unit labels, `displayUnits.distance.*` and `displayUnits.time.*`, as `text` knobs
143
+ - map: a `RoutingModule` `displayUnits` that leaves `distance.type` unset posts the speed limit signs in the global config's unit system, as the summary bubbles already do, so relabelling one unit keeps the global unit system everywhere
144
+
145
+ - [#2416](https://github.com/tomtom-internal/maps-sdk-js/pull/2416) [`4d2acd0`](https://github.com/tomtom-internal/maps-sdk-js/commit/4d2acd0eba34f2c8386a85b771261f4d1b9b9a10) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `validateKnobValue` and `setKnob` check and set knob values, and `KnobRange` requires `bounds`.
146
+
147
+ - **Breaking:** map: `KnobRange` requires `bounds`, which ends a value must keep to: `hard` both, `hard-min` only `min`, `soft` neither, so a range you declare yourself needs one
148
+ - map: `validateKnobValue(entry, value)` checks a value against a knob's kind, range, options or colour syntax, and throws a `RangeError` naming the knob and what it expects
149
+ - map: `setKnob(module, catalogue, id, value)` validates a value, then applies the module's config with it at the knob's path, keeping every other setting; the value is typed from the path
150
+ - map: `StylingModule.set` and `setMapColors` check values with `validateKnobValue`, so their messages match every other module's
151
+ - map: the traffic heights, height scale factor, outline width, delay minutes and area analytics filters, and the geometries line and halo widths, label size and symbol spacing have `hard-min` ranges; the geometries line label offset a `soft` one; opacities, factors and zooms `hard` ones
152
+
153
+ - [#2411](https://github.com/tomtom-internal/maps-sdk-js/pull/2411) [`37c3a8d`](https://github.com/tomtom-internal/maps-sdk-js/commit/37c3a8d769a0ed0ab5adf1add6f3eb83d7ccb5d0) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: each module's `isVisible()` returns its `visible` setting, and `RoutingModule` gains `setVisible` and `isVisible`.
154
+
155
+ - **Breaking:** map: `isVisible()` on `POIsModule`, `BaseMapModule`, `TrafficFlowModule` and `TrafficIncidentsModule` returns the `visible` setting, as the module's `visible` knob reads, instead of whether any of its layers draws; on `BaseMapModule`, the `visible`, `groups` and styling-toggle settings over the groups asked about. Until something sets it, POIs and the base map report what the style draws and the traffic modules `false`. To read a layer itself, use `map.mapLibreMap.getLayoutProperty(layerId, 'visibility')`
156
+ - **Breaking:** map: `TrafficIncidentsModule.isVisible()` is `false` when the incidents are set hidden with `icons: { visible: true }`. Read `anyIconLayersVisible()` for the icons
157
+ - **Breaking:** map: `TerrainModule.isHillshadeVisible()` returns the `hillshade` setting, `false` until something sets it, instead of whether a hillshade layer draws; `isElevationEnabled()` returns the `elevation` setting and, until something sets it, whether the map's own terrain is raised. To read the map itself, use `map.mapLibreMap.getLayoutProperty(layerId, 'visibility')` or `map.mapLibreMap.getTerrain()`
158
+ - **Breaking:** map: `CustomGeoJSONModule.show()` no longer draws the layers of a module hidden with `setVisible(false)` or `visible: false`; data shown while hidden draws on `setVisible(true)`. Call `setVisible(true)` where a `show()` used to reveal them
159
+ - **Breaking:** map: a subclass of `AbstractDataOwnedMapModule` implements `applyVisibility(config)`, which shows or hides what it draws for the `setVisible` and `isVisible` the base class now provides; its config type takes `visible?: boolean`. Move a module's own `setVisible` body into `applyVisibility`
160
+ - map: `RoutingModule` takes `visible` (default `true`), with `setVisible` and `isVisible`. Hiding covers every part it draws and keeps the routes and waypoints through `showRoutes`, `showWaypoints`, `selectRoute`, the clears and style changes, and `routingKnobCatalogue` lists it as the `visible` toggle
161
+ - map: `CustomGeoJSONModule.isVisible()` reads its `visible` setting
162
+
163
+ - [#2394](https://github.com/tomtom-internal/maps-sdk-js/pull/2394) [`b5c66cc`](https://github.com/tomtom-internal/maps-sdk-js/commit/b5c66cc1a28f9ab897590d37a7d98fe83837d826) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `PlacesModule` and the routing charging stops take `label` instead of `text`, as `GeometriesModule` does.
164
+
165
+ - **Breaking:** map: `PlacesModuleConfig.text` is `label`, like `GeometriesModuleConfig.label`: `{ text: { title, color } }` → `{ label: { title, color } }`
166
+ - **Breaking:** map: `PlaceTextConfig` is `PlaceLabelConfig`
167
+ - **Breaking:** map: `PlacesModule.applyTextConfig()` is `applyLabelConfig()`, as on `GeometriesModule`: `places.applyTextConfig({ color })` → `places.applyLabelConfig({ color })`
168
+ - **Breaking:** map: `RoutingModuleConfig.chargingStops.text` is `chargingStops.label`: `{ chargingStops: { text: { title } } }` → `{ chargingStops: { label: { title } } }`; `ChargingStopTextConfig` is `ChargingStopLabelConfig`, and the routing knob `chargingStops.text.visible` is `chargingStops.label.visible`
169
+
170
+ - [#2338](https://github.com/tomtom-internal/maps-sdk-js/pull/2338) [`9095b5d`](https://github.com/tomtom-internal/maps-sdk-js/commit/9095b5d952788eed8f0c2610a300fafc90b12bba) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: a `PlacesModule` theme is a marker type (`markerType`, `applyMarkerType`), and `PlacesModuleConfig.color` sets the place colours at once.
171
+
172
+ - **Breaking:** map: `PlacesModuleConfig.theme` is `markerType`, with the same values: `{ theme: 'base-map' }` → `{ markerType: 'base-map' }`
173
+ - **Breaking:** map: `PlacesModule.applyTheme()` is `applyMarkerType()`: `places.applyTheme('pin')` → `places.applyMarkerType('pin')`
174
+ - **Breaking:** map: `PlacesTheme` is `PlacesMarkerType`, and `placesThemes` is `placesMarkerTypes`
175
+ - map: `PlacesModuleConfig.color` sets the default pin fill, the label of a hovered or clicked place, connection lines and entry points at once. A more specific setting still wins, and once `color` is set an accent change leaves the places as they are
176
+ - map: `PlaceLabelConfig` extends the shared `LabelConfig` and gains `opacity`, drawn as the labels' `text-opacity`
177
+ - map: a `label.size` or `label.haloWidth` of `0` on `PlacesModule` reaches its labels instead of being ignored
178
+ - map: a `PlacesModule` `layers.*.layout` override of `text-size`, `text-font` or `text-field` wins over `label`, as its paint overrides already did
179
+
180
+ - [#2248](https://github.com/tomtom-internal/maps-sdk-js/pull/2248) [`266202b`](https://github.com/tomtom-internal/maps-sdk-js/commit/266202bba8b3bf2db74b7c17e53d50654284e475) Thanks [@carlosprietofernandez-tomtom](https://github.com/carlosprietofernandez-tomtom)! - **Breaking:** services: `getPOICategories` ranks `filters` matches and keeps each filter's best ones, so `'bar'` returns Bar.
181
+
182
+ - **Breaking:** services: `getPOICategories`, and `getPOICategoryCodes` with it, ranks `filters` matches and keeps each filter's strongest ones, instead of every category whose name or synonym contains it: `'bar'` returns Bar instead of 15 categories including Nail Salon ("Nail Bar") and Toll Gate ("Toll Bar"), and a category code returns that category only
183
+ - services: `getPOICategories` merges several `filters` round-robin, so each filter's best match comes first
184
+ - services: `getPOICategories` `filters` fold accents, so `'cafe'` finds Café, and a blank filter matches nothing instead of every category
185
+
186
+ - [#2415](https://github.com/tomtom-internal/maps-sdk-js/pull/2415) [`fe74bd7`](https://github.com/tomtom-internal/maps-sdk-js/commit/fe74bd759a234894cb9c5c1fafb291a6b6777085) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `RoutingModule.getConfig()` returns the configuration as given, and a module without `displayUnits` follows the global units.
187
+
188
+ - **Breaking:** map: `RoutingModule.getConfig()` returns the configuration as given: without the global `displayUnits` filled in when none were set, and `undefined` after `RoutingModule.create(map)` or `resetConfig()`. Read `TomTomConfig.instance.get().displayUnits` for the units in force when the module config has none
189
+ - map: a `RoutingModule` without `displayUnits` labels its summaries, waypoints and speed limit signs in the global units in force when it draws them, so a later `TomTomConfig.instance.put({ displayUnits })` reaches routes already shown on their next `showRoutes` or configuration change, where the units set at creation used to stay, `updateConfig` included
190
+
191
+ - [#2366](https://github.com/tomtom-internal/maps-sdk-js/pull/2366) [`babe49f`](https://github.com/tomtom-internal/maps-sdk-js/commit/babe49f43aef09d682e078f8cfa1219617e1b8df) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `routingKnobCatalogue` lists the `RoutingModule` display settings, and `StylingKnob` types each knob kind strictly.
192
+
193
+ - **Breaking:** map: `StylingKnob` has one member per `kind`: a `factor` or `number` knob always carries its `range`, an `enum` knob its `options`, and no other kind either, so an entry built with a `range` on a `toggle` or `options` on a `color` knob no longer type-checks
194
+ - **Breaking:** map: `KnobKind` gains `image`, a sprite image id, so an exhaustive `switch` over `KnobKind` needs a case for it
195
+ - map: `routingKnobCatalogue` lists every plain-valued `RoutingModuleConfig` display setting, route-wide and per section type, with its kind, range or options and, where one value holds everywhere, its default; `routingKnobIds` lists the ids. `RoutingKnob` is one entry, `RoutingKnobId` a setting's path in the config, and `RoutingKnobValueOf` the value it takes
196
+ - map: `KnobEntry` is the entry shape every catalogue shares, one member per kind, and `KnobValueOf` the value a knob of each kind holds
197
+ - map: `SectionIconPlacement` names the placements `SectionIconConfig.placement` takes
198
+
199
+ - [#2356](https://github.com/tomtom-internal/maps-sdk-js/pull/2356) [`784ac2a`](https://github.com/tomtom-internal/maps-sdk-js/commit/784ac2a4c084ef7e24a85c7118bf4a905dfe201f) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `SectionIconConfig.sizeFactor` multiplies the size the section type draws its icon at, rather than setting it: `1` leaves it unchanged, and `ferry`, `tollRoad`, `tunnel` and `vehicleRestricted` keep their zoom ramp under any factor. A `size: 0.8` on `ferry` was a fixed `icon-size` of 0.8; `sizeFactor: 0.8` draws that size from zoom 16.5 and scales down below it
200
+
201
+ ### Patch Changes
202
+
203
+ - [#2375](https://github.com/tomtom-internal/maps-sdk-js/pull/2375) [`40b9332`](https://github.com/tomtom-internal/maps-sdk-js/commit/40b93323148c11a07ec9880f7ca657c2b53f02ae) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `baseMapKnobCatalogue` and `poisKnobCatalogue` list the base map and POI settings a knob holds.
204
+
205
+ - map: `baseMapKnobCatalogue` lists every `BaseMapModuleConfig` setting, `visible` and one `groups.<group>.visible` toggle per layer group, with its description; `baseMapKnobIds` lists the ids. `BaseMapKnob` is one entry, `BaseMapKnobId` a setting's path in the config, and `BaseMapKnobValueOf` the value it takes
206
+ - map: `poisKnobCatalogue` lists the `POIsModuleConfig` settings a knob holds, `visible` with its default; `poisKnobIds` lists the ids. `POIsKnob` is one entry, `POIsKnobId` a setting's path in the config, and `POIsKnobValueOf` the value it takes
207
+ - map: the `basemap.<group>` entries of `stylingKnobCatalogue` say what their group holds, in the words of the matching `baseMapKnobCatalogue` entry, and name its id
208
+
209
+ - [#2330](https://github.com/tomtom-internal/maps-sdk-js/pull/2330) [`2c1178c`](https://github.com/tomtom-internal/maps-sdk-js/commit/2c1178ca3d23f74eab3431b4a722e7312a94ef52) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: places, routes and the traffic incident overlay follow the styling knob colours live.
210
+
211
+ - map: `TrafficIncidentOverlayModule` follows the `traffic.incidents.*Color` styling knobs live, set before or after it was created and across `setStyle`
212
+ - map: `PlacesModule` with the `base-map`, `circle-icon` or `pin-clustered` marker type follows the POI label colour, outline and size knobs live; the caller's `label` and `layers` settings still win
213
+ - map: `RoutingModule` draws a route's traffic sections in the `traffic.incidents.minorColor`, `moderateColor` and `majorColor` knob colours when they are set, live; a `layers.sections` override still wins, and with none set the colours are unchanged
214
+ - map: `TrafficIncidentOverlayModule` draws minor jams in the style's own colour instead of the light styles' on every style, the dark ones included
215
+
216
+ - [#2399](https://github.com/tomtom-internal/maps-sdk-js/pull/2399) [`2044b41`](https://github.com/tomtom-internal/maps-sdk-js/commit/2044b41e6e0b0b2c0a6e6bf75c39cae496696b1a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `customGeoJSONKnobCatalogue` lists the `CustomGeoJSONModuleConfig` settings a knob holds, `visible` with its default; the sources' MapLibre layers and cluster options and the images stay the caller's. `customGeoJSONKnobIds` lists the ids. `CustomGeoJSONKnob` is one entry, `CustomGeoJSONKnobId` a setting's path in the config, and `CustomGeoJSONKnobValueOf` the value it takes
217
+
218
+ - [#2253](https://github.com/tomtom-internal/maps-sdk-js/pull/2253) [`52325b7`](https://github.com/tomtom-internal/maps-sdk-js/commit/52325b755317a25d0d1edf6fb1d3a751fc59fcdc) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `TomTomMap` loads nothing from unpkg.com: neither the MapLibre stylesheet nor the RTL text plugin.
219
+
220
+ - map: `TomTomMap` no longer fetches the MapLibre stylesheet from unpkg.com, which sent every end user's IP address to a third party and fired even when the app had imported `maplibre-gl.css` itself; when the page lacks the MapLibre CSS, the SDK applies a copy shipped with it as a lazy chunk — served alongside the SDK, not blocked by a strict CSP `style-src`, and in a cascade layer so the app's own CSS still wins
221
+ - map: `TomTomMap` no longer loads the Mapbox RTL text plugin from unpkg.com either; MapLibre shapes Arabic and bidirectional text itself, so right-to-left labels render as before
222
+
223
+ - [#2379](https://github.com/tomtom-internal/maps-sdk-js/pull/2379) [`85e9d1d`](https://github.com/tomtom-internal/maps-sdk-js/commit/85e9d1dfff95207fe42303d931a61941c45ba0b5) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `GeometriesModule` config changes restyle the geometries already shown.
224
+
225
+ - map: `GeometriesModule.applyConfig`, `updateConfig`, `resetConfig` and `applyLabelConfig` restyle the geometries already shown — colours, palette, fill style, labels and `transformFeaturesForDisplay` — instead of only the ones a later `show()` draws; a shown geometry keeps its id and event state
226
+ - map: `GeometriesModule.applyConfig` replaces the paint of the previous config, so a config that leaves out the colour, fill, border or label, and `resetConfig()`, return them to the defaults; call `updateConfig` to change one part
227
+ - map: a `GeometriesModule` `label.text` given as a MapLibre expression no longer becomes each geometry's `title`, which the line labels and an expression reading `['get', 'title']` drew as the expression itself; a geometry keeps its own title or address, and a literal `label.text` still sets it
228
+ - map: a config change or a style change after `GeometriesModule.clear()` keeps the map clear, and a style change no longer emits `shown-features`, as on the other modules
229
+
230
+ - [#2391](https://github.com/tomtom-internal/maps-sdk-js/pull/2391) [`2293010`](https://github.com/tomtom-internal/maps-sdk-js/commit/2293010f3e0dce4ad1b3fbe960368214a3ca64b3) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `geometriesKnobCatalogue` lists every plain-valued `GeometriesModuleConfig` display setting — colour, fill, border, center and border labels with their fonts, and the border labels' offset — with its kind, range or options and, where one value holds everywhere, its default; `geometriesKnobIds` lists the ids. `GeometriesKnob` is one entry, `GeometriesKnobId` a setting's path in the config, and `GeometriesKnobValueOf` the value it takes
231
+
232
+ - [#2402](https://github.com/tomtom-internal/maps-sdk-js/pull/2402) [`3944ea8`](https://github.com/tomtom-internal/maps-sdk-js/commit/3944ea8d4c46d69facaa59837cb9ce99460a9b67) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - core: `TimeDisplayUnits.hours` documents its real default, `hr`, which `formatDuration` uses when none is set
233
+
234
+ - [#2412](https://github.com/tomtom-internal/maps-sdk-js/pull/2412) [`473c613`](https://github.com/tomtom-internal/maps-sdk-js/commit/473c613346c6014f1be6499893472d97ec38c976) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `TrafficIncidentOverlayModule.applyConfig` and `updateConfig` apply `focus` to the incidents already shown, instead of only after a style switch: the outline colour and width factor repaint in place, so the `focus.outlineColor` and `focus.widthFactor` knobs of `trafficIncidentOverlayKnobCatalogue` take effect when set, and `focus: false` removes the outline, which a later focus style adds back beneath the incidents
235
+
236
+ - [#2389](https://github.com/tomtom-internal/maps-sdk-js/pull/2389) [`04ee5de`](https://github.com/tomtom-internal/maps-sdk-js/commit/04ee5de36942abebd8d59f111925dc83d3056340) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `discoverPlaces` and the new `resolvePOICategories` take POI categories in words.
237
+
238
+ - discoverPlaces: `filters.poiCategoryQuery` takes categories in words — `'sushi'`, `['gym', 'parking']` — and searches the POI categories they name, resolved in the call's language, so category words reach results in one call instead of a lookup and a search; a word nothing matches is left out, and when none matches the call rejects with `SDKError`
239
+ - `resolvePOICategories` turns words or codes into the `poiCategories` of one search — each word's best three codes, merged round-robin and capped at the 10 a search accepts — and returns the words nothing matched in `unmatched`, for a caller who decides about them before searching; codes alone skip the catalog request
240
+
241
+ - [#2384](https://github.com/tomtom-internal/maps-sdk-js/pull/2384) [`bfe160b`](https://github.com/tomtom-internal/maps-sdk-js/commit/bfe160b1767f892ad2a82fe218a0e9599964eb84) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `preparePlacesForDisplay`, what `PlacesModule.show()` does to the places it is given, is documented along with `toPlaces` and `buildPlaceTitle`, and takes `(places, config)`. The places guide shows your own GeoJSON points drawn through `show()`. `ShownPlaces` names the three places results that are not places — search suggestions, `geometryData` polygons, EV availability — and what shows each instead
242
+
243
+ - [#2376](https://github.com/tomtom-internal/maps-sdk-js/pull/2376) [`6fcdacc`](https://github.com/tomtom-internal/maps-sdk-js/commit/6fcdacc97e87aede4f227f052d139f93a9fed026) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `getPlacesWithEVAvailability` takes `maxConcurrentRequests`, and its result type allows places without availability.
244
+
245
+ - services: `getPlacesWithEVAvailability` takes `maxConcurrentRequests` (default 1, one request at a time as before) to send that many availability requests at once; the places keep their input order. `PlacesWithEVAvailabilityOptions` names its options
246
+ - services: `getPlacesWithEVAvailability(places)` without options is typed as places that may lack availability, as it returns them; only `excludeIfAvailabilityUnknown: true` types every place as having it
247
+ - services: the `discoverPlaces` docs name all three searches it runs, along-route search when `route` is given included
248
+
249
+ - [#2380](https://github.com/tomtom-internal/maps-sdk-js/pull/2380) [`cd981a0`](https://github.com/tomtom-internal/maps-sdk-js/commit/cd981a0b508b712b95a068b0959d3904c0c80503) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `placesKnobCatalogue` lists every plain-valued `PlacesModuleConfig` display setting — marker type, colour, visibility, default pin style, label, cluster badge and source, EV availability and entry points — with its kind, range or options and, where one value holds everywhere, its default; `placesKnobIds` lists the ids. `PlacesKnob` is one entry, `PlacesKnobId` a setting's path in the config, and `PlacesKnobValueOf` the plain value it takes
250
+
251
+ - [#2390](https://github.com/tomtom-internal/maps-sdk-js/pull/2390) [`712dbb0`](https://github.com/tomtom-internal/maps-sdk-js/commit/712dbb0bae2c7e2f57aa18e403bdd7b50820b67c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `PlaceLabelConfig` says to set place labels through the module config rather than with MapLibre's `setPaintProperty` or `setLayoutProperty` on its layers, which a style change or a marker type change rebuilds from the config
252
+
253
+ - [#2387](https://github.com/tomtom-internal/maps-sdk-js/pull/2387) [`2d22b56`](https://github.com/tomtom-internal/maps-sdk-js/commit/2d22b56c143d991be6d7cdfa12102a959fcdd92a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `PlacesModule` documents what a place keeps across `show()`, `clear()` and style changes — `show()` replaces and drops the event states and connections of what it replaces, even under the same id, while style and configuration changes keep both — and `getShown()` states that it returns the places as drawn, with their display properties and event states
254
+
255
+ - [#2410](https://github.com/tomtom-internal/maps-sdk-js/pull/2410) [`8ee1161`](https://github.com/tomtom-internal/maps-sdk-js/commit/8ee11613905ff75aafbb0a204cd7ec58c4ecec8f) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `PlacesModule.create<P>`, `applyLabelConfig<P>`, `applyIconConfig<P>` and `preparePlacesForDisplay<P>` type the `label.title` and `icon.mapping.fn` callbacks for the place shape `P` you name, as `extraFeatureProps` already was, so a callback reading a property of your own data no longer needs a cast
256
+
257
+ - [#2350](https://github.com/tomtom-internal/maps-sdk-js/pull/2350) [`d987e8f`](https://github.com/tomtom-internal/maps-sdk-js/commit/d987e8fc4bfab020ae1019b987e55db368a480e9) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `calculateReachableRange` and `calculateReachableRanges` return polygons whose ring ends on its first position, as GeoJSON requires; the API's boundary leaves it open, which spatial libraries such as Turf reject
258
+
259
+ - [#2352](https://github.com/tomtom-internal/maps-sdk-js/pull/2352) [`1882c43`](https://github.com/tomtom-internal/maps-sdk-js/commit/1882c433fee8d2756013291a7e3e35f05424adf3) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `calculateReachableRanges` rejects on a `401` like it does on a `403` or a `429`, instead of skipping the range as one the engine could not compute and returning no polygons
260
+
261
+ - [#2372](https://github.com/tomtom-internal/maps-sdk-js/pull/2372) [`3288c6c`](https://github.com/tomtom-internal/maps-sdk-js/commit/3288c6c43d74d5a3cb6f686a1f6f0b9c0c076eb1) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - `calculateReachableRanges` says in its TSDoc that a range the service answers with an error, such as `NO_RANGE_FOUND` for an origin off the road network, is skipped rather than thrown, so the result can hold fewer polygons than requested.
262
+
263
+ - [#2357](https://github.com/tomtom-internal/maps-sdk-js/pull/2357) [`184d4f4`](https://github.com/tomtom-internal/maps-sdk-js/commit/184d4f4f9c5dd5c31c3ad155223495a19d2e38c0) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: the route's instruction arrows scale with `widthFactor`, instead of keeping one size as the line around them grows or shrinks. The `width` presets draw them as before
264
+
265
+ - [#2358](https://github.com/tomtom-internal/maps-sdk-js/pull/2358) [`6836e99`](https://github.com/tomtom-internal/maps-sdk-js/commit/6836e9910edacc4a7b9d57cb40477f6803793dcd) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: the stop number inside a waypoint pin scales with the pin, so it stays in the pin's head at every `waypointSize` and `waypointSizeFactor`; the `'s'` and `'l'` presets draw it at 0.75× and 1.25×
266
+
267
+ - [#2382](https://github.com/tomtom-internal/maps-sdk-js/pull/2382) [`5e5708b`](https://github.com/tomtom-internal/maps-sdk-js/commit/5e5708bf7160077cbea1b4e36aa49a1bdfb4d024) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `PlacesModuleSerializableConfig`, `RoutingModuleSerializableConfig`, `GeometriesModuleSerializableConfig` and `CustomGeoJSONModuleSerializableConfig` type the part of each module's configuration that survives JSON, leaving out the functions and image elements those modules also take; `SerializableCustomImage` is a `CustomImage` with a string `image`. Every module's configuration, exported with `JSON.stringify(module.getConfig())` and given back to `applyConfig`, holds the same configuration and draws the same layers, and the map modules guide shows how to save and replay one
268
+
269
+ - [#2399](https://github.com/tomtom-internal/maps-sdk-js/pull/2399) [`2044b41`](https://github.com/tomtom-internal/maps-sdk-js/commit/2044b41e6e0b0b2c0a6e6bf75c39cae496696b1a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `terrainKnobCatalogue` lists every `TerrainModuleConfig` setting — the hillshade, the 3D surface and its exaggeration — with its kind, the exaggeration's `hard-min` range (at least 0.5; above 3 still applies) and, where one value holds everywhere, its default; `terrainKnobIds` lists the ids. `TerrainKnob` is one entry, `TerrainKnobId` a setting's path in the config, and `TerrainKnobValueOf` the value it takes
270
+
271
+ - [#2383](https://github.com/tomtom-internal/maps-sdk-js/pull/2383) [`43b1a71`](https://github.com/tomtom-internal/maps-sdk-js/commit/43b1a717a07857925d37239d886a5fa01b961a0c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `trafficFlowKnobCatalogue`, `trafficIncidentsKnobCatalogue`, `trafficIncidentOverlayKnobCatalogue` and `trafficAreaAnalyticsKnobCatalogue` list each traffic module's plain-valued settings with their kind, range or options and, where one value holds everywhere, their default; the matching `…KnobIds` arrays list the ids. `TrafficFlowKnob`, `TrafficIncidentsKnob`, `TrafficIncidentOverlayKnob` and `TrafficAreaAnalyticsKnob` are one entry each, their `…KnobId` a setting's path in the module config, and their `…KnobValueOf` the value it takes
272
+
273
+ - [#2414](https://github.com/tomtom-internal/maps-sdk-js/pull/2414) [`7cfe598`](https://github.com/tomtom-internal/maps-sdk-js/commit/7cfe598e8b7e1096a13399d1a086b11f06116b72) Thanks [@JulianChinAFoeng-TomTom](https://github.com/JulianChinAFoeng-TomTom)! - security: a new guide, What the SDK sends, and where, lists what the browser sends to TomTom and to third parties, which values travel in URLs and so land in logs, and whose session cookie proxy mode carries, for a privacy notice or records of processing
274
+
3
275
  ## 0.60.0
4
276
 
5
277
  ### Minor Changes
6
278
 
7
- - 5c97b52: Breaking changes:
8
- - map: `GeometriesModule`'s `fill.beforeLayerConfig` and `line.beforeLayerConfig` are removed; use `beforeLayerConfig: { fill, line }` on the module config, `all` covering any part it doesn't name
9
- - map: `GeometryBeforeLayerTargets` is removed; the record form of `GeometryBeforeLayerConfig` is `PartsBeforeLayerConfig<'fill' | 'line'>`'s
10
- - map: `TrafficAreaAnalyticsModule`'s nested `beforeLayerConfig` shape is removed; key it by display mode instead: `hexgrid.flat2D` → `'hexgrid-2d'`, `hexgrid.extrusion3D` → `'hexgrid-3d'`, likewise for `square`, plus `all` for the rest
11
- - map: `GeometriesModule.applyConfig` puts a part the applied config's `beforeLayerConfig` names no target for back at its default place, as a style change does — every part, when the applied config has no `beforeLayerConfig`. `moveBeforeLayer` still leaves such a part where it is
12
- - map: `RoutingModule.getLayerToRenderLinesUnder()` returns `string | undefined`, following `beforeLayerConfig` and undefined when the route lines are on top; unconfigured, it still returns `mapStyleLayerIDs.lowestLabel`
279
+ - [#2337](https://github.com/tomtom-internal/maps-sdk-js/pull/2337) [`5c97b52`](https://github.com/tomtom-internal/maps-sdk-js/commit/5c97b529ba05bb8b42dc5ca66da56a1b239107ec) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
13
280
 
14
- Features:
281
+ - **Breaking:** map: `GeometriesModule`'s `fill.beforeLayerConfig` and `line.beforeLayerConfig` are removed; use `beforeLayerConfig: { fill, line }` on the module config, `all` covering any part it doesn't name
282
+ - **Breaking:** map: `GeometryBeforeLayerTargets` is removed; the record form of `GeometryBeforeLayerConfig` is `PartsBeforeLayerConfig<'fill' | 'line'>`'s
283
+ - **Breaking:** map: `TrafficAreaAnalyticsModule`'s nested `beforeLayerConfig` shape is removed; key it by display mode instead: `hexgrid.flat2D` → `'hexgrid-2d'`, `hexgrid.extrusion3D` → `'hexgrid-3d'`, likewise for `square`, plus `all` for the rest
284
+ - **Breaking:** map: `GeometriesModule.applyConfig` puts a part the applied config's `beforeLayerConfig` names no target for back at its default place, as a style change does — every part, when the applied config has no `beforeLayerConfig`. `moveBeforeLayer` still leaves such a part where it is
285
+ - **Breaking:** map: `RoutingModule.getLayerToRenderLinesUnder()` returns `string | undefined`, following `beforeLayerConfig` and undefined when the route lines are on top; unconfigured, it still returns `mapStyleLayerIDs.lowestLabel`
15
286
  - map: `RoutingModule` takes a `beforeLayerConfig`: one target for the whole route, or one per part — `mainLines`, `instructionLines`, `icons` — plus `all`. `applyConfig` and `updateConfig` restack the layers, and a style change keeps them there. Unconfigured, the layer order is unchanged
16
287
  - map: `PartsBeforeLayerConfig` is the one shape every module's `beforeLayerConfig` takes: a single `BeforeLayerConfig`, or a record of the module's own part names plus `all`. `GeometryBeforeLayerConfig`, `AreaAnalyticsBeforeLayerConfig` and `RoutingBeforeLayerConfig` are built on it
17
288
  - map: `TrafficAreaAnalyticsModule.moveBeforeLayer` emits `config-change`, as `GeometriesModule` and `TrafficIncidentOverlayModule` do
18
- - a117660: Breaking changes:
19
- - map: `RoutingModuleConfig.theme` and the `RouteTheme` type are removed. `theme.mainColor` → `color`, `theme.routeWidth` → `width`, `theme.waypointSize` → `waypointSize`, all top-level: `{ theme: { mainColor: '#f00', routeWidth: 'l' } }` becomes `{ color: '#f00', width: 'l' }` (#2336)
20
- - map: `SectionIconConfig.size` → `sizeFactor`, now clamped to `SECTION_ICON_SIZE_FACTOR_RANGE` (0.25–2) (#2336)
289
+
290
+ - [#2336](https://github.com/tomtom-internal/maps-sdk-js/pull/2336) [`a117660`](https://github.com/tomtom-internal/maps-sdk-js/commit/a11766044b72a7a8128e882fc58b55f151e7db7c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
21
291
 
22
- Features:
23
- - map: `RoutingModuleConfig.widthFactor` and `waypointSizeFactor` multiply the `width` and `waypointSize` presets, and a section's `widthFactor` its own `width`; clamped to the published `ROUTE_WIDTH_FACTOR_RANGE` and `ROUTE_WAYPOINT_SIZE_FACTOR_RANGE` (0.5–2). The presets draw the sizes they did (#2336)
292
+ - **Breaking:** map: `RoutingModuleConfig.theme` and the `RouteTheme` type are removed. `theme.mainColor` → `color`, `theme.routeWidth` → `width`, `theme.waypointSize` → `waypointSize`, all top-level: `{ theme: { mainColor: '#f00', routeWidth: 'l' } }` becomes `{ color: '#f00', width: 'l' }`
293
+ - **Breaking:** map: `SectionIconConfig.size` → `sizeFactor`, now clamped to `SECTION_ICON_SIZE_FACTOR_RANGE` (0.25–2)
294
+ - map: `RoutingModuleConfig.widthFactor` and `waypointSizeFactor` multiply the `width` and `waypointSize` presets, and a section's `widthFactor` its own `width`; clamped to the published `ROUTE_WIDTH_FACTOR_RANGE` and `ROUTE_WAYPOINT_SIZE_FACTOR_RANGE` (0.5–2). The presets draw the sizes they did
24
295
 
25
296
  ### Patch Changes
26
297
 
27
- - d2e714a: Documentation:
28
- - services: the `ChargingModel.batteryCurve` reference says a route with charging stops needs it; the service rejects such a request without one
298
+ - [#2354](https://github.com/tomtom-internal/maps-sdk-js/pull/2354) [`d2e714a`](https://github.com/tomtom-internal/maps-sdk-js/commit/d2e714ac51e1977be7c2fbe10cbcad6559db38e0) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: the `ChargingModel.batteryCurve` reference says a route with charging stops needs it; the service rejects such a request without one
29
299
 
30
300
  ## 0.59.0
31
301
 
32
302
  ### Minor Changes
33
303
 
34
- - 4279e2a: Breaking changes:
35
- - map: `TrafficAreaAnalyticsModule.applyConfig` replaces the configuration instead of merging into it: what it leaves out, including each metric its `metricConfig` leaves out and each layer its `beforeLayerConfig` leaves out, goes back to the default. Merge with `updateConfig`, and change one metric with `setColor`, `setHeight` or `filter` given that metric (`setColor('heat', ['speed'])`) (#2312)
36
- - d2c304e: Breaking changes:
37
- - map: `BaseMapModuleConfig.layerGroupsVisibility` and the `BaseMapLayerGroupsVisibility` type are removed; use `groups`, which keeps a visibility per layer group:
304
+ - [#2312](https://github.com/tomtom-internal/maps-sdk-js/pull/2312) [`4279e2a`](https://github.com/tomtom-internal/maps-sdk-js/commit/4279e2a7b5d6a9a1971dc46f9ece23eda52793ba) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `TrafficAreaAnalyticsModule.applyConfig` replaces the configuration instead of merging into it: what it leaves out, including each metric its `metricConfig` leaves out and each layer its `beforeLayerConfig` leaves out, goes back to the default. Merge with `updateConfig`, and change one metric with `setColor`, `setHeight` or `filter` given that metric (`setColor('heat', ['speed'])`)
305
+
306
+ - [#2335](https://github.com/tomtom-internal/maps-sdk-js/pull/2335) [`d2c304e`](https://github.com/tomtom-internal/maps-sdk-js/commit/d2c304e124ba0607c4387f85bb5fdc4b1ffa65c4) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
307
+
308
+ - **Breaking:** map: `BaseMapModuleConfig.layerGroupsVisibility` and the `BaseMapLayerGroupsVisibility` type are removed; use `groups`, which keeps a visibility per layer group:
38
309
  - `layerGroupsVisibility: { mode: 'include', names: ['water', 'ferries'], visible: false }` becomes `groups: { water: { visible: false }, ferries: { visible: false } }`
39
310
  - `layerGroupsVisibility: { mode: 'exclude', names: ['land', 'roads'], visible: false }` becomes `visible: false, groups: { land: {}, roads: {} }` — an entry without `visible` draws its group as the style ships it
40
- - map: `BaseMapModule.getConfig()` and its `config-change` event carry `groups`, one entry per group `setVisible` has set
41
- - map: `BaseMapModule.applyConfig` replaces the configuration instead of merging into it: groups the new configuration leaves out go back to how the style ships them. Merge with `updateConfig`
42
- - map: `BaseMapModule.resetConfig` puts every base-map layer back to how the style ships it, instead of leaving hidden groups hidden, or showing every layer, those the style ships hidden included, when the whole base map was hidden
43
- - map: the `basemap.roadShields` styling knob is removed; use `roads.shields`, which now toggles the whole `roadShields` group
44
-
45
- Features:
311
+ - **Breaking:** map: `BaseMapModule.getConfig()` and its `config-change` event carry `groups`, one entry per group `setVisible` has set
312
+ - **Breaking:** map: `BaseMapModule.applyConfig` replaces the configuration instead of merging into it: groups the new configuration leaves out go back to how the style ships them. Merge with `updateConfig`
313
+ - **Breaking:** map: `BaseMapModule.resetConfig` puts every base-map layer back to how the style ships it, instead of leaving hidden groups hidden, or showing every layer, those the style ships hidden included, when the whole base map was hidden
314
+ - **Breaking:** map: the `basemap.roadShields` styling knob is removed; use `roads.shields`, which now toggles the whole `roadShields` group
46
315
  - map: `BaseMapModuleConfig.groups` keeps a visibility per base-map layer group, applied in order over `visible`; an entry without `visible` draws its group as the style ships it
47
-
48
- Fixes:
49
316
  - map: a style change restores every `BaseMapModule.setVisible` group call, not only the last one
50
317
  - map: `BaseMapModule.setVisible` over a group removes the `basemap.<group>`, `buildings.*` or `roads.shields` knob for it from `StylingModule`, so the later call still wins after a style change
51
318
  - map: `pois.microMarkers`, `roads.arrows`, `roads.restricted`, `roads.underConstruction` and `roads.exitNumbers` only hide within what `POIsModule` and `BaseMapModule` show: `true` no longer shows layers their module hid, `POIsModule.setVisible(true)` or `BaseMapModule.setVisible(true)` keeps a knob's `false`, and resetting the knob leaves the layers as the module has them
52
- - 220d76c: Breaking changes:
53
- - map: `IncidentFocusStyle.widthScale` is `widthFactor`, clamped to the new `INCIDENT_FOCUS_WIDTH_FACTOR_RANGE` (`1`–`1.8`, default `1.6`); migrate `focus: { widthScale }` to `focus: { widthFactor }`
54
- - 3c4cd39: Breaking changes:
55
- - map: `TrafficIncidentsModule` has one set of filters for the incident lines and their icons. `TrafficIncidentsModuleConfig.icons` is the new `IncidentIconsConfig`, `{ visible? }` only, and `filter()` takes a single argument; `IncidentsCommonConfig` is removed. Migrate by moving what `icons.filters` or `filter()`'s second argument held into the root `filters`
319
+
320
+ - [#2317](https://github.com/tomtom-internal/maps-sdk-js/pull/2317) [`220d76c`](https://github.com/tomtom-internal/maps-sdk-js/commit/220d76c56634fdfd1f42803fa0f67b7d36da3664) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `IncidentFocusStyle.widthScale` is `widthFactor`, clamped to the new `INCIDENT_FOCUS_WIDTH_FACTOR_RANGE` (`1`–`1.8`, default `1.6`); migrate `focus: { widthScale }` to `focus: { widthFactor }`
321
+
322
+ - [#2313](https://github.com/tomtom-internal/maps-sdk-js/pull/2313) [`3c4cd39`](https://github.com/tomtom-internal/maps-sdk-js/commit/3c4cd395ace39d4730a1af0b047c2d4af0c79933) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
56
323
 
57
- Documentation:
324
+ - **Breaking:** map: `TrafficIncidentsModule` has one set of filters for the incident lines and their icons. `TrafficIncidentsModuleConfig.icons` is the new `IncidentIconsConfig`, `{ visible? }` only, and `filter()` takes a single argument; `IncidentsCommonConfig` is removed. Migrate by moving what `icons.filters` or `filter()`'s second argument held into the root `filters`
58
325
  - map: the style parts the SDK adds — traffic flow, traffic incidents and the hillshade — are hidden until you show them, stated in the traffic flow, traffic incidents and terrain guides
59
- - 70fc511: Breaking changes:
60
- - map: `isVisible()` on `TrafficIncidentOverlayModule` and `TrafficAreaAnalyticsModule` reports the module's `visible` setting — `true` unless hidden with `setVisible(false)` or `visible: false` — whatever is shown. A module showing nothing returns `true`. To know whether data is drawn, read `getShown()`: `overlay.getShown().incidents.features.length > 0`, or the `heatmap`/`hexgrid`/`square` collections of `TrafficAreaAnalyticsModule.getShown()` (#2316)
326
+
327
+ - [#2316](https://github.com/tomtom-internal/maps-sdk-js/pull/2316) [`70fc511`](https://github.com/tomtom-internal/maps-sdk-js/commit/70fc511e288c47c09d509c497f5116e6d2f75744) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
328
+
329
+ - **Breaking:** map: `isVisible()` on `TrafficIncidentOverlayModule` and `TrafficAreaAnalyticsModule` reports the module's `visible` setting — `true` unless hidden with `setVisible(false)` or `visible: false` — whatever is shown. A module showing nothing returns `true`. To know whether data is drawn, read `getShown()`: `overlay.getShown().incidents.features.length > 0`, or the `heatmap`/`hexgrid`/`square` collections of `TrafficAreaAnalyticsModule.getShown()`
330
+ - map: `TrafficIncidentOverlayModule.show()` keeps the incidents hidden while the module is set to `visible: false`
331
+ - map: a style change restores a hidden `TrafficAreaAnalyticsModule` without emitting `config-change`
332
+
333
+ - [#2345](https://github.com/tomtom-internal/maps-sdk-js/pull/2345) [`c5660b8`](https://github.com/tomtom-internal/maps-sdk-js/commit/c5660b8679ad652fc068277bc977cfda59226e76) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
61
334
 
62
- Fixes:
63
- - map: `TrafficIncidentOverlayModule.show()` keeps the incidents hidden while the module is set to `visible: false` (#2316)
64
- - map: a style change restores a hidden `TrafficAreaAnalyticsModule` without emitting `config-change` (#2316)
65
- - c5660b8: Breaking changes:
66
- - services: `CommonServiceParams.customServiceBaseURL` is removed; every service builds its endpoint URL from the global `commonBaseURL`
67
- - services: an `apiVersion` passed at runtime, per call or through `TomTomConfig.put`, is ignored; each service calls the API version it pins
68
- - map: `StandardStyle.version` is removed; standard styles always load the Orbis style version the SDK is verified against
69
- - map: the undocumented `DEFAULT_STYLE_VERSION` export is removed
70
- - a52f5f0: Breaking changes:
71
- - map: `GeometriesModuleConfig.theme` is `fillStyle`, `GeometryTheme` is `GeometryFillStyle` and `geometryThemes` is `geometryFillStyles`; the values are unchanged
72
- - map: a feature sets its own fill style with `properties.fillStyle` instead of `properties.theme`
73
- - map: `themedGeometryConfig` is `fillStyledGeometryConfig`
74
- - map: `GeometriesModuleConfig.textConfig: { textField }` is `label: { text }`, `GeometryTextConfig` is `GeometryLabel`, and `GeometriesModule.applyTextConfig` takes `{ text }`
75
- - map: `GeometriesModuleConfig.lineLabelConfig` is `lineLabel` and `GeometryLineLabelConfig` is `GeometryLineLabel`; its `textSize`, `textColor`, `textHaloColor`, `textHaloWidth`, `textOpacity` and `textOffset` are `size`, `color`, `haloColor`, `haloWidth`, `opacity` and `offset`
76
- - map: `GeometryFillConfig.color` takes a colour, a palette name or a MapLibre expression; legacy MapLibre function objects (`{ stops }`) are no longer accepted
335
+ - **Breaking:** services: `CommonServiceParams.customServiceBaseURL` is removed; every service builds its endpoint URL from the global `commonBaseURL`
336
+ - **Breaking:** services: an `apiVersion` passed at runtime, per call or through `TomTomConfig.put`, is ignored; each service calls the API version it pins
337
+ - **Breaking:** map: `StandardStyle.version` is removed; standard styles always load the Orbis style version the SDK is verified against
338
+ - **Breaking:** map: the undocumented `DEFAULT_STYLE_VERSION` export is removed
339
+
340
+ - [#2333](https://github.com/tomtom-internal/maps-sdk-js/pull/2333) [`a52f5f0`](https://github.com/tomtom-internal/maps-sdk-js/commit/a52f5f02acfecdfcc1b05800652f6e16037b0a7a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
77
341
 
78
- Features:
342
+ - **Breaking:** map: `GeometriesModuleConfig.theme` is `fillStyle`, `GeometryTheme` is `GeometryFillStyle` and `geometryThemes` is `geometryFillStyles`; the values are unchanged
343
+ - **Breaking:** map: a feature sets its own fill style with `properties.fillStyle` instead of `properties.theme`
344
+ - **Breaking:** map: `themedGeometryConfig` is `fillStyledGeometryConfig`
345
+ - **Breaking:** map: `GeometriesModuleConfig.textConfig: { textField }` is `label: { text }`, `GeometryTextConfig` is `GeometryLabel`, and `GeometriesModule.applyTextConfig` takes `{ text }`
346
+ - **Breaking:** map: `GeometriesModuleConfig.lineLabelConfig` is `lineLabel` and `GeometryLineLabelConfig` is `GeometryLineLabel`; its `textSize`, `textColor`, `textHaloColor`, `textHaloWidth`, `textOpacity` and `textOffset` are `size`, `color`, `haloColor`, `haloWidth`, `opacity` and `offset`
347
+ - **Breaking:** map: `GeometryFillConfig.color` takes a colour, a palette name or a MapLibre expression; legacy MapLibre function objects (`{ stops }`) are no longer accepted
79
348
  - map: `GeometriesModuleConfig.color` colours a module's fill and border at once; `fill.color`, `line.color` and a feature's own `color` override it, and the map accent applies only while it is unset
80
349
  - map: `LabelConfig` is the label styling every module shares — `size`, `color`, `haloColor`, `haloWidth`, `opacity` and `font`
81
350
  - map: `label` styles the geometry titles with `LabelConfig`, and `lineLabel` gains `font`
82
-
83
- Fixes:
84
351
  - map: a MapLibre expression in `fill.color` renders, on the fill and on a border without its own `line.color`; an accent change no longer redraws a module that sets `fill.color`
85
- - 543319b: Breaking changes:
86
- - core: `ChargingPoint.evseId` is optional — some operators publish none, in search results and in `evChargingStationsAvailability()` alike (#2226)
87
-
88
- Features:
89
- - services: EV charging places from `discoverPlaces()`, `discoverOnePlace()` and `getPlaceDetails()` carry `chargingPark.chargingStations` — each station's charging points (EVSEs) with `capabilities`, `restrictions`, connectors and `evseId`, as the availability service already returns them (#2226)
90
- - services: route charging stops carry `dataSources.chargingAvailability.id`, so `getPlaceWithEVAvailability()` adds their availability as it does for search results (#2226)
91
- - core: `ChargingStation` takes its charging point type as a parameter, and `StaticChargingPoint` describes a charging point without real-time status (#2226)
92
-
93
- Fixes:
94
- - services: `connectorAvailabilities[].connector.chargingSpeed` is set, and a charging point without `capabilities` or `restrictions` gets empty lists (#2226)
95
- - services: `getPlaceWithEVAvailability()` counts `chargingPark.connectors` from the availability when the place has none of its own (#2226)
96
- - c324ff0: Breaking changes:
97
- - services: the options that drop results — `poiCategories`, `poiBrands`, `indexes`, `geographyTypes`, `connectors`, `fuelTypes`, `minPowerKW`, `maxPowerKW` and `countries` — move under one `filters` object: `PlaceFilters` on the places searches, plus `GeographicFilters` (`countries`) on fuzzy search and geocoding. Geometry and along-route search take no `countries`, which they never sent (#2193)
98
- - services: `offset` gives way to an opaque `cursor`: pass a fuzzy search or geocoding response's `properties.nextCursor` back unchanged; a value the SDK did not mint throws. `SearchSummary.offset` becomes `nextCursor`, absent when no further page can be served — including once the next page would start past result 1900, which ends pagination rather than failing validation (#2193)
352
+
353
+ - [#2226](https://github.com/tomtom-internal/maps-sdk-js/pull/2226) [`543319b`](https://github.com/tomtom-internal/maps-sdk-js/commit/543319b321489e3ce6e5ea280e736b253464bd1d) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
99
354
 
100
- Features:
101
- - services: geocoding responses carry the search summary as `properties`, `nextCursor` included (#2193)
102
- - bed0784: Breaking changes:
103
- - services: `getPlaceWithEVAvailability` and `getPlacesWithEVAvailability` reject with `SDKAbortError` when their `signal` is aborted, instead of reporting the cancellation as missing availability data. Every other request failure still resolves to `undefined`, and the sequential run now stops at the cancelled station rather than working through the rest of the list (#2201)
104
- - f0b1ad9: Breaking changes:
105
- - map: `SectionSignConfig.minzoom` and `CountryCrossingConfig.minzoom` are renamed `minZoom`, as every other display config spells its zoom threshold; migrate by renaming the key (#2311)
106
- - f066146: Breaking changes:
107
- - map: `MapColorName` and `mapColorNames` gain `accent`, the colour for what is drawn on top of the map, so a `Record<MapColorName, …>` needs an entry for it (#2101)
355
+ - **Breaking:** core: `ChargingPoint.evseId` is optional — some operators publish none, in search results and in `evChargingStationsAvailability()` alike
356
+ - services: EV charging places from `discoverPlaces()`, `discoverOnePlace()` and `getPlaceDetails()` carry `chargingPark.chargingStations` — each station's charging points (EVSEs) with `capabilities`, `restrictions`, connectors and `evseId`, as the availability service already returns them
357
+ - services: route charging stops carry `dataSources.chargingAvailability.id`, so `getPlaceWithEVAvailability()` adds their availability as it does for search results
358
+ - core: `ChargingStation` takes its charging point type as a parameter, and `StaticChargingPoint` describes a charging point without real-time status
359
+ - services: `connectorAvailabilities[].connector.chargingSpeed` is set, and a charging point without `capabilities` or `restrictions` gets empty lists
360
+ - services: `getPlaceWithEVAvailability()` counts `chargingPark.connectors` from the availability when the place has none of its own
361
+
362
+ - [#2193](https://github.com/tomtom-internal/maps-sdk-js/pull/2193) [`c324ff0`](https://github.com/tomtom-internal/maps-sdk-js/commit/c324ff04afb892a600eda5ca9e6576d380ccc9c7) Thanks [@JulianChinAFoeng-TomTom](https://github.com/JulianChinAFoeng-TomTom)!
108
363
 
109
- Features:
110
- - map: `setMapColors` and the `colors.accent` knob set `accent`, and `map.mapColors` publishes the map colours in effect (#2101)
111
- - map: routes, geometries, place pins, connections and entry points default to the accent and follow it when it changes; a colour the caller set still wins (#2101)
364
+ - **Breaking:** services: the options that drop results — `poiCategories`, `poiBrands`, `indexes`, `geographyTypes`, `connectors`, `fuelTypes`, `minPowerKW`, `maxPowerKW` and `countries` — move under one `filters` object: `PlaceFilters` on the places searches, plus `GeographicFilters` (`countries`) on fuzzy search and geocoding. Geometry and along-route search take no `countries`, which they never sent
365
+ - **Breaking:** services: `offset` gives way to an opaque `cursor`: pass a fuzzy search or geocoding response's `properties.nextCursor` back unchanged; a value the SDK did not mint throws. `SearchSummary.offset` becomes `nextCursor`, absent when no further page can be served — including once the next page would start past result 1900, which ends pagination rather than failing validation
366
+ - services: geocoding responses carry the search summary as `properties`, `nextCursor` included
367
+
368
+ - [#2201](https://github.com/tomtom-internal/maps-sdk-js/pull/2201) [`bed0784`](https://github.com/tomtom-internal/maps-sdk-js/commit/bed07846eb89910a5587caf1a04e0dd7c3fe5607) Thanks [@JulianChinAFoeng-TomTom](https://github.com/JulianChinAFoeng-TomTom)! - **Breaking:** services: `getPlaceWithEVAvailability` and `getPlacesWithEVAvailability` reject with `SDKAbortError` when their `signal` is aborted, instead of reporting the cancellation as missing availability data. Every other request failure still resolves to `undefined`, and the sequential run now stops at the cancelled station rather than working through the rest of the list
369
+
370
+ - [#2311](https://github.com/tomtom-internal/maps-sdk-js/pull/2311) [`f0b1ad9`](https://github.com/tomtom-internal/maps-sdk-js/commit/f0b1ad9f75007b73c584bd5d238a118d1a66440d) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `SectionSignConfig.minzoom` and `CountryCrossingConfig.minzoom` are renamed `minZoom`, as every other display config spells its zoom threshold; migrate by renaming the key
371
+
372
+ - [#2101](https://github.com/tomtom-internal/maps-sdk-js/pull/2101) [`f066146`](https://github.com/tomtom-internal/maps-sdk-js/commit/f066146bed70481f8bb3c705b808bda634b7b905) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
112
373
 
113
- Fixes:
114
- - map: `RoutingModule.getConfig()` returns the configuration as given, without the layers the module built from it (#2101)
115
- - map: a `PlacesModule` default pin `style` repaints the pin when it changes, and an `icon.default.image` is never replaced by it (#2101)
116
- - services: `trafficAreaAnalytics` parses its response when an app transpiles the SDK to ES5, as Sandpack or Babel over `node_modules` does, instead of failing with "undefined is not iterable" (#2101)
117
- - 1fa401b: Breaking changes:
118
- - core: `AreaAnalyticsFeatureProperties.name` is optional: the API echoes a region name only from a request that names one, and the SDK's names none, so `trafficAreaAnalytics` leaves it out instead of setting it to `undefined` (#2334)
374
+ - **Breaking:** map: `MapColorName` and `mapColorNames` gain `accent`, the colour for what is drawn on top of the map, so a `Record<MapColorName, …>` needs an entry for it
375
+ - map: `setMapColors` and the `colors.accent` knob set `accent`, and `map.mapColors` publishes the map colours in effect
376
+ - map: routes, geometries, place pins, connections and entry points default to the accent and follow it when it changes; a colour the caller set still wins
377
+ - map: `RoutingModule.getConfig()` returns the configuration as given, without the layers the module built from it
378
+ - map: a `PlacesModule` default pin `style` repaints the pin when it changes, and an `icon.default.image` is never replaced by it
379
+ - services: `trafficAreaAnalytics` parses its response when an app transpiles the SDK to ES5, as Sandpack or Babel over `node_modules` does, instead of failing with "undefined is not iterable"
380
+
381
+ - [#2334](https://github.com/tomtom-internal/maps-sdk-js/pull/2334) [`1fa401b`](https://github.com/tomtom-internal/maps-sdk-js/commit/1fa401bb7a7ab40061caad66651ee509f96c44be) Thanks [@carlosprietofernandez-tomtom](https://github.com/carlosprietofernandez-tomtom)! - **Breaking:** core: `AreaAnalyticsFeatureProperties.name` is optional: the API echoes a region name only from a request that names one, and the SDK's names none, so `trafficAreaAnalytics` leaves it out instead of setting it to `undefined`
119
382
 
120
383
  ### Patch Changes
121
384
 
122
- - b5a7c5f: Fixes:
123
- - services: the `evChargingStationsAvailability()`, `getPlaceWithEVAvailability()` and `getPlacesWithEVAvailability()` examples compile, and `ChargingParkWithAvailability.availability` names the functions that fetch it (#2327)
124
- - 220d76c: Documentation:
125
- - map: the `hillshade.exaggeration` knob description, `TerrainModuleConfig.elevationExaggeration` and `TerrainModule.setElevationExaggeration` each name the other: the knob sets how strongly slopes are shaded, the terrain setting the vertical scale of the 3D surface
126
- - bc35c5f: Features:
127
- - map: `PlacesModule` takes a `cluster` config under the `pin-clustered` theme: `badge` styles the count badge of single-category and mixed-category clusters together, and `source` sets MapLibre's `clusterRadius`, `clusterMaxZoom`, `clusterMinPoints` and your own `clusterProperties` aggregators. Entry points start above a changed `clusterMaxZoom` (#2203)
385
+ - [#2327](https://github.com/tomtom-internal/maps-sdk-js/pull/2327) [`b5a7c5f`](https://github.com/tomtom-internal/maps-sdk-js/commit/b5a7c5fb5503401cd4ae77b7e788b872661cac01) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: the `evChargingStationsAvailability()`, `getPlaceWithEVAvailability()` and `getPlacesWithEVAvailability()` examples compile, and `ChargingParkWithAvailability.availability` names the functions that fetch it
386
+
387
+ - [#2317](https://github.com/tomtom-internal/maps-sdk-js/pull/2317) [`220d76c`](https://github.com/tomtom-internal/maps-sdk-js/commit/220d76c56634fdfd1f42803fa0f67b7d36da3664) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: the `hillshade.exaggeration` knob description, `TerrainModuleConfig.elevationExaggeration` and `TerrainModule.setElevationExaggeration` each name the other: the knob sets how strongly slopes are shaded, the terrain setting the vertical scale of the 3D surface
388
+
389
+ - [#2203](https://github.com/tomtom-internal/maps-sdk-js/pull/2203) [`bc35c5f`](https://github.com/tomtom-internal/maps-sdk-js/commit/bc35c5f288e1bc900cca64469d2960e762e15b81) Thanks [@JulianChinAFoeng-TomTom](https://github.com/JulianChinAFoeng-TomTom)!
128
390
 
129
- Fixes:
130
- - map: a `PlacesModule` `layers.cluster`, `clusterBadge`, `clusterCount`, `clusterMixedBadge` or `clusterMixedCount` override merges into that layer's `paint` and `layout` key by key, like the other place layers, instead of replacing them whole (#2203)
131
- - daf1d0b: Features:
132
- - map: `PlacesModule` and `GeometriesModule` take a `visible` config field (default `true`) and `setVisible()` / `isVisible()`. Hiding covers every layer the module draws — places, connections and entry points; fills, borders, center labels and border labels — keeps its data, and survives `show()`, `clear()` and style changes. Showing again leaves theme-unused layers and `layout.visibility: 'none'` overrides hidden
391
+ - map: `PlacesModule` takes a `cluster` config under the `pin-clustered` theme: `badge` styles the count badge of single-category and mixed-category clusters together, and `source` sets MapLibre's `clusterRadius`, `clusterMaxZoom`, `clusterMinPoints` and your own `clusterProperties` aggregators. Entry points start above a changed `clusterMaxZoom`
392
+ - map: a `PlacesModule` `layers.cluster`, `clusterBadge`, `clusterCount`, `clusterMixedBadge` or `clusterMixedCount` override merges into that layer's `paint` and `layout` key by key, like the other place layers, instead of replacing them whole
393
+
394
+ - [#2315](https://github.com/tomtom-internal/maps-sdk-js/pull/2315) [`daf1d0b`](https://github.com/tomtom-internal/maps-sdk-js/commit/daf1d0bb69f6ea6ecd5c23b4bcb5e536e6d76080) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
133
395
 
134
- Fixes:
396
+ - map: `PlacesModule` and `GeometriesModule` take a `visible` config field (default `true`) and `setVisible()` / `isVisible()`. Hiding covers every layer the module draws — places, connections and entry points; fills, borders, center labels and border labels — keeps its data, and survives `show()`, `clear()` and style changes. Showing again leaves theme-unused layers and `layout.visibility: 'none'` overrides hidden
135
397
  - map: `PlacesModule` connection layers and the `GeometriesModule` border keep a `layout.visibility: 'none'` override when data is shown
136
398
  - map: `GeometriesModule` border labels (`lineLabel`) move with the border in `moveBeforeLayer` and follow config changes
137
- - 371985f: Fixes:
138
- - services: `reverseGeocode` sets no `dataSources.geometry` on an area result; the ID it set was the place ID, which `geometryData` answers with no geometry. To draw a reverse geocoded area, search it by name with its `geographyType` (#2308)
139
- - da4a60d: core: `getCoordinateAtRouteProgress`, `calculateProgressAtRoutePoint` and the other route progress lookups bisect the route's `progress` instead of scanning all of it, so a lookup on a 30,000-point route takes microseconds rather than a millisecond (#2181)
140
- - 8d7d938: Features:
141
- - map: `RoutingModule` posts a tunnel sign where each tunnel starts, under the map's labels, and a "closed to vehicles" sign where each vehicle-restricted stretch starts, just under the traffic icons, on the new `routeTunnelSymbol` and `routeVehicleRestrictedSymbol` layers (#2272)
399
+
400
+ - [#2308](https://github.com/tomtom-internal/maps-sdk-js/pull/2308) [`371985f`](https://github.com/tomtom-internal/maps-sdk-js/commit/371985f1576d92f3d4566eec863d5b27c36d0eb5) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `reverseGeocode` sets no `dataSources.geometry` on an area result; the ID it set was the place ID, which `geometryData` answers with no geometry. To draw a reverse geocoded area, search it by name with its `geographyType`
401
+
402
+ - [#2181](https://github.com/tomtom-internal/maps-sdk-js/pull/2181) [`da4a60d`](https://github.com/tomtom-internal/maps-sdk-js/commit/da4a60d64e59beae7d4b55531f0fa6235b70275f) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - core: `getCoordinateAtRouteProgress`, `calculateProgressAtRoutePoint` and the other route progress lookups bisect the route's `progress` instead of scanning all of it, so a lookup on a 30,000-point route takes microseconds rather than a millisecond ([#2181](https://github.com/tomtom-internal/maps-sdk-js/issues/2181))
403
+
404
+ - [#2272](https://github.com/tomtom-internal/maps-sdk-js/pull/2272) [`8d7d938`](https://github.com/tomtom-internal/maps-sdk-js/commit/8d7d9385d0695547511ef94e02eef59c1840d19f) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
142
405
 
143
- Fixes:
144
- - map: `sections.tunnel.icon` and `sections.vehicleRestricted.icon` replace those signs, instead of being accepted and ignored (#2272)
145
- - 0574709: Features:
146
- - services: `createLatestRequest` keeps only the latest of a series of requests. Each `run` aborts the one before it and resolves `{ current: true, value }`, or `{ current: false }` once a newer run or a `cancel` retired it, so a superseded call neither rejects nor paints last. Errors of the current request, a deadline composed onto its signal included, are rethrown (#2279)
147
- - 6d5ac9d: Fixes:
148
- - services: the `CommonRoutingParams` examples compile — the heavy-vehicle one drops `travelMode: 'truck'`, the EV one uses `speedsToConsumptionsKWH` — and `VehicleDimensions` states that weight is its only dimension (#2307)
406
+ - map: `RoutingModule` posts a tunnel sign where each tunnel starts, under the map's labels, and a "closed to vehicles" sign where each vehicle-restricted stretch starts, just under the traffic icons, on the new `routeTunnelSymbol` and `routeVehicleRestrictedSymbol` layers
407
+ - map: `sections.tunnel.icon` and `sections.vehicleRestricted.icon` replace those signs, instead of being accepted and ignored
408
+
409
+ - [#2279](https://github.com/tomtom-internal/maps-sdk-js/pull/2279) [`0574709`](https://github.com/tomtom-internal/maps-sdk-js/commit/0574709de2be181fe2ed64c6b16e1ec69bec269b) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `createLatestRequest` keeps only the latest of a series of requests. Each `run` aborts the one before it and resolves `{ current: true, value }`, or `{ current: false }` once a newer run or a `cancel` retired it, so a superseded call neither rejects nor paints last. Errors of the current request, a deadline composed onto its signal included, are rethrown
410
+
411
+ - [#2307](https://github.com/tomtom-internal/maps-sdk-js/pull/2307) [`6d5ac9d`](https://github.com/tomtom-internal/maps-sdk-js/commit/6d5ac9deac6c3d276a787b2654c2dc48088b9ff5) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: the `CommonRoutingParams` examples compile — the heavy-vehicle one drops `travelMode: 'truck'`, the EV one uses `speedsToConsumptionsKWH` — and `VehicleDimensions` states that weight is its only dimension
149
412
 
150
413
  ## 0.58.1
151
414
 
152
415
  ### Patch Changes
153
416
 
154
- - 3e22da7: Fixes:
155
- - map: the `basemap.<group>` and `buildings.*` styling toggles write through `BaseMapModule`, and `styling.get` reads their layers live, so it agrees with `baseMap.isVisible(…)` whichever of the two set the group (#2099)
156
- - map: `basemap.land` reaches the layers `BaseMapModule`'s `land` group does, which leave out the style's sourceless `background`; on `satellite` that is no layer (#2099)
157
- - 4a3fd42: Features:
158
- - services: `trafficIncidentDetails` takes a `polygon`, such as a city boundary from `geometryData`, as a third query mode beside `bbox` and `ids`; the request covers the polygon's bounding box and the response keeps the incidents that intersect the polygon (#1939)
417
+ - [#2099](https://github.com/tomtom-internal/maps-sdk-js/pull/2099) [`3e22da7`](https://github.com/tomtom-internal/maps-sdk-js/commit/3e22da7ae15c064c19a1e32a360d40c1688d8cc5) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
418
+
419
+ - map: the `basemap.<group>` and `buildings.*` styling toggles write through `BaseMapModule`, and `styling.get` reads their layers live, so it agrees with `baseMap.isVisible(…)` whichever of the two set the group
420
+ - map: `basemap.land` reaches the layers `BaseMapModule`'s `land` group does, which leave out the style's sourceless `background`; on `satellite` that is no layer
421
+
422
+ - [#1939](https://github.com/tomtom-internal/maps-sdk-js/pull/1939) [`4a3fd42`](https://github.com/tomtom-internal/maps-sdk-js/commit/4a3fd42681a45609a31cd90ad0600a40aac3e097) Thanks [@SuleymanAli-TomTom](https://github.com/SuleymanAli-TomTom)!
159
423
 
160
- Fixes:
161
- - services: `trafficIncidentDetails` validation rejects a request that sets more than one of `bbox`, `polygon` and `ids`, or none of them; the check that `bbox` and `ids` are not combined was never applied (#1939)
424
+ - services: `trafficIncidentDetails` takes a `polygon`, such as a city boundary from `geometryData`, as a third query mode beside `bbox` and `ids`; the request covers the polygon's bounding box and the response keeps the incidents that intersect the polygon
425
+ - services: `trafficIncidentDetails` validation rejects a request that sets more than one of `bbox`, `polygon` and `ids`, or none of them; the check that `bbox` and `ids` are not combined was never applied
162
426
 
163
427
  ## 0.58.0
164
428
 
165
429
  ### Minor Changes
166
430
 
167
- - 29a6a55: Breaking changes:
168
- - map: `culori` v4 is a new peer dependency. npm 7+ and Yarn install it for you; pnpm needs `auto-install-peers=true` or `pnpm add culori` (#2227)
431
+ - [#2227](https://github.com/tomtom-internal/maps-sdk-js/pull/2227) [`29a6a55`](https://github.com/tomtom-internal/maps-sdk-js/commit/29a6a55ca894dfedc1cdd2788b17a836f57c74ef) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
169
432
 
170
- Changes:
171
- - map: colour parsing, conversion, luminance and mixing run on culori's tree-shakeable `culori/fn` instead of the SDK's own parser and named-colour table, so an app that also uses culori ships it once (#2227)
172
- - 115f8a4: Breaking changes:
173
- - services: `GuidanceParams.phonetics` and the `Phonetics` type are removed; `guidance` takes `{ type: 'coded' }` only (#2213)
174
- - core: `TextWithPhonetics` is renamed `InstructionText` and drops `phonetic` and `phoneticLanguageCode`; instruction name fields carry `text` only (#2213)
175
- - 93b72d7: Breaking changes:
176
- - services: `calculateReachableRange` calls reachable-range API version 3, so the request `onAPIRequest` sees is a `POST` with `data` and `headers` — the API key travels as a `TomTom-Api-Key` header — instead of a `GET` URL (#2137)
177
- - services: `calculateReachableRange` rejects `costModel.avoidAreas`, `when.arriveBy`, and a charge budget it cannot convert (no `model.engine.charging.maxChargeKWH`, or no `vehicle.state` for `remainingChargePCT`) instead of dropping them (#2137)
433
+ - **Breaking:** map: `culori` v4 is a new peer dependency. npm 7+ and Yarn install it for you; pnpm needs `auto-install-peers=true` or `pnpm add culori`
434
+ - map: colour parsing, conversion, luminance and mixing run on culori's tree-shakeable `culori/fn` instead of the SDK's own parser and named-colour table, so an app that also uses culori ships it once
435
+
436
+ - [#2213](https://github.com/tomtom-internal/maps-sdk-js/pull/2213) [`115f8a4`](https://github.com/tomtom-internal/maps-sdk-js/commit/115f8a48dbea201145da4bec3bb8e50d90ddc0ab) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
178
437
 
179
- Fixes:
180
- - services: `calculateRoute` sends a vehicle's `currentChargeInkWh` / `currentFuelInLiters` when it has no explicit engine model, and keeps a zero charge, charge percentage or heading on the wire (#2137)
181
- - 5bfbe75: Breaking changes:
182
- - services: the reachable-range budget type `remainingChargeCPT` is `remainingChargePCT`, matching `spentChargePCT` (#2216)
183
- - services: `reverseGeocode` takes `geographyTypes`, as the other places services do; it was a singular name holding an array (#2216)
184
- - services: `metricKeyToApiDataType` is no longer exported (#2216)
185
- - services: generic and combustion vehicles take no `preferences`, and the `VehiclePreferences` type is removed; an electric vehicle's `preferences` is `ElectricVehiclePreferences` (#2216)
186
- - map: the module config types follow `<Module>Config` — `TrafficFlowModuleConfig`, `TrafficIncidentsModuleConfig`, `TrafficIncidentOverlayModuleConfig`, `TrafficAreaAnalyticsModuleConfig` replace `FlowConfig`, `IncidentsConfig`, `TrafficIncidentOverlayConfig`, `TrafficAreaAnalyticsConfig` (#2216)
187
- - map: the `FilterShowMode` value `'all_except'` is `'all-except'`, in the POI, traffic flow and traffic incident filters (#2216)
438
+ - **Breaking:** services: `GuidanceParams.phonetics` and the `Phonetics` type are removed; `guidance` takes `{ type: 'coded' }` only
439
+ - **Breaking:** core: `TextWithPhonetics` is renamed `InstructionText` and drops `phonetic` and `phoneticLanguageCode`; instruction name fields carry `text` only
440
+
441
+ - [#2137](https://github.com/tomtom-internal/maps-sdk-js/pull/2137) [`93b72d7`](https://github.com/tomtom-internal/maps-sdk-js/commit/93b72d70cc0bf7b112f091a839b5d1a9984f5587) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
442
+
443
+ - **Breaking:** services: `calculateReachableRange` calls reachable-range API version 3, so the request `onAPIRequest` sees is a `POST` with `data` and `headers` — the API key travels as a `TomTom-Api-Key` header — instead of a `GET` URL
444
+ - **Breaking:** services: `calculateReachableRange` rejects `costModel.avoidAreas`, `when.arriveBy`, and a charge budget it cannot convert (no `model.engine.charging.maxChargeKWH`, or no `vehicle.state` for `remainingChargePCT`) instead of dropping them
445
+ - services: `calculateRoute` sends a vehicle's `currentChargeInkWh` / `currentFuelInLiters` when it has no explicit engine model, and keeps a zero charge, charge percentage or heading on the wire
446
+
447
+ - [#2216](https://github.com/tomtom-internal/maps-sdk-js/pull/2216) [`5bfbe75`](https://github.com/tomtom-internal/maps-sdk-js/commit/5bfbe75ec9517789c8624fd2ede1034590e51d48) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
188
448
 
189
- Features:
190
- - map: `filterShowModes` lists the `FilterShowMode` values at runtime (#2216)
191
- - services: `discoverOnePlace` and `geocodeOne` also take a params object (everything but `limit`), so a single-result lookup can carry `geoBias` or a `signal` (#2216)
192
- - 0678a81: Breaking changes:
193
- - map: `eventState` is typed `EventState`, which adds `recently-hovered`, so your own `['has', 'eventState']` expressions match a feature for its grace period; exclude that state or set `hoverGracePeriodMS: 0` (#2197)
449
+ - **Breaking:** services: the reachable-range budget type `remainingChargeCPT` is `remainingChargePCT`, matching `spentChargePCT`
450
+ - **Breaking:** services: `reverseGeocode` takes `geographyTypes`, as the other places services do; it was a singular name holding an array
451
+ - **Breaking:** services: `metricKeyToApiDataType` is no longer exported
452
+ - **Breaking:** services: generic and combustion vehicles take no `preferences`, and the `VehiclePreferences` type is removed; an electric vehicle's `preferences` is `ElectricVehiclePreferences`
453
+ - **Breaking:** map: the module config types follow `<Module>Config` — `TrafficFlowModuleConfig`, `TrafficIncidentsModuleConfig`, `TrafficIncidentOverlayModuleConfig`, `TrafficAreaAnalyticsModuleConfig` replace `FlowConfig`, `IncidentsConfig`, `TrafficIncidentOverlayConfig`, `TrafficAreaAnalyticsConfig`
454
+ - **Breaking:** map: the `FilterShowMode` value `'all_except'` is `'all-except'`, in the POI, traffic flow and traffic incident filters
455
+ - map: `filterShowModes` lists the `FilterShowMode` values at runtime
456
+ - services: `discoverOnePlace` and `geocodeOne` also take a params object (everything but `limit`), so a single-result lookup can carry `geoBias` or a `signal`
457
+
458
+ - [#2197](https://github.com/tomtom-internal/maps-sdk-js/pull/2197) [`0678a81`](https://github.com/tomtom-internal/maps-sdk-js/commit/0678a81f5dff0f840c6735e8a68182c7c998eb60) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
194
459
 
195
- Features:
196
- - map: `PlacesModule` draws the entry points of shown places with `entryPoints` on its config — for all places or only hovered or clicked ones, from a minimum zoom — and `places.events.entryPoints` hands each back as a point feature with its place attached (#2197)
197
- - map: a GeoJSON-backed feature the pointer leaves stays `recently-hovered` for `hoverGracePeriodMS` (default 400, on the map's or a module's `events`); the SDK's layers draw it as no state (#2197)
198
- - 834257b: Breaking changes:
199
- - core: 67 `POICategory` values take their Places Search v3 name, upper-cased — among them `GAS_STATION` → `FUEL_STATION`, `ELECTRIC_VEHICLE_STATION` → `CHARGING_LOCATION`, `HOTEL_MOTEL` → `HOTEL_OR_MOTEL`, `SHOPPING_CENTER` → `MALL`, `SUPERMARKETS_HYPERMARKETS` → `SUPERMARKET` (#2189)
200
- - core: five `POICategory` values merge into the v3 type they share, keeping both V2 ids: `COLLEGE_UNIVERSITY` → `COLLEGE_OR_UNIVERSITY`, `LEISURE_SPORTS_CENTER` → `SPORTS_CENTER`, `OPEN_PARKING_AREA` → `OPEN_CAR_PARKING_AREA`, `PERFORMING_ARTS_THEATER` → `THEATER`, `ROAD_TRAFFIC_CONTROL_CENTER` → `TRAFFIC_CONTROL_DEPARTMENT` (#2189)
201
- - services: `autocompleteSearch` and its `AutocompleteSearch*` types are no longer exported — `getSearchSuggestions()` returns its brand and category suggestions, alone with `filters: { kinds: ['brand', 'category'] }` or ranked with places (#2189)
202
- - services: the places functions take intent-based names that line up with Places Search v3's `suggest` / `discover` / `details`: `search` → `discoverPlaces`, `searchOne` → `discoverOnePlace`, `placeById` → `getPlaceDetails` (#2189)
203
- - services: the types follow — `SearchResponse` → `DiscoverPlacesResponse`, `PlaceByIdParams` / `PlaceByIdResponse` → `PlaceDetailsParams` / `PlaceDetailsResponse`; a place-details error reports its service as `PlaceDetails` (#2189)
204
- - core: `POICategory` drops `PUB_FOOD`, `POLYNESIAN_RESTAURANT`, `OTHER_WINTER_SPORT` and `SNOOKER_POOL_BILLIARD`, which the category endpoint no longer returns. Filtering on one already matched nothing. The map's `poiCategoryGroups.FOOD_DRINKS_GROUP` no longer lists `PUB_FOOD` (#2189)
460
+ - **Breaking:** map: `eventState` is typed `EventState`, which adds `recently-hovered`, so your own `['has', 'eventState']` expressions match a feature for its grace period; exclude that state or set `hoverGracePeriodMS: 0`
461
+ - map: `PlacesModule` draws the entry points of shown places with `entryPoints` on its config — for all places or only hovered or clicked ones, from a minimum zoom — and `places.events.entryPoints` hands each back as a point feature with its place attached
462
+ - map: a GeoJSON-backed feature the pointer leaves stays `recently-hovered` for `hoverGracePeriodMS` (default 400, on the map's or a module's `events`); the SDK's layers draw it as no state
463
+
464
+ - [#2189](https://github.com/tomtom-internal/maps-sdk-js/pull/2189) [`834257b`](https://github.com/tomtom-internal/maps-sdk-js/commit/834257b27bee5c60e1cc1782a466d7f6a6f5f8d8) Thanks [@JulianChinAFoeng-TomTom](https://github.com/JulianChinAFoeng-TomTom)!
205
465
 
206
- Features:
207
- - services: `getSearchSuggestions()` returns one ranked list from the search and autocomplete arms, blended like Places Search v3: at most one brand or category leads, then places (#2189)
208
- - core: `POICategory` gains the seven categories the endpoint returns that the vendored table was missing, so `getPOICategories()` and category filters now reach them, and `PlacesModule` draws an icon for each (#2189)
466
+ - **Breaking:** core: 67 `POICategory` values take their Places Search v3 name, upper-cased — among them `GAS_STATION` → `FUEL_STATION`, `ELECTRIC_VEHICLE_STATION` → `CHARGING_LOCATION`, `HOTEL_MOTEL` → `HOTEL_OR_MOTEL`, `SHOPPING_CENTER` → `MALL`, `SUPERMARKETS_HYPERMARKETS` → `SUPERMARKET`
467
+ - **Breaking:** core: five `POICategory` values merge into the v3 type they share, keeping both V2 ids: `COLLEGE_UNIVERSITY` → `COLLEGE_OR_UNIVERSITY`, `LEISURE_SPORTS_CENTER` → `SPORTS_CENTER`, `OPEN_PARKING_AREA` → `OPEN_CAR_PARKING_AREA`, `PERFORMING_ARTS_THEATER` → `THEATER`, `ROAD_TRAFFIC_CONTROL_CENTER` → `TRAFFIC_CONTROL_DEPARTMENT`
468
+ - **Breaking:** services: `autocompleteSearch` and its `AutocompleteSearch*` types are no longer exported — `getSearchSuggestions()` returns its brand and category suggestions, alone with `filters: { kinds: ['brand', 'category'] }` or ranked with places
469
+ - **Breaking:** services: the places functions take intent-based names that line up with Places Search v3's `suggest` / `discover` / `details`: `search` → `discoverPlaces`, `searchOne` → `discoverOnePlace`, `placeById` → `getPlaceDetails`
470
+ - **Breaking:** services: the types follow — `SearchResponse` → `DiscoverPlacesResponse`, `PlaceByIdParams` / `PlaceByIdResponse` → `PlaceDetailsParams` / `PlaceDetailsResponse`; a place-details error reports its service as `PlaceDetails`
471
+ - **Breaking:** core: `POICategory` drops `PUB_FOOD`, `POLYNESIAN_RESTAURANT`, `OTHER_WINTER_SPORT` and `SNOOKER_POOL_BILLIARD`, which the category endpoint no longer returns. Filtering on one already matched nothing. The map's `poiCategoryGroups.FOOD_DRINKS_GROUP` no longer lists `PUB_FOOD`
472
+ - services: `getSearchSuggestions()` returns one ranked list from the search and autocomplete arms, blended like Places Search v3: at most one brand or category leads, then places
473
+ - core: `POICategory` gains the seven categories the endpoint returns that the vendored table was missing, so `getPOICategories()` and category filters now reach them, and `PlacesModule` draws an icon for each
474
+ - services: `discoverPlaces`, `geocode` and `getSearchSuggestions` encode the query in the request path, so a query containing `/`, `?` or `#` is answered instead of failing with a 404
475
+
476
+ - [#2212](https://github.com/tomtom-internal/maps-sdk-js/pull/2212) [`78c9a7e`](https://github.com/tomtom-internal/maps-sdk-js/commit/78c9a7e74fff1cdb9bc4735d7c01011485d59031) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** services: remove the `customizeService` export, and the optional second argument every service function took to override its request building, sending or response parsing. `calculateReachableRanges` keeps its second `options` argument
477
+
478
+ - [#2223](https://github.com/tomtom-internal/maps-sdk-js/pull/2223) [`e0417a9`](https://github.com/tomtom-internal/maps-sdk-js/commit/e0417a900d9954567180fe96325160f484563c7e) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `StylingModule.describe()` is removed, together with the `StylingCatalogue`, `StylingKnobDescriptor`, `StylingPresetDescriptor` and shared `KnobDescriptor` types. The knob catalogue is static data now: `stylingKnobCatalogue` lists every knob's kind, description, range or options and `appliesTo`, `stylingPresetCatalogue` every preset with its settings, and `styling.get(id)` reads the value in force on a live map.
479
+
480
+ - [#2231](https://github.com/tomtom-internal/maps-sdk-js/pull/2231) [`7a26791`](https://github.com/tomtom-internal/maps-sdk-js/commit/7a267912057c1026021c769b036e395b1fc29405) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
209
481
 
210
- Fixes:
211
- - services: `discoverPlaces`, `geocode` and `getSearchSuggestions` encode the query in the request path, so a query containing `/`, `?` or `#` is answered instead of failing with a 404 (#2189)
212
- - 78c9a7e: Breaking changes:
213
- - services: remove the `customizeService` export, and the optional second argument every service function took to override its request building, sending or response parsing. `calculateReachableRanges` keeps its second `options` argument
214
- - e0417a9: Breaking changes:
215
- - map: `StylingModule.describe()` is removed, together with the `StylingCatalogue`, `StylingKnobDescriptor`, `StylingPresetDescriptor` and shared `KnobDescriptor` types. The knob catalogue is static data now: `stylingKnobCatalogue` lists every knob's kind, description, range or options and `appliesTo`, `stylingPresetCatalogue` every preset with its settings, and `styling.get(id)` reads the value in force on a live map.
216
- - 7a26791: Breaking changes:
217
- - core: `GlobalConfig.trackingId` is removed, together with the `Tracking-ID` request header it set
218
- - core, services: `apiVersion` is removed from `GlobalConfig` and `CommonRoutingParams`; each service picks the API version it calls
219
- - d94e12b: Breaking changes:
220
- - core: each `AreaAnalyticsTimedData` granularity has its own entry type, `AreaAnalyticsYearlyEntry` to `AreaAnalyticsHourlyEntry` and `AreaAnalyticsAverageEntry`, whose time identifiers are required, and `AreaAnalyticsTimedEntry` is their union, so code that builds entries by hand must set them (#2244)
221
- - core: `AreaAnalyticsFeatureProperties.timezone` is optional: the API echoes it only from a request that names one, and the SDK's names none (#2244)
482
+ - **Breaking:** core: `GlobalConfig.trackingId` is removed, together with the `Tracking-ID` request header it set
483
+ - **Breaking:** core, services: `apiVersion` is removed from `GlobalConfig` and `CommonRoutingParams`; each service picks the API version it calls
484
+
485
+ - [#2244](https://github.com/tomtom-internal/maps-sdk-js/pull/2244) [`d94e12b`](https://github.com/tomtom-internal/maps-sdk-js/commit/d94e12bb142693730a95b7032e9772ff3caf6a31) Thanks [@carlosprietofernandez-tomtom](https://github.com/carlosprietofernandez-tomtom)!
222
486
 
223
- Fixes:
224
- - services: `trafficAreaAnalytics` reads each `timedData.average` entry's `day` and `hour` from the label the API sends (`FRIDAY-10`) and orders the entries Monday first, instead of numbering them by position in an array the API sorts by label string (#2244)
225
- - services: `trafficAreaAnalytics` reads the `year`, `month`, `week`, `date` and `hour` of each yearly to hourly `timedData` entry from the `time` label the API sends (`2024-08-06T07:00`), instead of numbering daily and hourly entries by position from a start date the Lite response never sends, which gave every one an Invalid Date and shifted the hours whenever an `hours` filter, a `days` list or a day without data left entries out, and leaving yearly, monthly and weekly entries with none (#2244)
226
- - services: `trafficAreaAnalytics` defaults an omitted `endDate` to three days ago, the latest date that always has data, instead of two: the API publishes a day 24 to 48 hours after it ends, so the default window failed during part of each day (#2244)
227
- - services: `trafficAreaAnalytics` documents that its `hours` filter and every `timedData` time identifier are in UTC, since the request names no region timezone (#2244)
228
- - b09510c: Breaking changes:
229
- - services: `trafficIncidentDetails` calls Orbis Traffic Incident Details v2, so the request `onAPIRequest` sees carries the API key, version, language and an `Attributes` projection as headers instead of query parameters (#2215)
230
- - services: remove the `trafficModelId` parameter from `trafficIncidentDetails`; v2 always serves the latest traffic state (#2215)
231
- - core: remove `TrafficIncidentTMC`, `TrafficIncidentTMCPoint` and `properties.tmc` from `TrafficIncidentProperties`; v2 carries no TMC data (#2215)
487
+ - **Breaking:** core: each `AreaAnalyticsTimedData` granularity has its own entry type, `AreaAnalyticsYearlyEntry` to `AreaAnalyticsHourlyEntry` and `AreaAnalyticsAverageEntry`, whose time identifiers are required, and `AreaAnalyticsTimedEntry` is their union, so code that builds entries by hand must set them
488
+ - **Breaking:** core: `AreaAnalyticsFeatureProperties.timezone` is optional: the API echoes it only from a request that names one, and the SDK's names none
489
+ - services: `trafficAreaAnalytics` reads each `timedData.average` entry's `day` and `hour` from the label the API sends (`FRIDAY-10`) and orders the entries Monday first, instead of numbering them by position in an array the API sorts by label string
490
+ - services: `trafficAreaAnalytics` reads the `year`, `month`, `week`, `date` and `hour` of each yearly to hourly `timedData` entry from the `time` label the API sends (`2024-08-06T07:00`), instead of numbering daily and hourly entries by position from a start date the Lite response never sends, which gave every one an Invalid Date and shifted the hours whenever an `hours` filter, a `days` list or a day without data left entries out, and leaving yearly, monthly and weekly entries with none
491
+ - services: `trafficAreaAnalytics` defaults an omitted `endDate` to three days ago, the latest date that always has data, instead of two: the API publishes a day 24 to 48 hours after it ends, so the default window failed during part of each day
492
+ - services: `trafficAreaAnalytics` documents that its `hours` filter and every `timedData` time identifier are in UTC, since the request names no region timezone
493
+
494
+ - [#2215](https://github.com/tomtom-internal/maps-sdk-js/pull/2215) [`b09510c`](https://github.com/tomtom-internal/maps-sdk-js/commit/b09510c42d6863777e2a5fbe09f429cc0cc9b8da) Thanks [@JulianChinAFoeng-TomTom](https://github.com/JulianChinAFoeng-TomTom)!
232
495
 
233
- Fixes:
234
- - services: `trafficAreaAnalytics` accepts a `startDate` without an `endDate` and measures the range to two days ago, the end date it sends, instead of rejecting every such request (#2215)
235
- - services: `trafficAreaAnalytics` validates a range in the UTC calendar days it sends, and dates hourly and daily entries in UTC, so neither drifts a day with the time of day or a daylight-saving switch (#2215)
496
+ - **Breaking:** services: `trafficIncidentDetails` calls Orbis Traffic Incident Details v2, so the request `onAPIRequest` sees carries the API key, version, language and an `Attributes` projection as headers instead of query parameters
497
+ - **Breaking:** services: remove the `trafficModelId` parameter from `trafficIncidentDetails`; v2 always serves the latest traffic state
498
+ - **Breaking:** core: remove `TrafficIncidentTMC`, `TrafficIncidentTMCPoint` and `properties.tmc` from `TrafficIncidentProperties`; v2 carries no TMC data
499
+ - services: `trafficAreaAnalytics` accepts a `startDate` without an `endDate` and measures the range to two days ago, the end date it sends, instead of rejecting every such request
500
+ - services: `trafficAreaAnalytics` validates a range in the UTC calendar days it sends, and dates hourly and daily entries in UTC, so neither drifts a day with the time of day or a daylight-saving switch
236
501
 
237
502
  ### Patch Changes
238
503
 
239
- - d70cae2: Changes:
240
- - map: the API reference of `BaseMapModule`, `POIsModule`, `TerrainModule`, `TrafficFlowModule` and `TrafficIncidentsModule` states what each module owns and which `StylingModule` knobs own the look (#2098)
241
- - f7e1c3e: map: a source comment in the place-pin category mapping no longer links to an internal repository (#2232)
242
- - 8eff899: Dependencies:
243
- - The `maplibre-gl` peer dependency requires `^6.11.2`, and the `zod` peer dependency `^4.6.5` (#2217)
244
- - bb9161c: Fixes:
245
- - map: `PlacesModule` pins for `ADVENTURE_SPORTS_FACILITY`, `COMMUNITY_CENTER`, `EMBASSY`, `EMERGENCY_MEDICAL_SERVICE` and `ENTERTAINMENT` draw the icon of the category they share a base-map icon with, instead of no icon at all (#2222)
246
- - map: `TOLL_GATE` maps to the base-map `toll_plaza` category, so its `circle-icon` and `base-map` icons draw and `POIsModule` category filters match toll plazas (#2222)
247
- - map: `THEATER`, `SPORTS_CENTER`, `SQUASH_COURT` and `SCHOOL_BUS_COMPANY` places draw the closest base-map icon under the `circle-icon`, `base-map` and `pin-clustered` themes, instead of the default place pin (#2222)
248
- - 58761e4: Fixes:
249
- - services: `calculateReachableRange` and `calculateReachableRanges` keep the API key, base URLs, `retry`, callbacks and `signal` out of each polygon's `properties`, now typed as the new `ReachableRangeProperties` — the request parameters without the `CommonServiceParams` fields (#2230)
250
- - 8d48ac8: services: the TSDoc of reachable ranges, Long Distance EV Routing, EV charging stations availability and traffic area analytics says which API key access each needs; reachable ranges are marked as a private preview
251
- - dec7dac: Features:
252
- - map: `TomTomMap.updateEventsConfig` changes the map's user events configuration at runtime, such as the long-hover delays and `hoverGracePeriodMS`; what it leaves out keeps its value
253
- - a0f6956: Features:
254
- - map: on the mono styles, `setMapColors({ land })` re-derives the other nine colours from it with the formulas the styles' themes compile them with; colours given outright still win (#2237)
504
+ - [#2098](https://github.com/tomtom-internal/maps-sdk-js/pull/2098) [`d70cae2`](https://github.com/tomtom-internal/maps-sdk-js/commit/d70cae24af5aae9fcdc48159ebb6d7a167bea69b) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: the API reference of `BaseMapModule`, `POIsModule`, `TerrainModule`, `TrafficFlowModule` and `TrafficIncidentsModule` states what each module owns and which `StylingModule` knobs own the look
505
+
506
+ - [#2232](https://github.com/tomtom-internal/maps-sdk-js/pull/2232) [`f7e1c3e`](https://github.com/tomtom-internal/maps-sdk-js/commit/f7e1c3e534cabefd56d09a03ae68bf8b5c90ed06) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: a source comment in the place-pin category mapping no longer links to an internal repository ([#2232](https://github.com/tomtom-internal/maps-sdk-js/issues/2232))
507
+
508
+ - [#2217](https://github.com/tomtom-internal/maps-sdk-js/pull/2217) [`8eff899`](https://github.com/tomtom-internal/maps-sdk-js/commit/8eff899c713586296529fb22a4c84f3663fa0859) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - The `maplibre-gl` peer dependency requires `^6.11.2`, and the `zod` peer dependency `^4.6.5`
509
+
510
+ - [#2222](https://github.com/tomtom-internal/maps-sdk-js/pull/2222) [`bb9161c`](https://github.com/tomtom-internal/maps-sdk-js/commit/bb9161c2dd3bd0e210c36ff94c4f4d4d6f950c3c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
511
+
512
+ - map: `PlacesModule` pins for `ADVENTURE_SPORTS_FACILITY`, `COMMUNITY_CENTER`, `EMBASSY`, `EMERGENCY_MEDICAL_SERVICE` and `ENTERTAINMENT` draw the icon of the category they share a base-map icon with, instead of no icon at all
513
+ - map: `TOLL_GATE` maps to the base-map `toll_plaza` category, so its `circle-icon` and `base-map` icons draw and `POIsModule` category filters match toll plazas
514
+ - map: `THEATER`, `SPORTS_CENTER`, `SQUASH_COURT` and `SCHOOL_BUS_COMPANY` places draw the closest base-map icon under the `circle-icon`, `base-map` and `pin-clustered` themes, instead of the default place pin
515
+
516
+ - [#2230](https://github.com/tomtom-internal/maps-sdk-js/pull/2230) [`58761e4`](https://github.com/tomtom-internal/maps-sdk-js/commit/58761e446cf917b8e07d3388c0347e1fab1f10e4) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `calculateReachableRange` and `calculateReachableRanges` keep the API key, base URLs, `retry`, callbacks and `signal` out of each polygon's `properties`, now typed as the new `ReachableRangeProperties` — the request parameters without the `CommonServiceParams` fields
517
+
518
+ - [#2242](https://github.com/tomtom-internal/maps-sdk-js/pull/2242) [`8d48ac8`](https://github.com/tomtom-internal/maps-sdk-js/commit/8d48ac87c76270554b67340495318b0f8bb167b2) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: the TSDoc of reachable ranges, Long Distance EV Routing, EV charging stations availability and traffic area analytics says which API key access each needs; reachable ranges are marked as a private preview
519
+
520
+ - [#2254](https://github.com/tomtom-internal/maps-sdk-js/pull/2254) [`dec7dac`](https://github.com/tomtom-internal/maps-sdk-js/commit/dec7dacd9a6a00177ce6541bf592d1992988de72) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `TomTomMap.updateEventsConfig` changes the map's user events configuration at runtime, such as the long-hover delays and `hoverGracePeriodMS`; what it leaves out keeps its value
521
+
522
+ - [#2237](https://github.com/tomtom-internal/maps-sdk-js/pull/2237) [`a0f6956`](https://github.com/tomtom-internal/maps-sdk-js/commit/a0f6956bedd3a8f511d062ef37179329392e58de) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
255
523
 
256
- Fixes:
257
- - map: `setMapColors` darkens or lightens the education, healthcare, leisure and shopping land-use and building tints with `artificial`, keeping their hue and scaling their saturation with its luminance as the styles' themes do, instead of leaving them at the style's pastel lightness under a dark built-up colour (#2237)
258
- - map: a pure grey map colour or colour knob derives grey shades, instead of shades tinted towards red (#2237)
259
- - map: `setMapColors` recolours railway outlines with `artificial` along with their dashes, instead of leaving them at the style's grey (#2237)
260
- - map: `setMapColors` paints water, roads, built-up areas and labels in the colour given, on the mono styles too, instead of offsetting them from a glacier, restricted-access or city-label literal (#2237)
261
- - map: `setMapColors` keeps the opacity of translucent label halos, instead of painting them opaque (#2237)
262
- - map: `setMapColors` recolours motorway, trunk and primary link roads with `roadMajor`, instead of with `road` (#2237)
263
- - map: `styling.get('colors.<name>')` reports a colour without the opacity of the layer it was read from, so setting it back changes nothing (#2237)
264
- - map: `artificial` is read from the city-scale built-up colour, the one the style's theme sets, and `setMapColors` measures its shades from it, instead of from the more saturated small-scale stop (#2237)
265
- - 3133622: Fixes:
266
- - map: replacing the image of a `ferry` or `tollRoad` section icon through `sections.<type>.icon` keeps the zoom-ramped size its layer draws with, instead of flattening it to 1; `icon.size` still sets one when given (#2224)
267
- - ddd6a97: Changes:
268
- - map: `toHsl`, `formatStyleHsl` and `HslColor` are exported, the colour rules the map-theme plugin shares with the recolour (#2094)
269
- - a3318ef: Fixes:
270
- - services: `trafficAreaAnalytics` reads `properties.startDate` and `endDate` as the earliest and latest of the `days` the API lists, at midnight UTC, instead of fields the Lite response never sends, which left both an Invalid Date (#2247)
271
- - services: `trafficAreaAnalytics` reads `anomalies` keyed by the abbreviated metric fields the API sends (`v`, `c`), instead of data type names, which dropped every anomaly; each anomaly's times are read as UTC, and its `labels` are the names of the public holidays it overlaps (#2247)
272
- - services: `trafficAreaAnalytics` documents that `anomalies` is empty: the service detects anomalies only over 35 days or more, beyond a request's 31-day limit (#2247)
524
+ - map: on the mono styles, `setMapColors({ land })` re-derives the other nine colours from it with the formulas the styles' themes compile them with; colours given outright still win
525
+ - map: `setMapColors` darkens or lightens the education, healthcare, leisure and shopping land-use and building tints with `artificial`, keeping their hue and scaling their saturation with its luminance as the styles' themes do, instead of leaving them at the style's pastel lightness under a dark built-up colour
526
+ - map: a pure grey map colour or colour knob derives grey shades, instead of shades tinted towards red
527
+ - map: `setMapColors` recolours railway outlines with `artificial` along with their dashes, instead of leaving them at the style's grey
528
+ - map: `setMapColors` paints water, roads, built-up areas and labels in the colour given, on the mono styles too, instead of offsetting them from a glacier, restricted-access or city-label literal
529
+ - map: `setMapColors` keeps the opacity of translucent label halos, instead of painting them opaque
530
+ - map: `setMapColors` recolours motorway, trunk and primary link roads with `roadMajor`, instead of with `road`
531
+ - map: `styling.get('colors.<name>')` reports a colour without the opacity of the layer it was read from, so setting it back changes nothing
532
+ - map: `artificial` is read from the city-scale built-up colour, the one the style's theme sets, and `setMapColors` measures its shades from it, instead of from the more saturated small-scale stop
533
+
534
+ - [#2224](https://github.com/tomtom-internal/maps-sdk-js/pull/2224) [`3133622`](https://github.com/tomtom-internal/maps-sdk-js/commit/3133622d8f7a9c56bd2126326e026f85f470fc2f) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: replacing the image of a `ferry` or `tollRoad` section icon through `sections.<type>.icon` keeps the zoom-ramped size its layer draws with, instead of flattening it to 1; `icon.size` still sets one when given
535
+
536
+ - [#2094](https://github.com/tomtom-internal/maps-sdk-js/pull/2094) [`ddd6a97`](https://github.com/tomtom-internal/maps-sdk-js/commit/ddd6a9749bc140ba90fbc6abf8e6bf648b64db9a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `toHsl`, `formatStyleHsl` and `HslColor` are exported, the colour rules the map-theme plugin shares with the recolour
537
+
538
+ - [#2247](https://github.com/tomtom-internal/maps-sdk-js/pull/2247) [`a3318ef`](https://github.com/tomtom-internal/maps-sdk-js/commit/a3318efefbefa313fe082440d9f5c5f24aff17eb) Thanks [@carlosprietofernandez-tomtom](https://github.com/carlosprietofernandez-tomtom)!
539
+
540
+ - services: `trafficAreaAnalytics` reads `properties.startDate` and `endDate` as the earliest and latest of the `days` the API lists, at midnight UTC, instead of fields the Lite response never sends, which left both an Invalid Date
541
+ - services: `trafficAreaAnalytics` reads `anomalies` keyed by the abbreviated metric fields the API sends (`v`, `c`), instead of data type names, which dropped every anomaly; each anomaly's times are read as UTC, and its `labels` are the names of the public holidays it overlaps
542
+ - services: `trafficAreaAnalytics` documents that `anomalies` is empty: the service detects anomalies only over 35 days or more, beyond a request's 31-day limit
273
543
 
274
544
  ## 0.57.0
275
545
 
276
546
  ### Minor Changes
277
547
 
278
- - 669dc17: Breaking changes:
279
- - services: the places services send the API key and API version as `TomTom-Api-Key` / `TomTom-Api-Version` headers instead of `key=` in the URL, so a request builder now returns `{ url, headers }` and a proxy has to forward those headers (#2185)
280
- - services: `SearchSummary.totalResults` and `SearchSummary.fuzzyLevel` are optional — guard them rather than assuming a number (#2185)
548
+ - [#2185](https://github.com/tomtom-internal/maps-sdk-js/pull/2185) [`669dc17`](https://github.com/tomtom-internal/maps-sdk-js/commit/669dc17c7be960bafbce86c4acabeafa44350f37) Thanks [@JulianChinAFoeng-TomTom](https://github.com/JulianChinAFoeng-TomTom)!
281
549
 
282
- Features:
283
- - services: `customizeService` builders document how to send the credential yourself, including `credentials: 'include'` under a credentials proxy via `isProxyCredentialsMode(config)` (#2185)
284
- - 892139d: Breaking changes:
285
- - map: `TerrainModule` replaces `HillshadeModule` — `TerrainModule.get(map, { hillshade: true })` for what `HillshadeModule.get(map, { visible: true })` did, `setHillshadeVisible` for `setVisible` (#2056)
286
- - map: the `view.terrain` and `view.terrainExaggeration` styling knobs and the `terrain` preset are removed — `TerrainModule.get(map, { elevation: true, elevationExaggeration })` raises the terrain instead, and loads the elevation style part the knob could not (#2056)
550
+ - **Breaking:** services: the places services send the API key and API version as `TomTom-Api-Key` / `TomTom-Api-Version` headers instead of `key=` in the URL, so a request builder now returns `{ url, headers }` and a proxy has to forward those headers
551
+ - **Breaking:** services: `SearchSummary.totalResults` and `SearchSummary.fuzzyLevel` are optional — guard them rather than assuming a number
552
+ - services: `customizeService` builders document how to send the credential yourself, including `credentials: 'include'` under a credentials proxy via `isProxyCredentialsMode(config)`
553
+
554
+ - [#2056](https://github.com/tomtom-internal/maps-sdk-js/pull/2056) [`892139d`](https://github.com/tomtom-internal/maps-sdk-js/commit/892139d642f4e78cfe061ea246452effab171ea0) Thanks [@AlvaroGraca-TomTom](https://github.com/AlvaroGraca-TomTom)!
287
555
 
288
- Features:
289
- - map: 3D terrain with `TerrainModule` — `elevation` and `elevationExaggeration` raise the map surface from the same elevation data the hillshade shades, restored after every style change (#2056)
556
+ - **Breaking:** map: `TerrainModule` replaces `HillshadeModule` — `TerrainModule.get(map, { hillshade: true })` for what `HillshadeModule.get(map, { visible: true })` did, `setHillshadeVisible` for `setVisible`
557
+ - **Breaking:** map: the `view.terrain` and `view.terrainExaggeration` styling knobs and the `terrain` preset are removed — `TerrainModule.get(map, { elevation: true, elevationExaggeration })` raises the terrain instead, and loads the elevation style part the knob could not
558
+ - map: 3D terrain with `TerrainModule` — `elevation` and `elevationExaggeration` raise the map surface from the same elevation data the hillshade shades, restored after every style change
290
559
 
291
560
  ### Patch Changes
292
561
 
293
- - a8d3fde: Features:
294
- - map: `basemap.<group>` styling knobs toggle every base-map layer group `BaseMapModule` knows, bar the two building groups the `buildings.*` knobs already cover (#2092)
295
- - map: `hillshade.*` styling knobs set the shading's method, light direction, strength, maximum zoom and colours (#2092)
296
- - map: `styling.layers.query(…)` edits the paint, layout, filter or visibility of the style layers a query selects, re-applied after every style change and undone by `reset()` (#2092)
297
- - 2f9aa90: Features:
298
- - map: every module has `updateConfig(partial)`, which changes the given properties and keeps the rest of the configuration, whatever that module's `applyConfig` does with a whole one (#2100)
562
+ - [#2092](https://github.com/tomtom-internal/maps-sdk-js/pull/2092) [`a8d3fde`](https://github.com/tomtom-internal/maps-sdk-js/commit/a8d3fdef60c84278dc9f1c326d390aaed2af7154) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
563
+
564
+ - map: `basemap.<group>` styling knobs toggle every base-map layer group `BaseMapModule` knows, bar the two building groups the `buildings.*` knobs already cover
565
+ - map: `hillshade.*` styling knobs set the shading's method, light direction, strength, maximum zoom and colours
566
+ - map: `styling.layers.query(…)` edits the paint, layout, filter or visibility of the style layers a query selects, re-applied after every style change and undone by `reset()`
567
+
568
+ - [#2100](https://github.com/tomtom-internal/maps-sdk-js/pull/2100) [`2f9aa90`](https://github.com/tomtom-internal/maps-sdk-js/commit/2f9aa90eae8bed1d90fd16388664f577b65b0c1c) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
299
569
 
300
- Fixes:
301
- - map: `BaseMapModule.resetConfig()` empties the configuration instead of keeping the previous one (#2100)
302
- - map: `TrafficAreaAnalyticsModule.resetConfig()` returns the display mode, metric, colours, filters, region and layer positions to their defaults, instead of only clearing `getConfig()` (#2100)
303
- - map: `TrafficAreaAnalyticsModule.applyConfig` with a new `activeMetric` filters and scales the layers by that metric rather than the previous one (#2100)
304
- - map: a clean style switch (`setStyle(style, { resetState: true })`) leaves every module on the configuration `resetConfig()` returns to, and `CustomGeoJSONModule` survives it instead of throwing (#2100)
570
+ - map: every module has `updateConfig(partial)`, which changes the given properties and keeps the rest of the configuration, whatever that module's `applyConfig` does with a whole one
571
+ - map: `BaseMapModule.resetConfig()` empties the configuration instead of keeping the previous one
572
+ - map: `TrafficAreaAnalyticsModule.resetConfig()` returns the display mode, metric, colours, filters, region and layer positions to their defaults, instead of only clearing `getConfig()`
573
+ - map: `TrafficAreaAnalyticsModule.applyConfig` with a new `activeMetric` filters and scales the layers by that metric rather than the previous one
574
+ - map: a clean style switch (`setStyle(style, { resetState: true })`) leaves every module on the configuration `resetConfig()` returns to, and `CustomGeoJSONModule` survives it instead of throwing
305
575
 
306
576
  ## 0.56.0
307
577
 
308
578
  ### Minor Changes
309
579
 
310
- - 9e1d080: Breaking changes:
311
- - map: precise types for custom styles, places props and traffic data (#2161)
312
- - services: deduplicate vehicle energy encoding, tighten EV types (#2159)
313
-
314
- Features:
315
- - map: label a route's border crossings with the countries they join (#2153)
316
- - map: post speed limit signs where the limit changes (#2183)
317
- - map: styling GA phase 2 - view knobs, presets, map-effects plugin (#2090)
318
- - map: styling GA phase 3 - setMapColors map colours and exportStyle (#2091)
319
- - routing: phase 6 - show what the SDK adds over calling the API directly (#2080)
320
- - services: places GA phase 1 - remove the experimentalSearch export (#2152)
580
+ - [#2188](https://github.com/tomtom-internal/maps-sdk-js/pull/2188) [`9e1d080`](https://github.com/tomtom-internal/maps-sdk-js/commit/9e1d080397ee2d16b6185873661890e5a81f7b65) Thanks [@AlvaroGraca-TomTom](https://github.com/AlvaroGraca-TomTom)!
321
581
 
322
- Bug fixes:
323
- - map: draw border crossings under the waypoint pins (#2187)
324
- - 1bea71f: Breaking changes:
325
- - map: `StylingKnobValueOf` narrows to each knob's kind, so `StylingModule.set` rejects a value of the wrong kind at compile time (#2175)
582
+ - **Breaking:** map: precise types for custom styles, places props and traffic data
583
+ - **Breaking:** services: deduplicate vehicle energy encoding, tighten EV types
584
+ - map: label a route's border crossings with the countries they join
585
+ - map: post speed limit signs where the limit changes
586
+ - map: styling GA phase 2 - view knobs, presets, map-effects plugin
587
+ - map: styling GA phase 3 - setMapColors map colours and exportStyle
588
+ - routing: phase 6 - show what the SDK adds over calling the API directly
589
+ - services: places GA phase 1 - remove the experimentalSearch export
590
+ - map: draw border crossings under the waypoint pins
591
+
592
+ - [#2175](https://github.com/tomtom-internal/maps-sdk-js/pull/2175) [`1bea71f`](https://github.com/tomtom-internal/maps-sdk-js/commit/1bea71fe79f2875ff3c78cfef136eeb492e8acc0) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)!
326
593
 
327
- Features:
328
- - map: `stylingColorKnobIds` and `StylingColorKnobId` name every styling colour knob, and `KnobKind` gains `colors` (#2175)
594
+ - **Breaking:** map: `StylingKnobValueOf` narrows to each knob's kind, so `StylingModule.set` rejects a value of the wrong kind at compile time
595
+ - map: `stylingColorKnobIds` and `StylingColorKnobId` name every styling colour knob, and `KnobKind` gains `colors`
329
596
 
330
597
  ## [0.55.1](https://github.com/tomtom-internal/maps-sdk-js/compare/v0.54.0...v0.55.1) (2026-09-21)
331
598