help@rskworld.in +91 93305 39277
RSK World
  • Home
  • Development
    • Web Development
    • Mobile Apps
    • Software
    • Games
    • Project
  • Technologies
    • Data Science
    • AI Development
    • Cloud Development
    • Blockchain
    • Cyber Security
    • Dev Tools
    • Testing Tools
  • About
  • Contact

Theme Settings

Color Scheme
Display Options
Font Size
100%
Back to Project
RSK World
speech-recognition
/
data
RSK World
speech-recognition
Speech Recognition Dataset - Audio AI + Speech-to-Text + Voice Recognition
data
  • audio
  • features
  • metadata.csv3.9 KB
  • transcripts.json1.6 KB
train.jsonscript.jsvalidation.jsonstyle.css
js/script.js
Raw Download
Find: Go to:
/**
 * ============================================================================
 * Speech Recognition Dataset - JavaScript
 * ============================================================================
 * 
 * Project: Speech Recognition Dataset
 * Description: Audio speech recognition dataset with labeled speech samples 
 *              for training speech-to-text and voice recognition models.
 * 
 * ============================================================================
 * DEVELOPER INFORMATION
 * ============================================================================
 * Website: https://rskworld.in
 * Founded by: Molla Samser
 * Designer & Tester: Rima Khatun
 * Email: help@rskworld.in
 * Support: support@rskworld.in
 * Phone: +91 93305 39277
 * Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India, 713147
 * 
 * ============================================================================
 * COPYRIGHT NOTICE
 * ============================================================================
 * © 2026 RSK World. All rights reserved.
 * This dataset is provided for educational and research purposes.
 * 
 * ============================================================================
 */

// ============================================================================
// PRELOADER
// ============================================================================
window.addEventListener('load', () => {
    const preloader = document.getElementById('preloader');
    if (preloader) {
        setTimeout(() => {
            preloader.classList.add('hidden');
        }, 1500);
    }
});

// ============================================================================
// CUSTOM CURSOR
// ============================================================================
const cursor = document.getElementById('cursor');
const cursorFollower = document.getElementById('cursorFollower');

if (cursor && cursorFollower) {
    document.addEventListener('mousemove', (e) => {
        cursor.style.left = e.clientX + 'px';
        cursor.style.top = e.clientY + 'px';
        
        setTimeout(() => {
            cursorFollower.style.left = e.clientX - 15 + 'px';
            cursorFollower.style.top = e.clientY - 15 + 'px';
        }, 50);
    });

    // Add hover effect to interactive elements
    const interactiveElements = document.querySelectorAll('a, button, input, .feature-card, .sample-card, .use-case-card');
    interactiveElements.forEach(el => {
        el.addEventListener('mouseenter', () => cursorFollower.classList.add('hover'));
        el.addEventListener('mouseleave', () => cursorFollower.classList.remove('hover'));
    });
}

// ============================================================================
// THEME TOGGLE
// ============================================================================
const themeToggle = document.getElementById('themeToggle');
const html = document.documentElement;

// Check for saved theme preference
const savedTheme = localStorage.getItem('theme') || 'dark';
html.setAttribute('data-theme', savedTheme);
updateThemeIcon(savedTheme);

if (themeToggle) {
    themeToggle.addEventListener('click', () => {
        const currentTheme = html.getAttribute('data-theme');
        const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
        
        html.setAttribute('data-theme', newTheme);
        localStorage.setItem('theme', newTheme);
        updateThemeIcon(newTheme);
        
        showToast(`Theme changed to ${newTheme} mode`);
    });
}

function updateThemeIcon(theme) {
    if (themeToggle) {
        const icon = themeToggle.querySelector('i');
        icon.className = theme === 'dark' ? 'fas fa-moon' : 'fas fa-sun';
    }
}

// ============================================================================
// SEARCH FUNCTIONALITY
// ============================================================================
const searchBtn = document.getElementById('searchBtn');
const searchModal = document.getElementById('searchModal');
const searchInput = document.getElementById('searchInput');
const closeSearch = document.getElementById('closeSearch');
const searchResults = document.getElementById('searchResults');

const searchData = [
    { title: 'MFCC Features', section: '#features', description: 'Mel-frequency cepstral coefficients extraction' },
    { title: 'Librosa Integration', section: '#code', description: 'Audio processing with Librosa library' },
    { title: 'LSTM Model', section: '#tensorflow', description: 'Recurrent neural network for sequence modeling' },
    { title: 'PyTorch Training', section: '#pytorch', description: 'Deep learning with PyTorch framework' },
    { title: 'Audio Samples', section: '#samples', description: 'Preview dataset audio recordings' },
    { title: 'Speaker Distribution', section: '#statistics', description: 'Dataset statistics and metrics' },
    { title: 'Download Dataset', section: '#download', description: 'Get the complete dataset package' },
    { title: 'Voice Assistants', section: '#use-cases', description: 'Build intelligent voice-activated systems' },
    { title: 'Transcription', section: '#use-cases', description: 'Automatic speech-to-text conversion' },
    { title: 'FAQ', section: '#faq', description: 'Frequently asked questions' }
];

if (searchBtn && searchModal) {
    searchBtn.addEventListener('click', () => {
        searchModal.classList.add('active');
        searchInput.focus();
    });

    closeSearch.addEventListener('click', () => {
        searchModal.classList.remove('active');
    });

    searchModal.addEventListener('click', (e) => {
        if (e.target === searchModal) {
            searchModal.classList.remove('active');
        }
    });

    // Search input handling
    searchInput.addEventListener('input', (e) => {
        const query = e.target.value.toLowerCase();
        
        if (query.length < 2) {
            searchResults.innerHTML = `
                <div class="search-hint">
                    <p>Try searching for: <span class="search-tag">MFCC</span> <span class="search-tag">Librosa</span> <span class="search-tag">LSTM</span></p>
                </div>
            `;
            return;
        }

        const results = searchData.filter(item => 
            item.title.toLowerCase().includes(query) || 
            item.description.toLowerCase().includes(query)
        );

        if (results.length === 0) {
            searchResults.innerHTML = `
                <div class="search-hint">
                    <p>No results found for "${query}"</p>
                </div>
            `;
            return;
        }

        searchResults.innerHTML = results.map(item => `
            <div class="search-result-item" data-section="${item.section}">
                <strong>${item.title}</strong>
                <p style="font-size: 0.85rem; color: var(--text-muted); margin-top: 0.25rem;">
                    ${item.description}
                </p>
            </div>
        `).join('');

        // Add click handlers to results
        document.querySelectorAll('.search-result-item').forEach(item => {
            item.addEventListener('click', () => {
                const section = item.dataset.section;
                searchModal.classList.remove('active');
                document.querySelector(section)?.scrollIntoView({ behavior: 'smooth' });
            });
        });
    });

    // Keyboard shortcut
    document.addEventListener('keydown', (e) => {
        if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
            e.preventDefault();
            searchModal.classList.add('active');
            searchInput.focus();
        }
        if (e.key === 'Escape') {
            searchModal.classList.remove('active');
        }
    });
}

// ============================================================================
// TYPING ANIMATION
// ============================================================================
const typingText = document.getElementById('typingText');
const phrases = [
    'Speech-to-Text Models',
    'Voice Assistants',
    'Audio Deep Learning',
    'Speaker Recognition',
    'Language Models',
    'Transcription Services'
];

if (typingText) {
    let phraseIndex = 0;
    let charIndex = 0;
    let isDeleting = false;
    let typingSpeed = 100;

    function type() {
        const currentPhrase = phrases[phraseIndex];
        
        if (isDeleting) {
            typingText.textContent = currentPhrase.substring(0, charIndex - 1);
            charIndex--;
            typingSpeed = 50;
        } else {
            typingText.textContent = currentPhrase.substring(0, charIndex + 1);
            charIndex++;
            typingSpeed = 100;
        }

        if (!isDeleting && charIndex === currentPhrase.length) {
            isDeleting = true;
            typingSpeed = 2000; // Pause at end
        } else if (isDeleting && charIndex === 0) {
            isDeleting = false;
            phraseIndex = (phraseIndex + 1) % phrases.length;
            typingSpeed = 500; // Pause before next phrase
        }

        setTimeout(type, typingSpeed);
    }

    type();
}

// ============================================================================
// MOBILE MENU
// ============================================================================
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
const mobileMenu = document.getElementById('mobileMenu');

if (mobileMenuBtn && mobileMenu) {
    mobileMenuBtn.addEventListener('click', () => {
        mobileMenu.classList.toggle('active');
        mobileMenuBtn.classList.toggle('active');
    });

    const mobileLinks = document.querySelectorAll('.mobile-link');
    mobileLinks.forEach(link => {
        link.addEventListener('click', () => {
            mobileMenu.classList.remove('active');
            mobileMenuBtn.classList.remove('active');
        });
    });
}

// ============================================================================
// SMOOTH SCROLLING - FIXED TO PREVENT REFRESH
// ============================================================================
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
    anchor.addEventListener('click', function (e) {
        e.preventDefault();
        e.stopPropagation();
        
        const href = this.getAttribute('href');
        if (href && href !== '#') {
            const target = document.querySelector(href);
            if (target) {
                // Close mobile menu if open
                if (mobileMenu && mobileMenu.classList.contains('active')) {
                    mobileMenu.classList.remove('active');
                    mobileMenuBtn.classList.remove('active');
                }
                
                // Smooth scroll to target
                const navHeight = document.querySelector('.navbar')?.offsetHeight || 70;
                const targetPosition = target.getBoundingClientRect().top + window.pageYOffset - navHeight;
                
                window.scrollTo({
                    top: targetPosition,
                    behavior: 'smooth'
                });
                
                // Update URL without page jump
                history.pushState(null, null, href);
            }
        }
        return false;
    });
});

// Prevent form submissions from refreshing page
document.querySelectorAll('form').forEach(form => {
    form.addEventListener('submit', (e) => {
        e.preventDefault();
    });
});

