'use client'; import { useEffect, useState } from 'react'; import { loadComponent } from '@/lib/material-components'; const sizeMap = { small: '24px', medium: '48px', large: '64px', } as const; interface LoadingSpinnerProps { size?: 'small' | 'medium' | 'large'; inline?: boolean; /** Занимает всё доступное пространство страницы - предотвращает layout shift */ fullPage?: boolean; } export function LoadingSpinner({ size = 'medium', inline = false, fullPage = false, }: LoadingSpinnerProps) { const [mounted, setMounted] = useState(false); const [componentsLoaded, setComponentsLoaded] = useState(false); useEffect(() => { setMounted(true); loadComponent('circular-progress').then(() => { setComponentsLoaded(true); }); }, []); // Стили для fullPage режима - занимает всё пространство, предотвращает дёрганье const fullPageStyle: React.CSSProperties = fullPage ? { display: 'flex', justifyContent: 'center', alignItems: 'center', width: '100%', height: '100%', minHeight: '100%', flex: 1, background: 'var(--md-sys-color-background)', } : {}; if (!mounted || !componentsLoaded) { if (inline) { return ( progress_activity ); } if (fullPage) { return (
progress_activity
); } return
Загрузка...
; } return (
); }