Changes since tag 0.5

commit 583fc9f11c00730c45f60f57a29d017282ac5e0f
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 18:16:46 2026 +0200

    feat: make vote and results popups draggable, persist position
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 9ae807a620d7f06176976923230240f233afe735
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 18:13:57 2026 +0200

    fix: use SecureActionButtonTemplate for teleport icon click
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 23db3be511dce203360a3783e4340b3db01c7b4b
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 18:11:11 2026 +0200

    feat: click dungeon icon in vote results to teleport
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 492aff41707d22ff7794cc123e5cf359d591e099
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 18:07:24 2026 +0200

    feat: replace results click-to-dismiss with explicit close button
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 80102673140e7daa0021d520134ea4c5da0fbd24
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 18:02:44 2026 +0200

    fix: replace goto/continue with if block for Lua 5.1 compatibility
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit cf576b869ccadffad248a099333c547bb7295a59
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 18:01:54 2026 +0200

    feat: make KeyVote always-enabled, remove from settings panel
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 2fe9767ca3a67f48b799865d22fcc4ab449370ca
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 17:57:48 2026 +0200

    fix: suppress spurious "Group updated" print on LFG group join
    
    LFG_LIST_ACTIVE_ENTRY_UPDATE fires immediately after LFG_LIST_JOINED_GROUP
    as part of the join flow, causing both "Joined group" and "Group updated"
    to print at once. Added recentlyJoined flag to skip the update print when
    it is triggered by the join itself.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit fc5dde3c608f9c052fc2fb9f215d7a573f7f7b6c
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 17:56:31 2026 +0200

    fix: preserve LFG merge flag until player is inside the instance
    
    Two bugs caused pendingLFGMerge to be consumed too early:
    
    1. In GetGreetingChannel, the isSolo guard (numMembers<=1) fired before the
       isLFGMerge bypass. A GROUP_ROSTER_UPDATE with numMembers=0 during the
       loading screen returned nil, and the caller wiped the flag unconditionally.
    
    2. isLFGMerge returned INSTANCE_CHAT even when inInst=false (roster update
       fired before the loading screen). The timer could expire before the player
       finished loading, and SendChatMessage to INSTANCE_CHAT failed silently.
    
    Fix: isLFGMerge is now checked first and only returns a channel when
    inInst=true and numMembers>1. A nil return from the merge path means "not
    ready yet" — the caller now only clears pendingLFGMerge when a channel is
    actually returned, so the flag survives transient roster updates and fires
    correctly on PLAYER_ENTERING_WORLD.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 3717829f66edc205fc994f33eeedc99039c57d3e
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 17:38:26 2026 +0200

    fix: detect LFR merge via PLAYER_LEAVING_WORLD, remove unsafe stale flag cleanup
    
    LFG_PROPOSAL_SHOW is tied to the Dungeon Finder popup and never fires for
    LFR (Raid Finder), which auto-places players without a role-check dialog.
    Check GetLFGMode(RF/LFD) on PLAYER_LEAVING_WORLD instead — fires before the
    loading screen, before any GROUP_ROSTER_UPDATE, no race possible.
    
    Also removed the "clear flag if solo" block: transient zero-member
    GROUP_ROSTER_UPDATE events during loading screens were wiping pendingLFGMerge
    before GetGreetingChannel could evaluate it.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit e7f3636abd46efb8b7da9c62bb7a3ea9d432c534
Author: FloMoit <kororo@free.fr>
Date:   Mon Mar 30 15:45:03 2026 +0200

    fix: use LFG_PROPOSAL_SHOW to avoid race condition on LFG merge detection
    
    LFG_PROPOSAL_SUCCEEDED could fire after GROUP_ROSTER_UPDATE in the
    no-loading-screen case (filling a vacancy in an active instance), leaving
    the flag set but unconsumed. LFG_PROPOSAL_SHOW fires before any roster
    change or loading screen, eliminating the race. LFG_PROPOSAL_FAILED clears
    the flag if the proposal times out or is declined.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

