atagen

malice

public
Star0
Watch0

Commit bf301cf5de2f

tarball

atagen <boss@atagen.co>2026-10-28 03:11 UTC

2 files changed+19-6
web: let the page take clicks again once typing stops

The hidden pointer made everything but the scroller ignore pointer events, and Vimium hints only elements that hit-testing can reach, so F found nothing after typing. Leaving the composer or pressing a key outside an editable field now restores pointer events while the cursor stays hidden until it moves.
Modified file: web/src/App.svelte+18 additions−5 deletions
@@ -336,19 +336,30 @@
336336 };
337337 let pointerAt: { x: number; y: number } | null = null;
338338 let pointerScroller: HTMLElement | null = null;
339+ const wakePointer = () => {
340+ document.documentElement.classList.remove('pointer-inert');
341+ pointerScroller?.removeAttribute('data-pointer-scroll');
342+ pointerScroller = null;
343+ };
339344 const hidePointer = (e: KeyboardEvent) => {
340- if (e.ctrlKey || e.metaKey || e.altKey || !isEditable(e.target)) return;
345+ if (!isEditable(e.target)) {
346+ wakePointer();
347+ return;
348+ }
349+ if (e.ctrlKey || e.metaKey || e.altKey) return;
341350 if (e.key.length !== 1 && e.key !== 'Backspace' && e.key !== 'Delete' && e.key !== 'Enter') return;
342351 const root = document.documentElement;
343- if (root.classList.contains('pointer-hidden')) return;
352+ if (root.classList.contains('pointer-inert')) return;
344353 pointerScroller = pointerAt ? scrollerAt(pointerAt.x, pointerAt.y) : null;
345354 pointerScroller?.setAttribute('data-pointer-scroll', '');
346- root.classList.add('pointer-hidden');
355+ root.classList.add('pointer-hidden', 'pointer-inert');
347356 };
348357 const showPointer = () => {
349358 document.documentElement.classList.remove('pointer-hidden');
350- pointerScroller?.removeAttribute('data-pointer-scroll');
351- pointerScroller = null;
359+ wakePointer();
360+ };
361+ const leaveEditable = (e: FocusEvent) => {
362+ if (isEditable(e.target)) wakePointer();
352363 };
353364 const movePointer = (e: PointerEvent) => {
354365 pointerAt = { x: e.clientX, y: e.clientY };
@@ -362,6 +373,7 @@
362373 window.addEventListener('keydown', hidePointer, true);
363374 window.addEventListener('pointermove', movePointer);
364375 window.addEventListener('pointerdown', showPointer);
376+ window.addEventListener('focusout', leaveEditable);
365377 const stopMuteSync = startMuteSync();
366378 const stopNotifications = startNotifications((roomId) => {
367379 selectedSpaceId = null;
@@ -379,6 +391,7 @@
379391 window.removeEventListener('keydown', hidePointer, true);
380392 window.removeEventListener('pointermove', movePointer);
381393 window.removeEventListener('pointerdown', showPointer);
394+ window.removeEventListener('focusout', leaveEditable);
382395 showPointer();
383396 disconnectEvents();
384397 stopTyping();
Modified file: web/src/app.css+1 additions−1 deletions
@@ -157,7 +157,7 @@ html, body, #app {
157157
158158 html.pointer-hidden, html.pointer-hidden * { cursor: none !important; }
159159 /* A still pointer keeps hovering whatever scrolls under it, lighting rows and the browser's link URL bubble. The scroller under it keeps the wheel. */
160-html.pointer-hidden body *:not([data-pointer-scroll]) { pointer-events: none !important; }
160+html.pointer-inert body *:not([data-pointer-scroll]) { pointer-events: none !important; }
161161
162162 body {
163163 background: var(--bg);