11 KiB
Skeleton Loaders, Toast Notifications, Indicateur Visuel et Raccourcis Clavier
Auteur : Équipe 4NK Date : 2025-01-27
Objectif
Implémenter les quatre premières améliorations UX de priorité haute :
- Skeleton loaders - Remplacer les messages "Loading..." par des skeleton loaders
- Toast notifications - Intégrer le système de toast pour les confirmations visuelles
- Indicateur visuel pour contenu débloqué - Badge et bordure distinctive pour les articles débloqués
- Raccourcis clavier de base -
/pour focus sur recherche,Escpour fermer modals/overlays
Impacts
Skeleton loaders
- Expérience utilisateur : Amélioration de la perception de performance en affichant la structure du contenu pendant le chargement
- Cohérence visuelle : Remplacement des messages textuels par des éléments visuels cohérents avec le design system
- Feedback visuel : Animation subtile pour indiquer le chargement actif
Toast notifications
- Feedback utilisateur : Confirmations visuelles immédiates après les actions importantes
- Accessibilité : Toasts avec
role="alert"etaria-live="polite"pour les screen readers - Expérience utilisateur : Retour visuel clair et non intrusif pour les actions réussies
Indicateur visuel pour contenu débloqué
- Clarté visuelle : Identification immédiate des articles déjà débloqués
- Feedback positif : Confirmation visuelle que l'utilisateur a accès au contenu complet
- Accessibilité : Badge avec
aria-labelpour les screen readers
Raccourcis clavier de base
- Efficacité : Réduction du nombre de clics pour accéder à la recherche
- Accessibilité : Navigation au clavier améliorée
- Expérience utilisateur : Raccourcis intuitifs et standards
Modifications
Skeleton loaders
-
components/ArticlesList.tsx:- Ajout de
ArticleCardSkeletonqui reproduit la structure d'une carte d'article - Remplacement de
LoadingStatepar un affichage de 3 skeletons
- Ajout de
-
components/AuthorsList.tsx:- Ajout de
AuthorCardSkeletonqui reproduit la structure d'une carte d'auteur - Remplacement de
LoadingStatepar un affichage de 4 skeletons en grille
- Ajout de
-
components/UserArticlesList.tsx:- Ajout de
ArticleCardSkeleton(identique à ArticlesList) - Remplacement de
ArticlesLoadingpar un affichage de 3 skeletons - Ajout de l'import
Skeleton
- Ajout de
-
components/authorPage/AuthorPageContent.tsx:- Extraction de
AuthorPageLoadingSkeleton,AuthorPageError,AuthorPageNotFoundpour respectermax-lines-per-function - Remplacement du message de chargement par des skeletons représentant la structure de la page auteur
- Extraction de
-
components/authorPresentationEditor/AuthorPresentationEditor.tsx:- Remplacement de
LoadingNoticepar des skeletons représentant la structure du formulaire - Ajout de l'import
Skeleton
- Remplacement de
-
components/DocsContent.tsx:- Remplacement du message de chargement par des skeletons représentant la structure du contenu markdown
- Suppression de l'import
tnon utilisé
-
components/FundingGauge.tsx:- Remplacement de
FundingGaugeLoadingpar des skeletons représentant la structure du gauge - Ajout de l'import
Skeleton
- Remplacement de
Toast notifications
-
components/ui/ToastContainer.tsx(nouveau) :- Création du système de gestion des toasts avec
ToastProvideretuseToasthook - Gestion d'une pile de toasts avec suppression automatique après durée configurable
- Affichage des toasts en position fixe (top-right) avec z-index élevé
- Création du système de gestion des toasts avec
-
pages/_app.tsx:- Intégration du
ToastProviderdans l'application pour rendre les toasts disponibles globalement
- Intégration du
-
components/ArticleCard.tsx:- Ajout d'un toast de succès après déblocage réussi d'un article
- Extraction de
useArticleCardStatepour respectermax-lines-per-function - Extraction de
ArticleCardContentpour réduire le nombre de lignes deArticleCard
-
components/ArticleEditor.tsx:- Ajout d'un toast de succès après publication réussie via
useEffect - Extraction de
usePublishSuccessToastpour respectermax-lines-per-function
- Ajout d'un toast de succès après publication réussie via
-
components/PaymentModal.tsx:- Ajout d'un toast de succès après copie d'invoice dans
copyInvoiceToClipboard - Ajout d'un toast de succès après initiation du paiement dans
openWalletForInvoice - Mise à jour de
usePaymentModalStatepour acceptershowToastoptionnel
- Ajout d'un toast de succès après copie d'invoice dans
-
hooks/useArticlePayment.ts:- Refactoring pour accepter un objet de paramètres au lieu de paramètres individuels (respect de
max-params) - Ajout du support
showToastoptionnel pour afficher des toasts après paiement réussi - Propagation de
showToastà traverscheckPaymentAndUnlocketstartArticlePaymentFlow
- Refactoring pour accepter un objet de paramètres au lieu de paramètres individuels (respect de
-
locales/fr.txtetlocales/en.txt:- Ajout des clés de traduction pour les toasts :
article.unlock.success: "Article débloqué avec succès!" / "Article unlocked successfully!"article.publish.success: "Article publié avec succès!" / "Article published successfully!"payment.modal.copySuccess: "Facture copiée dans le presse-papiers" / "Invoice copied to clipboard"payment.modal.paymentInitiated: "Paiement initié avec succès" / "Payment initiated successfully"
- Ajout des clés de traduction manquantes pour
payment.modal.*déjà utilisées dans le code
- Ajout des clés de traduction pour les toasts :
Indicateur visuel pour contenu débloqué
-
components/ArticleCard.tsx:- Ajout d'un badge "Débloqué" avec icône SVG de cadenas ouvert dans
ArticleHeader - Badge affiché uniquement si
article.paid === true - Badge avec variant "success" (vert) et
aria-labelpour l'accessibilité - Ajout d'une bordure distinctive (border-2 border-neon-green/40) et d'un glow vert (shadow-[0_0_5px_#00ff41,0_0_10px_#00ff41]) sur la Card pour les articles débloqués
- Utilisation de
shadow-[...]avec les valeurs detailwind.config.js(glow-green)
- Ajout d'un badge "Débloqué" avec icône SVG de cadenas ouvert dans
-
locales/fr.txtetlocales/en.txt:- Ajout de la clé de traduction
article.unlocked.badge: "Débloqué" / "Unlocked"
- Ajout de la clé de traduction
Raccourcis clavier de base
-
hooks/useKeyboardShortcuts.ts(nouveau) :- Création du hook pour gérer les raccourcis clavier globaux
- Détection de la touche
/pour focus sur la barre de recherche - Vérification que l'utilisateur n'est pas déjà dans un champ de saisie avant d'activer le raccourci
- Recherche de l'input avec
role="search"et focus/select automatique
-
components/ui/Input.tsx:- Ajout du support
forwardRefpour permettre le focus programmatique - Conservation de toutes les fonctionnalités existantes
- Ajout du support
-
components/SearchBar.tsx:- Ajout du support
forwardRefpour permettre le focus programmatique - Ajout de
role="search"pour l'accessibilité et la détection par le hook - Ajout de
aria-labelpour l'accessibilité
- Ajout du support
-
pages/_app.tsx:- Intégration du hook
useKeyboardShortcutsdans l'application pour activer les raccourcis globaux
- Intégration du hook
-
components/NotificationPanel.tsx:- Ajout de la gestion de
Escpour fermer le panel de notifications - Ajout de
useEffectpour écouter les événements clavier
- Ajout de la gestion de
-
components/createSeriesModal/CreateSeriesModalView.tsx:- Ajout de la gestion de
Escpour fermer la modal de création de série - Ajout de la gestion du clic sur l'overlay pour fermer la modal
- Ajout de
document.body.style.overflow = 'hidden'pour empêcher le scroll pendant l'ouverture
- Ajout de la gestion de
-
Raccourci
Esc:- Déjà implémenté pour les modals via
useModalKeyboarddanscomponents/ui/Modal.tsx - Déjà implémenté pour le menu mobile via
useEffectdanscomponents/ui/MobileMenu.tsx - Ajouté pour
NotificationPaneletCreateSeriesModalView
- Déjà implémenté pour les modals via
Modalités de déploiement
-
Vérification :
npm run type-check: Aucune erreur TypeScriptnpm run lint: Aucune erreur de linting (4 warnings acceptables sur l'utilisation de l'index dans les keys pour les skeletons)
-
Déploiement :
- Utiliser les scripts de déploiement existants (
deploy.sh,update-from-git.sh,update-remote-git.sh) - Validation explicite requise avant déploiement
- Utiliser les scripts de déploiement existants (
Modalités d'analyse
-
Skeleton loaders :
- Vérifier visuellement que les skeletons apparaissent pendant le chargement des listes
- Vérifier que les animations de pulse sont fluides
- Vérifier que les skeletons disparaissent correctement une fois les données chargées
-
Toast notifications :
- Vérifier que les toasts apparaissent après :
- Déblocage réussi d'un article
- Publication réussie d'un article
- Copie d'invoice dans le presse-papiers
- Initiation du paiement avec Alby
- Vérifier que les toasts disparaissent automatiquement après 5 secondes (2 secondes pour la copie)
- Vérifier que les toasts peuvent être fermés manuellement via le bouton ×
- Vérifier l'accessibilité avec un screen reader (toasts annoncés via
aria-live="polite")
- Vérifier que les toasts apparaissent après :
-
Indicateur visuel pour contenu débloqué :
- Vérifier que le badge "Débloqué" apparaît dans le header des articles débloqués
- Vérifier que l'icône de cadenas ouvert est visible dans le badge
- Vérifier que les cartes d'articles débloqués ont une bordure verte distinctive et un glow vert
- Vérifier que les articles non débloqués n'ont pas de badge ni de bordure distinctive
- Vérifier l'accessibilité avec un screen reader (badge annoncé via
aria-label)
-
Raccourcis clavier de base :
- Vérifier que la touche
/focus la barre de recherche et sélectionne son contenu - Vérifier que le raccourci
/ne s'active pas si l'utilisateur est déjà dans un champ de saisie (input, textarea, contenteditable) - Vérifier que la touche
Escferme les modals (Modal.tsx) - Vérifier que la touche
Escferme le menu mobile (MobileMenu.tsx) - Vérifier que la touche
Escferme le panel de notifications (NotificationPanel.tsx) - Vérifier que la touche
Escferme la modal de création de série (CreateSeriesModalView.tsx) - Tester sur différentes pages (HomeView, ProfileView) pour s'assurer que le raccourci
/fonctionne partout
- Vérifier que la touche
Pages affectées
components/ArticlesList.tsxcomponents/AuthorsList.tsxcomponents/UserArticlesList.tsxcomponents/authorPage/AuthorPageContent.tsxcomponents/authorPresentationEditor/AuthorPresentationEditor.tsxcomponents/DocsContent.tsxcomponents/FundingGauge.tsxcomponents/ui/ToastContainer.tsx(nouveau)components/ArticleCard.tsxcomponents/ArticleEditor.tsxcomponents/PaymentModal.tsxhooks/useArticlePayment.tspages/_app.tsxlocales/fr.txtlocales/en.txtcomponents/ui/index.tshooks/useKeyboardShortcuts.ts(nouveau)components/NotificationPanel.tsxcomponents/createSeriesModal/CreateSeriesModalView.tsxdocs/migration-status.mddocs/todo-remaining.md