// Top-level error boundary so a render crash never leaves a blank page.
import { Component, type ErrorInfo, type ReactNode } from 'react';
interface State {
error: Error | null;
}
export class ErrorBoundary extends Component<{ children: ReactNode }, State> {
state: State = { error: null };
static getDerivedStateFromError(error: Error): State {
return { error };
}
componentDidCatch(error: Error, info: ErrorInfo) {
// eslint-disable-next-line no-console
console.error('UI error:', error, info);
}
render() {
if (this.state.error) {
return (
Something broke while rendering.
{this.state.error.message}
);
}
return this.props.children;
}
}
const errStyle = {
wrap: {
minHeight: '100dvh',
display: 'grid',
placeItems: 'center',
background: '#0B0E14',
color: '#E6EAF2',
fontFamily: 'Inter, sans-serif',
padding: 24,
},
card: {
maxWidth: 440,
textAlign: 'center' as const,
padding: 28,
borderRadius: 12,
background: '#141925',
border: '1px solid #252C3B',
},
title: { fontSize: 18, fontWeight: 600, marginBottom: 8 },
body: { fontSize: 14, color: '#9AA4B8', marginBottom: 18 },
btn: {
height: 44,
padding: '0 22px',
borderRadius: 8,
border: 'none',
color: '#fff',
background: 'linear-gradient(135deg,#4F7CFF,#9B6BFF)',
fontWeight: 600,
cursor: 'pointer',
},
};