diff --git a/src/uix/eidos/components/words/words-column-inserter.svelte b/src/uix/eidos/components/words/words-column-inserter.svelte index 90c5991fc..866cd0f3e 100644 --- a/src/uix/eidos/components/words/words-column-inserter.svelte +++ b/src/uix/eidos/components/words/words-column-inserter.svelte @@ -115,15 +115,30 @@ if (!ids) continue; const br = col.getBoundingClientRect(); if (br.bottom < cr.top + 4 || br.top > cr.bottom - 4) continue; + const empty = isColumnEmpty(col); + // Empty column → cover the whole column rect (large centered + // `+` is the invitation to start). Non-empty → only a thin + // strip at the bottom of the column. The wrap has + // pointer-events: none AND its trigger overlays the wrap area, + // so a tall non-empty wrap WOULD cover content blocks AND + // (more importantly) the auto-added trailing paragraph that + // follows atomic inserts (image / divider). Clicks intended + // for that paragraph would hit the `+` trigger instead, + // opening the dropdown when the user just wanted to type. + // The strip height matches the trigger button (~26px) + a + // small padding so it sits cleanly at the column bottom. + const stripH = 28; + const top = empty ? br.top - fr.top : br.bottom - fr.top - stripH; + const height = empty ? br.height : stripH; next.push({ columnsIdx: ids.columnsIdx, colIdx: ids.colIdx, - isEmpty: isColumnEmpty(col), + isEmpty: empty, rect: { - top: br.top - fr.top, + top, left: br.left - fr.left, width: br.width, - height: br.height + height } }); }