GeoLeaf Core API - v3.0.0
    Preparing search index...

    Map of the GeoLeaf custom DOM events whose payload is JSON-serialisable.

    The membership criterion is the PAYLOAD, not the carrier — that is what makes this map's boundary a real one and not a stylistic split. dispatchGeoLeafEvent deep-clones every payload through JSON.parse(JSON.stringify(detail)) (kernel/events/event-bus.ts:48-68); a detail holding a DOM node, a function or a Map does not survive that round-trip, and belongs in GeoLeafRawEventMap instead. The two maps state one rule from both ends.

    The Events facade subscribes to both maps (kernel/events/facade.ts); only emission through the sanitising bus is restricted to this one.

    ⚠️ Being listed here does NOT mean the event travels through that bus — it means it COULD. This sentence read « events carried by the sanitising bus » until task 7.3, which was narrower than the rule the two maps actually enforce, and it had no answer for the nine geoleaf:editor:* events: their payloads clone perfectly, but the editor dispatches them as raw CustomEvents and dispatchGeoLeafEvent is exported to no plugin. Reading the criterion as the carrier would have pushed them into the raw map, whose own warning — « adding a key here is a statement that the payload CANNOT be JSON-cloned » — they contradict. Arbitré par Mattieu : the payload decides, and the carrier is a separate question this contract deliberately does not type.

    interface GeoLeafEventMap {
        "geoleaf:app:ready": { version?: string; timestamp?: number };
        "geoleaf:map:ready": undefined;
        "geoleaf:legend:ready": { position?: string; layerCount?: number };
        "geoleaf:basemap:change": { key: string; previousKey?: string | null };
        "geoleaf:theme:applied": { themeName?: string; layerCount?: number };
        "geoleaf:palette-changed": { palette: string };
        "geoleaf:poi:click": GeoLeafPoiClickDetail;
        "geoleaf:poi:panel:open": GeoLeafPoiPanelOpenDetail;
        "geoleaf:poi:panel:close": GeoLeafPoiPanelCloseDetail;
        "geoleaf:popup:action": GeoLeafPopupActionDetail;
        "geoleaf:layer:toggle": GeoLeafLayerToggleDetail;
        "geoleaf:layer:added": GeoLeafLayerAddedDetail;
        "geoleaf:feature:click": GeoLeafFeatureClickDetail;
        "geoleaf:feature:hover": GeoLeafFeatureHoverDetail;
        "geoleaf:filter:apply": GeoLeafFilterApplyDetail;
        "geoleaf:filter:reset": GeoLeafFilterResetDetail;
        "geoleaf:map:move": GeoLeafMapMoveDetail;
        "geoleaf:map:zoom": GeoLeafMapZoomDetail;
        "geoleaf:filters:applied": Record<string, never>;
        "geoleaf:sw:updated": Record<string, never>;
        "geoleaf:cache:evicted": GeoLeafCacheEvictedDetail;
        "geoleaf:plugin:loaded": GeoLeafPluginLoadedDetail;
        "geoleaf:plugin:lazy-loaded": GeoLeafPluginLazyLoadedDetail;
        "geoleaf:plugin:failed": GeoLeafPluginFailedDetail;
        "geoleaf:editor:feature-created": GeoLeafEditorFeatureCreatedDetail;
        "geoleaf:editor:feature-saved": GeoLeafEditorFeatureSavedDetail;
        "geoleaf:editor:feature-deleted": GeoLeafEditorFeatureDeletedDetail;
        "geoleaf:editor:feature-conflict": GeoLeafEditorFeatureConflictDetail;
        "geoleaf:editor:feature-moved": GeoLeafEditorFeatureMovedDetail;
        "geoleaf:editor:vertex-added": GeoLeafEditorVertexChangedDetail;
        "geoleaf:editor:vertex-deleted": GeoLeafEditorVertexChangedDetail;
        "geoleaf:editor:feature-sync-queued": GeoLeafEditorSyncQueuedDetail;
        "geoleaf:editor:feature-sync-flushed": GeoLeafEditorSyncFlushedDetail;
    }
    Index

    Properties

    "geoleaf:app:ready": { version?: string; timestamp?: number }
    "geoleaf:map:ready": undefined
    "geoleaf:legend:ready": { position?: string; layerCount?: number }

    Emitted once when the legend control is first mounted on the map (S10 F2).

    "geoleaf:basemap:change": { key: string; previousKey?: string | null }
    "geoleaf:theme:applied": { themeName?: string; layerCount?: number }
    "geoleaf:palette-changed": { palette: string }

    Emitted when the accent palette changes (capability theme-palette). Distinct from geoleaf:theme:applied (MAP themes) and from geoleaf:ui-theme-changed (light/dark) — the three axes are orthogonal.

    "geoleaf:poi:click": GeoLeafPoiClickDetail
    "geoleaf:poi:panel:open": GeoLeafPoiPanelOpenDetail
    "geoleaf:poi:panel:close": GeoLeafPoiPanelCloseDetail
    "geoleaf:popup:action": GeoLeafPopupActionDetail
    "geoleaf:layer:toggle": GeoLeafLayerToggleDetail
    "geoleaf:layer:added": GeoLeafLayerAddedDetail
    "geoleaf:feature:click": GeoLeafFeatureClickDetail
    "geoleaf:feature:hover": GeoLeafFeatureHoverDetail
    "geoleaf:filter:apply": GeoLeafFilterApplyDetail
    "geoleaf:filter:reset": GeoLeafFilterResetDetail
    "geoleaf:map:move": GeoLeafMapMoveDetail
    "geoleaf:map:zoom": GeoLeafMapZoomDetail
    "geoleaf:filters:applied": Record<string, never>
    "geoleaf:sw:updated": Record<string, never>
    "geoleaf:cache:evicted": GeoLeafCacheEvictedDetail
    "geoleaf:plugin:loaded": GeoLeafPluginLoadedDetail
    "geoleaf:plugin:lazy-loaded": GeoLeafPluginLazyLoadedDetail
    "geoleaf:plugin:failed": GeoLeafPluginFailedDetail
    "geoleaf:editor:feature-created": GeoLeafEditorFeatureCreatedDetail
    "geoleaf:editor:feature-saved": GeoLeafEditorFeatureSavedDetail
    "geoleaf:editor:feature-deleted": GeoLeafEditorFeatureDeletedDetail
    "geoleaf:editor:feature-conflict": GeoLeafEditorFeatureConflictDetail
    "geoleaf:editor:feature-moved": GeoLeafEditorFeatureMovedDetail
    "geoleaf:editor:vertex-added": GeoLeafEditorVertexChangedDetail
    "geoleaf:editor:vertex-deleted": GeoLeafEditorVertexChangedDetail
    "geoleaf:editor:feature-sync-queued": GeoLeafEditorSyncQueuedDetail
    "geoleaf:editor:feature-sync-flushed": GeoLeafEditorSyncFlushedDetail