import React from 'react'; import { createPortal } from 'react-dom'; import classNames from 'classnames'; import { Loader as CoreLoader, type LoaderProps as CoreLoaderProps } from '@shoptet/ui-core-web'; import type { Exact, SafeOmit } from '@shoptet/utils'; import type { OmitPrivate, SafeExtract, Size } from '../../types'; export interface InheritedCoreLoaderProps extends SafeOmit, 'a11yLabel'> {} export interface LoaderOwnProps extends InheritedCoreLoaderProps { /** * Size of the loader. */ size?: SafeExtract; /** * Whether the loader should be displayed fullscreen (rendered in a portal). * When true, the loader is rendered over the entire screen. */ fullscreen?: boolean; /** * Accessible label describing what is loading. Defaults to the translated "Loading…" string. */ label?: string; } export interface LoaderProps extends LoaderOwnProps {} export const Loader: React.FC = ({ fullscreen, size = 'lg', label, ...coreLoaderProps }: LoaderProps) => { coreLoaderProps satisfies Exact; const LoaderElement = ( ); const LoaderContainer = (
{LoaderElement}
); return fullscreen ? createPortal(LoaderContainer, document.body) : LoaderElement; };