{"version":3,"sources":["../../src/use-hover/index.ts"],"sourcesContent":["import { useEventListener } from '../use-event-listener'\nimport { useLatest } from '../use-latest'\nimport { useSafeState } from '../use-safe-state'\nimport { useTargetElement } from '../use-target-element'\n\nimport type { ElementTarget } from '../use-target-element'\n\nexport interface UseHoverOptions {\n  /**\n   * Delay in milliseconds before the `onEnter` event is triggered\n   */\n  delayEnter?: number\n  /**\n   * Delay in milliseconds before the `onLeave` event is triggered\n   */\n  delayLeave?: number\n  /**\n   * Event handler when the mouse enters the target element\n   */\n  onEnter?: (e: MouseEvent) => void\n  /**\n   * Event handler when the mouse leaves the target element\n   */\n  onLeave?: (e: MouseEvent) => void\n  /**\n   * Event handler when the mouse enters or leaves the target element\n   */\n  onChange?: (isHovered: boolean, e: MouseEvent) => void\n}\n\n/**\n * A React Hook that helps to track the hover state of an element.\n */\nexport function useHover<T extends HTMLElement = HTMLElement>(\n  target: ElementTarget<T>,\n  options: UseHoverOptions = {},\n): boolean {\n  const latest = useLatest(options)\n  const el = useTargetElement<T>(target)\n  const [isHovered, setIsHovered] = useSafeState(false)\n\n  useEventListener(el, 'mouseenter', (e) => {\n    const { delayEnter = 0 } = options\n\n    const trigger = () => {\n      setIsHovered(true)\n      latest.current.onEnter?.(e)\n      latest.current.onChange?.(true, e)\n    }\n\n    if (delayEnter <= 0) {\n      trigger()\n    } else {\n      setTimeout(() => trigger(), delayEnter)\n    }\n  })\n\n  useEventListener(el, 'mouseleave', (e) => {\n    const { delayLeave = 0 } = options\n\n    const trigger = () => {\n      setIsHovered(false)\n      latest.current.onLeave?.(e)\n      latest.current.onChange?.(false, e)\n    }\n\n    if (delayLeave <= 0) {\n      trigger()\n    } else {\n      setTimeout(() => trigger(), delayLeave)\n    }\n  })\n\n  return isHovered\n}\n"],"names":["useHover","target","options","latest","useLatest","el","useTargetElement","useSafeState","isHovered","setIsHovered","useEventListener","e","delayEnter","trigger","current","onEnter","onChange","setTimeout","delayLeave","onLeave"],"mappings":";;;;+BAiCgBA;;;eAAAA;;;gCAjCiB;yBACP;4BACG;gCACI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B1B,SAASA,SACdC,MAAwB;QACxBC,UAAAA,iEAA2B,CAAC;IAE5B,IAAMC,SAASC,IAAAA,oBAAS,EAACF;IACzB,IAAMG,KAAKC,IAAAA,kCAAgB,EAAIL;IAC/B,IAAkCM,iCAAAA,IAAAA,0BAAY,EAAC,YAAxCC,YAA2BD,kBAAhBE,eAAgBF;IAElCG,IAAAA,kCAAgB,EAACL,IAAI,cAAc,SAACM;QAClC,0BAA2BT,QAAnBU,YAAAA,8CAAa;QAErB,IAAMC,UAAU;gBAEdV,yBAAAA,iBACAA,0BAAAA;YAFAM,aAAa;aACbN,0BAAAA,CAAAA,kBAAAA,OAAOW,OAAO,EAACC,OAAO,cAAtBZ,8CAAAA,6BAAAA,iBAAyBQ;aACzBR,2BAAAA,CAAAA,mBAAAA,OAAOW,OAAO,EAACE,QAAQ,cAAvBb,+CAAAA,8BAAAA,kBAA0B,MAAMQ;QAClC;QAEA,IAAIC,cAAc,GAAG;YACnBC;QACF,OAAO;YACLI,WAAW;uBAAMJ;eAAWD;QAC9B;IACF;IAEAF,IAAAA,kCAAgB,EAACL,IAAI,cAAc,SAACM;QAClC,0BAA2BT,QAAnBgB,YAAAA,8CAAa;QAErB,IAAML,UAAU;gBAEdV,yBAAAA,iBACAA,0BAAAA;YAFAM,aAAa;aACbN,0BAAAA,CAAAA,kBAAAA,OAAOW,OAAO,EAACK,OAAO,cAAtBhB,8CAAAA,6BAAAA,iBAAyBQ;aACzBR,2BAAAA,CAAAA,mBAAAA,OAAOW,OAAO,EAACE,QAAQ,cAAvBb,+CAAAA,8BAAAA,kBAA0B,OAAOQ;QACnC;QAEA,IAAIO,cAAc,GAAG;YACnBL;QACF,OAAO;YACLI,WAAW;uBAAMJ;eAAWK;QAC9B;IACF;IAEA,OAAOV;AACT"}