// Handle download buttons - prevent refresh
document.querySelectorAll('.btn-download, .btn-github').forEach(btn => {
    btn.addEventListener('click', (e) => {
        // Allow download links to work but show toast
        if (btn.classList.contains('btn-download')) {
            showToast('📦 Preparing download...');
        }
    });
});

// ============================================================================
// COUNTER ANIMATION
// ============================================================================
const animateCounter = (element, target, duration = 2000) => {
    let start = 0;
    const increment = target / (duration / 16);
    
    const updateCounter = () => {
        start += increment;
        if (start < target) {
            element.textContent = Math.floor(start).toLocaleString();
            requestAnimationFrame(updateCounter);
        } else {
            element.textContent = target.toLocaleString();
        }
    };
    
    updateCounter();
};

const observerOptions = {
    threshold: 0.5,
    rootMargin: '0px'
};

const counterObserver = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            const statNumber = entry.target.querySelector('.stat-number');
            if (statNumber && !statNumber.dataset.animated) {
                const target = parseInt(statNumber.dataset.count);
                animateCounter(statNumber, target);
                statNumber.dataset.animated = 'true';
            }
        }
    });
}, observerOptions);

document.querySelectorAll('.stat-item').forEach(item => {
    counterObserver.observe(item);
});

// ============================================================================
// WAVEFORM CANVAS
// ============================================================================
const waveformCanvas = document.getElementById('waveformCanvas');
if (waveformCanvas) {
    const ctx = waveformCanvas.getContext('2d');
    
    function resizeCanvas() {
        waveformCanvas.width = waveformCanvas.offsetWidth * window.devicePixelRatio;
        waveformCanvas.height = 200 * window.devicePixelRatio;
        ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
    }
    
    resizeCanvas();
    window.addEventListener('resize', resizeCanvas);
    
    const drawWaveform = () => {
        const width = waveformCanvas.offsetWidth;
        const height = 200;
        
        ctx.clearRect(0, 0, width, height);
        
        // Draw gradient background
        const gradient = ctx.createLinearGradient(0, 0, width, 0);
        gradient.addColorStop(0, 'rgba(99, 102, 241, 0.3)');
        gradient.addColorStop(0.5, 'rgba(139, 92, 246, 0.3)');
        gradient.addColorStop(1, 'rgba(236, 72, 153, 0.3)');
        
        ctx.strokeStyle = gradient;
        ctx.lineWidth = 3;
        ctx.beginPath();
        
        const centerY = height / 2;
        const time = Date.now() * 0.001;
        
        for (let x = 0; x < width; x++) {
            const y = centerY + 
                Math.sin(x * 0.02 + time) * 30 +
                Math.sin(x * 0.01 + time * 1.5) * 20 +
                Math.sin(x * 0.03 + time * 0.8) * 15;
            
            if (x === 0) {
                ctx.moveTo(x, y);
            } else {
                ctx.lineTo(x, y);
            }
        }
        
        ctx.stroke();
        
        // Draw secondary wave
        ctx.strokeStyle = 'rgba(99, 102, 241, 0.5)';
        ctx.lineWidth = 2;
        ctx.beginPath();
        
        for (let x = 0; x < width; x++) {
            const y = centerY + 
                Math.sin(x * 0.015 + time * 1.2) * 25 +
                Math.cos(x * 0.02 + time) * 15;
            
            if (x === 0) {
                ctx.moveTo(x, y);
            } else {
                ctx.lineTo(x, y);
            }
        }
        
        ctx.stroke();
        
        requestAnimationFrame(drawWaveform);
    };
    
    drawWaveform();
}

// ============================================================================
// SPECTROGRAM VISUALIZATION
// ============================================================================
const spectrogramCanvas = document.getElementById('spectrogramCanvas');
const specBtns = document.querySelectorAll('.spec-btn');
let currentVisualization = 'waveform';

if (spectrogramCanvas) {
    const ctx = spectrogramCanvas.getContext('2d');
    
    function resizeSpectrogramCanvas() {
        spectrogramCanvas.width = spectrogramCanvas.parentElement.offsetWidth * window.devicePixelRatio;
        spectrogramCanvas.height = spectrogramCanvas.parentElement.offsetHeight * window.devicePixelRatio;
        ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
    }
    
    resizeSpectrogramCanvas();
    window.addEventListener('resize', resizeSpectrogramCanvas);
    
    // Visualization type buttons
    specBtns.forEach(btn => {
        btn.addEventListener('click', () => {
            specBtns.forEach(b => b.classList.remove('active'));
            btn.classList.add('active');
            currentVisualization = btn.dataset.type;
        });
    });
    
    function drawSpectrogram() {
        const width = spectrogramCanvas.parentElement.offsetWidth;
        const height = spectrogramCanvas.parentElement.offsetHeight;
        const time = Date.now() * 0.001;
        
        ctx.clearRect(0, 0, width, height);
        
        if (currentVisualization === 'waveform') {
            // Draw waveform
            ctx.strokeStyle = '#6366f1';
            ctx.lineWidth = 2;
            ctx.beginPath();
            
            for (let x = 0; x < width; x++) {
                const y = height / 2 + 
                    Math.sin(x * 0.02 + time) * (height * 0.3) +
                    Math.sin(x * 0.05 + time * 1.5) * (height * 0.1);
                
                if (x === 0) ctx.moveTo(x, y);
                else ctx.lineTo(x, y);
            }
            ctx.stroke();
            
        } else if (currentVisualization === 'spectrogram') {
            // Draw spectrogram bars
            const barWidth = 4;
            const barGap = 2;
            const numBars = Math.floor(width / (barWidth + barGap));
            
            for (let i = 0; i < numBars; i++) {
                const barHeight = Math.abs(Math.sin(i * 0.1 + time) * 
                    Math.sin(i * 0.05 + time * 1.5)) * height * 0.8 + height * 0.1;
                
                const hue = 250 + (i / numBars) * 60;
                ctx.fillStyle = `hsla(${hue}, 70%, 60%, 0.8)`;
                
                const x = i * (barWidth + barGap);
                const y = (height - barHeight) / 2;
                ctx.fillRect(x, y, barWidth, barHeight);
            }
            
        } else if (currentVisualization === 'frequency') {
            // Draw frequency circles
            const numCircles = 8;
            
            for (let i = 0; i < numCircles; i++) {
                const radius = (i + 1) * (Math.min(width, height) / (numCircles * 2.5));
                const amplitude = Math.sin(time + i * 0.5) * 10;
                
                ctx.strokeStyle = `hsla(${250 + i * 15}, 70%, 60%, ${0.3 + (numCircles - i) * 0.05})`;
                ctx.lineWidth = 2;
                ctx.beginPath();
                ctx.arc(width / 2, height / 2, radius + amplitude, 0, Math.PI * 2);
                ctx.stroke();
            }
        }
        
        requestAnimationFrame(drawSpectrogram);
    }
    
    drawSpectrogram();
}

// ============================================================================
// WEB AUDIO API - AUDIO CONTEXT
// ============================================================================
let audioContext = null;
let currentOscillator = null;
let currentGainNode = null;

function initAudioContext() {
    if (!audioContext) {
        audioContext = new (window.AudioContext || window.webkitAudioContext)();
    }
    if (audioContext.state === 'suspended') {
        audioContext.resume();
    }
    return audioContext;
}

// Generate speech-like sound using oscillators
function playSpeechSound(duration = 2, transcript = '') {
    const ctx = initAudioContext();
    
    // Stop any currently playing sound
    stopCurrentSound();
    
    const masterGain = ctx.createGain();
    masterGain.connect(ctx.destination);
    masterGain.gain.setValueAtTime(0.3, ctx.currentTime);
    
    currentGainNode = masterGain;
    
    // Create multiple oscillators for richer sound
    const oscillators = [];
    const frequencies = [150, 300, 450, 600]; // Formant-like frequencies
    
    frequencies.forEach((freq, index) => {
        const osc = ctx.createOscillator();
        const oscGain = ctx.createGain();
        
        osc.type = index === 0 ? 'sawtooth' : 'sine';
        osc.frequency.setValueAtTime(freq, ctx.currentTime);
        
        // Add slight vibrato
        const vibrato = ctx.createOscillator();
        const vibratoGain = ctx.createGain();
        vibrato.frequency.setValueAtTime(5, ctx.currentTime);
        vibratoGain.gain.setValueAtTime(freq * 0.02, ctx.currentTime);
        vibrato.connect(vibratoGain);
        vibratoGain.connect(osc.frequency);
        vibrato.start();
        
        // Simulate speech patterns with frequency changes
        const speechPattern = generateSpeechPattern(duration, transcript);
        speechPattern.forEach((change, i) => {
            osc.frequency.setValueAtTime(
                freq * change.multiplier,
                ctx.currentTime + change.time
            );
        });
        
        oscGain.gain.setValueAtTime(0.15 / (index + 1), ctx.currentTime);
        
        osc.connect(oscGain);
        oscGain.connect(masterGain);
        
        osc.start();
        oscillators.push({ osc, vibrato, oscGain });
    });
    
    // Envelope for natural speech
    masterGain.gain.setValueAtTime(0, ctx.currentTime);
    masterGain.gain.linearRampToValueAtTime(0.3, ctx.currentTime + 0.05);
    masterGain.gain.setValueAtTime(0.3, ctx.currentTime + duration - 0.1);
    masterGain.gain.linearRampToValueAtTime(0, ctx.currentTime + duration);
    
    // Stop oscillators after duration
    setTimeout(() => {
        oscillators.forEach(({ osc, vibrato }) => {
            osc.stop();
            vibrato.stop();
        });
    }, duration * 1000);
    
    currentOscillator = oscillators;
    
    return duration;
}

