import { useEffect, useRef, useCallback, useState } from 'react'; import { Pane } from 'tweakpane'; /** * Hook pour gérer Tweakpane avec les contrôles de dilatation et taille * Activé uniquement en mode debug (touche D) */ export const useTweakpane = (dilationFactor, setDilationFactor, characterSize, setCharacterSize, darkMode, variantSizeImpact, setVariantSizeImpact) => { const paneRef = useRef(null); const paramsRef = useRef({ dilation: dilationFactor, size: characterSize, variantSizeImpact: variantSizeImpact }); const [isDebugMode, setIsDebugMode] = useState(false); // Charger l'état du debug depuis localStorage useEffect(() => { const savedDebugState = localStorage.getItem('fontmap-debug-mode'); if (savedDebugState === 'true') { setIsDebugMode(true); } }, []); // Fonction pour créer le pane Tweakpane const createPane = useCallback(() => { if (paneRef.current) return; // Déjà créé // Créer le pane const pane = new Pane({ title: 'FontMap Debug Controls', container: document.body, expanded: true }); // Configuration du style pane.element.style.position = 'fixed'; pane.element.style.top = '80px'; pane.element.style.right = '20px'; pane.element.style.zIndex = '10000'; pane.element.style.fontSize = '12px'; pane.element.style.backgroundColor = 'rgba(0, 0, 0, 0.9)'; pane.element.style.border = '1px solid #333'; pane.element.style.borderRadius = '8px'; // Contrôle de dilatation pane.addBinding(paramsRef.current, 'dilation', { label: 'Dilation', min: 0, max: 1, step: 0.01, format: (value) => `${(value).toFixed(3)}` }).on('change', (ev) => { setDilationFactor(ev.value); }); // Contrôle de taille pane.addBinding(paramsRef.current, 'size', { label: 'Font Size', min: 0.1, max: 2.0, step: 0.05, format: (value) => `${value.toFixed(2)}x` }).on('change', (ev) => { setCharacterSize(ev.value); }); // Checkbox pour l'impact des variantes sur la taille pane.addBinding(paramsRef.current, 'variantSizeImpact', { label: 'Variant Size Impact' }).on('change', (ev) => { setVariantSizeImpact(ev.value); }); // Bouton pour réinitialiser pane.addButton({ title: 'Reset' }).on('click', () => { setDilationFactor(0.035); // Valeur par défaut setCharacterSize(1); // Valeur par défaut setVariantSizeImpact(false); // Valeur par défaut paramsRef.current.dilation = 0.035; paramsRef.current.size = 1; paramsRef.current.variantSizeImpact = false; pane.refresh(); }); paneRef.current = pane; }, [setDilationFactor, setCharacterSize, setVariantSizeImpact]); // Fonction pour détruire le pane const destroyPane = useCallback(() => { if (paneRef.current) { paneRef.current.dispose(); paneRef.current = null; } }, []); // Fonction pour toggle le mode debug const toggleDebugMode = useCallback(() => { const newDebugMode = !isDebugMode; setIsDebugMode(newDebugMode); localStorage.setItem('fontmap-debug-mode', newDebugMode.toString()); if (newDebugMode) { createPane(); console.log('🐛 Debug mode activated - Press D to toggle'); } else { destroyPane(); console.log('🐛 Debug mode deactivated'); } }, [isDebugMode, createPane, destroyPane]); // Initialiser le pane si le mode debug est activé useEffect(() => { if (isDebugMode) { createPane(); } else { destroyPane(); } }, [isDebugMode, createPane, destroyPane]); // Gestionnaire de touches pour activer/désactiver le debug useEffect(() => { const handleKeyDown = (event) => { // Activer le debug avec la touche D if (event.key.toLowerCase() === 'd' && !event.ctrlKey && !event.metaKey && !event.altKey) { // Vérifier que ce n'est pas dans un input const target = event.target; if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.contentEditable === 'true') { return; } event.preventDefault(); toggleDebugMode(); } }; document.addEventListener('keydown', handleKeyDown); return () => { document.removeEventListener('keydown', handleKeyDown); }; }, [toggleDebugMode]); // Mettre à jour les valeurs quand elles changent useEffect(() => { if (paneRef.current) { paramsRef.current.dilation = dilationFactor; paramsRef.current.size = characterSize; paramsRef.current.variantSizeImpact = variantSizeImpact; paneRef.current.refresh(); } }, [dilationFactor, characterSize, variantSizeImpact]); return { isDebugMode, toggleDebugMode }; };