{"version":3,"file":"useCountdownHover-t9O7DHoK.mjs","names":[],"sources":["../src/composables/useCountdown.ts","../src/composables/useCountdownHover.ts"],"sourcesContent":["import {useDocumentVisibility, useTimestamp, type UseTimestampOptions} from '@vueuse/core'\nimport {computed, type MaybeRefOrGetter, readonly, ref, toRef, watch} from 'vue'\n\n/**\n * A simple interval timer that counts down the remaining seconds\n *\n * @param {MaybeRefOrGetter<number>} length the total amount of time to loop through in ms\n * @param {MaybeRefOrGetter<number>} interval how often the interval should refresh. Default 1000\n * @param {Readonly<UseIntervalFnOptions>} intervalOpts opts to pass to the interval fn. Default {}\n */\nexport const useCountdown = (\n  length: MaybeRefOrGetter<number>,\n  interval: number | 'requestAnimationFrame',\n  timestampOpts: UseTimestampOptions<true> = {}\n) => {\n  const resolvedLength = readonly(toRef(length))\n\n  const isPaused = ref(false)\n\n  const target = ref(Date.now() + resolvedLength.value)\n\n  const {isActive, pause, resume, timestamp} = useTimestamp({\n    interval,\n    controls: true,\n    callback: (v) => {\n      if (v >= target.value) {\n        isPaused.value = false\n        pause()\n      }\n    },\n    ...timestampOpts,\n  })\n\n  // Watch for document visibility changes to handle tab switching\n  // When tab becomes visible again, check if countdown has already expired\n  const visibility = useDocumentVisibility()\n  watch(visibility, (newVisibility) => {\n    if (newVisibility === 'visible' && isActive.value && !isPaused.value) {\n      // Check if the countdown has already expired while tab was inactive\n      if (Date.now() >= target.value) {\n        isPaused.value = false\n        pause()\n      }\n    }\n  })\n\n  const value = computed(() => target.value - timestamp.value)\n\n  const restart = () => {\n    target.value = Date.now() + resolvedLength.value\n    resume()\n  }\n  watch(resolvedLength, () => {\n    if (resolvedLength.value > 0) {\n      restart()\n    }\n  })\n\n  const myPause = () => {\n    isPaused.value = true\n    pause()\n  }\n  const myResume = () => {\n    isPaused.value = false\n    const remainingTime = target.value - timestamp.value\n    target.value = Date.now() + remainingTime\n    resume()\n  }\n  const stop = () => {\n    pause()\n    timestamp.value = target.value\n    isPaused.value = false\n  }\n\n  return {\n    isActive: readonly(isActive),\n    isPaused: readonly(isPaused),\n    stop,\n    pause: myPause,\n    resume: myResume,\n    restart,\n    value,\n  }\n}\n","import {useElementHover} from '@vueuse/core'\nimport {type MaybeRefOrGetter, type Ref, toValue, watch} from 'vue'\n\nexport const useCountdownHover = (\n  element: Ref<HTMLElement | null>,\n  {\n    modelValueIgnoresHover,\n    noHoverPause,\n    noResumeOnHoverLeave,\n  }: {\n    noHoverPause?: MaybeRefOrGetter<boolean>\n    noResumeOnHoverLeave?: MaybeRefOrGetter<boolean>\n    /**\n     * Countdown/hover rules don't apply to static model-values (boolean)\n     */\n    modelValueIgnoresHover?: MaybeRefOrGetter<boolean>\n  },\n  actions: {\n    pause: () => void\n    resume: () => void\n  }\n) => {\n  const isHovering = useElementHover(element)\n\n  const onMouseEnter = () => {\n    if (toValue(noHoverPause)) return\n    actions.pause()\n  }\n  const onMouseLeave = () => {\n    if (toValue(noResumeOnHoverLeave)) return\n    actions.resume()\n  }\n\n  watch(isHovering, (newValue) => {\n    if (toValue(modelValueIgnoresHover)) return\n    if (newValue) {\n      onMouseEnter()\n      return\n    }\n    onMouseLeave()\n  })\n\n  return {\n    isHovering,\n  }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,gBACX,QACA,UACA,gBAA2C,EAAE,KAC1C;CACH,MAAM,iBAAiB,SAAS,MAAM,OAAO,CAAC;CAE9C,MAAM,WAAW,IAAI,MAAM;CAE3B,MAAM,SAAS,IAAI,KAAK,KAAK,GAAG,eAAe,MAAM;CAErD,MAAM,EAAC,UAAU,OAAO,QAAQ,cAAa,aAAa;EACxD;EACA,UAAU;EACV,WAAW,MAAM;AACf,OAAI,KAAK,OAAO,OAAO;AACrB,aAAS,QAAQ;AACjB,WAAO;;;EAGX,GAAG;EACJ,CAAC;AAKF,OADmB,uBAAuB,GACvB,kBAAkB;AACnC,MAAI,kBAAkB,aAAa,SAAS,SAAS,CAAC,SAAS;OAEzD,KAAK,KAAK,IAAI,OAAO,OAAO;AAC9B,aAAS,QAAQ;AACjB,WAAO;;;GAGX;CAEF,MAAM,QAAQ,eAAe,OAAO,QAAQ,UAAU,MAAM;CAE5D,MAAM,gBAAgB;AACpB,SAAO,QAAQ,KAAK,KAAK,GAAG,eAAe;AAC3C,UAAQ;;AAEV,OAAM,sBAAsB;AAC1B,MAAI,eAAe,QAAQ,EACzB,UAAS;GAEX;CAEF,MAAM,gBAAgB;AACpB,WAAS,QAAQ;AACjB,SAAO;;CAET,MAAM,iBAAiB;AACrB,WAAS,QAAQ;EACjB,MAAM,gBAAgB,OAAO,QAAQ,UAAU;AAC/C,SAAO,QAAQ,KAAK,KAAK,GAAG;AAC5B,UAAQ;;CAEV,MAAM,aAAa;AACjB,SAAO;AACP,YAAU,QAAQ,OAAO;AACzB,WAAS,QAAQ;;AAGnB,QAAO;EACL,UAAU,SAAS,SAAS;EAC5B,UAAU,SAAS,SAAS;EAC5B;EACA,OAAO;EACP,QAAQ;EACR;EACA;EACD;;;;AC/EH,IAAa,qBACX,SACA,EACE,wBACA,cACA,wBASF,YAIG;CACH,MAAM,aAAa,gBAAgB,QAAQ;CAE3C,MAAM,qBAAqB;AACzB,MAAI,QAAQ,aAAa,CAAE;AAC3B,UAAQ,OAAO;;CAEjB,MAAM,qBAAqB;AACzB,MAAI,QAAQ,qBAAqB,CAAE;AACnC,UAAQ,QAAQ;;AAGlB,OAAM,aAAa,aAAa;AAC9B,MAAI,QAAQ,uBAAuB,CAAE;AACrC,MAAI,UAAU;AACZ,iBAAc;AACd;;AAEF,gBAAc;GACd;AAEF,QAAO,EACL,YACD"}