码桶

发现社区成员的开源项目

main
TabSkeleton.jsx5.5 KB
import React from 'react';

const SkeletonHeader = () => (
    <div className="skeleton-header">
        <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
            <div className="skeleton" style={{ width: '20px', height: '20px', borderRadius: '4px' }} />
            <div className="skeleton" style={{ width: '120px', height: '20px' }} />
        </div>
        <div className="skeleton" style={{ width: '32px', height: '28px', borderRadius: '6px' }} />
    </div>
);

const SettingsSkeleton = () => (
    <div style={{ display: 'flex', flexDirection: 'column', gap: '1.5rem' }}>
        <SkeletonHeader />
        {[1, 2, 3].map(i => (
            <div key={i} className="skeleton-card">
                <div className="skeleton-card-inner">
                    <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
                        <div className="skeleton" style={{ width: '8px', height: '8px', borderRadius: '50%' }} />
                        <div className="skeleton" style={{ width: `${100 + i * 20}px`, height: '16px' }} />
                    </div>
                    <div className="skeleton" style={{ width: '40px', height: '22px', borderRadius: '11px' }} />
                </div>
                <div className="skeleton" style={{ width: '80%', height: '12px', marginTop: '4px' }} />
            </div>
        ))}
    </div>
);

const ListSkeleton = () => (
    <div style={{ display: 'flex', flexDirection: 'column', gap: '1.5rem' }}>
        <SkeletonHeader />
        <div className="skeleton" style={{ width: '60%', height: '12px', marginTop: '-1rem', marginBottom: '0.25rem' }} />
        {[1, 2, 3, 4].map(i => (
            <div key={i} className="skeleton-card" style={{ padding: '0.85rem 1rem' }}>
                <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
                    <div style={{ display: 'flex', alignItems: 'center', gap: '8px', flex: 1 }}>
                        <div className="skeleton" style={{ width: `${140 + i * 15}px`, height: '16px' }} />
                        <div className="skeleton" style={{ width: '50px', height: '18px', borderRadius: '10px' }} />
                    </div>
                    <div style={{ display: 'flex', gap: '6px' }}>
                        <div className="skeleton" style={{ width: '28px', height: '28px', borderRadius: '6px' }} />
                        <div className="skeleton" style={{ width: '28px', height: '28px', borderRadius: '6px' }} />
                    </div>
                </div>
                <div className="skeleton" style={{ width: '90%', height: '11px', marginTop: '0.5rem' }} />
            </div>
        ))}
    </div>
);

const AnalyticsSkeleton = () => (
    <div style={{ display: 'flex', flexDirection: 'column', gap: '1.5rem' }}>
        <div className="skeleton-header">
            <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
                <div className="skeleton" style={{ width: '20px', height: '20px', borderRadius: '4px' }} />
                <div className="skeleton" style={{ width: '130px', height: '20px' }} />
            </div>
            <div style={{ display: 'flex', gap: '6px' }}>
                {[1, 2, 3].map(i => (
                    <div key={i} className="skeleton" style={{ width: '42px', height: '28px', borderRadius: '6px' }} />
                ))}
            </div>
        </div>
        <div className="skeleton-cards-grid">
            {[1, 2].map(i => (
                <div key={i} className="skeleton-card">
                    <div className="skeleton" style={{ width: '80px', height: '12px', marginBottom: '0.75rem' }} />
                    <div className="skeleton" style={{ width: '100px', height: '28px' }} />
                </div>
            ))}
        </div>
        <div className="skeleton-card" style={{ padding: '1.25rem' }}>
            <div className="skeleton" style={{ width: '100px', height: '16px', marginBottom: '1rem' }} />
            {[100, 80, 55, 35, 20].map((w, i) => (
                <div key={i} style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '0.5rem' }}>
                    <div className="skeleton" style={{ width: '40px', height: '14px' }} />
                    <div className="skeleton" style={{ flex: 1, height: '20px', maxWidth: `${w}%` }} />
                    <div className="skeleton" style={{ width: '45px', height: '14px' }} />
                </div>
            ))}
        </div>
    </div>
);

const CacheSkeleton = () => (
    <div style={{ display: 'flex', flexDirection: 'column', gap: '1.5rem' }}>
        <SkeletonHeader />
        <div className="skeleton-card">
            <div className="skeleton-card-inner">
                <div className="skeleton" style={{ width: '160px', height: '16px' }} />
                <div className="skeleton" style={{ width: '40px', height: '22px', borderRadius: '11px' }} />
            </div>
            <div className="skeleton" style={{ width: '70%', height: '12px' }} />
        </div>
        <div className="skeleton-card">
            <div className="skeleton" style={{ width: '120px', height: '16px', marginBottom: '0.75rem' }} />
            <div className="skeleton" style={{ width: '100%', height: '36px', borderRadius: '6px' }} />
        </div>
    </div>
);

const TabSkeleton = ({ variant = 'settings' }) => {
    switch (variant) {
        case 'list': return <ListSkeleton />;
        case 'analytics': return <AnalyticsSkeleton />;
        case 'cache': return <CacheSkeleton />;
        default: return <SettingsSkeleton />;
    }
};

export default TabSkeleton;