'use client'; import React, { useState, useContext, useEffect } from 'react'; import { Panel } from 'primereact/panel'; import { InputSwitch } from 'primereact/inputswitch'; import { Slider } from 'primereact/slider'; import { Dropdown } from 'primereact/dropdown'; import { Button } from 'primereact/button'; import { Message } from 'primereact/message'; import { LayoutContext } from '../../layout/context/layoutcontext'; interface AtlantisAccessibilityControlsProps { className?: string; } interface AccessibilitySettings { fontSize: number; highContrast: boolean; reduceMotion: boolean; screenReader: boolean; keyboardNav: boolean; } const AtlantisAccessibilityControls: React.FC = ({ className = '' }) => { const { layoutConfig, setLayoutConfig } = useContext(LayoutContext); const [settings, setSettings] = useState({ fontSize: 14, highContrast: false, reduceMotion: false, screenReader: false, keyboardNav: true }); // Options de thème pour l'accessibilité const contrastThemes = [ { label: 'Thème normal', value: 'magenta' }, { label: 'Contraste élevé - Bleu', value: 'blue' }, { label: 'Contraste élevé - Sombre', value: 'dark' } ]; // Appliquer les paramètres d'accessibilité useEffect(() => { // Appliquer la taille de police via scale Atlantis setLayoutConfig(prev => ({ ...prev, scale: settings.fontSize })); // Appliquer le thème de contraste if (settings.highContrast) { setLayoutConfig(prev => ({ ...prev, theme: 'blue', // Thème avec meilleur contraste colorScheme: 'dark' })); } // Classes CSS pour les animations const rootElement = document.documentElement; if (settings.reduceMotion) { rootElement.style.setProperty('--transition-duration', '0ms'); } else { rootElement.style.removeProperty('--transition-duration'); } // Annoncer les changements pour les lecteurs d'écran if (settings.screenReader) { announceChange('Paramètres d\'accessibilité mis à jour'); } }, [settings, setLayoutConfig]); // Fonction d'annonce pour lecteurs d'écran const announceChange = (message: string) => { const announcement = document.createElement('div'); announcement.setAttribute('aria-live', 'polite'); announcement.setAttribute('aria-atomic', 'true'); announcement.className = 'sr-only'; announcement.textContent = message; document.body.appendChild(announcement); setTimeout(() => document.body.removeChild(announcement), 1000); }; const updateSetting = (key: keyof AccessibilitySettings, value: any) => { setSettings(prev => ({ ...prev, [key]: value })); }; const resetToDefaults = () => { setSettings({ fontSize: 14, highContrast: false, reduceMotion: false, screenReader: false, keyboardNav: true }); setLayoutConfig(prev => ({ ...prev, scale: 14, theme: 'magenta', colorScheme: 'dark' })); announceChange('Paramètres d\'accessibilité réinitialisés'); }; return (
{/* Taille de police */}
updateSetting('fontSize', e.value)} min={12} max={20} step={1} className="w-full mt-2" />
Petit Normal Grand
{/* Contraste élevé */}
updateSetting('highContrast', e.value)} /> {settings.highContrast ? 'Activé' : 'Désactivé'}
{/* Réduction des animations */}
updateSetting('reduceMotion', e.value)} /> Pour les utilisateurs sensibles au mouvement
{/* Mode lecteur d'écran */}
updateSetting('screenReader', e.value)} /> Annonces vocales activées
{/* Informations et aide */}
{/* Raccourcis clavier */}
Raccourcis clavier disponibles
Tab Naviguer entre les éléments
Entrée Activer un élément
Échap Fermer un dialogue
↑↓ Naviguer dans les listes
{/* Actions */}
{/* Région pour les annonces lecteurs d'écran */}
); }; export default AtlantisAccessibilityControls;