From b2474bf79d3e11ab9549467ea74c0eb2aed58536 Mon Sep 17 00:00:00 2001 From: Ryan Hamamura <58859899+ryanhamamura@users.noreply.github.com> Date: Fri, 20 Feb 2026 07:25:18 -1000 Subject: [PATCH] fix: draggable pin writeback and click-to-place event collision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three related bugs in the maplibre reactive signal plumbing: 1. Draggable marker coordinates never updated because dragendHandlerJS queries for hidden inputs matching LngSignal/LatSignal IDs, but Element() never rendered those inputs. Add them after the marker data-effect divs. 2. Click-to-place marker didn't appear until moveend because Element() rendered a bare hidden input for each event signal, colliding with the user's action-bearing input (same data-bind, querySelector finds the bare one first). Remove the internal event inputs — the user provides their own via MapEvent.Input(). 3. The moveend handler dispatched 'input' on ALL data-bind inputs in the wrapper, accidentally triggering event inputs. Add an else-return so only the 5 viewport signal inputs get dispatched. --- maplibre/js.go | 1 + maplibre/maplibre.go | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/maplibre/js.go b/maplibre/js.go index 89b0912..ee136dc 100644 --- a/maplibre/js.go +++ b/maplibre/js.go @@ -140,6 +140,7 @@ func initScript(m *Map) string { `else if(sig===%[4]s)inp.value=map.getZoom();`+ `else if(sig===%[5]s)inp.value=map.getBearing();`+ `else if(sig===%[6]s)inp.value=map.getPitch();`+ + `else return;`+ `inp.dispatchEvent(new Event('input',{bubbles:true}));`+ `});`+ `});`, diff --git a/maplibre/maplibre.go b/maplibre/maplibre.go index 145633a..852a345 100644 --- a/maplibre/maplibre.go +++ b/maplibre/maplibre.go @@ -122,11 +122,14 @@ func (m *Map) Element(extra ...h.H) h.H { } } - // Event listener binding elements - for _, ev := range m.events { - children = append(children, - h.Input(h.Type("hidden"), ev.signal.Bind()), - ) + // Hidden inputs for signal-backed marker position writeback (drag → signal) + for _, me := range m.markers { + if me.marker.LngSignal != nil && me.marker.LatSignal != nil { + children = append(children, + h.Input(h.Type("hidden"), me.marker.LngSignal.Bind()), + h.Input(h.Type("hidden"), me.marker.LatSignal.Bind()), + ) + } } children = append(children, extra...)