function generateSpeechPattern(duration, transcript) {
    const pattern = [];
    const words = transcript.split(' ').length || 3;
    const wordDuration = duration / words;
    
    for (let i = 0; i < words; i++) {
        const wordStart = i * wordDuration;
        // Pitch variation for each word
        pattern.push({ time: wordStart, multiplier: 0.9 + Math.random() * 0.3 });
        pattern.push({ time: wordStart + wordDuration * 0.3, multiplier: 1 + Math.random() * 0.2 });
        pattern.push({ time: wordStart + wordDuration * 0.7, multiplier: 0.95 + Math.random() * 0.1 });
    }
    return pattern;
}

function stopCurrentSound() {
    if (currentOscillator) {
        try {
            if (Array.isArray(currentOscillator)) {
                currentOscillator.forEach(({ osc, vibrato }) => {
                    osc.stop();
                    vibrato.stop();
                });
            }
        } catch (e) {}
        currentOscillator = null;
    }
    if (currentGainNode) {
        currentGainNode.gain.setValueAtTime(0, audioContext?.currentTime || 0);
    }
}

// Play a simple beep sound for UI feedback
function playBeep(frequency = 440, duration = 0.1) {
    const ctx = initAudioContext();
    const osc = ctx.createOscillator();
    const gain = ctx.createGain();
    
    osc.type = 'sine';
    osc.frequency.setValueAtTime(frequency, ctx.currentTime);
    gain.gain.setValueAtTime(0.1, ctx.currentTime);
    gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + duration);
    
    osc.connect(gain);
    gain.connect(ctx.destination);
    
    osc.start();
    osc.stop(ctx.currentTime + duration);
}

// ============================================================================
// MAIN AUDIO PLAYER - Uses Browser Speech Synthesis
// ============================================================================
const playBtn = document.getElementById('playBtn');
const progressBar = document.getElementById('progressBar');
const timeDisplay = document.getElementById('timeDisplay');
const volumeSlider = document.getElementById('volumeSlider');
const volumeIcon = document.getElementById('volumeIcon');

// Main player transcript
const mainTranscript = "Hello, how are you today?";
let mainIsPlaying = false;

// Volume controls
function updateVolumeIcon(volume) {
    if (volumeIcon) {
        if (volume === 0) {
            volumeIcon.className = 'fas fa-volume-mute';
        } else if (volume < 50) {
            volumeIcon.className = 'fas fa-volume-down';
        } else {
            volumeIcon.className = 'fas fa-volume-up';
        }
    }
}

if (volumeSlider) {
    volumeSlider.addEventListener('input', (e) => {
        const volume = parseInt(e.target.value);
        updateVolumeIcon(volume);
    });
}

if (volumeIcon && volumeSlider) {
    let previousVolume = 70;
    volumeIcon.addEventListener('click', () => {
        if (parseInt(volumeSlider.value) > 0) {
            previousVolume = volumeSlider.value;
            volumeSlider.value = 0;
        } else {
            volumeSlider.value = previousVolume;
        }
        updateVolumeIcon(parseInt(volumeSlider.value));
    });
}

// Main play button
if (playBtn) {
    playBtn.addEventListener('click', () => {
        if (!mainIsPlaying) {
            // Start speaking
            mainIsPlaying = true;
            playBtn.innerHTML = '<i class="fas fa-pause"></i>';
            
            showToast(`🔊 Speaking: "${mainTranscript}"`);
            
            // Animate progress bar
            progressBar.style.transition = 'width 2s linear';
            progressBar.style.width = '100%';
            timeDisplay.textContent = '0:00 / 0:02';
            
            // Speak the text
            speakText(mainTranscript, () => {
                // Reset when done
                mainIsPlaying = false;
                playBtn.innerHTML = '<i class="fas fa-play"></i>';
                progressBar.style.transition = 'none';
                progressBar.style.width = '0%';
                timeDisplay.textContent = '0:00 / 0:02';
            });
            
            // Update time display
            let elapsed = 0;
            const timeInterval = setInterval(() => {
                elapsed++;
                if (elapsed <= 2 && mainIsPlaying) {
                    timeDisplay.textContent = `0:0${elapsed} / 0:02`;
                } else {
                    clearInterval(timeInterval);
                }
            }, 1000);
            
        } else {
            // Stop speaking
            mainIsPlaying = false;
            playBtn.innerHTML = '<i class="fas fa-play"></i>';
            stopSpeaking();
            progressBar.style.transition = 'none';
            progressBar.style.width = '0%';
            timeDisplay.textContent = '0:00 / 0:02';
        }
    });
}

// ============================================================================
// SAMPLE WAVEFORMS
// ============================================================================
document.querySelectorAll('.sample-waveform').forEach((waveform, index) => {
    const canvas = document.createElement('canvas');
    canvas.width = waveform.offsetWidth || 300;
    canvas.height = waveform.offsetHeight || 100;
    waveform.appendChild(canvas);
    
    const ctx = canvas.getContext('2d');
    const width = canvas.width;
    const height = canvas.height;
    
    // Generate random but consistent waveform data
    const waveData = [];
    for (let i = 0; i < width / 3; i++) {
        waveData.push(Math.random() * 0.6 + 0.2);
    }
    
    const drawSampleWaveform = () => {
        ctx.clearRect(0, 0, width, height);
        
        const barWidth = 2;
        const barSpacing = 1;
        const time = Date.now() * 0.001;
        
        waveData.forEach((value, i) => {
            const animatedValue = value * (0.8 + Math.sin(time + i * 0.2) * 0.2);
            const barHeight = animatedValue * height;
            const x = i * (barWidth + barSpacing);
            const y = (height - barHeight) / 2;
            
            const gradient = ctx.createLinearGradient(x, y, x, y + barHeight);
            gradient.addColorStop(0, 'rgba(99, 102, 241, 0.8)');
            gradient.addColorStop(1, 'rgba(139, 92, 246, 0.8)');
            
            ctx.fillStyle = gradient;
            ctx.fillRect(x, y, barWidth, barHeight);
        });
        
        requestAnimationFrame(drawSampleWaveform);
    };
    
    drawSampleWaveform();
});

// ============================================================================
// CHARTS
// ============================================================================
const speakerChart = document.getElementById('speakerChart');
const durationChart = document.getElementById('durationChart');
const wordChart = document.getElementById('wordChart');

if (speakerChart && typeof Chart !== 'undefined') {
    new Chart(speakerChart, {
        type: 'doughnut',
        data: {
            labels: ['Male', 'Female', 'Other'],
            datasets: [{
                data: [30, 18, 2],
                backgroundColor: [
                    'rgba(99, 102, 241, 0.8)',
                    'rgba(139, 92, 246, 0.8)',
                    'rgba(236, 72, 153, 0.8)'
                ],
                borderWidth: 0
            }]
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            plugins: {
                legend: {
                    position: 'bottom',
                    labels: {
                        color: '#cbd5e1',
                        padding: 20
                    }
                }
            },
            cutout: '60%'
        }
    });
}

if (durationChart && typeof Chart !== 'undefined') {
    new Chart(durationChart, {
        type: 'bar',
        data: {
            labels: ['0-1s', '1-2s', '2-3s', '3-4s', '4-5s', '5s+'],
            datasets: [{
                label: 'Number of Samples',
                data: [500, 1200, 1800, 1000, 400, 100],
                backgroundColor: 'rgba(99, 102, 241, 0.8)',
                borderRadius: 8
            }]
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            plugins: {
                legend: {
                    display: false
                }
            },
            scales: {
                y: {
                    beginAtZero: true,
                    ticks: { color: '#cbd5e1' },
                    grid: { color: 'rgba(51, 65, 85, 0.3)' }
                },
                x: {
                    ticks: { color: '#cbd5e1' },
                    grid: { color: 'rgba(51, 65, 85, 0.3)' }
                }
            }
        }
    });
}

if (wordChart && typeof Chart !== 'undefined') {
    new Chart(wordChart, {
        type: 'line',
        data: {
            labels: ['the', 'hello', 'please', 'what', 'how', 'turn', 'set', 'weather'],
            datasets: [{
                label: 'Frequency',
                data: [1200, 800, 600, 500, 450, 400, 350, 300],
                borderColor: 'rgba(99, 102, 241, 1)',
                backgroundColor: 'rgba(99, 102, 241, 0.1)',
                tension: 0.4,
                fill: true,
                pointBackgroundColor: 'rgba(99, 102, 241, 1)',
                pointBorderColor: '#fff',
                pointBorderWidth: 2
            }]
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            plugins: {
                legend: {
                    display: false
                }
            },
            scales: {
                y: {
                    beginAtZero: true,
                    ticks: { color: '#cbd5e1' },
                    grid: { color: 'rgba(51, 65, 85, 0.3)' }
                },
                x: {
                    ticks: { color: '#cbd5e1' },
                    grid: { color: 'rgba(51, 65, 85, 0.3)' }
                }
            }
        }
    });
}

// ============================================================================
// CODE TABS
// ============================================================================
const tabBtns = document.querySelectorAll('.tab-btn');
const codeBlocks = document.querySelectorAll('.code-block');

tabBtns.forEach(btn => {
    if (btn.dataset.tab) {
        btn.addEventListener('click', () => {
            tabBtns.forEach(b => {
                if (b.dataset.tab) b.classList.remove('active');
            });
            codeBlocks.forEach(block => block.classList.remove('active'));
            
            btn.classList.add('active');
            document.getElementById(btn.dataset.tab)?.classList.add('active');
        });
    }
});

// ============================================================================
// COPY CODE BUTTON
// ============================================================================
const copyCodeBtn = document.getElementById('copyCodeBtn');

if (copyCodeBtn) {
    copyCodeBtn.addEventListener('click', () => {
        const activeCodeBlock = document.querySelector('.code-block.active code');
        if (activeCodeBlock) {
            const code = activeCodeBlock.textContent;
            navigator.clipboard.writeText(code).then(() => {
                copyCodeBtn.innerHTML = '<i class="fas fa-check"></i> Copied!';
                copyCodeBtn.classList.add('copied');
                showToast('Code copied to clipboard!');
                
                setTimeout(() => {
                    copyCodeBtn.innerHTML = '<i class="fas fa-copy"></i> Copy Code';
                    copyCodeBtn.classList.remove('copied');
                }, 2000);
            });
        }
    });
}

