Files
quixotic/public/index.html
Andrey Kondratev beb2d19019 version fix
2025-11-10 16:27:35 +05:00

209 lines
13 KiB
HTML

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
<title>Quixotic Music - Поиск и скачивание музыки</title>
<meta name="description" content="Удобный сервис для поиска и скачивания музыки. Найдите любимые треки по названию песни или исполнителю.">
<meta name="keywords" content="музыка, поиск музыки, скачать музыку, mp3, треки, песни, исполнители">
<meta name="author" content="Quixotic Music">
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<!-- Canonical URL -->
<link rel="canonical" href="https://music.quixy.uk/">
<!-- Cache Control for iOS -->
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<!-- Theme & App -->
<meta name="theme-color" content="#007AFF">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="Quixotic Music">
<meta name="application-name" content="Quixotic Music">
<meta name="mobile-web-app-capable" content="yes">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://music.quixy.uk/">
<meta property="og:title" content="Quixotic Music - Поиск и скачивание музыки">
<meta property="og:description" content="Удобный сервис для поиска и скачивания музыки. Найдите любимые треки по названию песни или исполнителю.">
<meta property="og:site_name" content="Quixotic Music">
<meta property="og:locale" content="ru_RU">
<meta property="og:locale:alternate" content="en_US">
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Quixotic Music - Поиск и скачивание музыки">
<meta name="twitter:description" content="Удобный сервис для поиска и скачивания музыки. Найдите любимые треки по названию песни или исполнителю.">
<meta name="twitter:creator" content="@quixotic">
<!-- Telegram -->
<meta property="telegram:channel" content="@quixotic">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" sizes="180x180" href="/favicon.ico">
<!-- PWA Manifest -->
<link rel="manifest" href="/manifest.json">
<!-- Structured Data (JSON-LD) - минифицирован -->
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebApplication","name":"Quixotic Music","description":"Удобный сервис для поиска и скачивания музыки","url":"https://music.quixy.uk/","applicationCategory":"MultimediaApplication","operatingSystem":"Any","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"}}</script>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<!-- Preconnect to external resources -->
<link rel="preconnect" href="https://telegram.org" crossorigin>
<link rel="dns-prefetch" href="https://telegram.org">
<!-- Critical CSS - inline the most important styles -->
<style>
:root{--tg-color-bg:var(--tg-theme-bg-color,#fff);--tg-color-secondary-bg:var(--tg-theme-secondary-bg-color,#f1f1f1);--tg-color-section-bg:var(--tg-theme-section-bg-color,#fff);--tg-color-text:var(--tg-theme-text-color,#000);--tg-color-hint:var(--tg-theme-hint-color,#999);--tg-color-button:var(--tg-theme-button-color,#007aff);--tg-color-button-text:var(--tg-theme-button-text-color,#fff);--tg-border-radius:12px;--tg-spacing-lg:16px;--tg-spacing-xl:20px;--tg-spacing-xxl:24px;--tg-font-size-md:16px;--tg-font-size-lg:17px;--tg-font-size-xl:20px;--tg-line-height-normal:1.4;--tg-line-height-relaxed:1.6}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display',system-ui,sans-serif;-webkit-font-smoothing:antialiased}body{background:var(--tg-color-bg);color:var(--tg-color-text);font-size:var(--tg-font-size-md);line-height:var(--tg-line-height-normal);overflow-x:hidden}.tg-root{min-height:100vh;display:flex;flex-direction:column}.tg-content{flex:1;padding:var(--tg-spacing-lg);padding-bottom:100px;display:flex;flex-direction:column;gap:var(--tg-spacing-xl)}.tg-placeholder{text-align:center;padding:var(--tg-spacing-xxl) var(--tg-spacing-lg);max-width:300px;margin:0 auto}.tg-placeholder__icon{font-size:48px;margin-bottom:var(--tg-spacing-lg);opacity:.6}.tg-placeholder__title{font-size:var(--tg-font-size-xl);font-weight:600;margin-bottom:8px}.tg-placeholder__description{font-size:14px;color:var(--tg-color-hint);line-height:var(--tg-line-height-relaxed)}.tg-hidden{display:none!important}.tg-form{position:fixed;bottom:0;left:0;right:0;padding:var(--tg-spacing-lg);background:var(--tg-color-bg);border-top:1px solid var(--tg-color-secondary-bg);z-index:100}.tg-input-wrapper{position:relative}.tg-input{width:100%;height:48px;padding:0 var(--tg-spacing-lg);background:var(--tg-color-section-bg);border:2px solid var(--tg-color-secondary-bg);border-radius:var(--tg-border-radius);font-size:var(--tg-font-size-lg);color:var(--tg-color-text);transition:border-color .2s;outline:0}.tg-input::placeholder{color:var(--tg-color-hint)}.tg-input:focus{border-color:var(--tg-color-button)}
</style>
<!-- Load full CSS asynchronously with fallback -->
<link rel="stylesheet" href="style.css?v=VERSION" media="print" onload="this.media='all';this.onload=null">
<noscript><link rel="stylesheet" href="style.css?v=VERSION"></noscript>
<!-- Load Telegram script asynchronously (defer) -->
<script src="https://telegram.org/js/telegram-web-app.js" defer></script>
</head>
<body>
<div class="tg-root">
<div class="tg-pull-indicator" id="pullIndicator">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="tg-pull-indicator__icon">
<path d="M12 5v14M5 12l7 7 7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="tg-pull-indicator__text">Обновить</span>
</div>
<div class="tg-content">
<div class="tg-placeholder" id="welcomePlaceholder">
<div class="tg-placeholder__icon">🎵</div>
<div class="tg-placeholder__title">Найти музыку</div>
<div class="tg-placeholder__description">Введите название песни или исполнителя для поиска</div>
</div>
<div class="tg-spinner tg-hidden" id="loading">
<div class="tg-spinner__icon"></div>
<div class="tg-spinner__text">Поиск музыки...</div>
</div>
<div class="tg-skeleton-list tg-hidden" id="skeletonList">
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
<div class="tg-skeleton-item">
<div class="tg-skeleton-thumbnail"></div>
<div class="tg-skeleton-text">
<div class="tg-skeleton-line"></div>
<div class="tg-skeleton-line tg-skeleton-line--short"></div>
</div>
</div>
</div>
<div class="tg-recent-searches tg-hidden" id="recentSearches">
<div class="tg-recent-searches__header">
<span class="tg-recent-searches__title">Недавние поиски</span>
<button class="tg-recent-searches__clear" id="clearRecentBtn" type="button">Очистить</button>
</div>
<div class="tg-recent-searches__list" id="recentSearchesList">
<!-- Recent searches will be populated here -->
</div>
</div>
<div class="tg-list tg-hidden" id="results">
<!-- Search results will appear here -->
</div>
<div class="tg-placeholder tg-placeholder--secondary tg-hidden" id="noResults">
<div class="tg-placeholder__icon">🔍</div>
<div class="tg-placeholder__title">Ничего не найдено</div>
<div class="tg-placeholder__description">Попробуйте изменить поисковый запрос</div>
</div>
<div class="tg-form">
<div class="tg-input-wrapper">
<input type="text"
class="tg-input"
id="searchInput"
placeholder="Название песни или исполнитель..."
autocomplete="off">
<button class="tg-input-clear tg-hidden" id="clearButton" type="button" aria-label="Очистить поиск">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M15 5L5 15M5 5L15 15" stroke="currentColor"
stroke-width="2" stroke-linecap="round"/>
</svg>
</button>
</div>
</div>
</div>
</div>
<!-- Load app script with defer for better performance -->
<script src="dist/script.js?v=VERSION" defer></script>
</body>
</html>