// Centralized timing configuration for all animations and pauses // Edit these values to tune the feel of card animations and CPU gameplay const TIMING = { // Card animations (milliseconds) - smooth, unhurried card: { flip: 400, // Card flip duration (must match CSS transition) move: 400, // Card movement - slower = smoother lift: 0, // No lift pause moving: 400, // Card moving class duration }, // Pauses - minimal, let animations flow pause: { afterFlip: 0, // No pause - flow into next action afterDiscard: 100, // Brief settle beforeNewCard: 0, // No pause afterSwapComplete: 100, // Brief settle betweenAnimations: 0, // No gaps - continuous flow beforeFlip: 0, // No pause }, // Beat timing for animation phases (~1.2 sec with variance) beat: { base: 1200, // Base beat duration (longer to see results) variance: 200, // +/- variance for natural feel fadeOut: 300, // Fade out duration fadeIn: 300, // Fade in duration }, // UI feedback durations (milliseconds) feedback: { drawPulse: 300, // Draw pile highlight duration discardLand: 300, // Discard land effect duration cardFlipIn: 300, // Card flip-in effect duration statusMessage: 2000, // Toast/status message duration copyConfirm: 2000, // Copy button confirmation duration discardPickup: 250, // Discard pickup animation duration }, // CSS animation timing (for reference - actual values in style.css) css: { cpuConsidering: 1500, // CPU considering pulse cycle }, // Card manager specific cardManager: { flipDuration: 400, // Card flip animation moveDuration: 400, // Card move animation }, // Player swap animation steps - smooth continuous motion playerSwap: { flipToReveal: 400, // Initial flip to show card pauseAfterReveal: 50, // Tiny beat to register the card moveToDiscard: 400, // Move old card to discard pulseBeforeSwap: 0, // No pulse - just flow completePause: 50, // Tiny settle }, }; // Helper to get beat duration with variance function getBeatDuration() { const base = TIMING.beat.base; const variance = TIMING.beat.variance; return base + (Math.random() * variance * 2 - variance); } // Export for module systems, also attach to window for direct use if (typeof module !== 'undefined' && module.exports) { module.exports = TIMING; } if (typeof window !== 'undefined') { window.TIMING = TIMING; window.getBeatDuration = getBeatDuration; }