// Copy code buttons in "How to Use" section
document.querySelectorAll('.code-example .copy-code-btn').forEach(btn => {
    btn.addEventListener('click', () => {
        const codeId = btn.getAttribute('data-code');
        const codeElement = document.getElementById(codeId);
        
        if (codeElement) {
            const code = codeElement.textContent;
            navigator.clipboard.writeText(code).then(() => {
                const icon = btn.querySelector('i');
                const originalClass = icon ? icon.className : 'fas fa-copy';
                
                btn.innerHTML = '<i class="fas fa-check"></i> Copied!';
                btn.classList.add('copied');
                showToast('Code copied to clipboard!', 'success');
                
                setTimeout(() => {
                    btn.innerHTML = `<i class="${originalClass}"></i> Copy`;
                    btn.classList.remove('copied');
                }, 2000);
            }).catch(() => {
                showToast('Failed to copy code', 'error');
            });
        }
    });
});

// ============================================================================
// FAQ ACCORDION
// ============================================================================
document.querySelectorAll('.faq-question').forEach(question => {
    question.addEventListener('click', () => {
        const faqItem = question.parentElement;
        const isActive = faqItem.classList.contains('active');
        
        // Close all FAQ items
        document.querySelectorAll('.faq-item').forEach(item => {
            item.classList.remove('active');
        });
        
        // Open clicked item if it wasn't active
        if (!isActive) {
            faqItem.classList.add('active');
        }
    });
});

// ============================================================================
// BROWSER SPEECH SYNTHESIS - Speaks actual words!
// ============================================================================
const speechSynthesis = window.speechSynthesis;
let currentUtterance = null;

// Sample data with transcripts
const sampleData = [
    { transcript: "Hello, how are you today?" },
    { transcript: "Please turn on the lights" },
    { transcript: "What's the weather like outside?" },
    { transcript: "Set a timer for five minutes" }
];

// Load voices (needed for some browsers)
let voicesLoaded = false;
speechSynthesis.onvoiceschanged = () => {
    voicesLoaded = true;
};

// Function to speak text using browser TTS
function speakText(text, onEnd) {
    // Cancel any current speech
    speechSynthesis.cancel();
    
    // Create utterance
    currentUtterance = new SpeechSynthesisUtterance(text);
    currentUtterance.rate = 1.0;  // Speed
    currentUtterance.pitch = 1.0; // Pitch
    currentUtterance.volume = 1.0; // Volume
    
    // Try to get a good English voice
    const voices = speechSynthesis.getVoices();
    if (voices.length > 0) {
        const englishVoice = voices.find(v => v.lang.startsWith('en')) || voices[0];
        if (englishVoice) {
            currentUtterance.voice = englishVoice;
        }
    }
    
    currentUtterance.onend = onEnd;
    currentUtterance.onerror = onEnd;
    
    speechSynthesis.speak(currentUtterance);
}

// Stop speaking
function stopSpeaking() {
    speechSynthesis.cancel();
    currentUtterance = null;
}

// Sample play buttons
document.querySelectorAll('.sample-play-btn').forEach((btn, index) => {
    btn.addEventListener('click', (e) => {
        e.preventDefault();
        const icon = btn.querySelector('i');
        const sample = sampleData[index] || sampleData[0];
        
        if (icon.classList.contains('fa-play')) {
            // Stop all other samples
            document.querySelectorAll('.sample-play-btn').forEach((otherBtn) => {
                const otherIcon = otherBtn.querySelector('i');
                if (otherIcon.classList.contains('fa-pause')) {
                    otherIcon.classList.remove('fa-pause');
                    otherIcon.classList.add('fa-play');
                }
            });
            stopSpeaking();
            stopCurrentSound();
            
            // Play this sample
            icon.classList.remove('fa-play');
            icon.classList.add('fa-pause');
            
            // Speak the actual text!
            showToast(`🔊 Speaking: "${sample.transcript}"`);
            speakText(sample.transcript, () => {
                icon.classList.remove('fa-pause');
                icon.classList.add('fa-play');
            });
            
        } else {
            // Stop
            icon.classList.remove('fa-pause');
            icon.classList.add('fa-play');
            stopSpeaking();
        }
    });
});

// ============================================================================
// NEWSLETTER FORM
// ============================================================================
const newsletterForm = document.getElementById('newsletterForm');

if (newsletterForm) {
    newsletterForm.addEventListener('submit', (e) => {
        e.preventDefault();
        const email = newsletterForm.querySelector('input[type="email"]').value;
        
        // Simulate subscription
        showToast('Thank you for subscribing!');
        newsletterForm.reset();
    });
}

// ============================================================================
// TOAST NOTIFICATION
// ============================================================================
function showToast(message) {
    const toast = document.getElementById('toast');
    const toastMessage = document.getElementById('toastMessage');
    
    if (toast && toastMessage) {
        toastMessage.textContent = message;
        toast.classList.add('show');
        
        setTimeout(() => {
            toast.classList.remove('show');
        }, 3000);
    }
}

// ============================================================================
// BACK TO TOP BUTTON
// ============================================================================
const backToTop = document.getElementById('backToTop');

if (backToTop) {
    window.addEventListener('scroll', () => {
        if (window.pageYOffset > 300) {
            backToTop.classList.add('visible');
        } else {
            backToTop.classList.remove('visible');
        }
    });
    
    backToTop.addEventListener('click', () => {
        window.scrollTo({
            top: 0,
            behavior: 'smooth'
        });
    });
}

// ============================================================================
// FLOATING PARTICLES
// ============================================================================
const particlesContainer = document.getElementById('particles');
if (particlesContainer) {
    for (let i = 0; i < 30; i++) {
        const particle = document.createElement('div');
        particle.className = 'particle';
        particle.style.cssText = `
            position: absolute;
            width: ${Math.random() * 6 + 2}px;
            height: ${particle.style.width};
            background: rgba(99, 102, 241, ${Math.random() * 0.3 + 0.1});
            border-radius: 50%;
            left: ${Math.random() * 100}%;
            top: ${Math.random() * 100}%;
            animation: float ${Math.random() * 15 + 10}s infinite ease-in-out;
            animation-delay: ${Math.random() * 5}s;
        `;
        particlesContainer.appendChild(particle);
    }
}

// Add floating animation
const floatStyle = document.createElement('style');
floatStyle.textContent = `
    @keyframes float {
        0%, 100% {
            transform: translate(0, 0) rotate(0deg);
            opacity: 0.3;
        }
        25% {
            transform: translate(${Math.random() * 50 - 25}px, ${Math.random() * 50 - 25}px) rotate(90deg);
        }
        50% {
            transform: translate(${Math.random() * 50 - 25}px, ${Math.random() * 50 - 25}px) rotate(180deg);
            opacity: 0.6;
        }
        75% {
            transform: translate(${Math.random() * 50 - 25}px, ${Math.random() * 50 - 25}px) rotate(270deg);
        }
    }
`;
document.head.appendChild(floatStyle);

// ============================================================================
// SCROLL REVEAL ANIMATION
// ============================================================================
const revealElements = document.querySelectorAll('.feature-card, .sample-card, .use-case-card, .stats-card');

const revealObserver = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            entry.target.style.opacity = '1';
            entry.target.style.transform = 'translateY(0)';
        }
    });
}, { threshold: 0.1 });

revealElements.forEach(el => {
    el.style.opacity = '0';
    el.style.transform = 'translateY(30px)';
    el.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
    revealObserver.observe(el);
});

// ============================================================================
// NAVBAR SCROLL EFFECT
// ============================================================================
const navbar = document.querySelector('.navbar');

window.addEventListener('scroll', () => {
    if (window.pageYOffset > 50) {
        navbar.style.background = 'rgba(15, 23, 42, 0.95)';
        navbar.style.boxShadow = '0 4px 30px rgba(0, 0, 0, 0.3)';
    } else {
        navbar.style.background = 'rgba(15, 23, 42, 0.8)';
        navbar.style.boxShadow = 'none';
    }
});

// ============================================================================
// CONSOLE EASTER EGG
// ============================================================================
console.log('%c🎙️ Speech Recognition Dataset', 'font-size: 24px; font-weight: bold; color: #6366f1;');
console.log('%cDeveloped by Molla Samser - RSK World', 'font-size: 14px; color: #8b5cf6;');
console.log('%cWebsite: https://rskworld.in', 'font-size: 12px; color: #cbd5e1;');
console.log('%c© 2026 RSK World. All rights reserved.', 'font-size: 11px; color: #94a3b8;');
1,239 lines•44 KB
javascript
css/style.css
Raw Download
Find: Go to:
/**
 * ============================================================================
 * Speech Recognition Dataset - Stylesheet
 * ============================================================================
 * 
 * Project: Speech Recognition Dataset
 * Description: Audio speech recognition dataset with labeled speech samples 
 *              for training speech-to-text and voice recognition models.
 * 
 * ============================================================================
 * DEVELOPER INFORMATION
 * ============================================================================
 * Website: https://rskworld.in
 * Founded by: Molla Samser
 * Designer & Tester: Rima Khatun
 * Email: help@rskworld.in
 * Support: support@rskworld.in
 * Phone: +91 93305 39277
 * Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India, 713147
 * 
 * ============================================================================
 * COPYRIGHT NOTICE
 * ============================================================================
 * © 2026 RSK World. All rights reserved.
 * This dataset is provided for educational and research purposes.
 * 
 * ============================================================================
 */

/* Reset and Base Styles */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

