From c80dee98a72caf83f6f421e354f26b38e31dcaad Mon Sep 17 00:00:00 2001 From: Admin Date: Mon, 21 Sep 2026 00:46:33 +0000 Subject: [PATCH] Sync dock touch interaction fix --- src/dock-ui.js | 4 +++- tests/wiring.test.mjs | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/dock-ui.js b/src/dock-ui.js index 29675c6..6230244 100644 --- a/src/dock-ui.js +++ b/src/dock-ui.js @@ -364,8 +364,10 @@ window.addEventListener('airship:dock-hide', () => hide()); window.addEventListener('airship:dock-close', () => hide()); window.addEventListener('airship:dock-return', (event) => show(event.detail || latestState)); window.addEventListener('airship:hud-state', (event) => { + // Keep the latest snapshot for fallback/return, but do not rebuild interactive + // dock lists every frame. Replacing buttons between pointerdown and click + // breaks touch interaction on mobile. latestState = event.detail; - if (!overlay.hidden) render(event.detail); }); window.addEventListener('keydown', (event) => { if (event.key === 'Escape' && !overlay.hidden) dispatchAction('close-dock'); diff --git a/tests/wiring.test.mjs b/tests/wiring.test.mjs index a3b0471..bad89f7 100644 --- a/tests/wiring.test.mjs +++ b/tests/wiring.test.mjs @@ -337,6 +337,12 @@ test('dock trade and missions are driven by generated port economy state', async assert.match(dockUi, /sell-trade-good/); assert.match(dockUi, /accept-mission/); assert.match(dockUi, /complete-mission/); + assert.match(dockUi, /airship:dock-state/); + assert.match(dockUi, /latestState = event\.detail/); + assert.doesNotMatch( + dockUi, + /airship:hud-state'[\s\S]{0,180}if \(!overlay\.hidden\) render\(event\.detail\)/, + ); }); test('mobile merchant traffic uses a reduced render budget', async () => {