{"version":3,"file":"loader.mjs","names":[],"sources":["../../../../package/common/loader/loader.tsx"],"sourcesContent":["import { useEffect, type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport cx from 'classnames';\n\nimport { LoaderType } from './loader.types';\nimport type { LoaderLabels, LoaderProps } from './loader.types';\nimport styles from './loader.module.pcss';\nimport { useComponentDefaults, useLabels } from '../configProvider';\nimport { ThemeColor } from '../themeProvider/color.types';\nimport { toneProps, useToneCheck } from '../styles/tone';\nimport { isDev } from '../utils/isDev';\n\nconst DEFAULT_LABELS: Required<LoaderLabels> = {\n  loading: 'Loading',\n};\n\nfunction parts(count: number, className: string): ReactNode {\n  return Array.from({ length: count }, (_, index) => <span key={index} className={className} />);\n}\n\nfunction spinner(): ReactNode {\n  return (\n    <svg className={styles.loaderSpinner} viewBox='0 0 50 50'>\n      <circle className={styles.loaderSpinnerTrack} cx='25' cy='25' r='20' />\n      <circle className={styles.loaderSpinnerArc} cx='25' cy='25' r='20' />\n    </svg>\n  );\n}\n\n// A Map, so a type from untyped code or a JSON config can never hit an Object.prototype key.\nconst FIGURE_BY_TYPE = new Map<string, () => ReactNode>(\n  Object.entries({\n    [LoaderType.Spinner]: spinner,\n    [LoaderType.Comet]: () => (\n      <span className={styles.loaderComet}>\n        <span className={styles.loaderCometTail} />\n        <span className={styles.loaderCometHead} />\n      </span>\n    ),\n    [LoaderType.Dots]: () => <span className={styles.loaderDots}>{parts(3, styles.loaderDot)}</span>,\n    [LoaderType.Bars]: () => <span className={styles.loaderBars}>{parts(5, styles.loaderBar)}</span>,\n    [LoaderType.Pulse]: () => (\n      <span className={styles.loaderPulse}>\n        {parts(2, styles.loaderPulseRing)}\n        <span className={styles.loaderPulseCore} />\n      </span>\n    ),\n  } satisfies Record<LoaderType, () => ReactNode>),\n);\n\nfunction useTypeCheck(type: string): void {\n  useEffect(() => {\n    if (isDev() && !FIGURE_BY_TYPE.has(type)) {\n      console.warn(`Loader: \\`type\\` takes a LoaderType, and got '${type}'. Drawing the spinner instead.`);\n    }\n  }, [type]);\n}\n\nfunction Loader(props: LoaderProps): ReactElement {\n  const {\n    type = LoaderType.Spinner,\n    size = '2.5em',\n    color = ThemeColor.Primary,\n    labels,\n    className,\n    style,\n    ...rest\n  } = useComponentDefaults('Loader', props);\n  const text = useLabels('Loader', labels, DEFAULT_LABELS);\n  const tone = toneProps(color);\n  useToneCheck('Loader', [color]);\n  useTypeCheck(type);\n  const figure = FIGURE_BY_TYPE.get(type) ?? spinner;\n\n  return (\n    <span\n      {...rest}\n      role='progressbar'\n      aria-label={text.loading}\n      className={cx(styles.loader, type === LoaderType.Dots && styles.loaderOnBaseline, tone.className, className)}\n      style={\n        { '--loader-size': typeof size === 'number' ? `${size}px` : size, ...tone.style, ...style } as CSSProperties\n      }\n    >\n      {figure()}\n    </span>\n  );\n}\n\nexport default Loader;\n"],"mappings":"sgBAWA,IAAM,EAAyC,CAC7C,QAAS,SACX,EAEA,SAAS,EAAM,EAAe,EAA8B,CAC1D,OAAO,MAAM,KAAK,CAAE,OAAQ,CAAM,GAAI,EAAG,IAAU,EAAC,OAAD,CAA6B,WAAY,EAA9B,CAA8B,CAAC,CAC/F,CAEA,SAAS,GAAqB,CAC5B,OACE,EAAC,MAAD,CAAK,UAAW,EAAO,cAAe,QAAQ,YAA9C,SAAA,CACE,EAAC,SAAD,CAAQ,UAAW,EAAO,mBAAoB,GAAG,KAAK,GAAG,KAAK,EAAE,IAAM,CAAA,EACtE,EAAC,SAAD,CAAQ,UAAW,EAAO,iBAAkB,GAAG,KAAK,GAAG,KAAK,EAAE,IAAM,CAAA,CACjE,GAET,CAGA,IAAM,EAAiB,IAAI,IACzB,OAAO,QAAQ,EACZ,EAAW,SAAU,GACrB,EAAW,WACV,EAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,CACE,EAAC,OAAD,CAAM,UAAW,EAAO,eAAkB,CAAA,EAC1C,EAAC,OAAD,CAAM,UAAW,EAAO,eAAkB,CAAA,CACtC,KAEP,EAAW,UAAa,EAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAM,EAAG,EAAO,SAAS,CAAQ,CAAA,GAC9F,EAAW,UAAa,EAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAM,EAAG,EAAO,SAAS,CAAQ,CAAA,GAC9F,EAAW,WACV,EAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,CACG,EAAM,EAAG,EAAO,eAAe,EAChC,EAAC,OAAD,CAAM,UAAW,EAAO,eAAkB,CAAA,CACtC,GAEV,CAA+C,CACjD,EAEA,SAAS,EAAa,EAAoB,CACxC,MAAgB,CACV,EAAM,GAAK,CAAC,EAAe,IAAI,CAAI,GACrC,QAAQ,KAAK,iDAAiD,EAAK,gCAAgC,CAEvG,EAAG,CAAC,CAAI,CAAC,CACX,CAEA,SAAS,EAAO,EAAkC,CAChD,GAAM,CACJ,OAAO,EAAW,QAClB,OAAO,QACP,QAAQ,EAAW,QACnB,SACA,YACA,QACA,GAAG,GACD,EAAqB,SAAU,CAAK,EAClC,EAAO,EAAU,SAAU,EAAQ,CAAc,EACjD,EAAO,EAAU,CAAK,EAC5B,EAAa,SAAU,CAAC,CAAK,CAAC,EAC9B,EAAa,CAAI,EACjB,IAAM,EAAS,EAAe,IAAI,CAAI,GAAK,EAE3C,OACE,EAAC,OAAD,CACE,GAAI,EACJ,KAAK,cACL,aAAY,EAAK,QACjB,UAAW,EAAG,EAAO,OAAQ,IAAS,EAAW,MAAQ,EAAO,iBAAkB,EAAK,UAAW,CAAS,EAC3G,MACE,CAAE,gBAAiB,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,EAAM,GAAG,EAAK,MAAO,GAAG,CAAM,EAG3F,SAAA,EAAO,CACJ,CAAA,CAEV"}