:root {
    --primary-color: #6366f1;
    --secondary-color: #8b5cf6;
    --accent-color: #ec4899;
    --success-color: #10b981;
    --warning-color: #f59e0b;
    --error-color: #ef4444;
    --dark-bg: #0f172a;
    --dark-surface: #1e293b;
    --dark-border: #334155;
    --text-primary: #f1f5f9;
    --text-secondary: #cbd5e1;
    --text-muted: #94a3b8;
    --gradient-1: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #ec4899 100%);
    --gradient-2: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    --gradient-3: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
    --gradient-4: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
    --gradient-5: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
    --gradient-6: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
    --glass-bg: rgba(30, 41, 59, 0.7);
    --glass-border: rgba(255, 255, 255, 0.1);
    --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
    --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
    --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
    --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
    --shadow-glow: 0 0 40px rgba(99, 102, 241, 0.3);
}

/* Light Theme Variables */
[data-theme="light"] {
    --dark-bg: #f8fafc;
    --dark-surface: #ffffff;
    --dark-border: #e2e8f0;
    --text-primary: #0f172a;
    --text-secondary: #475569;
    --text-muted: #64748b;
    --glass-bg: rgba(255, 255, 255, 0.8);
    --glass-border: rgba(0, 0, 0, 0.1);
}

/* Preloader */
.preloader {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: var(--dark-bg);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 9999;
    transition: opacity 0.5s, visibility 0.5s;
}

.preloader.hidden {
    opacity: 0;
    visibility: hidden;
}

.loader {
    text-align: center;
}

.sound-bars {
    display: flex;
    justify-content: center;
    align-items: flex-end;
    height: 50px;
    gap: 4px;
    margin-bottom: 1rem;
}

.sound-bars span {
    width: 6px;
    background: var(--gradient-1);
    border-radius: 3px;
    animation: soundBar 1s ease-in-out infinite;
}

.sound-bars span:nth-child(1) { animation-delay: 0s; height: 20px; }
.sound-bars span:nth-child(2) { animation-delay: 0.1s; height: 35px; }
.sound-bars span:nth-child(3) { animation-delay: 0.2s; height: 25px; }
.sound-bars span:nth-child(4) { animation-delay: 0.3s; height: 40px; }
.sound-bars span:nth-child(5) { animation-delay: 0.4s; height: 30px; }

@keyframes soundBar {
    0%, 100% { transform: scaleY(1); }
    50% { transform: scaleY(0.5); }
}

.loader p {
    color: var(--text-secondary);
    font-size: 0.9rem;
    letter-spacing: 2px;
    text-transform: uppercase;
}

/* Custom Cursor */
.cursor, .cursor-follower {
    position: fixed;
    border-radius: 50%;
    pointer-events: none;
    z-index: 10000;
    mix-blend-mode: difference;
}

.cursor {
    width: 10px;
    height: 10px;
    background: white;
    transition: transform 0.1s;
}

.cursor-follower {
    width: 40px;
    height: 40px;
    border: 2px solid rgba(255, 255, 255, 0.5);
    transition: transform 0.3s, width 0.3s, height 0.3s;
}

.cursor-follower.hover {
    width: 60px;
    height: 60px;
    border-color: var(--primary-color);
}

/* Glassmorphism Card */
.glass-card {
    background: var(--glass-bg);
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    border: 1px solid var(--glass-border);
    border-radius: 20px;
}

body {
    font-family: 'Outfit', sans-serif;
    background: var(--dark-bg);
    color: var(--text-primary);
    line-height: 1.6;
    overflow-x: hidden;
}

.container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 20px;
}

/* Animated Background */
.animated-bg {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: -1;
    overflow: hidden;
}

.sound-wave {
    position: absolute;
    width: 200%;
    height: 200%;
    background: radial-gradient(circle, rgba(99, 102, 241, 0.1) 0%, transparent 70%);
    animation: wave 20s infinite;
}

.wave-1 {
    top: -50%;
    left: -50%;
    animation-delay: 0s;
}

.wave-2 {
    top: -30%;
    left: -30%;
    animation-delay: 7s;
}

.wave-3 {
    top: -70%;
    left: -70%;
    animation-delay: 14s;
}

@keyframes wave {
    0%, 100% {
        transform: scale(1) rotate(0deg);
        opacity: 0.3;
    }
    50% {
        transform: scale(1.2) rotate(180deg);
        opacity: 0.1;
    }
}

.floating-particles {
    position: absolute;
    width: 100%;
    height: 100%;
}

/* Navigation */
.navbar {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    background: rgba(15, 23, 42, 0.8);
    backdrop-filter: blur(10px);
    border-bottom: 1px solid var(--dark-border);
    z-index: 1000;
    padding: 1rem 0;
}

.nav-container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 20px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.nav-brand {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--text-primary);
    text-decoration: none;
    transition: color 0.3s;
}

.nav-brand:hover {
    color: var(--primary-color);
}

.nav-brand i {
    color: var(--primary-color);
}

.nav-links {
    display: flex;
    gap: 2rem;
    align-items: center;
}

.nav-link {
    color: var(--text-secondary);
    text-decoration: none;
    font-weight: 500;
    transition: color 0.3s;
    position: relative;
}

.nav-link:hover {
    color: var(--text-primary);
}

.nav-link::after {
    content: '';
    position: absolute;
    bottom: -5px;
    left: 0;
    width: 0;
    height: 2px;
    background: var(--gradient-1);
    transition: width 0.3s;
}

.nav-link:hover::after {
    width: 100%;
}

.download-btn {
    background: var(--gradient-1);
    padding: 0.5rem 1.5rem;
    border-radius: 8px;
    color: white !important;
}

.download-btn::after {
    display: none;
}

/* Navigation Actions */
.nav-actions {
    display: flex;
    gap: 0.5rem;
    margin-left: 1rem;
}

.theme-toggle, .search-btn {
    width: 40px;
    height: 40px;
    border-radius: 10px;
    background: var(--dark-bg);
    border: 1px solid var(--dark-border);
    color: var(--text-secondary);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.3s;
}

.theme-toggle:hover, .search-btn:hover {
    background: var(--primary-color);
    color: white;
    transform: scale(1.05);
}

/* Search Modal */
.search-modal {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.8);
    backdrop-filter: blur(10px);
    z-index: 2000;
    display: none;
    align-items: flex-start;
    justify-content: center;
    padding-top: 15vh;
}

.search-modal.active {
    display: flex;
    animation: fadeIn 0.3s ease;
}

.search-container {
    width: 100%;
    max-width: 600px;
    background: var(--dark-surface);
    border-radius: 16px;
    border: 1px solid var(--dark-border);
    overflow: hidden;
    box-shadow: var(--shadow-xl);
}

.search-header {
    display: flex;
    align-items: center;
    padding: 1rem 1.5rem;
    border-bottom: 1px solid var(--dark-border);
    gap: 1rem;
}

.search-header i {
    color: var(--text-muted);
    font-size: 1.2rem;
}

.search-header input {
    flex: 1;
    background: none;
    border: none;
    color: var(--text-primary);
    font-size: 1.1rem;
    outline: none;
}

.search-header input::placeholder {
    color: var(--text-muted);
}

.close-search {
    background: none;
    border: none;
    color: var(--text-muted);
    cursor: pointer;
    padding: 0.5rem;
    transition: color 0.3s;
}

.close-search:hover {
    color: var(--accent-color);
}

.search-results {
    max-height: 400px;
    overflow-y: auto;
    padding: 1rem;
}

.search-hint {
    text-align: center;
    padding: 2rem;
    color: var(--text-muted);
}

.search-tag {
    display: inline-block;
    padding: 0.25rem 0.75rem;
    background: var(--dark-bg);
    border-radius: 20px;
    font-size: 0.85rem;
    margin: 0.25rem;
    cursor: pointer;
    transition: all 0.3s;
}

.search-tag:hover {
    background: var(--primary-color);
    color: white;
}

.search-result-item {
    padding: 1rem;
    border-radius: 8px;
    cursor: pointer;
    transition: background 0.3s;
}

.search-result-item:hover {
    background: var(--dark-bg);
}

.mobile-menu-btn {
    display: none;
    flex-direction: column;
    gap: 5px;
    background: none;
    border: none;
    cursor: pointer;
    padding: 5px;
}

.mobile-menu-btn span {
    width: 25px;
    height: 2px;
    background: var(--text-primary);
    transition: all 0.3s;
}

.mobile-menu {
    display: none;
    position: fixed;
    top: 70px;
    left: 0;
    width: 100%;
    background: var(--dark-surface);
    border-bottom: 1px solid var(--dark-border);
    padding: 1rem;
    flex-direction: column;
    gap: 1rem;
    z-index: 999;
}

.mobile-menu.active {
    display: flex;
}

.mobile-link {
    color: var(--text-secondary);
    text-decoration: none;
    padding: 0.5rem;
    border-radius: 5px;
    transition: all 0.3s;
}

.mobile-link:hover {
    background: var(--dark-border);
    color: var(--text-primary);
}

/* Hero Section */
.hero {
    min-height: 100vh;
    display: flex;
    align-items: center;
    padding: 120px 20px 60px;
    gap: 4rem;
    max-width: 1400px;
    margin: 0 auto;
}

.hero-content {
    flex: 1;
}

.hero-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 1rem;
    background: rgba(99, 102, 241, 0.1);
    border: 1px solid rgba(99, 102, 241, 0.3);
    border-radius: 50px;
    color: var(--primary-color);
    font-size: 0.9rem;
    font-weight: 500;
    margin-bottom: 1.5rem;
}

.hero-title {
    font-size: 4rem;
    font-weight: 800;
    line-height: 1.1;
    margin-bottom: 1.5rem;
}

.gradient-text {
    background: var(--gradient-1);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
}

.hero-description {
    font-size: 1.25rem;
    color: var(--text-secondary);
    margin-bottom: 1.5rem;
    line-height: 1.8;
}

/* Typing Animation */
.typing-container {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 2rem;
    font-size: 1.1rem;
}

