Caller handler → the events it is bound to → the wrapper actually attached.
⚠️ The wrapper is typed on MaplibreEventArg — what MapLibre hands a listener —
and NOT on GeoLeafNormalizedMapEvent, which is what it hands the CALLER. The two differ,
and stating the engine's side here is what lets map.on/off take the wrapper without a
cast. Normalisation happens inside the wrapper, where it belongs.
Caller handler → the events it is bound to → the wrapper actually attached.
⚠️ The wrapper is typed on MaplibreEventArg — what MapLibre hands a listener — and NOT on
GeoLeafNormalizedMapEvent, which is what it hands the CALLER. The two differ, and stating the engine's side here is what letsmap.on/offtake the wrapper without a cast. Normalisation happens inside the wrapper, where it belongs.