hono-preact

useDismiss

useDismiss registers an open overlay with a shared dismissal stack. Pressing Escape or pressing outside the overlay dismisses the topmost registered layer, so nested overlays close one at a time, innermost first.

See also: useFocusReturn, usePosition, useSafeArea.

Signature

import { useDismiss } from '@hono-preact/ui';

function useDismiss(opts: UseDismissOptions): void;

interface UseDismissOptions {
  enabled: boolean; // typically the open state
  refs: RefObject<HTMLElement>[]; // elements treated as inside (no outside-press)
  escape?: boolean; // default true
  outsidePress?: boolean; // default true
  onDismiss: (reason: 'escape' | 'outside-press') => void;
}

Options

OptionTypeDefaultNotes
enabledbooleannoneRegister only while open.
refsRefObject[]noneElements treated as inside (no outside-press).
escapebooleantrueDismiss on Escape.
outsidePressbooleantrueDismiss on an outside pointer press.
onDismiss(reason) => voidnoneCalled with 'escape' or 'outside-press'.

The listeners are document-level and capture-phase, attached once and shared across every registered layer, so adding overlays does not multiply listeners.

Example

import { useDismiss } from '@hono-preact/ui';
import { useRef } from 'preact/hooks';

function Panel({ open, onClose }: { open: boolean; onClose: () => void }) {
  const ref = useRef<HTMLDivElement>(null);
  useDismiss({
    enabled: open,
    refs: [ref],
    onDismiss: onClose,
  });
  return open ? <div ref={ref}>panel</div> : null;
}