.typing-label {
    color: var(--text-muted);
}

.typing-text {
    color: var(--primary-color);
    font-weight: 600;
}

.typing-cursor {
    color: var(--primary-color);
    animation: blink 1s infinite;
}

@keyframes blink {
    0%, 50% { opacity: 1; }
    51%, 100% { opacity: 0; }
}

.hero-stats {
    display: flex;
    gap: 2rem;
    margin-bottom: 2rem;
}

.stat-item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.stat-item i {
    font-size: 2rem;
    color: var(--primary-color);
}

.stat-info {
    display: flex;
    flex-direction: column;
}

.stat-number {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--text-primary);
}

.stat-label {
    font-size: 0.9rem;
    color: var(--text-muted);
}

.hero-actions {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
}

.btn {
    padding: 0.875rem 2rem;
    border-radius: 8px;
    font-weight: 600;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    transition: all 0.3s;
    border: none;
    cursor: pointer;
    font-size: 1rem;
}

.btn-primary {
    background: var(--gradient-1);
    color: white;
}

.btn-primary:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-xl);
}

.btn-secondary {
    background: var(--dark-surface);
    color: var(--text-primary);
    border: 1px solid var(--dark-border);
}

.btn-secondary:hover {
    background: var(--dark-border);
    transform: translateY(-2px);
}

.hero-visual {
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 2rem;
}

.waveform-container {
    background: var(--dark-surface);
    border-radius: 16px;
    padding: 2rem;
    border: 1px solid var(--dark-border);
}

.waveform-container canvas {
    width: 100%;
    height: 200px;
}

.audio-player-card {
    background: var(--dark-surface);
    border-radius: 16px;
    padding: 1.5rem;
    border: 1px solid var(--dark-border);
}

.player-header {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 1rem;
    color: var(--primary-color);
    font-weight: 600;
}

.player-waveform {
    height: 80px;
    background: var(--dark-bg);
    border-radius: 8px;
    margin-bottom: 1rem;
    position: relative;
    overflow: hidden;
}

.player-controls {
    display: flex;
    align-items: center;
    gap: 1rem;
    margin-bottom: 1rem;
}

.play-btn {
    width: 50px;
    height: 50px;
    border-radius: 50%;
    background: var(--gradient-1);
    border: none;
    color: white;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.2rem;
    transition: all 0.3s;
}

.play-btn:hover {
    transform: scale(1.1);
}

.progress-container {
    flex: 1;
    height: 6px;
    background: var(--dark-bg);
    border-radius: 3px;
    cursor: pointer;
    position: relative;
}

.progress-bar {
    height: 100%;
    background: var(--gradient-1);
    border-radius: 3px;
    width: 0%;
    transition: width 0.1s;
}

.time-display {
    font-size: 0.9rem;
    color: var(--text-muted);
    font-family: 'JetBrains Mono', monospace;
}

/* Volume Control */
.volume-control {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-left: 0.5rem;
}

.volume-control i {
    color: var(--text-muted);
    font-size: 0.9rem;
    cursor: pointer;
    transition: color 0.3s ease;
}

.volume-control i:hover {
    color: var(--primary);
}

.volume-slider {
    width: 60px;
    height: 4px;
    -webkit-appearance: none;
    appearance: none;
    background: var(--glass-bg);
    border-radius: 2px;
    cursor: pointer;
}

.volume-slider::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 12px;
    height: 12px;
    background: var(--primary);
    border-radius: 50%;
    cursor: pointer;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.volume-slider::-webkit-slider-thumb:hover {
    transform: scale(1.2);
    box-shadow: 0 0 10px var(--primary);
}

.volume-slider::-moz-range-thumb {
    width: 12px;
    height: 12px;
    background: var(--primary);
    border-radius: 50%;
    cursor: pointer;
    border: none;
}

.player-info {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.speaker-tag {
    display: inline-block;
    padding: 0.25rem 0.75rem;
    background: rgba(99, 102, 241, 0.1);
    border-radius: 4px;
    font-size: 0.85rem;
    color: var(--primary-color);
    width: fit-content;
}

.transcript {
    color: var(--text-secondary);
    font-style: italic;
}

/* Section Styles */
section {
    padding: 80px 20px;
}

.section-header {
    text-align: center;
    margin-bottom: 4rem;
}

.section-tag {
    display: inline-block;
    padding: 0.5rem 1rem;
    background: rgba(99, 102, 241, 0.1);
    border: 1px solid rgba(99, 102, 241, 0.3);
    border-radius: 50px;
    color: var(--primary-color);
    font-size: 0.9rem;
    font-weight: 500;
    margin-bottom: 1rem;
}

.section-title {
    font-size: 3rem;
    font-weight: 700;
    margin-bottom: 1rem;
}

.section-subtitle {
    font-size: 1.25rem;
    color: var(--text-secondary);
}

/* Features Section */
.features-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 2rem;
}

.feature-card {
    background: var(--dark-surface);
    border: 1px solid var(--dark-border);
    border-radius: 16px;
    padding: 2rem;
    transition: all 0.3s;
}

.feature-card:hover {
    transform: translateY(-5px);
    border-color: var(--primary-color);
    box-shadow: var(--shadow-xl);
}

.feature-icon {
    width: 60px;
    height: 60px;
    border-radius: 12px;
    background: var(--gradient-1);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    color: white;
    margin-bottom: 1.5rem;
}

.feature-card h3 {
    font-size: 1.5rem;
    margin-bottom: 1rem;
    color: var(--text-primary);
}

.feature-card p {
    color: var(--text-secondary);
    line-height: 1.8;
}

/* Samples Section */
.samples-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 2rem;
}

.sample-card {
    background: var(--dark-surface);
    border: 1px solid var(--dark-border);
    border-radius: 16px;
    overflow: hidden;
    transition: all 0.3s;
}

.sample-card:hover {
    transform: translateY(-5px);
    box-shadow: var(--shadow-xl);
}

.sample-visual {
    height: 150px;
    background: var(--dark-bg);
    padding: 1rem;
}

.sample-waveform {
    width: 100%;
    height: 100%;
    background: linear-gradient(90deg, var(--primary-color) 0%, var(--secondary-color) 100%);
    border-radius: 8px;
    position: relative;
    overflow: hidden;
}

.sample-info {
    padding: 1.5rem;
}

.sample-meta {
    display: flex;
    justify-content: space-between;
    margin-bottom: 1rem;
    font-size: 0.9rem;
    color: var(--text-muted);
}

.sample-meta span {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.transcript {
    color: var(--text-secondary);
    margin-bottom: 1rem;
    font-style: italic;
}

.sample-play-btn {
    width: 100%;
    padding: 0.75rem;
    background: var(--gradient-1);
    border: none;
    border-radius: 8px;
    color: white;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s;
}

.sample-play-btn:hover {
    transform: scale(1.05);
}

/* Statistics Section */
.stats-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 2rem;
    margin-bottom: 3rem;
}

.stats-card {
    background: var(--dark-surface);
    border: 1px solid var(--dark-border);
    border-radius: 16px;
    padding: 2rem;
}

.stats-card.large {
    grid-column: span 2;
}

.stats-card h3 {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 1.5rem;
    color: var(--text-primary);
}

.chart-container {
    height: 250px;
    position: relative;
}

.data-table-container {
    background: var(--dark-surface);
    border: 1px solid var(--dark-border);
    border-radius: 16px;
    padding: 2rem;
}

.data-table-container h3 {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 1.5rem;
    color: var(--text-primary);
}

.table-wrapper {
    overflow-x: auto;
}

.data-table {
    width: 100%;
    border-collapse: collapse;
}

.data-table th,
.data-table td {
    padding: 1rem;
    text-align: left;
    border-bottom: 1px solid var(--dark-border);
}

.data-table th {
    background: var(--dark-bg);
    color: var(--text-primary);
    font-weight: 600;
}

.data-table td {
    color: var(--text-secondary);
}

.data-table tr:hover {
    background: var(--dark-bg);
}

/* Category Badges */
.category-badge {
    display: inline-block;
    padding: 0.25rem 0.75rem;
    border-radius: 20px;
    font-size: 0.8rem;
    font-weight: 500;
}

.category-badge.greeting {
    background: rgba(16, 185, 129, 0.2);
    color: #10b981;
}

.category-badge.command {
    background: rgba(99, 102, 241, 0.2);
    color: #6366f1;
}

.category-badge.question {
    background: rgba(245, 158, 11, 0.2);
    color: #f59e0b;
}

/* Technologies Section */
.tech-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 2rem;
}

.tech-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
    padding: 2rem;
    background: var(--dark-surface);
    border: 1px solid var(--dark-border);
    border-radius: 16px;
    transition: all 0.3s;
}

.tech-item:hover {
    transform: translateY(-5px);
    border-color: var(--primary-color);
}

.tech-icon {
    width: 80px;
    height: 80px;
    border-radius: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2rem;
    color: white;
}

.tech-icon.wav {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}

.tech-icon.mp3 {
    background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}

.tech-icon.numpy {
    background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
}

.tech-icon.librosa {
    background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
}

.tech-icon.tensorflow {
    background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
}

.tech-icon.pytorch {
    background: linear-gradient(135deg, #30cfd0 0%, #330867 100%);
}

.tech-item span {
    font-weight: 600;
    color: var(--text-primary);
}

/* Code Section */
.code-tabs {
    display: flex;
    gap: 1rem;
    margin-bottom: 1.5rem;
    border-bottom: 1px solid var(--dark-border);
}

.tab-btn {
    padding: 1rem 2rem;
    background: none;
    border: none;
    color: var(--text-muted);
    font-weight: 600;
    cursor: pointer;
    border-bottom: 2px solid transparent;
    transition: all 0.3s;
    position: relative;
    top: 1px;
}

.tab-btn.active {
    color: var(--primary-color);
    border-bottom-color: var(--primary-color);
}

.code-content {
    background: var(--dark-surface);
    border: 1px solid var(--dark-border);
    border-radius: 16px;
    overflow: hidden;
}

.code-block {
    display: none;
    padding: 2rem;
    margin: 0;
    overflow-x: auto;
}

.code-block.active {
    display: block;
}

.code-block code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 0.9rem;
    line-height: 1.8;
    color: var(--text-primary);
}

