Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>BreezyDucts - Вентиляционные системы</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script src="https://unpkg.com/feather-icons"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.waves.min.js"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/animejs@3.2.1/lib/anime.min.js"></script> | |
| <style> | |
| .duct-animation { | |
| transition: all 0.3s ease; | |
| } | |
| .duct-item:hover { | |
| transform: scale(1.05); | |
| box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1); | |
| } | |
| .custom-scroll { | |
| scrollbar-width: thin; | |
| scrollbar-color: #3b82f6 #e5e7eb; | |
| } | |
| .custom-scroll::-webkit-scrollbar { | |
| width: 6px; | |
| height: 6px; | |
| } | |
| .custom-scroll::-webkit-scrollbar-track { | |
| background: #e5e7eb; | |
| } | |
| .custom-scroll::-webkit-scrollbar-thumb { | |
| background-color: #3b82f6; | |
| border-radius: 6px; | |
| } | |
| .airflow-path { | |
| stroke-dasharray: 1000; | |
| stroke-dashoffset: 1000; | |
| animation: dash 5s linear forwards infinite; | |
| } | |
| @keyframes dash { | |
| to { | |
| stroke-dashoffset: 0; | |
| } | |
| } | |
| </style> | |
| </head> | |
| <body class="bg-gray-50"> | |
| <div id="vanta-background" class="fixed inset-0 z-0"></div> | |
| <div class="relative z-10 min-h-screen flex flex-col"> | |
| <!-- Header --> | |
| <header class="bg-white bg-opacity-90 backdrop-blur-md shadow-sm sticky top-0 z-50"> | |
| <div class="container mx-auto px-4 py-4 flex justify-between items-center"> | |
| <div class="flex items-center space-x-2"> | |
| <svg xmlns="http://www.w3.org/2000/svg" class="h-10 w-10 text-blue-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" /> | |
| </svg> | |
| <h1 class="text-2xl font-bold text-gray-800">BreezyDucts</h1> | |
| </div> | |
| <nav class="hidden md:flex space-x-8"> | |
| <a href="#" class="text-blue-600 font-medium">Продукция</a> | |
| <a href="#" class="text-gray-600 hover:text-blue-600 transition">Проекты</a> | |
| <a href="mobile-app.html" class="text-gray-600 hover:text-blue-600 transition">Мобильное приложение</a> | |
| <a href="#" class="text-gray-600 hover:text-blue-600 transition">Поддержка</a> | |
| </nav> | |
| <div class="flex items-center space-x-4"> | |
| <button class="p-2 rounded-full bg-gray-100 hover:bg-gray-200 transition"> | |
| <i data-feather="shopping-cart"></i> | |
| </button> | |
| <button class="p-2 rounded-full bg-gray-100 hover:bg-gray-200 transition"> | |
| <i data-feather="user"></i> | |
| </button> | |
| <button class="md:hidden p-2 rounded-full bg-gray-100 hover:bg-gray-200 transition"> | |
| <i data-feather="menu"></i> | |
| </button> | |
| </div> | |
| </div> | |
| </header> | |
| <!-- Hero Section --> | |
| <section class="py-16 px-4 relative overflow-hidden"> | |
| <div class="container mx-auto flex flex-col md:flex-row items-center"> | |
| <div class="md:w-1/2 mb-10 md:mb-0"> | |
| <h2 class="text-4xl md:text-5xl font-bold text-gray-800 mb-6 leading-tight"> | |
| Точный воздуховод<br> | |
| <span class="text-blue-600">Для профессионалов</span> | |
| </h2> | |
| <p class="text-lg text-gray-600 mb-8 max-w-lg"> | |
| Индивидуальные вентиляционные решения с расчетом размеров в реальном времени для профессионалов ОВК. | |
| </p> | |
| <div class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:space-x-4"> | |
| <button class="px-6 py-3 bg-blue-600 text-white font-medium rounded-lg hover:bg-blue-700 transition shadow-md hover:shadow-lg"> | |
| Начать проект | |
| </button> | |
| <button class="px-6 py-3 border border-blue-600 text-blue-600 font-medium rounded-lg hover:bg-blue-50 transition"> | |
| Демо <i data-feather="play-circle" class="inline ml-2"></i> | |
| </button> | |
| </div> | |
| </div> | |
| <div class="md:w-1/2 relative"> | |
| <div class="relative w-full h-64 md:h-96"> | |
| <svg viewBox="0 0 500 300" class="w-full h-full"> | |
| <!-- Duct system animation --> | |
| <path class="airflow-path" fill="none" stroke="#3b82f6" stroke-width="2" d="M50,150 Q150,50 250,150 Q350,250 450,150" /> | |
| <!-- Main duct --> | |
| <rect x="50" y="140" width="400" height="20" rx="10" fill="#e5e7eb" class="duct-animation" /> | |
| <!-- Branch ducts --> | |
| <rect x="150" y="140" width="20" height="100" rx="10" fill="#9ca3af" class="duct-animation" /> | |
| <rect x="300" y="40" width="20" height="100" rx="10" fill="#9ca3af" class="duct-animation" /> | |
| <!-- Elbows --> | |
| <path d="M150,240 Q150,190 200,190" fill="none" stroke="#9ca3af" stroke-width="20" stroke-linecap="round" class="duct-animation" /> | |
| <path d="M300,140 Q300,90 250,90" fill="none" stroke="#9ca3af" stroke-width="20" stroke-linecap="round" class="duct-animation" /> | |
| <!-- Airflow indicators --> | |
| <circle cx="70" cy="150" r="5" fill="#3b82f6"> | |
| <animate attributeName="cx" values="70;90;70" dur="2s" repeatCount="indefinite" /> | |
| </circle> | |
| <circle cx="170" cy="150" r="5" fill="#3b82f6"> | |
| <animate attributeName="cx" values="170;190;170" dur="2s" repeatCount="indefinite" /> | |
| </circle> | |
| <circle cx="320" cy="150" r="5" fill="#3b82f6"> | |
| <animate attributeName="cx" values="320;340;320" dur="2s" repeatCount="indefinite" /> | |
| </circle> | |
| </svg> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- Product Categories --> | |
| <section class="py-16 px-4 bg-white bg-opacity-90 backdrop-blur-sm"> | |
| <div class="container mx-auto"> | |
| <h2 class="text-3xl font-bold text-center text-gray-800 mb-12">Компоненты вентиляции</h2> | |
| <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6"> | |
| <!-- Ducting --> | |
| <div class="duct-item bg-white rounded-xl shadow-md overflow-hidden transition-all duration-300 hover:shadow-xl"> | |
| <div class="h-48 bg-gradient-to-br from-blue-50 to-blue-100 flex items-center justify-center"> | |
| <svg xmlns="http://www.w3.org/2000/svg" class="h-24 w-24 text-blue-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" /> | |
| </svg> | |
| </div> | |
| <div class="p-6"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-2">Воздуховоды</h3> | |
| <p class="text-gray-600 mb-4">Прямоугольные, круглые и спиральные воздуховоды различных материалов и размеров.</p> | |
| <button class="text-blue-600 font-medium flex items-center"> | |
| Каталог | |
| <i data-feather="arrow-right" class="ml-2 w-4 h-4"></i> | |
| </button> | |
| </div> | |
| </div> | |
| <!-- Fittings --> | |
| <div class="duct-item bg-white rounded-xl shadow-md overflow-hidden transition-all duration-300 hover:shadow-xl"> | |
| <div class="h-48 bg-gradient-to-br from-green-50 to-green-100 flex items-center justify-center"> | |
| <svg xmlns="http://www.w3.org/2000/svg" class="h-24 w-24 text-green-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z" /> | |
| </svg> | |
| </div> | |
| <div class="p-6"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-2">Фасонные части</h3> | |
| <p class="text-gray-600 mb-4">Отводы, переходы, тройники и другие соединительные элементы.</p> | |
| <button class="text-green-600 font-medium flex items-center"> | |
| Каталог | |
| <i data-feather="arrow-right" class="ml-2 w-4 h-4"></i> | |
| </button> | |
| </div> | |
| </div> | |
| <!-- Dampers & Valves --> | |
| <div class="duct-item bg-white rounded-xl shadow-md overflow-hidden transition-all duration-300 hover:shadow-xl"> | |
| <div class="h-48 bg-gradient-to-br from-purple-50 to-purple-100 flex items-center justify-center"> | |
| <svg xmlns="http://www.w3.org/2000/svg" class="h-24 w-24 text-purple-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 15l8-8m0 0l-8-8m8 8H4" /> | |
| </svg> | |
| </div> | |
| <div class="p-6"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-2">Задвижки и клапаны</h3> | |
| <p class="text-gray-600 mb-4">Регулировка воздушного потока с помощью наших заслонок и балансировочных клапанов.</p> | |
| <button class="text-purple-600 font-medium flex items-center"> | |
| Каталог | |
| <i data-feather="arrow-right" class="ml-2 w-4 h-4"></i> | |
| </button> | |
| </div> | |
| </div> | |
| <!-- Accessories --> | |
| <div class="duct-item bg-white rounded-xl shadow-md overflow-hidden transition-all duration-300 hover:shadow-xl"> | |
| <div class="h-48 bg-gradient-to-br from-yellow-50 to-yellow-100 flex items-center justify-center"> | |
| <svg xmlns="http://www.w3.org/2000/svg" class="h-24 w-24 text-yellow-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" /> | |
| </svg> | |
| </div> | |
| <div class="p-6"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-2">Аксессуары</h3> | |
| <p class="text-gray-600 mb-4">Крепежи, изоляция, герметики и другие монтажные элементы.</p> | |
| <button class="text-yellow-600 font-medium flex items-center"> | |
| Каталог | |
| <i data-feather="arrow-right" class="ml-2 w-4 h-4"></i> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- Size Calculator --> | |
| <section class="py-16 px-4 bg-gray-50 bg-opacity-90 backdrop-blur-sm"> | |
| <div class="container mx-auto max-w-4xl"> | |
| <div class="bg-white rounded-xl shadow-lg overflow-hidden"> | |
| <div class="md:flex"> | |
| <div class="md:w-1/2 p-8 bg-gradient-to-br from-blue-500 to-blue-600 text-white"> | |
| <h2 class="text-2xl font-bold mb-4">Калькулятор размеров</h2> | |
| <p class="mb-6">Быстрый расчет оптимального размера воздуховода для ваших требований по воздушному потоку.</p> | |
| <div class="space-y-4"> | |
| <div> | |
| <label class="block text-sm font-medium mb-1">Расход воздуха (м³/ч)</label> | |
| <input id="airflow-input" type="range" min="100" max="5000" value="500" class="w-full h-2 bg-blue-300 rounded-lg appearance-none cursor-pointer"> | |
| <div class="flex justify-between text-xs text-blue-100 mt-1"> | |
| <span>100</span> | |
| <span>5000</span> | |
| </div> | |
| <input id="airflow-value" type="number" min="100" max="5000" value="500" class="w-full px-2 py-1 mt-1 text-sm border border-blue-300 rounded"> | |
| </div> | |
| <div> | |
| <label class="block text-sm font-medium mb-1">Скорость (м/с)</label> | |
| <input id="velocity-input" type="range" min="2" max="10" step="0.1" value="3" class="w-full h-2 bg-blue-300 rounded-lg appearance-none cursor-pointer"> | |
| <div class="flex justify-between text-xs text-blue-100 mt-1"> | |
| <span>2</span> | |
| <span>10</span> | |
| </div> | |
| <input id="velocity-value" type="number" min="2" max="10" step="0.1" value="3" class="w-full px-2 py-1 mt-1 text-sm border border-blue-300 rounded"> | |
| </div> | |
| <div> | |
| <label class="block text-sm font-medium mb-1">Потери давления (Па/м)</label> | |
| <input id="pressure-input" type="range" min="0.1" max="5" step="0.1" value="0.8" class="w-full h-2 bg-blue-300 rounded-lg appearance-none cursor-pointer"> | |
| <div class="flex justify-between text-xs text-blue-100 mt-1"> | |
| <span>0.1</span> | |
| <span>5</span> | |
| </div> | |
| <input id="pressure-value" type="number" min="0.1" max="5" step="0.1" value="0.8" class="w-full px-2 py-1 mt-1 text-sm border border-blue-300 rounded"> | |
| </div> | |
| <div> | |
| <label class="block text-sm font-medium mb-1">Форма воздуховода</label> | |
| <div class="flex space-x-4"> | |
| <button id="round-btn" class="px-3 py-1 bg-blue-700 rounded-md">Круглый</button> | |
| <button id="rect-btn" class="px-3 py-1 bg-blue-400 rounded-md">Прямоугольный</button> | |
| </div> | |
| </div> | |
| <div id="rectangular-size" class="hidden"> | |
| <div class="grid grid-cols-2 gap-4"> | |
| <div> | |
| <label class="block text-sm font-medium mb-1">А Высота (мм)</label> | |
| <input id="rect-height" type="number" min="100" max="1000" value="300" class="w-full px-3 py-2 border border-blue-300 rounded-md"> | |
| </div> | |
| <div> | |
| <label class="block text-sm font-medium mb-1">Б Ширина (мм)</label> | |
| <input id="rect-width" type="number" min="100" max="1000" value="300" class="w-full px-3 py-2 border border-blue-300 rounded-md"> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="round-size"> | |
| <div> | |
| <label class="block text-sm font-medium mb-1">А Диаметр (мм)</label> | |
| <input id="round-diameter" type="number" min="100" max="1000" value="300" class="w-full px-3 py-2 border border-blue-300 rounded-md"> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="md:w-1/2 p-8"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-4">Рекомендуемый размер</h3> | |
| <div id="size-display" class="flex items-center justify-center mb-6"> | |
| <div class="text-center"> | |
| <div class="w-32 h-32 rounded-full border-8 border-blue-100 flex items-center justify-center mx-auto mb-4"> | |
| <span id="size-value" class="text-2xl font-bold text-blue-600">8"</span> | |
| </div> | |
| <p id="size-description" class="text-sm text-gray-600">Диаметр круглого воздуховода</p> | |
| </div> | |
| </div> | |
| <div class="grid grid-cols-3 gap-4 mb-6"> | |
| <div class="text-center"> | |
| <p class="text-sm text-gray-600">Давление скорости</p> | |
| <p id="velocity-pressure" class="font-semibold">0.06 мм. вод. ст.</p> | |
| </div> | |
| <div class="text-center"> | |
| <p class="text-sm text-gray-600">Потери давления</p> | |
| <p id="pressure-loss" class="font-semibold">0.08 Па/м</p> | |
| </div> | |
| <div class="text-center"> | |
| <p class="text-sm text-gray-600">Эквивалентный диаметр</p> | |
| <p id="equiv-diameter" class="font-semibold">300 мм</p> | |
| </div> | |
| </div> | |
| <button class="w-full py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition"> | |
| Добавить в проект | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- Project Showcase --> | |
| <section class="py-16 px-4 bg-white bg-opacity-90 backdrop-blur-sm"> | |
| <div class="container mx-auto"> | |
| <div class="text-center mb-12"> | |
| <h2 class="text-3xl font-bold text-gray-800 mb-4">Последние проекты</h2> | |
| <p class="text-gray-600 max-w-2xl mx-auto">Посмотрите, как профессионалы используют компоненты BreezyDucts в реальных монтажах</p> | |
| </div> | |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-8"> | |
| <div class="relative group overflow-hidden rounded-xl shadow-md h-64"> | |
| <img src="http://static.photos/industry/640x360/1" alt="Commercial HVAC" class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110"> | |
| <div class="absolute inset-0 bg-gradient-to-t from-black/80 to-transparent flex items-end p-6"> | |
| <div> | |
| <h3 class="text-white font-semibold text-lg">Офисный комплекс</h3> | |
| <p class="text-blue-200">1000 м спиральных воздуховодов</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="relative group overflow-hidden rounded-xl shadow-md h-64"> | |
| <img src="http://static.photos/construction/640x360/2" alt="Hospital HVAC" class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110"> | |
| <div class="absolute inset-0 bg-gradient-to-t from-black/80 to-transparent flex items-end p-6"> | |
| <div> | |
| <h3 class="text-white font-semibold text-lg">Вентиляция больницы</h3> | |
| <p class="text-blue-200">Специальная обработка воздуха</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="relative group overflow-hidden rounded-xl shadow-md h-64"> | |
| <img src="http://static.photos/education/640x360/3" alt="School HVAC" class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110"> | |
| <div class="absolute inset-0 bg-gradient-to-t from-black/80 to-transparent flex items-end p-6"> | |
| <div> | |
| <h3 class="text-white font-semibold text-lg">Университетская лаборатория</h3> | |
| <p class="text-blue-200">Вытяжная система для вытяжных шкафов</p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="text-center mt-12"> | |
| <button class="px-6 py-3 bg-white border border-blue-600 text-blue-600 font-medium rounded-lg hover:bg-blue-50 transition"> | |
| Все кейсы | |
| </button> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- Footer --> | |
| <footer class="bg-gray-800 text-white py-12 px-4"> | |
| <div class="container mx-auto"> | |
| <div class="grid grid-cols-1 md:grid-cols-4 gap-8"> | |
| <div> | |
| <div class="flex items-center space-x-2 mb-4"> | |
| <svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-blue-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" /> | |
| </svg> | |
| <span class="text-xl font-bold">BreezyDucts</span> | |
| </div> | |
| <p class="text-gray-400 mb-4">Профессиональные вентиляционные решения для подрядчиков и монтажников ОВК.</p> | |
| <div class="flex space-x-4"> | |
| <a href="#" class="text-gray-400 hover:text-white transition"> | |
| <i data-feather="facebook"></i> | |
| </a> | |
| <a href="#" class="text-gray-400 hover:text-white transition"> | |
| <i data-feather="twitter"></i> | |
| </a> | |
| <a href="#" class="text-gray-400 hover:text-white transition"> | |
| <i data-feather="linkedin"></i> | |
| </a> | |
| <a href="#" class="text-gray-400 hover:text-white transition"> | |
| <i data-feather="youtube"></i> | |
| </a> | |
| </div> | |
| </div> | |
| <div> | |
| <h3 class="text-lg font-semibold mb-4">Продукция</h3> | |
| <ul class="space-y-2"> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Воздуховоды</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Фасонные части</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Заслонки</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Аксессуары</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Новинки</a></li> | |
| </ul> | |
| </div> | |
| <div> | |
| <h3 class="text-lg font-semibold mb-4">Ресурсы</h3> | |
| <ul class="space-y-2"> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Чертежи CAD</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Технические характеристики</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Инструкции по монтажу</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Инженерные данные</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Технические статьи</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Технические статьи</a></li> | |
| </ul> | |
| </div> | |
| <div> | |
| <h3 class="text-lg font-semibold mb-4">Контакты</h3> | |
| <ul class="space-y-2"> | |
| <li class="flex items-start"> | |
| <i data-feather="map-pin" class="w-4 h-4 mt-1 mr-2"></i> | |
| <span class="text-gray-400">ул. Вентиляционная, 123, Москва, 123456</span> | |
| </li> | |
| <li class="flex items-center"> | |
| <i data-feather="phone" class="w-4 h-4 mr-2"></i> | |
| <span class="text-gray-400">+7 (800) 555-35-35</span> | |
| </li> | |
| <li class="flex items-center"> | |
| <i data-feather="mail" class="w-4 h-4 mr-2"></i> | |
| <span class="text-gray-400">info@breezyducts.ru</span> | |
| </li> | |
| </ul> | |
| </div> | |
| </div> | |
| <div class="border-t border-gray-700 mt-12 pt-8 flex flex-col md:flex-row justify-between items-center"> | |
| <p class="text-gray-400 mb-4 md:mb-0">© 2023 BreezyDucts. Все права защищены.</p> | |
| <div class="flex space-x-6"> | |
| <a href="#" class="text-gray-400 hover:text-white transition">Политика конфиденциальности</a> | |
| <a href="#" class="text-gray-400 hover:text-white transition">Условия использования</a> | |
| <a href="#" class="text-gray-400 hover:text-white transition">Карта сайта</a> | |
| </div> | |
| </div> | |
| </div> | |
| </footer> | |
| </div> | |
| <script> | |
| // Initialize Vanta.js background | |
| VANTA.WAVES({ | |
| el: "#vanta-background", | |
| mouseControls: true, | |
| touchControls: true, | |
| gyroControls: false, | |
| minHeight: 200.00, | |
| minWidth: 200.00, | |
| scale: 1.00, | |
| scaleMobile: 1.00, | |
| color: 0x3b82f6, | |
| shininess: 35.00, | |
| waveHeight: 10.00, | |
| waveSpeed: 0.75, | |
| zoom: 0.85 | |
| }); | |
| // Initialize feather icons | |
| feather.replace(); | |
| // Form handlers and calculations | |
| const roundBtn = document.getElementById('round-btn'); | |
| const rectBtn = document.getElementById('rect-btn'); | |
| const roundInput = document.getElementById('round-diameter'); | |
| const rectHeight = document.getElementById('rect-height'); | |
| const rectWidth = document.getElementById('rect-width'); | |
| const airflowInput = document.getElementById('airflow-input'); | |
| const airflowValue = document.getElementById('airflow-value'); | |
| const velocityInput = document.getElementById('velocity-input'); | |
| const velocityValue = document.getElementById('velocity-value'); | |
| const pressureInput = document.getElementById('pressure-input'); | |
| const pressureValue = document.getElementById('pressure-value'); | |
| let isRound = true; | |
| // Toggle between round and rectangular ducts | |
| roundBtn.addEventListener('click', function() { | |
| isRound = true; | |
| roundBtn.classList.add('bg-blue-700'); | |
| roundBtn.classList.remove('bg-blue-400'); | |
| rectBtn.classList.add('bg-blue-400'); | |
| rectBtn.classList.remove('bg-blue-700'); | |
| document.getElementById('round-size').classList.remove('hidden'); | |
| document.getElementById('rectangular-size').classList.add('hidden'); | |
| document.getElementById('size-description').textContent = 'Диаметр круглого воздуховода'; | |
| calculateAll(); | |
| }); | |
| rectBtn.addEventListener('click', function() { | |
| isRound = false; | |
| rectBtn.classList.add('bg-blue-700'); | |
| rectBtn.classList.remove('bg-blue-400'); | |
| roundBtn.classList.add('bg-blue-400'); | |
| roundBtn.classList.remove('bg-blue-700'); | |
| document.getElementById('rectangular-size').classList.remove('hidden'); | |
| document.getElementById('round-size').classList.add('hidden'); | |
| document.getElementById('size-description').textContent = 'Размеры прямоугольного воздуховода'; | |
| calculateAll(); | |
| }); | |
| // Connect range and number inputs | |
| airflowInput.addEventListener('input', function() { | |
| airflowValue.value = this.value; | |
| calculateFromAirflowVelocity(); | |
| }); | |
| airflowValue.addEventListener('input', function() { | |
| airflowInput.value = this.value; | |
| calculateFromAirflowVelocity(); | |
| }); | |
| velocityInput.addEventListener('input', function() { | |
| velocityValue.value = this.value; | |
| calculateFromAirflowVelocity(); | |
| }); | |
| velocityValue.addEventListener('input', function() { | |
| velocityInput.value = this.value; | |
| calculateFromAirflowVelocity(); | |
| }); | |
| pressureInput.addEventListener('input', function() { | |
| pressureValue.value = this.value; | |
| calculateFromPressure(); | |
| }); | |
| pressureValue.addEventListener('input', function() { | |
| pressureInput.value = this.value; | |
| calculateFromPressure(); | |
| }); | |
| // Duct size inputs | |
| roundInput.addEventListener('input', function() { | |
| document.getElementById('size-value').textContent = `${this.value}мм`; | |
| calculateFromSize(); | |
| }); | |
| rectHeight.addEventListener('input', function() { | |
| document.getElementById('size-value').textContent = `${rectWidth.value}×${this.value}мм`; | |
| calculateFromSize(); | |
| }); | |
| rectWidth.addEventListener('input', function() { | |
| document.getElementById('size-value').textContent = `${this.value}×${rectHeight.value}мм`; | |
| calculateFromSize(); | |
| }); | |
| function calculateAll() { | |
| const airflow = parseFloat(airflowValue.value); | |
| const velocity = parseFloat(velocityValue.value); | |
| // Calculate equivalent diameter for rectangular ducts | |
| if (!isRound) { | |
| const a = parseFloat(rectHeight.value) / 1000; | |
| const b = parseFloat(rectWidth.value) / 1000; | |
| const equivD = 1.3 * Math.pow(a * b, 0.625) / Math.pow(a + b, 0.25); | |
| document.getElementById('equiv-diameter').textContent = `${Math.round(equivD * 1000)} мм`; | |
| } | |
| // Calculate velocity pressure (dynamic pressure) | |
| const airDensity = 1.2; // kg/m³ | |
| const velocityPressure = 0.5 * airDensity * Math.pow(velocity, 2); | |
| document.getElementById('velocity-pressure').textContent = `${velocityPressure.toFixed(2)} Па`; | |
| // Calculate pressure loss (simplified Darcy-Weisbach) | |
| const diameter = isRound ? parseFloat(roundInput.value)/1000 : | |
| 1.3 * Math.pow((rectHeight.value/1000 * rectWidth.value/1000), 0.625) / | |
| Math.pow((rectHeight.value/1000 + rectWidth.value/1000), 0.25); | |
| const frictionFactor = 0.02; // typical for galvanized steel | |
| const pressureLoss = frictionFactor * (1/diameter) * velocityPressure; | |
| document.getElementById('pressure-loss').textContent = `${pressureLoss.toFixed(2)} Па/м`; | |
| } | |
| function calculateFromAirflowVelocity() { | |
| const airflow = parseFloat(airflowValue.value); // m³/h | |
| const velocity = parseFloat(velocityValue.value); // m/s | |
| // Calculate required duct size | |
| const area = (airflow / 3600) / velocity; // m² | |
| if (isRound) { | |
| const diameter = Math.sqrt(4 * area / Math.PI) * 1000; // mm | |
| roundInput.value = Math.round(diameter); | |
| document.getElementById('size-value').textContent = `${Math.round(diameter)}мм`; | |
| } else { | |
| // For rectangular, maintain aspect ratio ~1:2 | |
| const height = Math.sqrt(area * 2) * 1000; | |
| const width = height / 2; | |
| rectHeight.value = Math.round(height); | |
| rectWidth.value = Math.round(width); | |
| document.getElementById('size-value').textContent = `${Math.round(width)}×${Math.round(height)}мм`; | |
| } | |
| calculateAll(); | |
| } | |
| function calculateFromPressure() { | |
| const pressureLoss = parseFloat(pressureValue.value); // Pa/m | |
| const airflow = parseFloat(airflowValue.value); // m³/h | |
| // Simplified calculation - in reality this would use ductulator formulas | |
| const velocity = Math.sqrt(2 * pressureLoss * (isRound ? roundInput.value/1000 : | |
| 1.3 * Math.pow((rectHeight.value/1000 * rectWidth.value/1000), 0.625) / | |
| Math.pow((rectHeight.value/1000 + rectWidth.value/1000), 0.25)) / 0.02); | |
| velocityInput.value = velocity.toFixed(1); | |
| velocityValue.value = velocity.toFixed(1); | |
| calculateFromAirflowVelocity(); | |
| } | |
| function calculateFromSize() { | |
| const diameter = isRound ? parseFloat(roundInput.value)/1000 : | |
| 1.3 * Math.pow((rectHeight.value/1000 * rectWidth.value/1000), 0.625) / | |
| Math.pow((rectHeight.value/1000 + rectWidth.value/1000), 0.25); | |
| const area = isRound ? Math.PI * Math.pow(diameter, 2) / 4 : | |
| (rectHeight.value/1000 * rectWidth.value/1000); | |
| const airflow = parseFloat(airflowValue.value); // m³/h | |
| const velocity = (airflow / 3600) / area; // m/s | |
| velocityInput.value = velocity.toFixed(1); | |
| velocityValue.value = velocity.toFixed(1); | |
| calculateAll(); | |
| } | |
| // Initialize calculations | |
| calculateAll(); | |
| // Simple animation for duct items | |
| document.querySelectorAll('.duct-item').forEach((item, index) => { | |
| item.style.transitionDelay = `${index * 100}ms`; | |
| item.style.opacity = '0'; | |
| item.style.transform = 'translateY(20px)'; | |
| setTimeout(() => { | |
| item.style.opacity = '1'; | |
| item.style.transform = 'translateY(0)'; | |
| }, 500 + (index * 100)); | |
| }); | |
| // Animate the airflow path | |
| const path = document.querySelector('.airflow-path'); | |
| if (path) { | |
| const length = path.getTotalLength(); | |
| path.style.strokeDasharray = length; | |
| path.style.strokeDashoffset = length; | |
| // Trigger the animation when the element is in view | |
| const observer = new IntersectionObserver((entries) => { | |
| if (entries[0].isIntersecting) { | |
| path.style.animation = 'dash 3s linear forwards'; | |
| } | |
| }); | |
| observer.observe(path); | |
| } | |
| </script> | |
| </body> | |
| </html> | |