mapbox-gl-js version
3.28.0
Browser and version
Chrome 151.0.7922.75
Expected behavior
A line layer added after a symbol layer (intended to render on top) should remain visually above the symbols at all zoom levels.
Actual behavior
When zooming out past ~13.7 in Mapbox Standard, symbol layers placed along lines are hoisted into a top-level overlay pass, rendering directly on top of line layers regardless of beforeId, slot, or execution order.
Link to the demonstration
No response
Steps to trigger the unexpected behavior
- Load Mapbox GL JS (latest v3 release) with
mapbox://styles/mapbox/standard.
- Add a
symbol layer (planned-dots) with symbol-placement: "line" along a LineString.
- Add a
line layer (route-line) on top of planned-dots (e.g. map.addLayer(routeLine) called after planned-dots).
- Observe correct z-ordering at zoom > 14 (
route-line covers planned-dots).
- Zoom out past 13.7 and observe
planned-dots hopping on top of route-line.
// 1. Add Planned Dots (Symbol Layer - rendered first/below)
map.addLayer({
id: 'planned-dots',
type: 'symbol',
source: 'route-source',
layout: {
'symbol-placement': 'line',
'symbol-spacing': 20,
'icon-image': 'dot-icon',
'icon-allow-overlap': true,
'icon-ignore-placement': true
}
});
// 2. Add Route Line (Line Layer - added second to render ON TOP of dots)
map.addLayer({
id: 'route-line',
type: 'line',
source: 'route-source',
paint: {
'line-color': '#2a82e4',
'line-width': 8
}
}); // Drawn after planned-dots to sit on top
### Relevant log output
```shell
mapbox-gl-js version
3.28.0
Browser and version
Chrome 151.0.7922.75
Expected behavior
A
linelayer added after asymbollayer (intended to render on top) should remain visually above the symbols at all zoom levels.Actual behavior
When zooming out past ~13.7 in Mapbox Standard,
symbollayers placed along lines are hoisted into a top-level overlay pass, rendering directly on top oflinelayers regardless ofbeforeId,slot, or execution order.Link to the demonstration
No response
Steps to trigger the unexpected behavior
mapbox://styles/mapbox/standard.symbollayer (planned-dots) withsymbol-placement: "line"along a LineString.linelayer (route-line) on top ofplanned-dots(e.g.map.addLayer(routeLine)called afterplanned-dots).route-linecoversplanned-dots).planned-dotshopping on top ofroute-line.