From b92ea5a1a45c1d5eb6851c9f1c6eb1d212946775 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Thu, 16 Apr 2026 20:10:30 +0200 Subject: [PATCH] fix(widgets): replace setTimeout with transitionend in minimize Fixes race condition where openWidget() during the 250ms timeout would be overridden. Uses _minimizing flag to cancel in-flight transitions. Dispatches widget:minimize and widget:open events. --- src/js/widgets.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/js/widgets.js b/src/js/widgets.js index 301f194..36a9a14 100644 --- a/src/js/widgets.js +++ b/src/js/widgets.js @@ -177,10 +177,19 @@ const WidgetManager = { const entry = this._widgets.get(id); if (!entry) return; entry.state.open = false; + entry._minimizing = true; entry.el.classList.add('widget-minimized'); - setTimeout(() => { - entry.el.style.display = 'none'; - }, 250); + + entry.el.addEventListener('transitionend', function onEnd(e) { + if (e.target !== entry.el) return; + entry.el.removeEventListener('transitionend', onEnd); + if (entry._minimizing) { + entry.el.style.display = 'none'; + } + entry._minimizing = false; + }); + + this._emitter.dispatchEvent(new CustomEvent('widget:minimize', { detail: { id } })); await this.save(); }, @@ -191,13 +200,14 @@ const WidgetManager = { async openWidget(id) { const entry = this._widgets.get(id); if (!entry) return; + entry._minimizing = false; entry.state.open = true; entry.el.style.display = 'flex'; - // Naechster Frame fuer Animation requestAnimationFrame(() => { entry.el.classList.remove('widget-minimized'); }); this.bringToFront(id); + this._emitter.dispatchEvent(new CustomEvent('widget:open', { detail: { id } })); await this.save(); },