.code-block .comment {
    color: #64748b;
}

.code-block .keyword {
    color: #c792ea;
}

.code-block .string {
    color: #c3e88d;
}

.code-block .function {
    color: #82aaff;
}

.code-block .number {
    color: #f78c6c;
}

/* Spectrogram Section */
.spectrogram-section {
    background: var(--dark-surface);
    margin: 0 20px;
    border-radius: 24px;
    padding: 4rem 0;
}

.spectrogram-demo {
    max-width: 900px;
    margin: 0 auto;
}

.spectrogram-card {
    padding: 2rem;
}

.spectrogram-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 1.5rem;
    flex-wrap: wrap;
    gap: 1rem;
}

.spectrogram-header h3 {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    color: var(--text-primary);
}

.spectrogram-controls {
    display: flex;
    gap: 0.5rem;
}

.spec-btn {
    padding: 0.5rem 1rem;
    background: var(--dark-bg);
    border: 1px solid var(--dark-border);
    border-radius: 8px;
    color: var(--text-secondary);
    cursor: pointer;
    transition: all 0.3s;
}

.spec-btn.active, .spec-btn:hover {
    background: var(--primary-color);
    color: white;
    border-color: var(--primary-color);
}

.spectrogram-canvas-container {
    background: var(--dark-bg);
    border-radius: 12px;
    padding: 1rem;
    margin-bottom: 1rem;
    height: 300px;
}

.spectrogram-canvas-container canvas {
    width: 100%;
    height: 100%;
}

.spectrogram-info {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
}

.info-badge {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 1rem;
    background: var(--dark-bg);
    border-radius: 8px;
    font-size: 0.85rem;
    color: var(--text-secondary);
}

.info-badge i {
    color: var(--primary-color);
}

/* Use Cases Section */
.use-cases-section {
    padding: 80px 20px;
}

.use-cases-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
    gap: 2rem;
}

.use-case-card {
    padding: 2rem;
    transition: all 0.3s;
}

.use-case-card:hover {
    transform: translateY(-10px);
    box-shadow: var(--shadow-glow);
}

.use-case-icon {
    width: 70px;
    height: 70px;
    border-radius: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.8rem;
    color: white;
    margin-bottom: 1.5rem;
}

.gradient-bg-1 { background: var(--gradient-1); }
.gradient-bg-2 { background: var(--gradient-2); }
.gradient-bg-3 { background: var(--gradient-3); }
.gradient-bg-4 { background: var(--gradient-4); }
.gradient-bg-5 { background: var(--gradient-5); }
.gradient-bg-6 { background: var(--gradient-6); }

.use-case-card h3 {
    font-size: 1.5rem;
    margin-bottom: 1rem;
    color: var(--text-primary);
}

.use-case-card > p {
    color: var(--text-secondary);
    margin-bottom: 1.5rem;
    line-height: 1.7;
}

.use-case-features {
    list-style: none;
}

.use-case-features li {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0;
    color: var(--text-secondary);
    font-size: 0.95rem;
}

.use-case-features li i {
    color: var(--success-color);
    font-size: 0.8rem;
}

/* FAQ Section */
/* How to Use Section */
.how-to-use-section {
    padding: 6rem 0;
    background: var(--dark-bg);
}

.how-to-steps {
    display: flex;
    flex-direction: column;
    gap: 2rem;
    margin-bottom: 3rem;
}

.step-card {
    display: flex;
    gap: 2rem;
    padding: 2rem;
    border-radius: 16px;
    transition: transform 0.3s ease, box-shadow 0.3s ease;
    position: relative;
    overflow: hidden;
}

.step-card::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 4px;
    height: 100%;
    background: var(--gradient-1);
    opacity: 0;
    transition: opacity 0.3s ease;
}

.step-card:hover {
    transform: translateX(10px);
    box-shadow: var(--shadow-xl);
}

.step-card:hover::before {
    opacity: 1;
}

.step-number {
    min-width: 60px;
    height: 60px;
    border-radius: 50%;
    background: var(--gradient-1);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    font-weight: 700;
    color: white;
    flex-shrink: 0;
    box-shadow: var(--shadow-md);
}

.step-content {
    flex: 1;
}

.step-content h3 {
    font-size: 1.5rem;
    margin-bottom: 0.5rem;
    color: var(--text-primary);
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.step-content h3 i {
    color: var(--primary-color);
}

.step-content > p {
    color: var(--text-secondary);
    margin-bottom: 1.5rem;
    font-size: 1rem;
}

.code-example {
    background: rgba(15, 23, 42, 0.8);
    border-radius: 12px;
    overflow: hidden;
    border: 1px solid var(--dark-border);
}

.code-example .code-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0.75rem 1rem;
    background: rgba(30, 41, 59, 0.5);
    border-bottom: 1px solid var(--dark-border);
}

.code-example .code-lang {
    font-size: 0.85rem;
    color: var(--text-muted);
    font-family: 'JetBrains Mono', monospace;
    text-transform: uppercase;
    letter-spacing: 1px;
}

.code-example pre {
    margin: 0;
    padding: 1.5rem;
    overflow-x: auto;
    background: transparent;
}

.code-example code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 0.9rem;
    line-height: 1.6;
    color: var(--text-primary);
}

.quick-start-card {
    padding: 2.5rem;
    margin-bottom: 2rem;
    border-radius: 16px;
}

.quick-start-card h3 {
    font-size: 1.75rem;
    margin-bottom: 2rem;
    color: var(--text-primary);
    display: flex;
    align-items: center;
    gap: 1rem;
}

.quick-start-card h3 i {
    color: var(--primary-color);
    font-size: 2rem;
}

.commands-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 1.5rem;
}

.command-item {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 1.25rem;
    background: rgba(15, 23, 42, 0.6);
    border-radius: 12px;
    border: 1px solid var(--dark-border);
    transition: all 0.3s ease;
}

.command-item:hover {
    border-color: var(--primary-color);
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
}

.command-icon {
    width: 50px;
    height: 50px;
    border-radius: 12px;
    background: var(--gradient-1);
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    font-size: 1.25rem;
    flex-shrink: 0;
}

.command-content h4 {
    font-size: 1rem;
    color: var(--text-primary);
    margin-bottom: 0.5rem;
}

.command-content code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 0.85rem;
    color: var(--primary-color);
    background: rgba(99, 102, 241, 0.1);
    padding: 0.25rem 0.5rem;
    border-radius: 6px;
    display: inline-block;
}

.resources-card {
    padding: 2.5rem;
    border-radius: 16px;
}

.resources-card h3 {
    font-size: 1.75rem;
    margin-bottom: 2rem;
    color: var(--text-primary);
    display: flex;
    align-items: center;
    gap: 1rem;
}

.resources-card h3 i {
    color: var(--primary-color);
    font-size: 2rem;
}

.resources-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 1rem;
}

.resource-link {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 1.25rem;
    background: rgba(15, 23, 42, 0.6);
    border-radius: 12px;
    border: 1px solid var(--dark-border);
    color: var(--text-primary);
    text-decoration: none;
    transition: all 0.3s ease;
}

.resource-link:hover {
    border-color: var(--primary-color);
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
    color: var(--primary-color);
}

.resource-link i {
    font-size: 1.5rem;
    color: var(--primary-color);
}

.resource-link span {
    font-weight: 500;
}

@media (max-width: 768px) {
    .step-card {
        flex-direction: column;
        gap: 1.5rem;
    }

    .step-number {
        align-self: flex-start;
    }

    .commands-grid,
    .resources-grid {
        grid-template-columns: 1fr;
    }

    .quick-start-card,
    .resources-card {
        padding: 1.5rem;
    }
}

.faq-section {
    padding: 80px 20px;
    background: var(--dark-surface);
}

.faq-container {
    max-width: 800px;
    margin: 0 auto;
}

.faq-item {
    margin-bottom: 1rem;
    border: 1px solid var(--dark-border);
    border-radius: 12px;
    overflow: hidden;
    background: var(--dark-bg);
}

.faq-question {
    width: 100%;
    padding: 1.5rem;
    background: none;
    border: none;
    display: flex;
    justify-content: space-between;
    align-items: center;
    cursor: pointer;
    color: var(--text-primary);
    font-size: 1.1rem;
    font-weight: 500;
    text-align: left;
    transition: all 0.3s;
}

.faq-question:hover {
    background: var(--dark-surface);
}

.faq-question i {
    color: var(--primary-color);
    transition: transform 0.3s;
}

.faq-item.active .faq-question i {
    transform: rotate(180deg);
}

.faq-answer {
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.3s ease-out;
}

.faq-item.active .faq-answer {
    max-height: 500px;
}

.faq-answer p {
    padding: 0 1.5rem 1.5rem;
    color: var(--text-secondary);
    line-height: 1.8;
}

/* Newsletter Section */
.newsletter-section {
    padding: 40px 20px;
}

.newsletter-card {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 3rem;
    gap: 2rem;
    flex-wrap: wrap;
}

.newsletter-content {
    display: flex;
    align-items: center;
    gap: 1.5rem;
    flex: 1;
}

.newsletter-icon {
    width: 60px;
    height: 60px;
    border-radius: 16px;
    background: var(--gradient-1);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    color: white;
    flex-shrink: 0;
}

.newsletter-content h3 {
    font-size: 1.5rem;
    margin-bottom: 0.5rem;
    color: var(--text-primary);
}

.newsletter-content p {
    color: var(--text-secondary);
}

.newsletter-form {
    display: flex;
    gap: 0.5rem;
    flex: 1;
    max-width: 400px;
}

