Nickitozi263's picture
undefined - Initial Deployment
8bb2297 verified
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EthnoScan - Российский этнический анализатор</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.card-hover {
transition: all 0.3s ease;
transform: translateY(0);
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
}
.voice-pulse {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.5); }
70% { box-shadow: 0 0 0 10px rgba(59, 130, 246, 0); }
100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); }
}
.slide-in {
animation: slideIn 0.8s ease-out forwards;
}
@keyframes slideIn {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
.progress-bar {
height: 6px;
transition: width 0.3s ease-in-out;
}
</style>
</head>
<body class="bg-gradient-to-br from-gray-50 to-gray-200 min-h-screen">
<!-- Header -->
<header class="py-6 bg-indigo-700 text-white shadow-lg">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center">
<div class="flex items-center">
<div class="bg-gray-200 border-2 border-dashed rounded-xl w-16 h-16" />
<div class="ml-4">
<h1 class="text-2xl font-bold">EthnoScan</h1>
<p class="text-indigo-200">Идентификация этно-расовых характеристик</p>
</div>
</div>
<div class="flex items-center">
<button class="bg-indigo-800 hover:bg-indigo-600 px-4 py-2 rounded-lg transition mr-3">
<i class="fas fa-history mr-2"></i>История
</button>
<button class="bg-indigo-800 hover:bg-indigo-600 px-4 py-2 rounded-lg transition">
<i class="fas fa-cog mr-2"></i>Настройки
</button>
</div>
</div>
</div>
</header>
<!-- Main Section -->
<main class="container mx-auto px-4 py-10">
<div class="text-center mb-12">
<h2 class="text-3xl md:text-4xl font-bold text-gray-800 mb-4">Определение этнической принадлежности</h2>
<p class="text-gray-600 max-w-3xl mx-auto">Загрузите фотографию и запишите голос для анализа расовых типов, национальностей и субэтносов России. Результаты формируются уникально для каждого пользователя.</p>
</div>
<div class="flex flex-col lg:flex-row gap-8">
<!-- Input Section -->
<div class="lg:w-1/2 bg-white rounded-xl shadow-lg p-6">
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
<div>
<h3 class="text-xl font-semibold text-gray-800 mb-4">Фотография</h3>
<div class="border-2 border-dashed border-gray-300 rounded-xl p-6 flex flex-col items-center justify-center h-64">
<i class="fas fa-camera text-indigo-500 text-4xl mb-4"></i>
<p class="text-gray-600 mb-4 text-center">Перетащите сюда фото или</p>
<label for="photoUpload" class="bg-indigo-600 text-white px-6 py-2 rounded-lg cursor-pointer hover:bg-indigo-700 transition">
<i class="fas fa-upload mr-2"></i>Выбрать файл
</label>
<input type="file" id="photoUpload" accept="image/*" class="hidden">
</div>
</div>
<div>
<h3 class="text-xl font-semibold text-gray-800 mb-4">Голосовая запись</h3>
<div id="voiceRecorder" class="bg-indigo-50 border-2 border-dashed border-indigo-300 rounded-xl p-6 flex flex-col items-center justify-center h-64">
<div id="audioVisualizer" class="h-16 mb-6 flex items-end w-full justify-center hidden">
<div id="bar1" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div>
<div id="bar2" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div>
<div id="bar3" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div>
<div id="bar4" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div>
<div id="bar5" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div>
</div>
<button id="recordButton" class="voice-pulse bg-indigo-600 hover:bg-indigo-700 text-white rounded-full w-16 h-16 flex items-center justify-center mb-4">
<i class="fas fa-microphone text-2xl"></i>
</button>
<p class="text-gray-600 text-center" id="recordStatus">Нажмите для записи голоса</p>
<p class="text-xs text-gray-500 mt-2">Попроизнесите несколько фраз в течение 10 секунд</p>
</div>
</div>
</div>
<div class="mb-6">
<h3 class="text-xl font-semibold text-gray-800 mb-4">Дополнительная информация (необязательно)</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div>
<label class="text-gray-700 mb-1 block">Возраст</label>
<select class="w-full border border-gray-300 rounded-lg px-3 py-2">
<option>Выберите</option>
<option>18-25</option>
<option>26-35</option>
<option>36-45</option>
<option>46+</option>
</select>
</div>
<div>
<label class="text-gray-700 mb-1 block">Пол</label>
<select class="w-full border border-gray-300 rounded-lg px-3 py-2">
<option>Выберите</option>
<option>Мужской</option>
<option>Женский</option>
</select>
</div>
<div>
<label class="text-gray-700 mb-1 block">Регион</label>
<select class="w-full border border-gray-300 rounded-lg px-3 py-2">
<option>Выберите</option>
<option>Центральный</option>
<option>Северо-Западный</option>
<option>Южный</option>
<option>Поволжье</option>
<option>Урал</option>
<option>Сибирь</option>
<option>Дальний Восток</option>
</select>
</div>
</div>
</div>
<div class="text-center">
<button id="analyzeButton" class="bg-gradient-to-r from-indigo-600 to-purple-600 hover:from-indigo-700 hover:to-purple-700 text-white px-8 py-4 rounded-xl font-bold text-lg transition-all transform hover:scale-105 shadow-lg">
<i class="fas fa-search mr-2"></i> Анализировать данные
</button>
</div>
</div>
<!-- Results Section -->
<div class="lg:w-1/2">
<div class="bg-white rounded-xl shadow-lg p-6">
<div class="flex justify-between items-center mb-6">
<h3 class="text-xl font-semibold text-gray-800">Результаты анализа</h3>
<span id="sessionId" class="text-sm text-gray-500">Сессия: #230917-05</span>
</div>
<div class="flex flex-wrap" id="resultsContainer">
<div class="w-full mb-6 text-center py-10">
<div class="text-indigo-400 mx-auto mb-4">
<i class="fas fa-chart-pie text-6xl"></i>
</div>
<h4 class="text-lg font-semibold text-gray-700 mb-2">Ожидание данных</h4>
<p class="text-gray-600">Загрузите фото и запишите голос, чтобы получить результаты анализа</p>
</div>
</div>
<div id="progressBar" class="h-2 bg-gray-200 rounded-full overflow-hidden mb-6 hidden">
<div id="progress" class="h-full bg-indigo-600 w-0"></div>
</div>
<div id="analysisStats" class="hidden">
<div class="grid grid-cols-4 gap-4 text-center mb-6">
<div class="bg-gray-100 p-3 rounded-lg">
<div class="text-indigo-600 font-bold text-2xl">97.8%</div>
<div class="text-xs text-gray-600">Точность анализа</div>
</div>
<div class="bg-gray-100 p-3 rounded-lg">
<div class="text-indigo-600 font-bold text-2xl">64</div>
<div class="text-xs text-gray-600">Антроп. маркеров</div>
</div>
<div class="bg-gray-100 p-3 rounded-lg">
<div class="text-indigo-600 font-bold text-2xl">28</div>
<div class="text-xs text-gray-600">Фонационных черт</div>
</div>
<div class="bg-gray-100 p-3 rounded-lg">
<div class="text-indigo-600 font-bold text-2xl">2.4с</div>
<div class="text-xs text-gray-600">Время обработки</div>
</div>
</div>
<div class="bg-indigo-50 rounded-lg p-4 mb-6">
<div class="flex items-center">
<i class="fas fa-shield-alt text-indigo-500 text-lg mr-3"></i>
<span class="text-gray-700">Ваши данные обрабатываются локально и никогда не передаются на сервер</span>
</div>
</div>
<div class="text-center">
<button onclick="downloadResults()" class="bg-indigo-600 hover:bg-indigo-700 text-white px-6 py-3 rounded-lg mr-3">
<i class="fas fa-download mr-2"></i>Скачать отчет
</button>
<button onclick="resetAnalysis()" class="bg-gray-600 hover:bg-gray-700 text-white px-6 py-3 rounded-lg">
<i class="fas fa-redo mr-2"></i>Новый анализ
</button>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Ethnic Map Accordion -->
<section class="container mx-auto px-4 py-6">
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold text-gray-800 mb-4">Атлас этнических групп России</h3>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="border-l-4 border-indigo-500 pl-4 py-2">
<h4 class="font-bold text-gray-800">Северная группа</h4>
<p class="text-sm text-gray-600">Ненцы, саамы, ханты, манси, коми, якуты</p>
</div>
<div class="border-l-4 border-green-500 pl-4 py-2">
<h4 class="font-bold text-gray-800">Поволжская группа</h4>
<p class="text-sm text-gray-600">Татары, чуваши, башкиры, марийцы, мордва</p>
</div>
<div class="border-l-4 border-red-500 pl-4 py-2">
<h4 class="font-bold text-gray-800">Южная группа</h4>
<p class="text-sm text-gray-600">Чеченцы, ингуши, осетины, кабардинцы</p>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-800 text-gray-300 py-8 mt-12">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div>
<h4 class="font-bold text-white mb-4">EthnoScan</h4>
<p>Современная система идентификации этнической принадлежности на основе передовых технологий.</p>
</div>
<div>
<h4 class="font-bold text-white mb-4">Методология</h4>
<ul>
<li class="mb-2"><a href="#" class="hover:text-white transition">Голосовой анализ</a></li>
<li class="mb-2"><a href="#" class="hover:text-white transition">Антропометрия</a></li>
<li class="mb-2"><a href="#" class="hover:text-white transition">Этнографическая картография</a></li>
</ul>
</div>
<div>
<h4 class="font-bold text-white mb-4">Ресурсы</h4>
<ul>
<li class="mb-2"><a href="#" class="hover:text-white transition">Научные публикации</a></li>
<li class="mb-2"><a href="#" class="hover:text-white transition">Базы данных</a></li>
<li class="mb-2"><a href="#" class="hover:text-white transition">API для разработчиков</a></li>
</ul>
</div>
<div>
<h4 class="font-bold text-white mb-4">Контакты</h4>
<div class="mb-2"><i class="fas fa-envelope mr-2"></i>[email protected]</div>
<div class="mb-2"><i class="fas fa-phone mr-2"></i>+7 (495) 123-45-67</div>
<div class="flex mt-4 space-x-3">
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-vk fa-lg"></i></a>
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-telegram fa-lg"></i></a>
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-youtube fa-lg"></i></a>
</div>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-sm text-center">
© 2023 EthnoScan. Все права защищены. По результатам аналитики проекта Росэтногенезис.
</div>
</div>
</footer>
<script>
// Ethnic groups database
const ethnicGroups = {
races: [
"Североевропейский",
"Восточноевропейский",
"Балтийский",
"Понтийский",
"Южносибирский",
"Центральноазиатский",
"Северосибирский",
"Амуро-сахалинский"
],
nations: [
"Карелы", "Весь", "Ногайцы", "Чуванцы", "Удины", "Кумандинцы", "Энцы", "Нагайбаки"
],
anthroTypes: [
"Ильменский", "Онежский", "Нижнедонской", "Беломоро-карельский",
"Саянский", "Алтайский", "Тунгусский", "Приамурский",
"Предуральский", "Прикаспийский", "Кубанский", "Западносибирский",
"Якутский"
],
subethnos: [
"Поморы", "Семейские", "Мезенцы", "Устюжане",
"Бухтарминцы", "Ямщики", "Сибиряки", "Кержаки",
"Донские казаки", "Кубанские казаки", "Уральские казаки",
"Терские казаки", "Забайкальские казаки"
]
};
// Simulation state
let isAnalyzing = false;
let recordInProgress = false;
// DOM elements
const analyzeButton = document.getElementById('analyzeButton');
const resultsContainer = document.getElementById('resultsContainer');
const progressBar = document.getElementById('progressBar');
const progress = document.getElementById('progress');
const analysisStats = document.getElementById('analysisStats');
const recordButton = document.getElementById('recordButton');
const recordStatus = document.getElementById('recordStatus');
const audioVisualizer = document.getElementById('audioVisualizer');
// Audio visualization elements
const bar1 = document.getElementById('bar1');
const bar2 = document.getElementById('bar2');
const bar3 = document.getElementById('bar3');
const bar4 = document.getElementById('bar4');
const bar5 = document.getElementById('bar5');
// Voice recording simulation
recordButton.addEventListener('click', () => {
if (recordInProgress) {
stopRecording();
} else {
startRecording();
}
});
function startRecording() {
recordInProgress = true;
recordButton.classList.add('voice-pulse');
recordButton.classList.add('bg-red-600');
recordButton.classList.remove('bg-indigo-600');
recordStatus.textContent = "Запись... Говорите сейчас!";
audioVisualizer.classList.remove('hidden');
// Simulate audio visualization
const animateBars = () => {
if (!recordInProgress) return;
const heights = [
Math.random() * 50 + 10,
Math.random() * 70 + 20,
Math.random() * 90 + 30,
Math.random() * 60 + 15,
Math.random() * 80 + 25
];
bar1.style.height = heights[0] + 'px';
bar2.style.height = heights[1] + 'px';
bar3.style.height = heights[2] + 'px';
bar4.style.height = heights[3] + 'px';
bar5.style.height = heights[4] + 'px';
setTimeout(animateBars, 150);
};
animateBars();
// Stop recording after 10 seconds
setTimeout(() => {
if (recordInProgress) {
stopRecording();
}
}, 10000);
}
function stopRecording() {
recordInProgress = false;
recordButton.classList.remove('voice-pulse');
recordButton.classList.remove('bg-red-600');
recordButton.classList.add('bg-indigo-600');
recordStatus.textContent = "Запись завершена! Можно анализировать";
// Reset heights
const resetBars = () => {
bar1.style.height = '0px';
bar2.style.height = '0px';
bar3.style.height = '0px';
bar4.style.height = '0px';
bar5.style.height = '0px';
};
setTimeout(resetBars, 300);
}
// Analyze functionality
analyzeButton.addEventListener('click', () => {
if (isAnalyzing) return;
isAnalyzing = true;
// Show progress bar
progressBar.classList.remove('hidden');
// Reset progress width and show analyzing state
resultsContainer.innerHTML = `
<div class="w-full mb-6 text-center py-10 slide-in">
<div class="animate-spin text-indigo-600 mx-auto mb-4">
<i class="fas fa-cog text-6xl"></i>
</div>
<h4 class="text-lg font-semibold text-gray-700 mb-2">Анализ данных</h4>
<p class="text-gray-600">Обработка фото и голосовых данных...</p>
</div>
`;
// Animate progress bar
let width = 0;
const interval = setInterval(() => {
width += Math.random() * 20;
progress.style.width = width + '%';
if (width >= 100) {
clearInterval(interval);
displayResults();
}
}, 500);
});
function displayResults() {
isAnalyzing = false;
// Generate unique results
const resultData = {
race: getRandomUniqueItem(ethnicGroups.races),
nation: getRandomUniqueItem(ethnicGroups.nations),
anthroType: getRandomUniqueItem(ethnicGroups.anthroTypes),
subethno: getRandomUniqueItem(ethnicGroups.subethnos)
};
// Build results UI
resultsContainer.innerHTML = '';
// Race
resultsContainer.innerHTML += `
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2">
<div class="card-hover bg-gradient-to-br from-indigo-50 to-purple-50 rounded-xl p-5 text-center shadow h-full">
<div class="bg-white rounded-lg p-3 inline-block mb-4">
<i class="fas fa-globe-asia text-indigo-600 text-3xl"></i>
</div>
<h4 class="font-bold text-gray-800 mb-2">Расовая принадлежность</h4>
<div class="bg-indigo-100 text-indigo-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.race}</div>
<p class="text-gray-600 text-xs">Определено с точностью 94.3%</p>
</div>
</div>
`;
// Nation
resultsContainer.innerHTML += `
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2">
<div class="card-hover bg-gradient-to-br from-blue-50 to-teal-50 rounded-xl p-5 text-center shadow h-full">
<div class="bg-white rounded-lg p-3 inline-block mb-4">
<i class="fas fa-users text-blue-600 text-3xl"></i>
</div>
<h4 class="font-bold text-gray-800 mb-2">Народ/Национальность</h4>
<div class="bg-blue-100 text-blue-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.nation}</div>
<p class="text-gray-600 text-xs">Определено с точностью 88.7%</p>
</div>
</div>
`;
// Anthropological type
resultsContainer.innerHTML += `
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2">
<div class="card-hover bg-gradient-to-br from-amber-50 to-orange-50 rounded-xl p-5 text-center shadow h-full">
<div class="bg-white rounded-lg p-3 inline-block mb-4">
<i class="fas fa-brain text-amber-600 text-3xl"></i>
</div>
<h4 class="font-bold text-gray-800 mb-2">Антропологический тип</h4>
<div class="bg-amber-100 text-amber-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.anthroType}</div>
<p class="text-gray-600 text-xs">Определено с точностью 89.5%</p>
</div>
</div>
`;
// Sub-ethnos
resultsContainer.innerHTML += `
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2">
<div class="card-hover bg-gradient-to-br from-emerald-50 to-cyan-50 rounded-xl p-5 text-center shadow h-full">
<div class="bg-white rounded-lg p-3 inline-block mb-4">
<i class="fas fa-map-marker-alt text-emerald-600 text-3xl"></i>
</div>
<h4 class="font-bold text-gray-800 mb-2">Субэтнос</h4>
<div class="bg-emerald-100 text-emerald-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.subethno}</div>
<p class="text-gray-600 text-xs">Определено с точностью 83.2%</p>
</div>
</div>
`;
// Show stats
analysisStats.classList.remove('hidden');
}
// Generate unique item - simplified simulation
function getRandomUniqueItem(arr) {
const now = new Date();
const minutes = now.getMinutes();
const seconds = now.getSeconds();
const index = (minutes * seconds) % arr.length;
return arr[index];
}
// Download results simulation
function downloadResults() {
alert('Отчет сохранен в формате PDF. Проверьте папку загрузок!');
}
// Reset analysis simulation
function resetAnalysis() {
resultsContainer.innerHTML = `
<div class="w-full mb-6 text-center py-10">
<div class="text-indigo-400 mx-auto mb-4">
<i class="fas fa-chart-pie text-6xl"></i>
</div>
<h4 class="text-lg font-semibold text-gray-700 mb-2">Ожидание данных</h4>
<p class="text-gray-600">Загрузите фото и запишите голос, чтобы получить результаты анализа</p>
</div>
`;
analysisStats.classList.add('hidden');
progressBar.classList.add('hidden');
}
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Nickitozi263/awesome-ethnicity-analyser" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>