{"version":3,"file":"useChromeIdle.mjs","names":[],"sources":["../../../src/Image/viewer/useChromeIdle.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nconst IDLE_HIDE_MS = 2000;\n\nexport interface UseChromeIdleResult {\n  hidden: boolean;\n  ref: (node: HTMLDivElement | null) => void;\n  setHeld: (held: boolean) => void;\n}\n\nexport const useChromeIdle = (): UseChromeIdleResult => {\n  const [hidden, setHidden] = useState(false);\n  const nodeRef = useRef<HTMLDivElement | null>(null);\n  const overChromeRef = useRef(false);\n  const heldRef = useRef(false);\n  const timerRef = useRef<number | null>(null);\n\n  const clearTimer = useCallback(() => {\n    if (timerRef.current === null) return;\n    window.clearTimeout(timerRef.current);\n    timerRef.current = null;\n  }, []);\n\n  const arm = useCallback(() => {\n    clearTimer();\n    timerRef.current = window.setTimeout(function fire() {\n      timerRef.current = null;\n      const node = nodeRef.current;\n      const active = document.activeElement;\n      const focusWithin = Boolean(node && active && node.contains(active));\n      if (overChromeRef.current || heldRef.current || focusWithin) {\n        timerRef.current = window.setTimeout(fire, IDLE_HIDE_MS);\n        return;\n      }\n      setHidden(true);\n    }, IDLE_HIDE_MS);\n  }, [clearTimer]);\n\n  const wake = useCallback(() => {\n    setHidden(false);\n    arm();\n  }, [arm]);\n\n  useEffect(() => {\n    const handlePointerMove = (event: PointerEvent) => {\n      overChromeRef.current = Boolean(\n        event.target instanceof Node && nodeRef.current?.contains(event.target),\n      );\n      wake();\n    };\n    const handleActivity = () => wake();\n\n    document.addEventListener('pointermove', handlePointerMove);\n    document.addEventListener('pointerdown', handleActivity);\n    document.addEventListener('wheel', handleActivity, { passive: true });\n    document.addEventListener('keydown', handleActivity);\n    arm();\n\n    return () => {\n      document.removeEventListener('pointermove', handlePointerMove);\n      document.removeEventListener('pointerdown', handleActivity);\n      document.removeEventListener('wheel', handleActivity);\n      document.removeEventListener('keydown', handleActivity);\n      clearTimer();\n    };\n  }, [arm, clearTimer, wake]);\n\n  const setHeld = useCallback(\n    (held: boolean) => {\n      heldRef.current = held;\n      if (held) wake();\n    },\n    [wake],\n  );\n\n  const ref = useCallback((node: HTMLDivElement | null) => {\n    nodeRef.current = node;\n  }, []);\n\n  return { hidden, ref, setHeld };\n};\n"],"mappings":";;;AAIA,MAAM,eAAe;AAQrB,MAAa,sBAA2C;CACtD,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,UAAU,OAA8B,IAAI;CAClD,MAAM,gBAAgB,OAAO,KAAK;CAClC,MAAM,UAAU,OAAO,KAAK;CAC5B,MAAM,WAAW,OAAsB,IAAI;CAE3C,MAAM,aAAa,kBAAkB;EACnC,IAAI,SAAS,YAAY,MAAM;EAC/B,OAAO,aAAa,SAAS,OAAO;EACpC,SAAS,UAAU;CACrB,GAAG,CAAC,CAAC;CAEL,MAAM,MAAM,kBAAkB;EAC5B,WAAW;EACX,SAAS,UAAU,OAAO,WAAW,SAAS,OAAO;GACnD,SAAS,UAAU;GACnB,MAAM,OAAO,QAAQ;GACrB,MAAM,SAAS,SAAS;GACxB,MAAM,cAAc,QAAQ,QAAQ,UAAU,KAAK,SAAS,MAAM,CAAC;GACnE,IAAI,cAAc,WAAW,QAAQ,WAAW,aAAa;IAC3D,SAAS,UAAU,OAAO,WAAW,MAAM,YAAY;IACvD;GACF;GACA,UAAU,IAAI;EAChB,GAAG,YAAY;CACjB,GAAG,CAAC,UAAU,CAAC;CAEf,MAAM,OAAO,kBAAkB;EAC7B,UAAU,KAAK;EACf,IAAI;CACN,GAAG,CAAC,GAAG,CAAC;CAER,gBAAgB;EACd,MAAM,qBAAqB,UAAwB;GACjD,cAAc,UAAU,QACtB,MAAM,kBAAkB,QAAQ,QAAQ,SAAS,SAAS,MAAM,MAAM,CACxE;GACA,KAAK;EACP;EACA,MAAM,uBAAuB,KAAK;EAElC,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,SAAS,iBAAiB,eAAe,cAAc;EACvD,SAAS,iBAAiB,SAAS,gBAAgB,EAAE,SAAS,KAAK,CAAC;EACpE,SAAS,iBAAiB,WAAW,cAAc;EACnD,IAAI;EAEJ,aAAa;GACX,SAAS,oBAAoB,eAAe,iBAAiB;GAC7D,SAAS,oBAAoB,eAAe,cAAc;GAC1D,SAAS,oBAAoB,SAAS,cAAc;GACpD,SAAS,oBAAoB,WAAW,cAAc;GACtD,WAAW;EACb;CACF,GAAG;EAAC;EAAK;EAAY;CAAI,CAAC;CAE1B,MAAM,UAAU,aACb,SAAkB;EACjB,QAAQ,UAAU;EAClB,IAAI,MAAM,KAAK;CACjB,GACA,CAAC,IAAI,CACP;CAMA,OAAO;EAAE;EAAQ,KAJL,aAAa,SAAgC;GACvD,QAAQ,UAAU;EACpB,GAAG,CAAC,CAEe;EAAG;CAAQ;AAChC"}