File size: 4,848 Bytes
eebc40f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
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
};
}; |