@@ -40,6 +40,41 @@ export {};
4040
4141const GA_ID = import . meta. env . VITE_GA_ID as string | undefined ;
4242
43+ class RootErrorBoundary extends React . Component <
44+ { children : React . ReactNode } ,
45+ { hasError : boolean ; error ?: unknown }
46+ > {
47+ state = { hasError : false as boolean , error : undefined as unknown } ;
48+
49+ static getDerivedStateFromError ( error : unknown ) {
50+ return { hasError : true , error } ;
51+ }
52+
53+ componentDidCatch ( error : unknown ) {
54+ console . error ( "[HPL] Uncaught render error:" , error ) ;
55+ }
56+
57+ render ( ) {
58+ if ( this . state . hasError ) {
59+ return (
60+ < div className = "min-h-screen bg-slate-950 text-slate-100 flex items-center justify-center p-6" >
61+ < div className = "max-w-xl space-y-3 rounded-xl border border-slate-800 bg-slate-900/30 p-6" >
62+ < div className = "text-xs font-mono uppercase tracking-widest text-slate-400" >
63+ HPL Recovery Mode
64+ </ div >
65+ < div className = "text-lg font-semibold" > Something crashed during render.</ div >
66+ < div className = "text-sm text-slate-300" >
67+ Check the console for details. If this is production, we can add a safer fallback path.
68+ </ div >
69+ </ div >
70+ </ div >
71+ ) ;
72+ }
73+ return this . props . children ;
74+ }
75+ }
76+
77+
4378function initGA ( measurementId : string ) {
4479 // 1) Create dataLayer + gtag stub immediately
4580 window . dataLayer = window . dataLayer ?? [ ] ;
@@ -70,6 +105,8 @@ if (GA_ID) initGA(GA_ID);
70105
71106ReactDOM . createRoot ( document . getElementById ( "root" ) ! ) . render (
72107 < React . StrictMode >
73- < RouterProvider router = { router } />
108+ < RootErrorBoundary >
109+ < RouterProvider router = { router } />
110+ </ RootErrorBoundary >
74111 </ React . StrictMode >
75112) ;
0 commit comments