.newsletter-form input {
    flex: 1;
    padding: 0.875rem 1.5rem;
    background: var(--dark-bg);
    border: 1px solid var(--dark-border);
    border-radius: 8px;
    color: var(--text-primary);
    font-size: 1rem;
    outline: none;
    transition: border-color 0.3s;
}

.newsletter-form input:focus {
    border-color: var(--primary-color);
}

.newsletter-form button {
    padding: 0.875rem 1.5rem;
    background: var(--gradient-1);
    border: none;
    border-radius: 8px;
    color: white;
    font-weight: 600;
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    transition: all 0.3s;
    white-space: nowrap;
}

.newsletter-form button:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-lg);
}

/* Copy Code Button */
.copy-code-btn {
    margin-left: auto;
    padding: 0.75rem 1.5rem;
    background: var(--dark-bg);
    border: 1px solid var(--dark-border);
    border-radius: 8px;
    color: var(--text-secondary);
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    transition: all 0.3s;
}

.copy-code-btn:hover {
    background: var(--primary-color);
    color: white;
    border-color: var(--primary-color);
}

.copy-code-btn.copied {
    background: var(--success-color);
    border-color: var(--success-color);
    color: white;
}

/* Toast Notification */
.toast {
    position: fixed;
    bottom: 2rem;
    left: 50%;
    transform: translateX(-50%) translateY(100px);
    background: var(--dark-surface);
    border: 1px solid var(--dark-border);
    border-radius: 12px;
    padding: 1rem 2rem;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    box-shadow: var(--shadow-xl);
    z-index: 9999;
    opacity: 0;
    visibility: hidden;
    transition: all 0.3s;
}

.toast.show {
    transform: translateX(-50%) translateY(0);
    opacity: 1;
    visibility: visible;
}

.toast i {
    color: var(--success-color);
    font-size: 1.2rem;
}

/* Download Section */
.download-section {
    background: var(--dark-surface);
    border-radius: 24px;
    margin: 0 20px;
}

.download-card {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 4rem;
    padding: 4rem;
    align-items: center;
}

.download-content {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}

.download-icon {
    width: 80px;
    height: 80px;
    border-radius: 16px;
    background: var(--gradient-1);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2rem;
    color: white;
    margin-bottom: 1rem;
}

.download-content h2 {
    font-size: 2.5rem;
    margin-bottom: 1rem;
}

.download-content p {
    color: var(--text-secondary);
    font-size: 1.1rem;
    line-height: 1.8;
}

.download-info {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    margin: 1rem 0;
}

.info-item {
    display: flex;
    align-items: center;
    gap: 1rem;
    color: var(--text-secondary);
}

.info-item i {
    color: var(--primary-color);
}

.download-actions {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
}

.btn-download {
    background: var(--gradient-1);
    color: white;
}

.btn-github {
    background: var(--dark-bg);
    color: var(--text-primary);
    border: 1px solid var(--dark-border);
}

.file-preview {
    background: var(--dark-bg);
    border-radius: 12px;
    padding: 2rem;
    border: 1px solid var(--dark-border);
}

.file-tree {
    font-family: 'JetBrains Mono', monospace;
    font-size: 0.9rem;
}

.tree-item {
    padding: 0.5rem 0;
    color: var(--text-secondary);
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.tree-item.folder {
    color: var(--primary-color);
}

.tree-item.file {
    color: var(--text-muted);
}

.indent-1 {
    padding-left: 1.5rem;
}

.indent-2 {
    padding-left: 3rem;
}

/* Footer */
.footer {
    background: var(--dark-surface);
    border-top: 1px solid var(--dark-border);
    padding: 4rem 20px 2rem;
    margin-top: 4rem;
}

.footer-content {
    max-width: 1200px;
    margin: 0 auto;
    display: grid;
    grid-template-columns: 2fr 3fr;
    gap: 4rem;
    margin-bottom: 3rem;
}

.footer-logo {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--text-primary);
    text-decoration: none;
    margin-bottom: 1rem;
}

.footer-brand p {
    color: var(--text-secondary);
    margin-bottom: 1.5rem;
    line-height: 1.8;
}

.social-links {
    display: flex;
    gap: 1rem;
}

.social-links a {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: var(--dark-bg);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--text-secondary);
    text-decoration: none;
    transition: all 0.3s;
}

.social-links a:hover {
    background: var(--primary-color);
    color: white;
    transform: translateY(-3px);
}

.footer-links {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 2rem;
}

.footer-column h4 {
    color: var(--text-primary);
    margin-bottom: 1rem;
    font-size: 1.1rem;
}

.footer-column ul {
    list-style: none;
}

.footer-column ul li {
    margin-bottom: 0.75rem;
}

.footer-column ul li a {
    color: var(--text-secondary);
    text-decoration: none;
    transition: color 0.3s;
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.footer-column ul li a:hover {
    color: var(--primary-color);
}

.footer-bottom {
    max-width: 1200px;
    margin: 0 auto;
    padding-top: 2rem;
    border-top: 1px solid var(--dark-border);
    text-align: center;
    color: var(--text-muted);
}

.footer-bottom p {
    margin-bottom: 0.5rem;
}

.disclaimer {
    font-size: 0.9rem;
    color: var(--text-muted);
}

/* Back to Top */
.back-to-top {
    position: fixed;
    bottom: 2rem;
    right: 2rem;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    background: var(--gradient-1);
    border: none;
    color: white;
    font-size: 1.2rem;
    cursor: pointer;
    display: none;
    align-items: center;
    justify-content: center;
    z-index: 1000;
    transition: all 0.3s;
    box-shadow: var(--shadow-lg);
}

.back-to-top.visible {
    display: flex;
}

.back-to-top:hover {
    transform: translateY(-5px);
    box-shadow: var(--shadow-xl);
}

/* Responsive Design */
@media (max-width: 968px) {
    .hero {
        flex-direction: column;
        text-align: center;
    }

    .hero-title {
        font-size: 2.5rem;
    }

    .hero-stats {
        justify-content: center;
    }

    .nav-links {
        display: none;
    }

    .mobile-menu-btn {
        display: flex;
    }

    .download-card {
        grid-template-columns: 1fr;
    }

    .footer-content {
        grid-template-columns: 1fr;
    }

    .footer-links {
        grid-template-columns: 1fr;
    }

    .stats-card.large {
        grid-column: span 1;
    }
}

@media (max-width: 768px) {
    .section-title {
        font-size: 2rem;
    }

    .features-grid,
    .samples-grid,
    .use-cases-grid {
        grid-template-columns: 1fr;
    }

    .hero-actions {
        flex-direction: column;
    }

    .btn {
        width: 100%;
        justify-content: center;
    }

    .nav-actions {
        display: none;
    }

    .newsletter-card {
        flex-direction: column;
        text-align: center;
    }

    .newsletter-content {
        flex-direction: column;
    }

    .newsletter-form {
        flex-direction: column;
        width: 100%;
        max-width: none;
    }

    .spectrogram-header {
        flex-direction: column;
        align-items: flex-start;
    }

    .cursor, .cursor-follower {
        display: none;
    }
}

/* Animations */
@keyframes fadeIn {
    from { opacity: 0; }
    to { opacity: 1; }
}

@keyframes slideUp {
    from {
        opacity: 0;
        transform: translateY(30px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@keyframes pulse {
    0%, 100% { transform: scale(1); }
    50% { transform: scale(1.05); }
}

@keyframes shimmer {
    0% { background-position: -200% 0; }
    100% { background-position: 200% 0; }
}

/* Scroll Reveal */
.reveal {
    opacity: 0;
    transform: translateY(30px);
    transition: all 0.8s ease;
}

.reveal.visible {
    opacity: 1;
    transform: translateY(0);
}

/* Hover Effects */
.hover-lift {
    transition: transform 0.3s, box-shadow 0.3s;
}

.hover-lift:hover {
    transform: translateY(-5px);
    box-shadow: var(--shadow-xl);
}

/* Glow Effect */
.glow {
    position: relative;
}

.glow::before {
    content: '';
    position: absolute;
    top: -2px;
    left: -2px;
    right: -2px;
    bottom: -2px;
    background: var(--gradient-1);
    border-radius: inherit;
    z-index: -1;
    opacity: 0;
    filter: blur(20px);
    transition: opacity 0.3s;
}

.glow:hover::before {
    opacity: 0.5;
}

/* Skeleton Loading */
.skeleton {
    background: linear-gradient(90deg, var(--dark-surface) 25%, var(--dark-border) 50%, var(--dark-surface) 75%);
    background-size: 200% 100%;
    animation: shimmer 1.5s infinite;
    border-radius: 8px;
}

/* Focus Styles */
:focus-visible {
    outline: 2px solid var(--primary-color);
    outline-offset: 2px;
}

/* Selection */
::selection {
    background: var(--primary-color);
    color: white;
}

/* Scrollbar */
::-webkit-scrollbar {
    width: 10px;
}

::-webkit-scrollbar-track {
    background: var(--dark-bg);
}

::-webkit-scrollbar-thumb {
    background: var(--dark-border);
    border-radius: 5px;
}

::-webkit-scrollbar-thumb:hover {
    background: var(--primary-color);
}

2,308 lines•44 KB
css

About RSK World

Founded by Molla Samser, with Designer & Tester Rima Khatun, RSK World is your one-stop destination for free programming resources, source code, and development tools.

Founder: Molla Samser
Designer & Tester: Rima Khatun

Development

  • Game Development
  • Web Development
  • Mobile Development
  • AI Development
  • Development Tools

Legal

  • Terms & Conditions
  • Privacy Policy
  • Disclaimer

Contact Info

Nutanhat, Mongolkote
Purba Burdwan, West Bengal
India, 713147

+91 93305 39277

hello@rskworld.in
support@rskworld.in

© 2026 RSK World. All rights reserved.

Content used for educational purposes only. View Disclaimer