{"version":3,"file":"loadingOverlay.mjs","names":[],"sources":["../../../../package/common/loadingOverlay/loadingOverlay.tsx"],"sourcesContent":["import { useEffect, useId, useRef, useState, type ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport type { LoadingOverlayProps } from './loadingOverlay.types';\nimport styles from './loadingOverlay.module.pcss';\nimport Loader from '../loader';\nimport { useComponentDefaults } from '../configProvider';\n\nconst MIN_VISIBLE_MS = 400;\n/** The backdrop's opacity transition in loadingOverlay.module.pcss. */\nconst FADE_OUT_MS = 200;\n\ntype Phase = 'hidden' | 'shown' | 'leaving';\n\n/** Holds MIN_VISIBLE_MS once shown: a load ending just after the overlay appeared would flash it. */\nfunction usePhase(isLoading: boolean, delay: number): Phase {\n  const [phase, setPhase] = useState<Phase>(() => (isLoading && delay <= 0 ? 'shown' : 'hidden'));\n  const shownAt = useRef<number | null>(null);\n\n  useEffect(() => {\n    let next: Phase;\n    let wait: number;\n    if (isLoading) {\n      if (phase === 'shown') {\n        // Shown on the first render, so no timer stamped it.\n        shownAt.current ??= Date.now();\n        return;\n      }\n      next = 'shown';\n      // Still on screen while it fades, so it comes straight back rather than waiting again.\n      wait = phase === 'leaving' ? 0 : delay;\n    } else if (phase === 'shown') {\n      next = 'leaving';\n      wait = Math.max(0, (shownAt.current ?? 0) + MIN_VISIBLE_MS - Date.now());\n    } else if (phase === 'leaving') {\n      next = 'hidden';\n      wait = FADE_OUT_MS;\n    } else {\n      return;\n    }\n    const id = setTimeout(() => {\n      if (next === 'shown') shownAt.current = Date.now();\n      setPhase(next);\n    }, wait);\n    return () => clearTimeout(id);\n  }, [isLoading, phase, delay]);\n\n  return phase;\n}\n\nfunction LoadingOverlay(props: LoadingOverlayProps): ReactElement {\n  const {\n    isLoading = false,\n    children,\n    loader,\n    message,\n    delay = 200,\n    className,\n    style,\n    classNames,\n    styles: slotStyles,\n    ...rest\n  } = useComponentDefaults('LoadingOverlay', props);\n  const phase = usePhase(isLoading, delay);\n  const messageId = useId();\n  const hasMessage = message != null && typeof message !== 'boolean' && message !== '';\n\n  return (\n    <div {...rest} className={cx(styles.loadingOverlay, className)} style={style}>\n      <div\n        aria-busy={isLoading || undefined}\n        className={cx(styles.loadingOverlayContent, classNames?.content)}\n        style={slotStyles?.content}\n      >\n        {children}\n      </div>\n      {phase !== 'hidden' && (\n        <div\n          className={cx(\n            styles.loadingOverlayBackdrop,\n            phase === 'leaving' && styles.loadingOverlayBackdropLeaving,\n            classNames?.backdrop,\n          )}\n          style={slotStyles?.backdrop}\n        >\n          <div className={cx(styles.loadingOverlayPanel, classNames?.panel)} style={slotStyles?.panel}>\n            {loader ?? <Loader aria-labelledby={hasMessage ? messageId : undefined} />}\n            {hasMessage && (\n              <div\n                id={messageId}\n                className={cx(styles.loadingOverlayMessage, classNames?.message)}\n                style={slotStyles?.message}\n              >\n                {message}\n              </div>\n            )}\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default LoadingOverlay;\n"],"mappings":"iUAQA,IAAM,EAAiB,IAEjB,EAAc,IAKpB,SAAS,EAAS,EAAoB,EAAsB,CAC1D,GAAM,CAAC,EAAO,GAAY,MAAuB,GAAa,GAAS,EAAI,QAAU,QAAS,EACxF,EAAU,EAAsB,IAAI,EA8B1C,OA5BA,MAAgB,CACd,IAAI,EACA,EACJ,GAAI,EAAW,CACb,GAAI,IAAU,QAAS,CAErB,EAAQ,UAAY,KAAK,IAAI,EAC7B,MACF,CACA,EAAO,QAEP,EAAO,IAAU,UAAY,EAAI,CACnC,MAAO,GAAI,IAAU,QACnB,EAAO,UACP,EAAO,KAAK,IAAI,GAAI,EAAQ,SAAW,GAAK,EAAiB,KAAK,IAAI,CAAC,OAClE,GAAI,IAAU,UACnB,EAAO,SACP,EAAO,OAEP,OAEF,IAAM,EAAK,eAAiB,CACtB,IAAS,UAAS,EAAQ,QAAU,KAAK,IAAI,GACjD,EAAS,CAAI,CACf,EAAG,CAAI,EACP,UAAa,aAAa,CAAE,CAC9B,EAAG,CAAC,EAAW,EAAO,CAAK,CAAC,EAErB,CACT,CAEA,SAAS,EAAe,EAA0C,CAChE,GAAM,CACJ,YAAY,GACZ,WACA,SACA,UACA,QAAQ,IACR,YACA,QACA,aACA,OAAQ,EACR,GAAG,GACD,EAAqB,iBAAkB,CAAK,EAC1C,EAAQ,EAAS,EAAW,CAAK,EACjC,EAAY,EAAM,EAClB,EAAa,GAAW,MAAQ,OAAO,GAAY,WAAa,IAAY,GAElF,OACE,EAAC,MAAD,CAAK,GAAI,EAAM,UAAW,EAAG,EAAO,eAAgB,CAAS,EAAU,QAAvE,SAAA,CACE,EAAC,MAAD,CACE,YAAW,GAAa,IAAA,GACxB,UAAW,EAAG,EAAO,sBAAuB,GAAY,OAAO,EAC/D,MAAO,GAAY,QAElB,UACE,CAAA,EACJ,IAAU,UACT,EAAC,MAAD,CACE,UAAW,EACT,EAAO,uBACP,IAAU,WAAa,EAAO,8BAC9B,GAAY,QACd,EACA,MAAO,GAAY,SAEnB,SAAA,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,oBAAqB,GAAY,KAAK,EAAG,MAAO,GAAY,MAAtF,SAAA,CACG,GAAU,EAAC,EAAD,CAAQ,kBAAiB,EAAa,EAAY,IAAA,EAAY,CAAA,EACxE,GACC,EAAC,MAAD,CACE,GAAI,EACJ,UAAW,EAAG,EAAO,sBAAuB,GAAY,OAAO,EAC/D,MAAO,GAAY,QAElB,SAAA,CACE,CAAA,CAEJ,GACF,CAAA,CAEJ,GAET"}