// Клиентская мелочь без сборки и фреймворков. // htmx тянет серверные фрагменты, здесь — только то, что серверу знать не нужно. // Копирование infohash в буфер обмена. На целевом деплое (домашний LAN по HTTP) // navigator.clipboard недоступен — secure context только на HTTPS/localhost, // поэтому есть fallback на execCommand, а индикация честная: «✓» лишь при успехе. function copyHash(btn, full) { if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(full).then( () => flashCopy(btn, true), () => flashCopy(btn, legacyCopy(full)), ); } else { flashCopy(btn, legacyCopy(full)); } } function legacyCopy(text) { try { const ta = document.createElement('textarea'); ta.value = text; ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.focus(); ta.select(); const ok = document.execCommand('copy'); document.body.removeChild(ta); return ok; } catch (e) { return false; } } function flashCopy(btn, ok) { const old = btn.dataset.label || btn.textContent; btn.dataset.label = old; btn.textContent = ok ? '✓ скопировано' : '✗ не вышло'; btn.classList.toggle('copied', ok); setTimeout(() => { btn.textContent = old; btn.classList.remove('copied'); }, 1400); } // Фильтр, поиск и пагинация списка — серверные (GET-параметры f/q/page/all), // работают без JS. Здесь клиентской фильтрации нет намеренно.