Spaces:
Configuration error
Configuration error
| import { useEffect, useRef, useCallback, useState } from 'react'; | |
| import { Pane } from 'tweakpane'; | |
| import { useFontMapStore } from '../../../store/fontMapStore'; | |
| /** | |
| * Hook pour gérer Tweakpane avec les contrôles de taille | |
| * Activé uniquement en mode debug (touche D) | |
| * Maintenant utilise Zustand pour éviter le props drilling | |
| */ | |
| export const useTweakpane = (darkMode) => { | |
| // Récupérer l'état depuis le store Zustand | |
| const { | |
| characterSize, | |
| variantSizeImpact, | |
| debugMode, | |
| setCharacterSize, | |
| setVariantSizeImpact, | |
| setDebugMode | |
| } = useFontMapStore(); | |
| const paneRef = useRef(null); | |
| const paramsRef = useRef({ | |
| size: characterSize, | |
| variantSizeImpact: variantSizeImpact, | |
| debugMode: debugMode | |
| }); | |
| 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 debug mode | |
| pane.addBinding(paramsRef.current, 'debugMode', { | |
| label: '🐛 Debug Logs' | |
| }).on('change', (ev) => { | |
| console.log('🎯 Debug mode changed to:', ev.value); | |
| setDebugMode(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', () => { | |
| setCharacterSize(1); // Valeur par défaut | |
| setVariantSizeImpact(false); // Valeur par défaut | |
| paramsRef.current.size = 1; | |
| paramsRef.current.variantSizeImpact = false; | |
| pane.refresh(); | |
| }); | |
| paneRef.current = pane; | |
| }, [setCharacterSize, setVariantSizeImpact, setDebugMode]); | |
| // 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.size = characterSize; | |
| paramsRef.current.variantSizeImpact = variantSizeImpact; | |
| paneRef.current.refresh(); | |
| } | |
| }, [characterSize, variantSizeImpact]); | |
| return { | |
| isDebugMode, | |
| toggleDebugMode | |
| }; | |
| }; |