# Mappedin JS, React & React Native SDK v6.30.0

**URL:** <https://community.mappedin.com/t/mappedin-js-react-react-native-sdk-v6-30-0/613>\
**Category:** News & Announcements\
**Created:** [October 20, 2026, 8:50pm UTC](https://community.mappedin.com/t/mappedin-js-react-react-native-sdk-v6-30-0/613 "2026-10-20T20:50:27Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![msohm](https://yyz2.discourse-cdn.com/flex004/user_avatar/community.mappedin.com/msohm/32/6_2.png) [@msohm](https://community.mappedin.com/u/msohm)\
**Post date:** [October 20, 2026, 8:50pm UTC](https://community.mappedin.com/t/mappedin-js-react-react-native-sdk-v6-30-0/613/1 "2026-10-20T20:50:27Z")

</div>

### **Features**

- Added async `MapData.Nodes` for navigation `Node`s. `getAll()`, `getById()`, `getByExternalId()`, and `getByType()` return the same `Node`s as the synchronous getters. `getByType()` accepts a `Floor`, an `EnterpriseLocation`, a `Connection`, or a `Directions` result. `Node.getNeighbors()` returns the neighbouring `Node`s. `getAll()` builds a `Node` for every node, so prefer `getByType()` with a `Floor` when one floor is enough. Compare `Node`s by `id`. The synchronous getters still work and are deprecated: `MapData.getByType('node')`, `MapData.getById('node', id)`, `MapData.getByExternalId('node', id)`, `Connection.nodes`, `EnterpriseLocation.nodes`, and `Node.neighbors`.

```ts
const onFloor = await mapData.Nodes.getByType(floor);
const node = await mapData.Nodes.getById('n_1234');
const neighbors = await node?.getNeighbors();

```

- Added `travelDistanceOptions` to `Query.nearest()` for `mode: 'travel-distance'`. `excludedConnections` and `zones` now rank results the same way `getDirections` does. A result that can only be reached through an excluded connection, or through a zone whose cost is `Infinity`, is omitted. The reported `distance` includes zone cost, so it can be larger than `maxDistance`. `accessible` and `connectionIdWeightMap` are not available on `Query.nearest()` yet.

```ts
const nearest = await mapData.Query.nearest(origin, evacuationPoints, {
    mode: 'travel-distance',
    limit: 'all-floors',
    travelDistanceOptions: {
        excludedConnections: elevatorsToAvoid,
        zones: avoidanceZones,
    },
});

```

- Added `costAccumulation` on direction `zones` for `getDirections` and for `Query.nearest()` travel-distance zones. `'per-node'` is the default, so existing routes are unchanged: every navigation node the route steps onto inside the zone adds the cost. `'per-zone-entry'` charges the cost once each time the route enters the zone. Moving inside the zone adds nothing, and entering again charges again. A cost of `Infinity` still blocks the zone.

```ts
const directions = await mapData.getDirections(origin, destination, {
    zones: [
        {
            geometry: departmentPolygon,
            cost: 1000,
            costAccumulation: 'per-zone-entry',
        },
    ],
});

```

- Added experimental `__EXPERIMENTAL_outdoorPathWeightMultiplier` on `getDirections`. It scales the cost of same-floor outdoor walking relative to indoor walking. Leave it unset to keep the map’s outdoor weights. `1` makes outdoor walking cost the same per metre as indoor walking, and `2` makes it cost twice as much. Cross-floor connections and indoor edges stay unchanged, and blocked outdoor edges stay blocked. The option has no effect on Enterprise map data. The name and behaviour may change, and no deprecation cycle is promised for this prefixed option.

```ts
const directions = await mapView.getDirections(start, end, {
    __EXPERIMENTAL_outdoorPathWeightMultiplier: 1,
});

```

- Added `shadows` to `show3dMap`. Shadows stay off when the option is omitted. `'auto'` is the recommended value: it picks a quality tier from the device and turns shadows off where they cannot render. `true` uses the default settings. An object sets the shadows explicitly. `quality` accepts `'low'`, `'medium'`, or `'high'`, and `'high'` matches the previous defaults. On mobile, `true` and an object that omits `quality` are capped at `'medium'`. Pass `{ quality: 'high' }` to force the high tier. `__EXPERIMENTAL_shadows` is deprecated and still works. `{ enabled: false }` becomes `false`, and `{ enabled: true, ... }` becomes the remaining settings.

```ts
const mapView = await show3dMap(el, mapData, { shadows: 'auto' });

```

- Added `textWrap` to `Label` appearance. `'max-width'` is the default and fills each line up to `maxWidth`. `'balance'` keeps the same number of lines and makes those lines as even in length as possible. Single-line `Label`s are unchanged, and `maxLines` still truncates with `...`.

```ts
mapView.Labels.add(space, 'Restrooms and guest services are straight ahead past the fountain', {
    appearance: {
        maxLines: 4,
        textWrap: 'balance',
    },
});

```

- `enableTestMode()` now runs `MapData` and `MapView` headless in Node. Painting is skipped. Call it before `show3dMap`. `setHeadlessViewport()` sets the virtual size used when the container has no layout. The default size is 1920 by 1080.

### **Performance**

- Improved directions performance on large maps, including `dp-optimal` path smoothing.
- Improved path arrow animation performance, resulting in lower CPU use while arrows animate.
- Improved shadow rendering performance, resulting in higher frame rates while the camera moves and lower memory use.

### **Fixes**

- Fixed an issue where default `greedy-los` path smoothing drew a node-to-node zigzag through an open area with a clear line of sight. The path now collapses across that open area. The first step still follows the edge the router chose, so smoothing does not cut across a zone the route was avoiding.
- Fixed an issue where `onMVFParsed` in `hydrateMapData` ran after the map was built, so in-place edits were ignored. The callback now runs before the map is built, matching `getMapData`.
- Fixed an issue where a `Space` side texture also tinted the top face.
- Fixed an issue where replacing a legacy `Space` texture with a plain texture kept the old repeat, offset, and rotation.
- Fixed an issue where re-hydrating a bundle from `toJSONBundle()` drew each Enterprise `Space` texture twice.
- Fixed an issue where dashes on a ribbon `Path` disappeared, and which dashes disappeared changed with zoom.
- Fixed an issue where floor footprints were visible by default. Footprints stay hidden until multi-floor view shows them, or until `updateState` sets a floor’s `footprint`.
- Fixed an issue where releasing a drag on a `Model` or `Marker` fired a `click`, including a drag that ended near where it started.
- Fixed an issue where fading an instanced `Model` replaced each material’s own opacity, so transparent parts of the model appeared as a halo.
- Fixed an issue where a `Model` with `visibleThroughGeometry: true` drew nested meshes twice, leaving stray geometry away from the pin.
- Fixed an issue where `Marker` `zIndex` did not change stacking order. `zIndex` now sets stacking against sibling `Marker`s, on add and on `updateState`. Passing `zIndex: undefined` to `updateState` clears it.
- Fixed an issue where `'hidden'` was tried in list order for `Marker` `placement` and `Label` `textPlacement`. `'hidden'` is now always tried last, wherever it is listed. Also fixed an issue where creating a `Marker` with its own `placement` replaced the default `['center', 'hidden']` for `Marker`s created afterwards.
- Fixed an issue where a truncated right-to-left `Label` drew `...` at the start of the text. The ellipsis now sits at the end of the text.
- Fixed an issue where shadows on a floor high above the ground, or on a floor with a large altitude, drifted away from the walls and could disappear on the highest floors.
- Fixed an issue where a tall shadow caster lost part of its ground shadow, and the missing piece shifted while panning.
- Fixed an issue where shadows stopped rendering after a zoom change while they were faded out.
