game_list/frontend/src/components/EmptyState.tsx
2026-01-11 20:32:34 +01:00

92 lines
2.5 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { ReactNode } from "react";
interface EmptyStateProps {
icon?: string;
title: string;
description?: string;
action?: ReactNode;
}
export function EmptyState({ icon = "📭", title, description, action }: EmptyStateProps) {
return (
<div
style={{
padding: "3rem 2rem",
textAlign: "center",
background: "var(--secondary-alt-bg)",
borderRadius: "16px",
border: "1px dashed var(--border-color)",
color: "var(--text-muted)"
}}
>
<div style={{ fontSize: "3rem", marginBottom: "1rem" }}>{icon}</div>
<h3 style={{ margin: "0 0 0.5rem 0", color: "var(--text-color)" }}>{title}</h3>
{description && <p style={{ margin: "0 0 1.5rem 0", fontSize: "0.95rem" }}>{description}</p>}
{action}
</div>
);
}
export function LoadingState({ message = "Loading..." }: { message?: string }) {
return (
<div
style={{
padding: "3rem 2rem",
textAlign: "center"
}}
>
<div
style={{
width: "40px",
height: "40px",
border: "4px solid rgba(255, 255, 255, 0.2)",
borderTopColor: "currentColor",
borderRadius: "50%",
animation: "spin 0.8s linear infinite",
margin: "0 auto 1rem"
}}
></div>
<p style={{ color: "var(--text-muted)", margin: 0 }}>{message}</p>
<style>{`
@keyframes spin {
to { transform: rotate(360deg); }
}
`}</style>
</div>
);
}
export function ErrorState({ message, onRetry }: { message: string, onRetry?: () => void }) {
return (
<div
style={{
padding: "3rem 2rem",
textAlign: "center",
background: "rgba(244, 67, 54, 0.1)",
borderRadius: "16px",
border: "1px solid rgba(244, 67, 54, 0.3)"
}}
>
<div style={{ fontSize: "3rem", marginBottom: "1rem" }}></div>
<h3 style={{ margin: "0 0 0.5rem 0", color: "var(--text-color)" }}>Something went wrong</h3>
<p style={{ margin: "0 0 1.5rem 0", color: "var(--text-muted)", fontSize: "0.95rem" }}>{message}</p>
{onRetry && (
<button
onClick={onRetry}
style={{
background: "var(--accent-color)",
border: "none",
padding: "0.75rem 1.5rem",
borderRadius: "8px",
color: "white",
fontWeight: 600,
cursor: "pointer"
}}
>
🔄 Try Again
</button>
)}
</div>
);
}