Render descriptors, in display order.
The feature's properties as they came from the source.
Render context — layer and feature identity, plus the click position.
hasSidepanel tells the builder whether a "see details"
affordance has anywhere to lead; without one, it is not rendered at all.
The popup root element, ready to mount. Text is escaped at the sinks.
Builds the popup content element for a set of resolved fields.
Three widgets get special treatment, all for LAYOUT reasons rather than rendering ones: a hero image closes the current body and attaches to the root, and consecutive badges — like consecutive actions — are buffered into a row of their own instead of stacking in the body's column. A row nothing rendered into is not attached: an action with no
actionIdrenders nothing, and an empty container would still take its margin.