{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "lib-use-dismiss",
  "type": "registry:lib",
  "title": "lib/use-dismiss",
  "description": "팝오버 바깥 클릭 / Esc 키로 닫기",
  "files": [
    {
      "path": "poc/design-system/implement/src/lib/use-dismiss.ts",
      "content": "import { type RefObject, useEffect, useLayoutEffect, useRef } from \"react\";\n\n/** 팝오버 바깥 클릭 / Esc 키로 닫기 */\nexport function useDismiss(\n  open: boolean,\n  refs: RefObject<HTMLElement | null>[],\n  onDismiss: (reason: \"outside\" | \"escape\") => void,\n) {\n  // 최신 콜백·ref 목록을 렌더가 끝난 뒤 반영 (렌더 중 ref 쓰기 금지)\n  const onDismissRef = useRef(onDismiss);\n  const refsRef = useRef(refs);\n  useLayoutEffect(() => {\n    onDismissRef.current = onDismiss;\n    refsRef.current = refs;\n  });\n\n  useEffect(() => {\n    if (!open) return;\n\n    function onPointerDown(e: PointerEvent) {\n      const target = e.target as Node;\n      if (refsRef.current.some((r) => r.current?.contains(target))) return;\n      onDismissRef.current(\"outside\");\n    }\n    function onKeyDown(e: KeyboardEvent) {\n      if (e.key === \"Escape\") onDismissRef.current(\"escape\");\n    }\n\n    document.addEventListener(\"pointerdown\", onPointerDown);\n    document.addEventListener(\"keydown\", onKeyDown);\n    return () => {\n      document.removeEventListener(\"pointerdown\", onPointerDown);\n      document.removeEventListener(\"keydown\", onKeyDown);\n    };\n  }, [open]);\n}\n",
      "type": "registry:lib",
      "target": "components/lib/use-dismiss.ts"
    }
  ],
  "categories": [
    "internal"
  ],
  "meta": {
    "version": "0.1.0"
  }
}
