// Écrans d'erreur — 404, 500, hors ligne. // // Trois variantes d'un même écran : pictogramme, titre, explication, action. // Aucun n'est câblé sur un vrai routeur (l'app n'en a pas) : ils existent pour // que le jour où le backend répond mal, l'écran soit déjà dessiné. On peut les // voir avec `?error=404` (ou 500 / offline) dans l'URL. // // Le ton suit le reste de l'app : vouvoiement, pas d'excuse geignarde, une // sortie concrète à chaque fois. const ER_VT = window.VT || {}; const ER_INK = ER_VT.ink || '#0a0a0a'; const ER_SUB = ER_VT.sub || '#6b7280'; const ER_BG = ER_VT.paper || '#f6f5f1'; const ER_SURF = ER_VT.surface || '#ffffff'; const ER_HAIR2 = ER_VT.hair2 || 'rgba(10,10,10,0.10)'; const ER_MED = ER_VT.medBlue || '#3d6b8f'; const ER_MED_TINT = ER_VT.medBlueTint || 'rgba(61,107,143,0.10)'; const ER_WARN = ER_VT.warning || '#d97706'; const ER_VARIANTS = { 404: { code: '404', tint: ER_MED_TINT, color: ER_MED, icon: <>, title: 'Page introuvable', body: "Ce contenu a été déplacé, supprimé, ou l'adresse comporte une erreur. Rien n'est perdu côté dossiers.", action: 'Retour au tableau de bord', }, 500: { code: '500', tint: 'rgba(217,119,6,0.10)', color: ER_WARN, icon: <>, title: 'Le serveur ne répond pas', body: "L'incident est enregistré de notre côté. Vos données ne sont pas affectées — rien de ce que vous avez validé n'est perdu.", action: 'Réessayer', }, offline: { code: 'HORS LIGNE', tint: 'rgba(10,10,10,0.05)', color: ER_SUB, icon: <>, title: 'Pas de connexion', body: "Vous pouvez continuer à dicter : les comptes rendus sont conservés sur l'appareil et partiront dès le retour du réseau.", action: 'Réessayer', }, }; function ErrorScreen({ variant = '404', onAction, actionLabel, onSecondary, secondaryLabel }) { const v = ER_VARIANTS[variant] || ER_VARIANTS['404']; return (
{v.icon}
{v.code}
{v.title}
{v.body}
{onSecondary && ( )}
); } // `?error=404` / `?error=500` / `?error=offline` — même mécanique que // `?onboarding` : montrable en démo sans ouvrir la console. function errorFromUrl() { try { const m = /(^|[?&])error=(404|500|offline)(&|$)/.exec(window.location.search); return m ? m[2] : null; } catch (e) { return null; } } window.ErrorScreen = ErrorScreen; window.vascoErrorFromUrl = errorFromUrl; console.log('%c[VASCO] error-screens.jsx chargé', 'color:#3d6b8f;font-weight:bold');