`symbol` layers using `symbol-placement: line` render above `line` layers at zoom < 13.7 in Mapbox Standard
Author: MobileD2Created Aug 6, 2026Updated Aug 7, 2026
Labelsbug :lady_beetle:auto-triaged
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
symbollayer (planned-dots) withsymbol-placement: "line"along a LineString. - Add a
linelayer (route-line) on top ofplanned-dots(e.g.map.addLayer(routeLine)called afterplanned-dots). - Observe correct z-ordering at zoom > 14 (
route-linecoversplanned-dots). - Zoom out past 13.7 and observe
planned-dotshopping on top ofroute-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
Source: mapbox/mapbox-gl-js