# Animations de pages SmartCommon utilise **Framer Motion** pour animer les transitions entre pages. Les animations sont configurables par route. ## Configuration de base Dans la configuration du Provider : ``` const config = { pages: { "*": "fade" // Animation par défaut pour toutes les pages } }; ``` ## Animations disponibles ^ Animation ^ Description ^ Effet ^ | ''fade'' | Fondu enchaîné | Opacité 0 → 1 | | ''slideLeft'' | Glissement gauche | Entrée par la droite | | ''slideRight'' | Glissement droite | Entrée par la gauche | | ''zoom'' | Effet de zoom | Scale 0.9 → 1 | ## Configuration par route Vous pouvez définir des animations différentes selon la route d'origine et de destination : ``` const config = { pages: { // Depuis la page d'accueil "/": { "/dashboard": "slideLeft", // Vers dashboard: glisse à gauche "/settings": "slideLeft", // Vers settings: glisse à gauche "*": "fade" // Vers autres: fondu }, // Depuis le dashboard "/dashboard": { "/": "slideRight", // Retour accueil: glisse à droite "/details": "slideLeft", // Vers détails: glisse à gauche "*": "fade" }, // Depuis les paramètres "/settings": { "/": "slideRight", "*": "fade" }, // Pour toutes les autres pages "*": "fade" } }; ``` ## Logique de navigation L'animation est choisie selon ce schéma : 1. Cherche une config pour la page actuelle 2. Si trouvée, cherche une animation pour la page précédente 3. Si pas trouvée, utilise ''*'' de la page actuelle 4. Si pas de config pour la page actuelle, utilise ''*'' global ### Exemple Navigation de ''/dashboard'' vers ''/'' : ``` pages: { "/": { "/dashboard": "slideRight", // <- Cette animation sera utilisée "*": "fade" }, "/dashboard": { "/": "slideRight", "*": "fade" } } ``` La page ''/'' s'affiche avec ''slideRight'' car on vient de ''/dashboard''. ## Désactiver les animations sur desktop Par défaut, les animations de glissement sont remplacées par ''fade'' sur desktop pour une meilleure UX : ``` // Dans le composant Page (comportement interne) if (device?.type === "desktop") { return "fade"; } ``` ## Utiliser le composant Page Le composant ''Page'' gère automatiquement les animations : ``` import { Page, Block } from '@cap-rel/smartcommon'; import { useLocation } from 'react-router-dom'; const Dashboard = () => { const location = useLocation(); return ( Contenu du dashboard ); }; ``` Le prop ''location'' est requis pour que les animations fonctionnent correctement. ## Personnaliser les animations Vous pouvez créer des animations personnalisées en modifiant les variants Framer Motion : ``` // Animations par défaut dans SmartCommon const animations = { slideRight: { initial: { x: "50%", opacity: 0 }, animate: { x: 0, opacity: 1, transition: { duration: 0.15, ease: "easeInOut" } }, exit: { x: "50%", opacity: 0, transition: { duration: 0.15, ease: "easeInOut" } } }, slideLeft: { initial: { x: "-50%", opacity: 0 }, animate: { x: 0, opacity: 1, transition: { duration: 0.15, ease: "easeInOut" } }, exit: { x: "-50%", opacity: 0, transition: { duration: 0.15, ease: "easeInOut" } } }, fade: { initial: { opacity: 0 }, animate: { opacity: 1, transition: { duration: 0.15, ease: "easeOut" } }, exit: { opacity: 0, transition: { duration: 0.15, ease: "easeOut" } } }, zoom: { initial: { scale: 0.9, opacity: 0 }, animate: { scale: 1, opacity: 1 }, exit: { scale: 0.9, opacity: 0 }, transition: { duration: 0.2, ease: "easeOut" } } }; ``` ## Hook useAnimation Pour des animations personnalisées dans vos composants : ``` import { useAnimation } from '@cap-rel/smartcommon'; const MyComponent = () => { const { start, animations, setAnimations } = useAnimation({ fadeIn: { value: false, state: null }, slideIn: { value: false, state: null } }); useEffect(() => { if (start) { // Déclencher l'animation après le premier rendu setAnimations(prev => ({ ...prev, fadeIn: { ...prev.fadeIn, state: 'visible' } })); } }, [start]); return ( Contenu animé ); }; ``` ## Animations avec Framer Motion Pour des animations plus complexes, utilisez directement Framer Motion : ``` import { motion, AnimatePresence } from 'framer-motion'; const MyList = ({ items }) => ( {items.map(item => ( {item.name} ))} ); ``` ## Exemples de configurations ### Application mobile classique Navigation hiérarchique (liste → détail → sous-détail) : ``` pages: { "/": { "*": "slideLeft" }, "/items": { "/": "slideRight", "/items/*": "slideLeft", "*": "fade" }, "/items/*": { "/items": "slideRight", "*": "fade" }, "*": "fade" } ``` ### Application avec onglets Navigation entre onglets sans animation de glissement : ``` pages: { "/home": { "*": "fade" }, "/search": { "*": "fade" }, "/profile": { "*": "fade" }, "/settings": { "*": "slideLeft" // Seul settings a une animation différente }, "*": "fade" } ``` ### Désactiver toutes les animations ``` pages: { "*": "fade" // Utiliser uniquement fade (le plus discret) } // Ou modifier la durée à 0 // (nécessite de modifier les animations dans le code) ``` ## Voir aussi * [[configuration|Configuration]] - Configuration du Provider * [[smartcommon|SmartCommon]] - Composant Page * [Framer Motion](https://www.framer.com/motion/) - Documentation officielle