{ e.preventDefault(); cancelPress(); openAt(e.clientX, e.clientY); }} onkeydown={(e) => { if (e.key === 'ContextMenu' || (e.key === 'F10' && e.shiftKey)) { e.preventDefault(); const r = area.getBoundingClientRect(); openAt(r.left + 8, r.top + Math.min(r.height, 32)); } }} onpointerdown={(e) => { if (e.pointerType !== 'touch') return; press = { x: e.clientX, y: e.clientY, timer: setTimeout(() => { if (press) openAt(press.x, press.y); press = undefined; }, 500) }; }} onpointermove={(e) => { // A finger that moves is scrolling, not pressing. if (press && Math.hypot(e.clientX - press.x, e.clientY - press.y) > 10) cancelPress(); }} onpointerup={cancelPress} onpointercancel={cancelPress} > {@render children()} Right-click, long-press or press Shift+F10 for options.
{#snippet trigger(props)} {/snippet} {@render menu()}