diff --git a/server/src/wled_controller/static/js/features/pattern-templates.js b/server/src/wled_controller/static/js/features/pattern-templates.js index 6dfbc0d..c74d417 100644 --- a/server/src/wled_controller/static/js/features/pattern-templates.js +++ b/server/src/wled_controller/static/js/features/pattern-templates.js @@ -675,8 +675,15 @@ function _patternCanvasMouseDown(e) { } } - // Test all rects in reverse order (top-most first). + // Test all rects; selected rect takes priority so it stays interactive + // even when overlapping with others. + const selIdx = patternEditorSelectedIdx; + const testOrder = []; + if (selIdx >= 0 && selIdx < patternEditorRects.length) testOrder.push(selIdx); for (let i = patternEditorRects.length - 1; i >= 0; i--) { + if (i !== selIdx) testOrder.push(i); + } + for (const i of testOrder) { const r = patternEditorRects[i]; const hit = _hitTestRect(mx, my, r, w, h); if (!hit) continue; @@ -733,7 +740,14 @@ function _patternCanvasMouseMove(e) { let cursor = 'default'; let newHoverIdx = -1; let newHoverHit = null; + // Selected rect takes priority for hover so edges stay reachable under overlaps + const selIdx = patternEditorSelectedIdx; + const hoverOrder = []; + if (selIdx >= 0 && selIdx < patternEditorRects.length) hoverOrder.push(selIdx); for (let i = patternEditorRects.length - 1; i >= 0; i--) { + if (i !== selIdx) hoverOrder.push(i); + } + for (const i of hoverOrder) { const hit = _hitTestRect(mx, my, patternEditorRects[i], w, h); if (hit) { cursor = _DIR_CURSORS[hit] || 'default';