439 lines
21 KiB
HTML
439 lines
21 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru" data-theme="light">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>Регистрация — КТ Опен Хакатон 2026</title>
|
||
<link rel="stylesheet" href="design-system/kt-ai-fonts.css">
|
||
<link rel="stylesheet" href="design-system/kt-ai-tokens.css">
|
||
<link rel="stylesheet" href="design-system/kt-ai-components.css">
|
||
<link rel="stylesheet" href="design-system/kt-ai-page.css">
|
||
<link rel="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>">
|
||
<style>
|
||
a.kt-ai-btn { text-decoration: none; }
|
||
.hero-gradient {
|
||
background: linear-gradient(135deg, var(--kt-ai-bg-soft) 0%, var(--kt-ai-bg) 100%);
|
||
border-radius: var(--kt-ai-radius-3xl);
|
||
padding: var(--kt-ai-space-12);
|
||
}
|
||
.form-section {
|
||
margin-top: var(--kt-ai-space-10);
|
||
}
|
||
.stats-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||
gap: var(--kt-ai-space-6);
|
||
margin: var(--kt-ai-space-8) 0;
|
||
}
|
||
.stat-card {
|
||
background: var(--kt-ai-card-bg);
|
||
border: 1px solid var(--kt-ai-card-border);
|
||
border-radius: var(--kt-ai-radius-xl);
|
||
padding: var(--kt-ai-space-6);
|
||
text-align: center;
|
||
}
|
||
.stat-value {
|
||
font-size: var(--kt-ai-text-3xl);
|
||
font-weight: var(--kt-ai-font-bold);
|
||
color: var(--kt-ai-primary);
|
||
}
|
||
.stat-label {
|
||
color: var(--kt-ai-fg-muted);
|
||
margin-top: var(--kt-ai-space-2);
|
||
}
|
||
|
||
.success-message {
|
||
background: var(--kt-ai-bg-soft);
|
||
border: 2px solid var(--kt-ai-primary);
|
||
border-radius: var(--kt-ai-radius-xl);
|
||
padding: var(--kt-ai-space-8);
|
||
text-align: center;
|
||
margin-top: var(--kt-ai-space-8);
|
||
}
|
||
@media (max-width: 768px) {
|
||
.kt-ai-wrap {
|
||
padding-left: var(--kt-ai-space-4);
|
||
padding-right: var(--kt-ai-space-4);
|
||
}
|
||
.hero-gradient {
|
||
padding: var(--kt-ai-space-6);
|
||
}
|
||
.stats-grid {
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: var(--kt-ai-space-4);
|
||
}
|
||
.kt-ai-grid {
|
||
grid-template-columns: 1fr !important;
|
||
}
|
||
.kt-ai-hero-actions {
|
||
flex-direction: column;
|
||
width: 100%;
|
||
}
|
||
.kt-ai-hero-actions .kt-ai-btn {
|
||
width: 100%;
|
||
}
|
||
.kt-ai-pagehead-in {
|
||
flex-wrap: wrap;
|
||
}
|
||
.kt-ai-pagehead-in .kt-ai-btn {
|
||
margin-left: var(--kt-ai-space-2);
|
||
}
|
||
}
|
||
</style>
|
||
</head>
|
||
<body class="kt-ai-app" data-kt-data-mode="demo">
|
||
|
||
<header class="kt-ai-pagehead">
|
||
<div class="kt-ai-wrap kt-ai-pagehead-in">
|
||
<div style="display:flex;align-items:center;gap:var(--kt-ai-space-3)">
|
||
<img src="https://code.vibe42.kz/tore/aitu/kt-logo.svg" alt="Казахтелеком" height="28">
|
||
<strong>КТ Опен Хакатон 2026</strong>
|
||
</div>
|
||
<span class="kt-ai-spacer"></span>
|
||
<span class="kt-ai-chip" data-tone="orange">Демо-данные</span>
|
||
<a class="kt-ai-btn" data-variant="ghost" href="#about">О хакатоне</a>
|
||
<a class="kt-ai-btn" data-variant="primary" href="#register">Зарегистрироваться</a>
|
||
</div>
|
||
</header>
|
||
|
||
<section class="kt-ai-hero" data-align="center">
|
||
<div class="kt-ai-wrap">
|
||
<div class="hero-gradient">
|
||
<h1>Создавай будущее вместе с Казахтелеком</h1>
|
||
<p class="kt-ai-hero-sub" style="max-width:720px;margin:var(--kt-ai-space-6) auto">
|
||
Крупнейший хакатон страны: 48 часов кода, менторство экспертов, призовой фонд 10 млн ₸
|
||
и реальные кейсы от телеком-гиганта. Стань частью технологической революции!
|
||
</p>
|
||
<div class="kt-ai-hero-actions">
|
||
<a class="kt-ai-btn" data-variant="primary" data-size="lg" href="#register">Зарегистрироваться</a>
|
||
<a class="kt-ai-btn" data-size="lg" href="#about">Узнать больше</a>
|
||
</div>
|
||
<div class="stats-grid" style="margin-top:var(--kt-ai-space-10);max-width:800px;margin-left:auto;margin-right:auto">
|
||
<div class="stat-card">
|
||
<div class="stat-value" id="stat-participants">247</div>
|
||
<div class="stat-label">Участников</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-value" id="stat-teams">52</div>
|
||
<div class="stat-label">Команд</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-value" id="stat-days">14</div>
|
||
<div class="stat-label">Дней до старта</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-value" id="stat-tracks">6</div>
|
||
<div class="stat-label">Направлений</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="about" class="kt-ai-section" data-divider="true">
|
||
<div class="kt-ai-wrap">
|
||
<div class="kt-ai-section-head">
|
||
<h2>Что тебя ждёт</h2>
|
||
<p>Три дня интенсивной работы, нетворкинга и создания прорывных проектов</p>
|
||
</div>
|
||
<div class="kt-ai-grid" style="margin-top:var(--kt-ai-space-9)">
|
||
<article class="kt-ai-tile">
|
||
<div class="kt-ai-tile-icon">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/>
|
||
</svg>
|
||
</div>
|
||
<h3>6 треков инноваций</h3>
|
||
<p>AI/ML, IoT, Cybersecurity, Big Data, Cloud, Telecom Solutions — выбирай своё направление</p>
|
||
</article>
|
||
<article class="kt-ai-tile">
|
||
<div class="kt-ai-tile-icon">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/>
|
||
</svg>
|
||
</div>
|
||
<h3>50+ менторов</h3>
|
||
<p>Эксперты Казахтелека и технологических компаний помогут довести идею до прототипа</p>
|
||
</article>
|
||
<article class="kt-ai-tile">
|
||
<div class="kt-ai-tile-icon">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/>
|
||
</svg>
|
||
</div>
|
||
<h3>48 часов хардкора</h3>
|
||
<p>Нон-стоп кодинг, пицца, энергетика и комьюнити лучших разработчиков Казахстана</p>
|
||
</article>
|
||
<article class="kt-ai-tile">
|
||
<div class="kt-ai-tile-icon">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
|
||
</svg>
|
||
</div>
|
||
<h3>10 млн ₸ призовых</h3>
|
||
<p>Щедрые награды победителям в каждом треке и специальные призы от партнёров</p>
|
||
</article>
|
||
<article class="kt-ai-tile">
|
||
<div class="kt-ai-tile-icon">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/>
|
||
</svg>
|
||
</div>
|
||
<h3>Официальный сертификат</h3>
|
||
<p>Все участники получают сертификат хакатона для портфолио и LinkedIn</p>
|
||
</article>
|
||
<article class="kt-ai-tile">
|
||
<div class="kt-ai-tile-icon">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/>
|
||
</svg>
|
||
</div>
|
||
<h3>Трудоустройство</h3>
|
||
<p>Лучшие команды получат предложения о работе в Казахтелеке и партнёрских компаниях</p>
|
||
</article>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="tracks" class="kt-ai-section" data-divider="true">
|
||
<div class="kt-ai-wrap">
|
||
<div class="kt-ai-section-head">
|
||
<h2>Направления хакатона</h2>
|
||
<p>Выбери трек, в котором будешь участвовать</p>
|
||
</div>
|
||
<div class="kt-ai-grid" style="margin-top:var(--kt-ai-space-9)" data-cols="3">
|
||
<article class="kt-ai-tile" data-span="1">
|
||
<h3 style="color:var(--kt-ai-chart-blue)">AI / Machine Learning</h3>
|
||
<p>Нейросети, компьютерное зрение, NLP, генеративные модели</p>
|
||
</article>
|
||
<article class="kt-ai-tile" data-span="1">
|
||
<h3 style="color:var(--kt-ai-chart-green)">IoT & Smart Devices</h3>
|
||
<p>Умные устройства, сенсоры, автоматизация, embedded</p>
|
||
</article>
|
||
<article class="kt-ai-tile" data-span="1">
|
||
<h3 style="color:var(--kt-ai-chart-orange)">Cybersecurity</h3>
|
||
<p>Защита данных, пентест, криптография, безопасность сетей</p>
|
||
</article>
|
||
<article class="kt-ai-tile" data-span="1">
|
||
<h3 style="color:var(--kt-ai-chart-pink)">Big Data & Analytics</h3>
|
||
<p>Обработка больших данных, визуализация, предиктивная аналитика</p>
|
||
</article>
|
||
<article class="kt-ai-tile" data-span="1">
|
||
<h3 style="color:var(--kt-ai-chart-salmon)">Cloud & DevOps</h3>
|
||
<p>Облачные архитектуры, микросервисы, CI/CD, контейнеризация</p>
|
||
</article>
|
||
<article class="kt-ai-tile" data-span="1">
|
||
<h3 style="color:var(--kt-ai-primary)">Telecom Solutions</h3>
|
||
<p>Телеком-сервисы, 5G, сети нового поколения, API операторов</p>
|
||
</article>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="register" class="kt-ai-cta">
|
||
<div class="kt-ai-wrap" style="max-width:720px">
|
||
<h2>Регистрация участника</h2>
|
||
<p style="margin-bottom:var(--kt-ai-space-8)">Заполни форму, чтобы стать участником КТ Опен Хакатон 2026</p>
|
||
|
||
<div id="registration-form-container">
|
||
<form id="registration-form" class="kt-ai-card" style="padding:var(--kt-ai-space-8)">
|
||
<div class="kt-ai-field" style="margin-bottom:var(--kt-ai-space-5)">
|
||
<label for="fullname" style="display:block;margin-bottom:var(--kt-ai-space-2);font-weight:var(--kt-ai-font-medium)">ФИО *</label>
|
||
<input type="text" id="fullname" name="fullname" class="kt-ai-input" placeholder="Иванов Иван Иванович" required>
|
||
</div>
|
||
|
||
<div class="kt-ai-field" style="margin-bottom:var(--kt-ai-space-5)">
|
||
<label for="email" style="display:block;margin-bottom:var(--kt-ai-space-2);font-weight:var(--kt-ai-font-medium)">Email *</label>
|
||
<input type="email" id="email" name="email" class="kt-ai-input" placeholder="ivan@example.com" required>
|
||
</div>
|
||
|
||
<div class="kt-ai-field" style="margin-bottom:var(--kt-ai-space-5)">
|
||
<label for="phone" style="display:block;margin-bottom:var(--kt-ai-space-2);font-weight:var(--kt-ai-font-medium)">Телефон *</label>
|
||
<input type="tel" id="phone" name="phone" class="kt-ai-input" placeholder="+7 777 123 45 67" required>
|
||
</div>
|
||
|
||
<div class="kt-ai-field" style="margin-bottom:var(--kt-ai-space-5)">
|
||
<label for="team" style="display:block;margin-bottom:var(--kt-ai-space-2);font-weight:var(--kt-ai-font-medium)">Название команды</label>
|
||
<input type="text" id="team" name="team" class="kt-ai-input" placeholder="Code Warriors">
|
||
</div>
|
||
|
||
<div class="kt-ai-field" style="margin-bottom:var(--kt-ai-space-5)">
|
||
<label for="track" style="display:block;margin-bottom:var(--kt-ai-space-2);font-weight:var(--kt-ai-font-medium)">Направление *</label>
|
||
<select id="track" name="track" class="kt-ai-select" required>
|
||
<option value="">Выберите трек</option>
|
||
<option value="AI / Machine Learning">AI / Machine Learning</option>
|
||
<option value="IoT & Smart Devices">IoT & Smart Devices</option>
|
||
<option value="Cybersecurity">Cybersecurity</option>
|
||
<option value="Big Data & Analytics">Big Data & Analytics</option>
|
||
<option value="Cloud & DevOps">Cloud & DevOps</option>
|
||
<option value="Telecom Solutions">Telecom Solutions</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="kt-ai-field" style="margin-bottom:var(--kt-ai-space-6)">
|
||
<label for="experience" style="display:block;margin-bottom:var(--kt-ai-space-2);font-weight:var(--kt-ai-font-medium)">Опыт разработки</label>
|
||
<select id="experience" name="experience" class="kt-ai-select">
|
||
<option value="">Выберите опыт</option>
|
||
<option value="Junior (до 1 года)">Junior (до 1 года)</option>
|
||
<option value="Middle (1-3 года)">Middle (1-3 года)</option>
|
||
<option value="Senior (3+ лет)">Senior (3+ лет)</option>
|
||
<option value="Student">Студент</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="kt-ai-field" style="margin-bottom:var(--kt-ai-space-6)">
|
||
<label for="motivation" style="display:block;margin-bottom:var(--kt-ai-space-2);font-weight:var(--kt-ai-font-medium)">Почему вы хотите участвовать?</label>
|
||
<textarea id="motivation" name="motivation" class="kt-ai-textarea" rows="4" placeholder="Расскажите о себе и своей мотивации..."></textarea>
|
||
</div>
|
||
|
||
<button type="submit" class="kt-ai-btn" data-variant="primary" data-size="lg" style="width:100%">
|
||
Зарегистрироваться
|
||
</button>
|
||
</form>
|
||
</div>
|
||
|
||
<div id="success-message" class="success-message" style="display:none">
|
||
<svg width="64" height="64" viewBox="0 0 24 24" fill="none" stroke="var(--kt-ai-primary)" stroke-width="2" style="margin-bottom:var(--kt-ai-space-4)">
|
||
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/>
|
||
</svg>
|
||
<h3 style="margin-bottom:var(--kt-ai-space-2)">Вы зарегистрированы!</h3>
|
||
<p style="color:var(--kt-ai-fg-muted)">Добро пожаловать на КТ Опен Хакатон 2026. Детали участия придут на email.</p>
|
||
<button id="new-registration" class="kt-ai-btn" data-variant="ghost" style="margin-top:var(--kt-ai-space-6)">
|
||
Зарегистрировать ещё одного
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
|
||
|
||
<footer class="kt-ai-wrap kt-ai-pagefoot">
|
||
<span>© 2026 Казахтелеком. КТ Опен Хакатон</span>
|
||
<span class="kt-ai-spacer"></span>
|
||
<a href="#" class="kt-ai-link">Политика конфиденциальности</a>
|
||
<span style="width:var(--kt-ai-space-6)"></span>
|
||
<a href="mailto:hakathon@kt.kz" class="kt-ai-link">hakathon@kt.kz</a>
|
||
</footer>
|
||
|
||
<script>
|
||
// === Демо-данные для начального наполнения ===
|
||
const DEMO_DATA = [
|
||
{ id: 1, fullname: 'Алиев Нурсултан', email: 'nursultan@example.com', phone: '+7 777 111 22 33', team: 'AI Pioneers', track: 'AI / Machine Learning', experience: 'Middle (1-3 года)', registeredAt: '2026-09-10' },
|
||
{ id: 2, fullname: 'Смирнова Анна', email: 'anna@example.com', phone: '+7 777 222 33 44', team: 'AI Pioneers', track: 'AI / Machine Learning', experience: 'Senior (3+ лет)', registeredAt: '2026-09-10' },
|
||
{ id: 3, fullname: 'Ибраев Данияр', email: 'daniyar@example.com', phone: '+7 777 333 44 55', team: 'IoT Masters', track: 'IoT & Smart Devices', experience: 'Middle (1-3 года)', registeredAt: '2026-09-11' },
|
||
{ id: 4, fullname: 'Ким Юлия', email: 'yulia@example.com', phone: '+7 777 444 55 66', team: 'Cyber Knights', track: 'Cybersecurity', experience: 'Junior (до 1 года)', registeredAt: '2026-09-11' },
|
||
{ id: 5, fullname: 'Омаров Ержан', email: 'erzhan@example.com', phone: '+7 777 555 66 77', team: 'Data Wizards', track: 'Big Data & Analytics', experience: 'Senior (3+ лет)', registeredAt: '2026-09-12' },
|
||
{ id: 6, fullname: 'Петров Александр', email: 'alex@example.com', phone: '+7 777 666 77 88', team: 'Cloud Ninjas', track: 'Cloud & DevOps', experience: 'Middle (1-3 года)', registeredAt: '2026-09-12' },
|
||
{ id: 7, fullname: 'Нурсултанова Айдана', email: 'aidana@example.com', phone: '+7 777 777 88 99', team: 'Telecom Pros', track: 'Telecom Solutions', experience: 'Student', registeredAt: '2026-09-13' },
|
||
{ id: 8, fullname: 'Васильев Дмитрий', email: 'dmitry@example.com', phone: '+7 777 888 99 00', team: 'AI Pioneers', track: 'AI / Machine Learning', experience: 'Junior (до 1 года)', registeredAt: '2026-09-13' },
|
||
];
|
||
|
||
// === Инициализация localStorage ===
|
||
function getRegistrations() {
|
||
const stored = localStorage.getItem('kt-hackathon-2026-registrations');
|
||
if (stored) {
|
||
return JSON.parse(stored);
|
||
}
|
||
// Первый запуск - сохраняем демо-данные
|
||
localStorage.setItem('kt-hackathon-2026-registrations', JSON.stringify(DEMO_DATA));
|
||
return DEMO_DATA;
|
||
}
|
||
|
||
function saveRegistration(reg) {
|
||
const regs = getRegistrations();
|
||
reg.id = Date.now();
|
||
reg.registeredAt = new Date().toISOString().split('T')[0];
|
||
regs.push(reg);
|
||
localStorage.setItem('kt-hackathon-2026-registrations', JSON.stringify(regs));
|
||
return regs;
|
||
}
|
||
|
||
|
||
|
||
// === Обновление статистики ===
|
||
function updateStats() {
|
||
const regs = getRegistrations();
|
||
const teams = new Set(regs.map(r => r.team).filter(Boolean));
|
||
const tracks = new Set(regs.map(r => r.track));
|
||
|
||
document.getElementById('stat-participants').textContent = regs.length;
|
||
document.getElementById('stat-teams').textContent = teams.size;
|
||
document.getElementById('stat-tracks').textContent = tracks.size;
|
||
|
||
// Дни до старта (хакатон 1 октября 2026)
|
||
const hackathonDate = new Date('2026-10-01');
|
||
const today = new Date();
|
||
const daysLeft = Math.ceil((hackathonDate - today) / (1000 * 60 * 60 * 24));
|
||
document.getElementById('stat-days').textContent = Math.max(0, daysLeft);
|
||
}
|
||
|
||
// === Утилиты ===
|
||
function escapeHtml(text) {
|
||
if (!text) return '';
|
||
const div = document.createElement('div');
|
||
div.textContent = text;
|
||
return div.innerHTML;
|
||
}
|
||
|
||
function formatDate(dateStr) {
|
||
if (!dateStr) return '';
|
||
const date = new Date(dateStr);
|
||
return date.toLocaleDateString('ru-RU', { day: 'numeric', month: 'long' });
|
||
}
|
||
|
||
// === Обработчики ===
|
||
document.getElementById('registration-form').addEventListener('submit', function(e) {
|
||
e.preventDefault();
|
||
|
||
const formData = new FormData(this);
|
||
const registration = {
|
||
fullname: formData.get('fullname'),
|
||
email: formData.get('email'),
|
||
phone: formData.get('phone'),
|
||
team: formData.get('team'),
|
||
track: formData.get('track'),
|
||
experience: formData.get('experience'),
|
||
motivation: formData.get('motivation')
|
||
};
|
||
|
||
saveRegistration(registration);
|
||
|
||
// Показываем успех
|
||
document.getElementById('registration-form-container').style.display = 'none';
|
||
document.getElementById('success-message').style.display = 'block';
|
||
|
||
// Обновляем всё
|
||
updateStats();
|
||
renderRegistrations();
|
||
|
||
// Скролл к успеху
|
||
document.getElementById('success-message').scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||
});
|
||
|
||
document.getElementById('new-registration').addEventListener('click', function() {
|
||
document.getElementById('registration-form').reset();
|
||
document.getElementById('success-message').style.display = 'none';
|
||
document.getElementById('registration-form-container').style.display = 'block';
|
||
document.getElementById('registration-form').scrollIntoView({ behavior: 'smooth' });
|
||
});
|
||
|
||
|
||
|
||
// === Запуск при загрузке ===
|
||
updateStats();
|
||
|
||
// Плавный скролл для якорных ссылок
|
||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||
anchor.addEventListener('click', function(e) {
|
||
e.preventDefault();
|
||
const target = document.querySelector(this.getAttribute('href'));
|
||
if (target) {
|
||
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||
}
|
||
});
|
||
});
|
||
</script>
|
||
|
||
</body>
|
||
</html>
|