Que fait email-qa ?
Filtre : $ARGUMENTS
Rendu : ${CLAUDE_SKILL_DIR}/../ui-audit/scripts/render-html.mjs
1. Obtenir le HTML final pour chaque modèle
- Le script de galerie existe-t-il ? Recherchez dans package.json
email-gallery,email:previewouemails. Si l'un d'eux écrit chaque modèle avec des données de fixture, exécutez-le et utilisez son répertoire de sortie. - Sinon, écrivez un harnais dans
/tmp/email-qa/render.ts(en dehors du dépôt, sauf si l'utilisateur souhaite le conserver) :- importez chaque moteur de rendu (React Email
render(), fonctions template-literal, MJML) ; - appelez-le avec des fixtures réalistes, y compris des cas limites : un nom long, un champ facultatif manquant, 0, 1 et plusieurs éléments, et les deux locales ;
- écrivez
<template>-<case>.html; - stub tout ce qui lit l'env, la base de données ou le réseau. Exécutez-le avec
tsxdu dépôt.
- importez chaque moteur de rendu (React Email
- QA toujours le HTML final généré, jamais le JSX.
2. Rendu + vérifications statiques
node ${CLAUDE_SKILL_DIR}/../ui-audit/scripts/render-html.mjs /tmp/email-qa/out/*.html --out /tmp/email-qa/shots
Pour chaque fichier, cela produit des versions @600/@375 claire et sombre, plus une version @600-noimg, et un fichier render.json avec les problèmes statiques. Lisez les feuilles pour chaque modèle.
3. Checklist (au-delà de ce que le script signale)
- Placeholders : aucun des
undefined,NaN,null,[object Object],{{…}},Invalid Date,krvide,0 stlà où il devrait être masqué. - Pré-en-tête : présent, significatif et non une répétition de l'objet. Rembourré pour que le texte du corps ne fuite pas dans l'aperçu de la boîte de réception.
- Désabonnement : obligatoire pour les digest et les e-mails marketing (plus les en-têtes
List-Unsubscribe+List-Unsubscribe-Postdans le code d'envoi). Les e-mails transactionnels sont exemptés ; indiquez de quel type il s'agit pour chaque modèle. - Images désactivées : le message a toujours du sens, il y a un texte alternatif sur chaque image significative,
alt=""sur les espaceurs, et le CTA est un texte en direct, pas une image. - Mode sombre : les logos ont une variante transparente ou adaptée au mode sombre, il n'y a pas de texte sombre sur un fond désormais sombre, et la couleur de marque passe toujours 3:1. L'inversion forcée de Gmail/Outlook ne peut pas être émulée, signalez donc le texte
#000codé en dur sur des fonds transparents comme un risque. - Outlook desktop : disposition en tableau, pas de flex/grid, VML ou
msode rembourrage pour les boutons, largeurs dans les attributswidth=, pas demarginsur les éléments de bloc pour l'espacement. - Liens :
https://absolus, UTM si le projet les utilise, pas d'hôtes localhost ou de prévisualisation, et pas de suivi sur le désabonnement. - Copie : locale correcte partout (exécutez les règles
copy-checksur les chaînes), nom de l'expéditeur, et reply-to (correspond à ce que le projet attend). - CTA visible sans défilement à 375 et non coupé. Le total reste inférieur à ~102 Ko.
Critères de sortie
- Chaque modèle est rendu dans toutes ses variantes et les feuilles ont été lues.
- Aucune fuite de placeholder ou lien relatif, et la balise viewport est présente.
- Chaque problème restant est étiqueté bug (corrigé) ou risque (signalé).
- Un bref résumé à l'utilisateur, plus le répertoire des captures.