Item per Drag hinzufügen oder vorhandenes 2×2-Item wählen
Maus auf die rechts-unten Ecke (Resize-Dreieck) bewegen
Ziehen versuchen
Symptom
Item wird verschoben statt resized, ODER
gar keine Reaktion, weil HTML5-Dragstart den mousedown-Handler schluckt
Ursache
templates/index.html:1308 setzt div.draggable = true auf dem Grid-Item. Der Resize-Handle (:451-467, 18×18 px in der Ecke) ist ein Kind des Items. Browser fired dragstart am Parent, sobald Maus auf irgendeinem Kind ist — e.preventDefault() in startResize() (:1496) kommt zu spät, das HTML5-Drag-System hat den Move bereits übernommen.
Akzeptanz
Resize per Maus funktioniert zuverlässig für jede Ecke und Seite
Drag-Move bleibt unverändert (Body ohne Handle)
Touch + Mouse-Events parity
Tests/Manual: jedes Item kann auf 1×1, 2×2, 4×4 resized werden ohne dass ein Move-Drag startet
## Reproduktion
1. Admin UI aufrufen (z.B. http://10.11.3.144:8080/?demo=1)
2. Item per Drag hinzufügen oder vorhandenes 2×2-Item wählen
3. Maus auf die **rechts-unten Ecke** (Resize-Dreieck) bewegen
4. Ziehen versuchen
## Symptom
- Item wird **verschoben** statt resized, ODER
- gar keine Reaktion, weil HTML5-Dragstart den mousedown-Handler schluckt
## Ursache
`templates/index.html:1308` setzt `div.draggable = true` auf dem Grid-Item. Der Resize-Handle (`:451-467`, 18×18 px in der Ecke) ist ein Kind des Items. Browser fired `dragstart` am Parent, sobald Maus auf irgendeinem Kind ist — `e.preventDefault()` in `startResize()` (`:1496`) kommt zu spät, das HTML5-Drag-System hat den Move bereits übernommen.
## Akzeptanz
- Resize per Maus funktioniert zuverlässig für jede Ecke und Seite
- Drag-Move bleibt unverändert (Body ohne Handle)
- Touch + Mouse-Events parity
- Tests/Manual: jedes Item kann auf 1×1, 2×2, 4×4 resized werden ohne dass ein Move-Drag startet
Fixed in branch fix/BUG-01-02-resize-pointer (commit 3a44881, pushed).
Was war kaputt:
Items hatten div.draggable = true (HTML5-DnD). Der Resize-Handle war ein Kind des Items — Browser fired dragstart am Parent sobald die Maus auf irgendeinem Kind war. Der e.preventDefault() im mousedown-Handler kam zu spät, der Move-Drag hatte schon übernommen.
Fix:
div.draggable = true komplett raus
Eigene Pointer-Events für Move + Resize (pointerdown/pointermove/pointerup)
Resize-Handle hat pointer-events:auto, ::before (Dreieck-Deko) pointer-events:none → Hit-Trennung
touch-action:none für Touch-Scroll-Fix
stopPropagation() im Resize-Handler → Item-Handler sieht das Event NICHT
TEST 1: Resize-Handle pointerdown — stopPropagation called? ✓
TEST 2: Item-Body pointerdown (target = item): ✓
TEST 3: Resize-Handle CSS pointer-events: ✓
TEST 4: renderGrid() NOT called inside pointer move handlers: ✓ (0/2)
TEST 5: requestAnimationFrame used for resize/move: ✓ (3 calls)
TEST 6: draggable=true entfernt: ✓ (0)
TEST 7: touch-action:none auf Resize-Handle: ✓
⚠️ Siehe auch BUG-02 — wird im selben Patch mitgefixt.
Fixed in branch `fix/BUG-01-02-resize-pointer` (commit 3a44881, pushed).
**Was war kaputt:**
Items hatten `div.draggable = true` (HTML5-DnD). Der Resize-Handle war ein Kind des Items — Browser fired `dragstart` am Parent sobald die Maus auf irgendeinem Kind war. Der `e.preventDefault()` im mousedown-Handler kam zu spät, der Move-Drag hatte schon übernommen.
**Fix:**
- `div.draggable = true` komplett raus
- Eigene Pointer-Events für Move + Resize (`pointerdown`/`pointermove`/`pointerup`)
- Resize-Handle hat `pointer-events:auto`, `::before` (Dreieck-Deko) `pointer-events:none` → Hit-Trennung
- `touch-action:none` für Touch-Scroll-Fix
- `stopPropagation()` im Resize-Handler → Item-Handler sieht das Event NICHT
**Frischer Beweis:** `node tests/test_pointer_events.js` (7/7 grün):
```
TEST 1: Resize-Handle pointerdown — stopPropagation called? ✓
TEST 2: Item-Body pointerdown (target = item): ✓
TEST 3: Resize-Handle CSS pointer-events: ✓
TEST 4: renderGrid() NOT called inside pointer move handlers: ✓ (0/2)
TEST 5: requestAnimationFrame used for resize/move: ✓ (3 calls)
TEST 6: draggable=true entfernt: ✓ (0)
TEST 7: touch-action:none auf Resize-Handle: ✓
```
PR: https://git.pkop.de/Vibecode/epaper-dashboard/pulls/new/fix/BUG-01-02-resize-pointer
⚠️ Siehe auch BUG-02 — wird im selben Patch mitgefixt.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Reproduktion
Symptom
Ursache
templates/index.html:1308setztdiv.draggable = trueauf dem Grid-Item. Der Resize-Handle (:451-467, 18×18 px in der Ecke) ist ein Kind des Items. Browser fireddragstartam Parent, sobald Maus auf irgendeinem Kind ist —e.preventDefault()instartResize()(:1496) kommt zu spät, das HTML5-Drag-System hat den Move bereits übernommen.Akzeptanz
Fixed in branch
fix/BUG-01-02-resize-pointer(commit 3a44881, pushed).Was war kaputt:
Items hatten
div.draggable = true(HTML5-DnD). Der Resize-Handle war ein Kind des Items — Browser fireddragstartam Parent sobald die Maus auf irgendeinem Kind war. Dere.preventDefault()im mousedown-Handler kam zu spät, der Move-Drag hatte schon übernommen.Fix:
div.draggable = truekomplett rauspointerdown/pointermove/pointerup)pointer-events:auto,::before(Dreieck-Deko)pointer-events:none→ Hit-Trennungtouch-action:nonefür Touch-Scroll-FixstopPropagation()im Resize-Handler → Item-Handler sieht das Event NICHTFrischer Beweis:
node tests/test_pointer_events.js(7/7 grün):PR: https://git.pkop.de/Vibecode/epaper-dashboard/pulls/new/fix/BUG-01-02-resize-pointer
⚠️ Siehe auch BUG-02 — wird im selben Patch mitgefixt.