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.
Only two widgets get special treatment, and both for LAYOUT reasons rather than rendering ones: a hero image closes the current body and attaches to the root, and consecutive badges are buffered into one row instead of being interleaved with the text around them.