CoolFace
Apppublic

Alpaczka/nx-code-power-tools

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
index.html677 linesDownload Raw Back to root
1<!DOCTYPE html>2<html lang="en" class="dark">3<head>4    <meta charset="UTF-8">5    <meta name="viewport" content="width=device-width, initial-scale=1.0">6    <title>NX-Code - Powerful Tools for Modern Workflows</title>7    <meta name="description" content="NX-Code delivers cutting-edge software solutions. Download PDF-Translator and VC-Creator for enhanced productivity.">8    <link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>⚡</text></svg>">9    10    <!-- Tailwind CSS -->11    <script src="https://cdn.tailwindcss.com"></script>12    13    <!-- Feather Icons -->14    <script src="https://unpkg.com/feather-icons"></script>15    <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>16    17    <!-- GSAP for animations -->18    <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>19    20    <script>21        tailwind.config = {22            darkMode: 'class',23            theme: {24                extend: {25                    colors: {26                        primary: {27                            50: '#f0f9ff',28                            100: '#e0f2fe',29                            200: '#bae6fd',30                            300: '#7dd3fc',31                            400: '#38bdf8',32                            500: '#0ea5e9',33                            600: '#0284c7',34                            700: '#0369a1',35                            800: '#075985',36                            900: '#0c4a6e',37                        },38                        secondary: {39                            50: '#eff6ff',40                            100: '#dbeafe',41                            200: '#bfdbfe',42                            300: '#93c5fd',43                            400: '#60a5fa',44                            500: '#3b82f6',45                            600: '#2563eb',46                            700: '#1d4ed8',47                            800: '#1e40af',48                            900: '#1e3a8a',49                        }50                    },51                    animation: {52                        'float': 'float 6s ease-in-out infinite',53                        'pulse-soft': 'pulse-soft 2s ease-in-out infinite',54                        'shake': 'shake 0.5s ease-in-out',55                        'bounce-soft': 'bounce-soft 2s ease-in-out infinite',56                        'slide-in': 'slide-in 0.6s ease-out',57                        'fade-in-up': 'fade-in-up 0.8s ease-out',58                        'glow': 'glow 2s ease-in-out infinite alternate',59                        'spin-slow': 'spin-slow 3s linear infinite',60                        'wiggle': 'wiggle 1s ease-in-out infinite',61                        'zoom-in': 'zoom-in 0.5s ease-out',62                    },63                    keyframes: {64                        float: {65                            '0%, 100%': { transform: 'translateY(0px)' },66                            '50%': { transform: 'translateY(-20px)' },67                        },68                        'pulse-soft': {69                            '0%, 100%': { opacity: 1 },70                            '50%': { opacity: 0.7 },71                        },72                        shake: {73                            '0%, 100%': { transform: 'translateX(0)' },74                            '25%': { transform: 'translateX(-5px)' },75                            '75%': { transform: 'translateX(5px)' },76                        },77                        'bounce-soft': {78                            '0%, 100%': { transform: 'translateY(0)' },79                            '50%': { transform: 'translateY(-10px)' },80                        },81                        'slide-in': {82                            '0%': { transform: 'translateX(-100%)', opacity: 0 },83                            '100%': { transform: 'translateX(0)', opacity: 1 },84                        },85                        'fade-in-up': {86                            '0%': { transform: 'translateY(30px)', opacity: 0 },87                            '100%': { transform: 'translateY(0)', opacity: 1 },88                        },89                        'glow': {90                            '0%': { boxShadow: '0 0 5px rgba(59, 130, 246, 0.5)' },91                            '100%': { boxShadow: '0 0 20px rgba(59, 130, 246, 0.8)' },92                        },93                        'spin-slow': {94                            '0%': { transform: 'rotate(0deg)' },95                            '100%': { transform: 'rotate(360deg)' },96                        },97                        'wiggle': {98                            '0%, 100%': { transform: 'rotate(-3deg)' },99                            '50%': { transform: 'rotate(3deg)' },100                        },101                        'zoom-in': {102                            '0%': { transform: 'scale(0.9)', opacity: 0 },103                            '100%': { transform: 'scale(1)', opacity: 1 },104                        }105                    }106                }107            }108        }109</script>110    <style>111        .glass {112            background: rgba(255, 255, 255, 0.1);113            backdrop-filter: blur(10px);114            border: 1px solid rgba(255, 255, 255, 0.2);115        }116        117        .glass-light {118            background: rgba(255, 255, 255, 0.8);119            backdrop-filter: blur(10px);120            border: 1px solid rgba(0, 0, 0, 0.1);121        }122        123        .progress-stripes {124            background-image: linear-gradient(125                45deg,126                rgba(255, 255, 255, 0.15) 25%,127                transparent 25%,128                transparent 50%,129                rgba(255, 255, 255, 0.15) 50%,130                rgba(255, 255, 255, 0.15) 75%,131                transparent 75%,132                transparent133            );134            background-size: 1rem 1rem;135        }136        137        .ripple {138            position: absolute;139            border-radius: 50%;140            background: rgba(255, 255, 255, 0.6);141            transform: scale(0);142            animation: ripple-animation 0.6s linear;143        }144        145        @keyframes ripple-animation {146            to {147                transform: scale(4);148                opacity: 0;149            }150        }151        152        .particle {153            position: absolute;154            pointer-events: none;155            animation: particle-float 4s ease-in-out infinite;156        }157        158        @keyframes particle-float {159            0%, 100% { transform: translateY(0) rotate(0deg); }160            50% { transform: translateY(-20px) rotate(180deg); }161        }162        163        .text-glow {164            text-shadow: 0 0 10px currentColor;165        }166        167        .card-hover {168            transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);169        }170        171        .card-hover:hover {172            transform: translateY(-10px) scale(1.02);173            box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);174        }175        176        .gradient-border {177            position: relative;178            background: linear-gradient(45deg, #0ea5e9, #3b82f6);179            padding: 2px;180            border-radius: 16px;181        }182        183        .gradient-border::before {184            content: '';185            position: absolute;186            inset: 0;187            border-radius: 16px;188            padding: 2px;189            background: linear-gradient(45deg, #0ea5e9, #3b82f6);190            z-index: -1;191            filter: blur(10px);192            opacity: 0.7;193        }194        195        /* Reduced motion support */196        @media (prefers-reduced-motion: reduce) {197            * {198                animation-duration: 0.01ms !important;199                animation-iteration-count: 1 !important;200                transition-duration: 0.01ms !important;201            }202        }203        204        /* Light mode specific styles */205        .light .glass {206            background: rgba(255, 255, 255, 0.7);207            border: 1px solid rgba(255, 255, 255, 0.8);208        }209        210        .light .gradient-border::before {211            opacity: 0.4;212        }213    </style>214</head>215<body class="min-h-screen bg-gradient-to-br from-gray-900 to-gray-800 text-white transition-all duration-500 ease-in-out">216<!-- Background elements -->217    <div class="fixed inset-0 overflow-hidden pointer-events-none">218        <div class="absolute top-1/4 left-1/4 w-64 h-64 bg-primary-500 rounded-full mix-blend-multiply filter blur-xl opacity-20 animate-float"></div>219        <div class="absolute top-1/3 right-1/4 w-64 h-64 bg-secondary-500 rounded-full mix-blend-multiply filter blur-xl opacity-20 animate-float" style="animation-delay: -2s;"></div>220        <div class="absolute bottom-1/4 left-1/2 w-64 h-64 bg-primary-400 rounded-full mix-blend-multiply filter blur-xl opacity-20 animate-float" style="animation-delay: -4s;"></div>221        222        <!-- Animated particles -->223        <div class="particle" style="top: 20%; left: 10%; animation-delay: 0s; width: 4px; height: 4px; background: #38bdf8;"></div>224        <div class="particle" style="top: 60%; left: 80%; animation-delay: -1s; width: 6px; height: 6px; background: #3b82f6;"></div>225        <div class="particle" style="top: 80%; left: 30%; animation-delay: -2s; width: 3px; height: 3px; background: #0ea5e9;"></div>226        <div class="particle" style="top: 40%; left: 90%; animation-delay: -3s; width: 5px; height: 5px; background: #60a5fa;"></div>227        <div class="particle" style="top: 10%; left: 70%; animation-delay: -0.5s; width: 4px; height: 4px; background: #0284c7;"></div>228</div>229 230    <!-- Header -->231    <header class="relative z-10 py-6 px-4 sm:px-6 lg:px-8">232        <div class="max-w-7xl mx-auto flex justify-between items-center">233            <div class="flex items-center space-x-2">234                <div class="w-8 h-8 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-lg flex items-center justify-center">235                    <span class="text-white font-bold text-sm">NX</span>236                </div>237                <span class="text-xl font-bold bg-gradient-to-r from-primary-400 to-secondary-400 bg-clip-text text-transparent">NX-Code</span>238            </div>239            240            <button id="theme-toggle" class="p-2 rounded-lg glass hover:bg-white/20 transition-all duration-300" aria-label="Toggle theme">241                <i data-feather="moon" class="w-5 h-5"></i>242            </button>243        </div>244    </header>245    <!-- Hero Section -->246    <main class="relative z-10 py-12 px-4 sm:px-6 lg:px-8">247        <div class="max-w-4xl mx-auto">248            <!-- Hero Content -->249            <div class="text-center mb-16 animate-fade-in-up">250                <h1 class="text-4xl sm:text-6xl font-bold mb-6 bg-gradient-to-r from-primary-300 to-secondary-300 bg-clip-text text-transparent text-glow">251                    NX-Code252                </h1>253                <p class="text-xl sm:text-2xl text-gray-300 mb-8 max-w-2xl mx-auto animate-slide-in" style="animation-delay: 0.2s;">254                    Advanced tools for modern digital workflows255                </p>256                <div class="w-24 h-1 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-full mx-auto animate-zoom-in" style="animation-delay: 0.4s;"></div>257            </div>258            <!-- Download Cards -->259            <div class="grid md:grid-cols-2 gap-8 max-w-3xl mx-auto">260                <!-- PDF Translator Card -->261                <div class="glass rounded-2xl p-8 card-hover animate-fade-in-up" style="animation-delay: 0.6s;">262<div class="text-center mb-6">263                        <div class="w-16 h-16 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-2xl flex items-center justify-center mx-auto mb-4 animate-bounce-soft">264                            <i data-feather="file-text" class="w-8 h-8 text-white"></i>265                        </div>266<h3 class="text-2xl font-bold mb-2">PDF-Translator</h3>267                        <p class="text-gray-300 mb-6">268                            Instantly translate PDF documents while preserving formatting and layout across 50+ languages.269                        </p>270                    </div>271                    272                    <div class="download-container" data-product="pdf-translator">273                        <div class="gradient-border rounded-xl">274                            <button class="download-btn w-full py-4 px-6 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-xl font-semibold text-white hover:from-primary-600 hover:to-secondary-600 transition-all duration-300 transform hover:scale-105 active:scale-95 relative overflow-hidden animate-glow">275                                Download PDF-Translator276                            </button>277                        </div>278<div class="progress-container hidden mt-4">279                            <div class="flex justify-between text-sm mb-2">280                                <span>Downloading...</span>281                                <span class="percentage">0%</span>282                            </div>283                            <div class="w-full bg-gray-700 rounded-full h-3 overflow-hidden">284                                <div class="progress-bar h-full bg-gradient-to-r from-primary-500 to-secondary-500 rounded-full progress-stripes transition-all duration-300" style="width: 0%"></div>285                            </div>286                        </div>287                        288                        <div class="success-container hidden mt-4 text-center">289                            <div class="flex items-center justify-center space-x-2 text-green-400">290                                <i data-feather="check-circle" class="w-5 h-5"></i>291                                <span class="font-semibold">Download ready!</span>292                            </div>293                        </div>294                    </div>295                </div>296                <!-- VC Creator Card -->297                <div class="glass rounded-2xl p-8 card-hover animate-fade-in-up" style="animation-delay: 0.8s;">298<div class="text-center mb-6">299                        <div class="w-16 h-16 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-2xl flex items-center justify-center mx-auto mb-4 animate-bounce-soft" style="animation-delay: 0.2s;">300                            <i data-feather="video" class="w-8 h-8 text-white"></i>301                        </div>302<h3 class="text-2xl font-bold mb-2">VC-Creator</h3>303                        <p class="text-gray-300 mb-6">304                            Create professional video content with AI-powered editing and automated production workflows.305                        </p>306                    </div>307                    308                    <div class="download-container" data-product="vc-creator">309                        <div class="gradient-border rounded-xl">310                            <button class="download-btn w-full py-4 px-6 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-xl font-semibold text-white hover:from-primary-600 hover:to-secondary-600 transition-all duration-300 transform hover:scale-105 active:scale-95 relative overflow-hidden animate-glow" style="animation-delay: 0.3s;">311                                Download VC-Creator312                            </button>313                        </div>314<div class="progress-container hidden mt-4">315                            <div class="flex justify-between text-sm mb-2">316                                <span>Downloading...</span>317                                <span class="percentage">0%</span>318                            </div>319                            <div class="w-full bg-gray-700 rounded-full h-3 overflow-hidden">320                                <div class="progress-bar h-full bg-gradient-to-r from-primary-500 to-secondary-500 rounded-full progress-stripes transition-all duration-300" style="width: 0%"></div>321                            </div>322                        </div>323                        324                        <div class="success-container hidden mt-4 text-center">325                            <div class="flex items-center justify-center space-x-2 text-green-400">326                                <i data-feather="check-circle" class="w-5 h-5"></i>327                                <span class="font-semibold">Download ready!</span>328                            </div>329                        </div>330                    </div>331                </div>332            </div>333        </div>334    </main>335    <!-- Footer -->336    <footer class="relative z-10 py-8 px-4 sm:px-6 lg:px-8 mt-16">337        <div class="max-w-7xl mx-auto text-center">338            <p class="text-gray-400 animate-fade-in-up" style="animation-delay: 1s;">&copy; 2024 NX-Code. All rights reserved.</p>339        </div>340    </footer>341    <!-- Access Code Modal -->342    <div id="access-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50 hidden">343        <div class="glass rounded-2xl p-8 max-w-md w-full transform scale-95 opacity-0 transition-all duration-300">344<div class="text-center mb-6">345                <div class="w-12 h-12 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-2xl flex items-center justify-center mx-auto mb-4">346                    <i data-feather="lock" class="w-6 h-6 text-white"></i>347                </div>348                <h3 class="text-2xl font-bold mb-2">Access Required</h3>349                <p class="text-gray-300">Please enter the access code to download</p>350            </div>351            352            <form id="access-form" class="space-y-4">353                <div>354                    <input type="password" id="access-code" class="w-full px-4 py-3 bg-white/10 border border-white/20 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-all duration-300" placeholder="Enter access code" aria-label="Access code" required>355                    <div id="code-error" class="text-red-400 text-sm mt-2 hidden">356                        <i data-feather="alert-circle" class="w-4 h-4 inline mr-1"></i>357                        Incorrect access code. Please try again.358                    </div>359                </div>360                361                <div class="flex space-x-4">362                    <button type="button" id="cancel-access" class="flex-1 py-3 px-4 bg-gray-600 rounded-xl font-semibold hover:bg-gray-700 transition-all duration-300">363                        Cancel364                    </button>365                    <button type="submit" class="flex-1 py-3 px-4 bg-gradient-to-r from-primary-500 to-secondary-500 rounded-xl font-semibold text-white hover:from-primary-600 hover:to-secondary-600 transition-all duration-300">366                        Verify367                    </button>368                </div>369            </form>370        </div>371    </div>372    <script>373        // Initialize Feather Icons374        document.addEventListener('DOMContentLoaded', function() {375            feather.replace();376            // Theme Management377            const themeToggle = document.getElementById('theme-toggle');378            const themeIcon = themeToggle.querySelector('i');379            380            // Check for saved theme preference or respect OS preference381            const savedTheme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';382            383            function applyTheme(theme) {384                if (theme === 'light') {385                    document.documentElement.classList.remove('dark');386                    document.body.className = 'min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 text-gray-800 transition-all duration-500 ease-in-out';387                    themeIcon.setAttribute('data-feather', 'sun');388                } else {389                    document.documentElement.classList.add('dark');390                    document.body.className = 'min-h-screen bg-gradient-to-br from-gray-900 to-gray-800 text-white transition-all duration-500 ease-in-out';391                    themeIcon.setAttribute('data-feather', 'moon');392                }393                feather.replace();394                395                // Animate theme transition396                document.body.style.animation = 'none';397                setTimeout(() => {398                    document.body.style.animation = 'fade-in-up 0.5s ease-out';399                }, 10);400            }401            402            applyTheme(savedTheme);403            404            themeToggle.addEventListener('click', function() {405                const newTheme = document.documentElement.classList.contains('dark') ? 'light' : 'dark';406                localStorage.setItem('theme', newTheme);407                applyTheme(newTheme);408                409                // Add particles on theme toggle410                createParticles(10);411            });412            413            // Particle system414            function createParticles(count) {415                const colors = ['#0ea5e9', '#3b82f6', '#38bdf8', '#60a5fa'];416                417                for (let i = 0; i < count; i++) {418                    const particle = document.createElement('div');419                    particle.className = 'particle';420                    particle.style.left = Math.random() * 100 + '%';421                particle.style.top = Math.random() * 100 + '%';422                particle.style.background = colors[Math.floor(Math.random() * colors.length)];423                particle.style.width = Math.random() * 6 + 2 + 'px';424                particle.style.height = particle.style.width;425                particle.style.animationDelay = Math.random() * -4 + 's';426                427                document.querySelector('.fixed.inset-0').appendChild(particle);428                429                setTimeout(() => {430                    particle.remove();431                }, 4000);432            }433            }434// Modal Elements435            const accessModal = document.getElementById('access-modal');436            const accessForm = document.getElementById('access-form');437            const accessCodeInput = document.getElementById('access-code');438            const codeError = document.getElementById('code-error');439            const cancelAccess = document.getElementById('cancel-access');440            441            let currentProduct = null;442            const CORRECT_CODE = '1122';443            444            // Ripple effect for buttons445            function createRipple(event) {446                const button = event.currentTarget;447                const circle = document.createElement('span');448                const diameter = Math.max(button.clientWidth, button.clientHeight);449                const radius = diameter / 2;450                451                circle.style.width = circle.style.height = `${diameter}px`;452                circle.style.left = `${event.clientX - button.getBoundingClientRect().left - radius}px`;453                circle.style.top = `${event.clientY - button.getBoundingClientRect().top - radius}px`;454                circle.classList.add('ripple');455                456                const ripple = button.getElementsByClassName('ripple')[0];457                if (ripple) {458                    ripple.remove();459                }460                461                button.appendChild(circle);462            }463            // Add ripple effect to all download buttons464            document.querySelectorAll('.download-btn').forEach(button => {465                button.addEventListener('click', createRipple);466                467                // Add hover animations468                button.addEventListener('mouseenter', function() {469                    this.style.transform = 'scale(1.05) rotate(1deg)';470                setTimeout(() => {471                    this.style.transform = 'scale(1.05)';472                }, 100);473            });474            475            button.addEventListener('mouseleave', function() {476                this.style.transform = 'scale(1) rotate(0deg)';477            });478            }479            // Download button click handler480            document.querySelectorAll('.download-btn').forEach(button => {481                button.addEventListener('click', function() {482                    currentProduct = this.closest('.download-container').dataset.product;483                    showAccessModal();484                    485                    // Add wiggle animation on click486                    this.classList.add('animate-wiggle');487                    setTimeout(() => {488                        this.classList.remove('animate-wiggle');489                    }, 1000);490                });491            });492            // Show access modal493            function showAccessModal() {494                accessModal.classList.remove('hidden');495                accessCodeInput.value = '';496                codeError.classList.add('hidden');497                498                // Create particles around modal499                createModalParticles();500                501                // Animate modal entrance502                setTimeout(() => {503                    const modalContent = accessModal.querySelector('.glass');504                    modalContent.style.transform = 'scale(1)';505                    modalContent.style.opacity = '1';506                    507                    // Add slide-in animation to form elements508                    const formElements = modalContent.querySelectorAll('input, button');509                    formElements.forEach((el, index) => {510                    el.style.animation = 'none';511                    setTimeout(() => {512                        el.style.animation = 'slide-in 0.5s ease-out';513                        el.style.animationDelay = (index * 0.1) + 's';514                    }, 10);515                    516                    accessCodeInput.focus();517                }, 50);518            }519            520            function createModalParticles() {521                const modalRect = accessModal.getBoundingClientRect();522                for (let i = 0; i < 8; i++) {523                    const particle = document.createElement('div');524                    particle.className = 'particle';525                    particle.style.left = Math.random() * modalRect.width + 'px';526                    particle.style.top = Math.random() * modalRect.height + 'px';527                    particle.style.background = i % 2 === 0 ? '#0ea5e9' : '#3b82f6';528                    particle.style.width = Math.random() * 4 + 2 + 'px';529                    particle.style.height = particle.style.width;530                    particle.style.animationDuration = '2s';531                    532                    accessModal.appendChild(particle);533                    534                    setTimeout(() => {535                        particle.remove();536                    }, 2000);537                }538                }539// Hide access modal540            function hideAccessModal() {541                const modalContent = accessModal.querySelector('.glass');542                    modalContent.style.transform = 'scale(0.95)';543                    modalContent.style.opacity = '0';544                545                setTimeout(() => {546                    accessModal.classList.add('hidden');547                }, 300);548            }549            550            // Cancel access551            cancelAccess.addEventListener('click', hideAccessModal);552            553            // Access form submission554            accessForm.addEventListener('submit', function(e) {555                e.preventDefault();556                557                if (accessCodeInput.value === CORRECT_CODE) {558                    codeError.classList.add('hidden');559                    hideAccessModal();560                    startDownload(currentProduct);561                } else {562                    codeError.classList.remove('hidden');563                    accessCodeInput.classList.add('animate-shake');564                    accessCodeInput.focus();565                    566                    setTimeout(() => {567                        accessCodeInput.classList.remove('animate-shake');568                    }, 500);569                }570            });571            // Start download process572            function startDownload(product) {573                const container = document.querySelector(`[data-product="${product}"]`);574                const downloadBtn = container.querySelector('.download-btn');575                const progressContainer = container.querySelector('.progress-container');576                const successContainer = container.querySelector('.success-container');577                const progressBar = container.querySelector('.progress-bar');578                const percentage = container.querySelector('.percentage');579                580                // Hide button, show progress581                downloadBtn.classList.add('hidden');582                progressContainer.classList.remove('hidden');583                584                // Animate progress bar entrance585                setTimeout(() => {586                    progressContainer.style.animation = 'zoom-in 0.3s ease-out';587                    588                    // Add spin animation to progress bar589                    progressBar.classList.add('animate-spin-slow');590                    591                    let progress = 0;592                    const interval = setInterval(() => {593                        progress += Math.random() * 8 + 2;594                        if (progress > 100) progress = 100;595                        596                        progressBar.style.width = `${progress}%`;597                        percentage.textContent = `${Math.floor(progress)}%';598                        599                        if (progress === 100) {600                            clearInterval(interval);601                            progressBar.classList.remove('animate-spin-slow');602                            603                            // Show success state with animation604                            setTimeout(() => {605                                progressContainer.classList.add('hidden');606                                successContainer.classList.remove('hidden');607                                successContainer.style.animation = 'fade-in-up 0.5s ease-out';608                                609                                // Trigger actual download after success animation610                                setTimeout(() => {611                                    simulateDownload(product);612                                    // Create celebration particles613                                    createCelebrationParticles(container);614                                    615                                    // Reset to initial state616                                    setTimeout(() => {617                                        successContainer.classList.add('hidden');618                                        downloadBtn.classList.remove('hidden');619                                        feather.replace();620                                    }, 1500);621                                }, 500);622                            }623                        }, 80);624                    }, 100);625                    626                    function createCelebrationParticles(container) {627                        const rect = container.getBoundingClientRect();628                        for (let i = 0; i < 15; i++) {629                            const particle = document.createElement('div');630                            particle.className = 'particle';631                            particle.style.left = (rect.left + Math.random() * rect.width) + 'px';632                            particle.style.top = (rect.top + Math.random() * rect.height) + 'px';633                            particle.style.background = Math.random() > 0.5 ? '#10b981' : '#0ea5e9';634                            particle.style.width = Math.random() * 6 + 2 + 'px';635                            particle.style.height = particle.style.width;636                            particle.style.animationDuration = '1.5s';637                            638                            document.body.appendChild(particle);639                            640                            setTimeout(() => {641                                particle.remove();642                            }, 1500);643                        }644                    }645// Simulate file download646                function simulateDownload(product) {647                    const filename = `${product}-setup.exe`;648                    const blob = new Blob(['Simulated download content for ' + product], { type: 'application/octet-stream' });649                    const url = window.URL.createObjectURL(blob);650                    const a = document.createElement('a');651                    a.style.display = 'none';652                    a.href = url;653                    a.download = filename;654                    document.body.appendChild(a);655                    a.click();656                    window.URL.revokeObjectURL(url);657                    document.body.removeChild(a);658                }659                660                // Close modal on ESC key661                document.addEventListener('keydown', function(e) {662                    if (e.key === 'Escape' && !accessModal.classList.contains('hidden')) {663                        hideAccessModal();664                    }665                });666                667                // Trap focus in modal668                accessModal.addEventListener('keydown', function(e) {669                    if (e.key === 'Tab') {670                        e.preventDefault();671                        accessCodeInput.focus();672                    }673                });674            </script>675</body>676</html>677