{
  "version": 3,
  "sources": ["../../src/modal/use-modal-exit-animation.ts"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useReducedMotion } from '@wordpress/compose';\nimport { useCallback, useRef, useState } from '@wordpress/element';\nimport warning from '@wordpress/warning';\n\n/**\n * Internal dependencies\n */\nimport { CONFIG } from '../utils';\n\n// Animation duration (ms) extracted to JS in order to be used on a setTimeout.\nconst FRAME_ANIMATION_DURATION = CONFIG.transitionDuration;\nconst FRAME_ANIMATION_DURATION_NUMBER = Number.parseInt(CONFIG.transitionDuration);\nconst EXIT_ANIMATION_NAME = 'components-modal__disappear-animation';\nexport function useModalExitAnimation() {\n  const frameRef = useRef(null);\n  const [isAnimatingOut, setIsAnimatingOut] = useState(false);\n  const isReducedMotion = useReducedMotion();\n  const closeModal = useCallback(() => new Promise(closeModalResolve => {\n    // Grab a \"stable\" reference of the frame element, since\n    // the value held by the react ref might change at runtime.\n    const frameEl = frameRef.current;\n    if (isReducedMotion) {\n      closeModalResolve();\n      return;\n    }\n    if (!frameEl) {\n      globalThis.SCRIPT_DEBUG === true ? warning(\"wp.components.Modal: the Modal component can't be closed with an exit animation because of a missing reference to the modal frame element.\") : void 0;\n      closeModalResolve();\n      return;\n    }\n    let handleAnimationEnd;\n    const startAnimation = () => new Promise(animationResolve => {\n      handleAnimationEnd = e => {\n        if (e.animationName === EXIT_ANIMATION_NAME) {\n          animationResolve();\n        }\n      };\n      frameEl.addEventListener('animationend', handleAnimationEnd);\n      setIsAnimatingOut(true);\n    });\n    const animationTimeout = () => new Promise(timeoutResolve => {\n      setTimeout(() => timeoutResolve(),\n      // Allow an extra 20% of the animation duration for the\n      // animationend event to fire, in case the animation frame is\n      // slightly delayes by some other events in the event loop.\n      FRAME_ANIMATION_DURATION_NUMBER * 1.2);\n    });\n    Promise.race([startAnimation(), animationTimeout()]).then(() => {\n      if (handleAnimationEnd) {\n        frameEl.removeEventListener('animationend', handleAnimationEnd);\n      }\n      setIsAnimatingOut(false);\n      closeModalResolve();\n    });\n  }), [isReducedMotion]);\n  return {\n    overlayClassname: isAnimatingOut ? 'is-animating-out' : undefined,\n    frameRef,\n    frameStyle: {\n      '--modal-frame-animation-duration': `${FRAME_ANIMATION_DURATION}`\n    },\n    closeModal\n  };\n}"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAAiC;AACjC,qBAA8C;AAC9C,qBAAoB;AAKpB,mBAAuB;AAGvB,IAAM,2BAA2B,oBAAO;AACxC,IAAM,kCAAkC,OAAO,SAAS,oBAAO,kBAAkB;AACjF,IAAM,sBAAsB;AACrB,SAAS,wBAAwB;AACtC,QAAM,eAAW,uBAAO,IAAI;AAC5B,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,sBAAkB,iCAAiB;AACzC,QAAM,iBAAa,4BAAY,MAAM,IAAI,QAAQ,uBAAqB;AAGpE,UAAM,UAAU,SAAS;AACzB,QAAI,iBAAiB;AACnB,wBAAkB;AAClB;AAAA,IACF;AACA,QAAI,CAAC,SAAS;AACZ,iBAAW,iBAAiB,WAAO,eAAAA,SAAQ,4IAA4I,IAAI;AAC3L,wBAAkB;AAClB;AAAA,IACF;AACA,QAAI;AACJ,UAAM,iBAAiB,MAAM,IAAI,QAAQ,sBAAoB;AAC3D,2BAAqB,OAAK;AACxB,YAAI,EAAE,kBAAkB,qBAAqB;AAC3C,2BAAiB;AAAA,QACnB;AAAA,MACF;AACA,cAAQ,iBAAiB,gBAAgB,kBAAkB;AAC3D,wBAAkB,IAAI;AAAA,IACxB,CAAC;AACD,UAAM,mBAAmB,MAAM,IAAI,QAAQ,oBAAkB;AAC3D;AAAA,QAAW,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA,QAIhC,kCAAkC;AAAA,MAAG;AAAA,IACvC,CAAC;AACD,YAAQ,KAAK,CAAC,eAAe,GAAG,iBAAiB,CAAC,CAAC,EAAE,KAAK,MAAM;AAC9D,UAAI,oBAAoB;AACtB,gBAAQ,oBAAoB,gBAAgB,kBAAkB;AAAA,MAChE;AACA,wBAAkB,KAAK;AACvB,wBAAkB;AAAA,IACpB,CAAC;AAAA,EACH,CAAC,GAAG,CAAC,eAAe,CAAC;AACrB,SAAO;AAAA,IACL,kBAAkB,iBAAiB,qBAAqB;AAAA,IACxD;AAAA,IACA,YAAY;AAAA,MACV,oCAAoC,GAAG,wBAAwB;AAAA,IACjE;AAAA,IACA;AAAA,EACF;AACF;",
  "names": ["warning"]
}
