// É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.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');