Portage du projet « Bénévoles Festival.dc.html » en implémentation statique pilotée par un jeu de démonstration déterministe (portage du générateur du design : 15 postes, 64 bénévoles, ~209 affectations). - Système visuel néo-brutaliste : palette + primitives Tailwind, polices Archivo / DM Mono, primitives dans components/ui.tsx. - Domaine (aligné CLAUDE.md) : types, jours/plages, moteur de validation (mêmes codes BLOCKING/WARNING que le back-end), sélecteurs, différentiel de publication. - État applicatif : PlanningProvider (reducer) — affecter / désaffecter / publier / confirmer / éditer besoins et bénévoles / import simulé / pointage. - Écrans : 01 Grille des besoins + panneau d'affectation (candidats triés, alertes), 02 Vue par bénévole, 03 Publication, 04 Mobile bénévole, 05 Mobile référent, 06 Configuration (4 sous-onglets). - i18n : aucun texte d'interface en dur, locales/fr.json. - Vérifs : build tsc + vite, eslint (0 erreur), rendu headless des 6 écrans (npm run smoke). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AwswqSChc3Rwtu61pRXiY2
33 lines
981 B
TypeScript
33 lines
981 B
TypeScript
// Rendu headless de chaque écran pour vérifier qu'aucun composant ne lève.
|
|
// Lancement : npx tsx --tsconfig tsconfig.app.json scripts/smoke.tsx
|
|
import { createElement } from 'react';
|
|
import { renderToString } from 'react-dom/server';
|
|
import { RouterProvider, createMemoryRouter } from 'react-router-dom';
|
|
|
|
import { PlanningProvider } from '@/app/planning-store';
|
|
import { routes } from '@/app/router';
|
|
|
|
const paths = [
|
|
'/grille',
|
|
'/benevoles',
|
|
'/publication',
|
|
'/mobile-benevole',
|
|
'/mobile-referent',
|
|
'/configuration',
|
|
];
|
|
|
|
let failures = 0;
|
|
for (const path of paths) {
|
|
try {
|
|
const router = createMemoryRouter(routes, { initialEntries: [path] });
|
|
const html = renderToString(
|
|
createElement(PlanningProvider, null, createElement(RouterProvider, { router })),
|
|
);
|
|
console.log(`ok ${path.padEnd(20)} ${html.length} octets`);
|
|
} catch (error) {
|
|
failures += 1;
|
|
console.error(`FAIL ${path}`, error);
|
|
}
|
|
}
|
|
process.exit(failures ? 1 : 0);
|