tfrere's picture
tfrere HF Staff
first commit
eebc40f
raw
history blame
4.85 kB
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
};
};