mozhem-li-my-sozdat-sayt-gde/index.html

1235 lines
40 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Нуртас & Аружан — Приглашение на той</title>
<meta name="description" content="Приглашение на наш особенный вечер">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;500;600;700&family=Montserrat:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
* { margin: 0; box-sizing: border-box; }
:root {
--bg: #0a0f0d;
--bg-card: #121a16;
--bg-input: #1a2520;
--text: #f8f5f0;
--text-muted: #a8b5ae;
--gold: #c9a962;
--gold-light: #e8d5a3;
--emerald: #1a4d3e;
--cream: #f8f5f0;
--border: #2a3a32;
}
html { scroll-behavior: smooth; }
body {
font-family: 'Montserrat', sans-serif;
background: var(--bg);
color: var(--text);
min-height: 100vh;
line-height: 1.7;
overflow-x: hidden;
}
h1, h2, h3, h4 {
font-family: 'Cormorant Garamond', serif;
font-weight: 600;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
/* Music Toggle */
.music-toggle {
position: fixed;
top: 20px;
right: 20px;
width: 50px;
height: 50px;
background: rgba(10, 15, 13, 0.8);
border: 1px solid var(--gold);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 1000;
transition: all 0.3s;
backdrop-filter: blur(10px);
}
.music-toggle:hover {
background: var(--gold);
color: var(--bg);
}
.music-toggle svg {
width: 24px;
height: 24px;
fill: var(--gold);
}
.music-toggle:hover svg {
fill: var(--bg);
}
.music-playing {
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.05); }
}
/* Hero Section */
.hero {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
position: relative;
background: linear-gradient(135deg, rgba(10,15,13,0.9) 0%, rgba(26,77,62,0.8) 100%),
url('https://images.unsplash.com/photo-1519741497674-611481863552?w=1920') center/cover;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23c9a962' fill-opacity='0.05'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
opacity: 0.5;
}
.hero-content {
position: relative;
z-index: 2;
padding: 40px;
animation: fadeInUp 1.5s ease;
}
.ornament-top, .ornament-bottom {
width: 200px;
height: 40px;
margin: 0 auto 30px;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M100 0 L120 10 L140 5 L130 20 L150 25 L130 30 L140 40 L120 35 L100 40 L80 35 L60 40 L70 30 L50 25 L70 20 L60 5 L80 10 Z' fill='%23c9a962' opacity='0.6'/%3E%3C/svg%3E") center/contain no-repeat;
}
.hero h1 {
font-size: clamp(48px, 8vw, 96px);
margin-bottom: 10px;
background: linear-gradient(135deg, var(--gold) 0%, var(--gold-light) 50%, var(--gold) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: 2px;
}
.hero-subtitle {
font-size: clamp(14px, 2vw, 18px);
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 4px;
margin-bottom: 40px;
}
.hero-event {
font-size: clamp(24px, 4vw, 48px);
color: var(--cream);
margin-bottom: 30px;
font-weight: 500;
}
.hero-details {
display: flex;
gap: 40px;
justify-content: center;
flex-wrap: wrap;
margin-bottom: 50px;
}
.hero-detail {
text-align: center;
}
.hero-detail .label {
font-size: 12px;
color: var(--gold);
text-transform: uppercase;
letter-spacing: 2px;
margin-bottom: 8px;
}
.hero-detail .value {
font-size: clamp(20px, 3vw, 32px);
font-family: 'Cormorant Garamond', serif;
}
.btn-hero {
padding: 18px 48px;
background: transparent;
border: 1px solid var(--gold);
color: var(--gold);
font-size: 14px;
text-transform: uppercase;
letter-spacing: 3px;
cursor: pointer;
transition: all 0.4s;
font-family: 'Montserrat', sans-serif;
}
.btn-hero:hover {
background: var(--gold);
color: var(--bg);
transform: translateY(-3px);
box-shadow: 0 10px 30px rgba(201, 169, 98, 0.3);
}
/* Sections */
section {
padding: 100px 0;
position: relative;
}
.section-title {
font-size: clamp(36px, 5vw, 56px);
text-align: center;
margin-bottom: 60px;
color: var(--gold);
}
/* Invitation */
.invitation {
background: var(--bg-card);
text-align: center;
}
.invitation-text {
max-width: 700px;
margin: 0 auto;
font-size: clamp(16px, 2vw, 20px);
line-height: 2;
color: var(--text-muted);
}
.invitation-text p {
margin-bottom: 30px;
}
.invitation-signature {
font-family: 'Cormorant Garamond', serif;
font-size: clamp(28px, 4vw, 40px);
color: var(--gold);
margin-top: 40px;
font-style: italic;
}
/* Event Info Card */
.event-info {
background: linear-gradient(135deg, var(--emerald) 0%, var(--bg) 100%);
}
.info-card {
max-width: 600px;
margin: 0 auto;
background: rgba(18, 26, 22, 0.8);
border: 1px solid var(--gold);
border-radius: 4px;
padding: 50px 40px;
text-align: center;
backdrop-filter: blur(10px);
}
.info-card h3 {
font-size: clamp(28px, 4vw, 40px);
margin-bottom: 40px;
color: var(--gold);
}
.info-item {
display: flex;
align-items: center;
justify-content: center;
gap: 16px;
margin-bottom: 24px;
font-size: clamp(16px, 2vw, 18px);
}
.info-item .icon {
font-size: 24px;
color: var(--gold);
}
.btn-map {
margin-top: 30px;
padding: 16px 32px;
background: var(--gold);
color: var(--bg);
border: none;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 2px;
cursor: pointer;
transition: all 0.3s;
font-family: 'Montserrat', sans-serif;
}
.btn-map:hover {
background: var(--gold-light);
transform: translateY(-2px);
}
/* Countdown */
.countdown-section {
background: var(--bg-card);
text-align: center;
}
.countdown-label {
font-size: clamp(18px, 2vw, 24px);
color: var(--text-muted);
margin-bottom: 40px;
text-transform: uppercase;
letter-spacing: 3px;
}
.countdown {
display: flex;
justify-content: center;
gap: clamp(10px, 3vw, 30px);
flex-wrap: wrap;
}
.countdown-item {
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: 4px;
padding: clamp(20px, 4vw, 40px) clamp(15px, 3vw, 30px);
min-width: 100px;
}
.countdown-value {
font-family: 'Cormorant Garamond', serif;
font-size: clamp(48px, 8vw, 80px);
color: var(--gold);
line-height: 1;
display: block;
}
.countdown-label-small {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--text-muted);
margin-top: 10px;
display: block;
}
.countdown-message {
font-size: clamp(24px, 4vw, 36px);
color: var(--gold);
font-family: 'Cormorant Garamond', serif;
display: none;
}
/* Program */
.program {
background: var(--bg);
}
.timeline {
max-width: 800px;
margin: 0 auto;
position: relative;
}
.timeline::before {
content: '';
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 2px;
height: 100%;
background: linear-gradient(to bottom, var(--gold), var(--emerald), var(--gold));
}
.timeline-item {
display: flex;
justify-content: flex-end;
padding: 30px 0;
position: relative;
width: 50%;
}
.timeline-item:nth-child(even) {
justify-content: flex-start;
margin-left: 50%;
}
.timeline-item::before {
content: '';
position: absolute;
width: 16px;
height: 16px;
background: var(--gold);
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
}
.timeline-item:nth-child(odd)::before {
right: -8px;
}
.timeline-item:nth-child(even)::before {
left: -8px;
}
.timeline-content {
background: var(--bg-card);
border: 1px solid var(--border);
padding: 25px 30px;
border-radius: 4px;
max-width: 350px;
margin: 0 30px;
}
.timeline-time {
font-size: 24px;
color: var(--gold);
font-family: 'Cormorant Garamond', serif;
margin-bottom: 8px;
}
.timeline-text {
color: var(--text-muted);
font-size: 16px;
}
/* Venue */
.venue {
background: var(--bg-card);
}
.venue-content {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 60px;
align-items: center;
}
.venue-image {
width: 100%;
height: 500px;
object-fit: cover;
border-radius: 4px;
border: 1px solid var(--gold);
}
.venue-info h3 {
font-size: clamp(32px, 4vw, 48px);
color: var(--gold);
margin-bottom: 30px;
}
.venue-info p {
color: var(--text-muted);
font-size: 18px;
margin-bottom: 30px;
}
.venue-buttons {
display: flex;
gap: 15px;
flex-wrap: wrap;
}
.btn-venue {
padding: 14px 28px;
background: transparent;
border: 1px solid var(--gold);
color: var(--gold);
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
cursor: pointer;
transition: all 0.3s;
font-family: 'Montserrat', sans-serif;
text-decoration: none;
display: inline-block;
}
.btn-venue:hover {
background: var(--gold);
color: var(--bg);
}
/* Dress Code */
.dresscode {
background: var(--bg);
text-align: center;
}
.dresscode-text {
max-width: 600px;
margin: 0 auto 50px;
font-size: clamp(16px, 2vw, 20px);
color: var(--text-muted);
}
.color-palette {
display: flex;
justify-content: center;
gap: 30px;
flex-wrap: wrap;
}
.color-item {
text-align: center;
}
.color-circle {
width: 80px;
height: 80px;
border-radius: 50%;
margin-bottom: 15px;
border: 2px solid var(--gold);
}
.color-circle.white { background: #f8f5f0; }
.color-circle.black { background: #1a1a1a; }
.color-circle.gold { background: linear-gradient(135deg, #c9a962, #e8d5a3); }
.color-circle emerald { background: #1a4d3e; }
.color-name {
color: var(--gold);
font-size: 14px;
text-transform: uppercase;
letter-spacing: 2px;
}
/* Gallery */
.gallery {
background: var(--bg-card);
}
.gallery-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
.gallery-item {
position: relative;
overflow: hidden;
border-radius: 4px;
cursor: pointer;
aspect-ratio: 1;
}
.gallery-item img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s;
}
.gallery-item:hover img {
transform: scale(1.1);
}
/* RSVP */
.rsvp {
background: linear-gradient(135deg, var(--emerald) 0%, var(--bg) 100%);
}
.rsvp-form {
max-width: 600px;
margin: 0 auto;
background: rgba(18, 26, 22, 0.9);
border: 1px solid var(--gold);
padding: 50px 40px;
border-radius: 4px;
backdrop-filter: blur(10px);
}
.form-group {
margin-bottom: 30px;
}
.form-group label {
display: block;
margin-bottom: 12px;
color: var(--gold);
font-size: 14px;
text-transform: uppercase;
letter-spacing: 2px;
}
.form-group input,
.form-group select,
.form-group textarea {
width: 100%;
padding: 16px;
background: var(--bg-input);
border: 1px solid var(--border);
color: var(--text);
font-family: 'Montserrat', sans-serif;
font-size: 16px;
border-radius: 4px;
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
outline: none;
border-color: var(--gold);
}
.form-group textarea {
resize: vertical;
min-height: 120px;
}
.radio-group {
display: flex;
gap: 30px;
flex-wrap: wrap;
}
.radio-option {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
}
.radio-option input {
width: auto;
accent-color: var(--gold);
}
.guest-counter {
display: flex;
align-items: center;
gap: 20px;
}
.counter-btn {
width: 40px;
height: 40px;
background: var(--bg-input);
border: 1px solid var(--gold);
color: var(--gold);
font-size: 20px;
cursor: pointer;
transition: all 0.3s;
}
.counter-btn:hover {
background: var(--gold);
color: var(--bg);
}
.counter-value {
font-size: 24px;
color: var(--gold);
min-width: 40px;
text-align: center;
}
.btn-submit {
width: 100%;
padding: 18px;
background: var(--gold);
color: var(--bg);
border: none;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 3px;
cursor: pointer;
transition: all 0.3s;
font-family: 'Montserrat', sans-serif;
}
.btn-submit:hover {
background: var(--gold-light);
transform: translateY(-2px);
}
.success-message {
text-align: center;
padding: 50px;
display: none;
}
.success-message h3 {
font-size: 32px;
color: var(--gold);
margin-bottom: 20px;
}
.success-message p {
color: var(--text-muted);
font-size: 18px;
}
/* Final */
.final {
background: var(--bg-card);
text-align: center;
padding: 150px 0;
}
.final h2 {
font-size: clamp(36px, 5vw, 64px);
color: var(--gold);
margin-bottom: 30px;
}
.final-names {
font-size: clamp(48px, 8vw, 96px);
background: linear-gradient(135deg, var(--gold) 0%, var(--gold-light) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 30px;
}
.final-heart {
font-size: 48px;
color: #e74c3c;
animation: heartbeat 1.5s infinite;
}
@keyframes heartbeat {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.2); }
}
/* Share Button */
.share-btn {
position: fixed;
bottom: 30px;
right: 30px;
width: 60px;
height: 60px;
background: var(--gold);
border: none;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
transition: all 0.3s;
box-shadow: 0 10px 30px rgba(201, 169, 98, 0.3);
}
.share-btn:hover {
transform: scale(1.1);
}
.share-btn svg {
width: 24px;
height: 24px;
fill: var(--bg);
}
/* Animations */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(40px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in {
opacity: 0;
transform: translateY(30px);
transition: all 0.8s ease;
}
.fade-in.visible {
opacity: 1;
transform: translateY(0);
}
/* Mobile */
@media (max-width: 768px) {
.timeline::before {
left: 20px;
}
.timeline-item,
.timeline-item:nth-child(even) {
width: 100%;
margin-left: 0;
justify-content: flex-start;
padding-left: 50px;
}
.timeline-item::before,
.timeline-item:nth-child(even)::before {
left: 12px;
right: auto;
}
.timeline-content,
.timeline-item:nth-child(even) .timeline-content {
margin: 0;
max-width: 100%;
}
.venue-content {
grid-template-columns: 1fr;
}
.venue-image {
height: 300px;
}
.music-toggle {
width: 45px;
height: 45px;
top: 15px;
right: 15px;
}
.share-btn {
width: 50px;
height: 50px;
bottom: 20px;
right: 20px;
}
}
/* Hidden initial content */
.main-content {
display: none;
}
.main-content.visible {
display: block;
}
</style>
</head>
<body>
<!-- Music Toggle -->
<button class="music-toggle" id="musicToggle" title="Включить музыку">
<svg viewBox="0 0 24 24"><path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/></svg>
</button>
<audio id="bgMusic" loop>
<source src="https://cdn.pixabay.com/download/audio/2022/10/25/audio_24a29c5e6d.mp3" type="audio/mp3">
</audio>
<!-- Hero Section -->
<section class="hero" id="hero">
<div class="hero-content">
<div class="ornament-top"></div>
<h1 id="heroNames">Aliya & Erlan</h1>
<p class="hero-subtitle">Приглашение на наш особенный вечер</p>
<h2 class="hero-event" id="heroEvent">Toy Kesh</h2>
<div class="hero-details">
<div class="hero-detail">
<div class="label">Дата</div>
<div class="value" id="heroDate">25.08.2025</div>
</div>
<div class="hero-detail">
<div class="label">Время</div>
<div class="value" id="heroTime">18:00</div>
</div>
</div>
<button class="btn-hero" id="openInvitation">Открыть приглашение</button>
<div class="ornament-bottom"></div>
</div>
</section>
<!-- Main Content -->
<div class="main-content" id="mainContent">
<!-- Invitation -->
<section class="invitation">
<div class="container">
<h2 class="section-title fade-in">Дорогие родные и друзья!</h2>
<div class="invitation-text fade-in">
<p id="invitationText1">С большой радостью приглашаем вас разделить с нами этот особенный день и стать частью нашего праздника.</p>
<p id="invitationText2">Ваши улыбки, тёплые слова и поддержка делают этот момент ещё более значимым для нас.</p>
<p id="invitationText3">Будем счастливы видеть вас среди дорогих нам людей!</p>
</div>
<div class="invitation-signature fade-in" id="invitationSignature">С любовью, Aliya & Erlan</div>
</div>
</section>
<!-- Event Info -->
<section class="event-info">
<div class="container">
<div class="info-card fade-in">
<h3 id="infoTitle">Toy Kesh</h3>
<div class="info-item">
<span class="icon">📅</span>
<span id="infoDate">25 Августа 2025</span>
</div>
<div class="info-item">
<span class="icon">🕐</span>
<span id="infoTime">18:00</span>
</div>
<div class="info-item">
<span class="icon">📍</span>
<span id="infoVenue">Grand Park Hotel</span>
</div>
<div class="info-item">
<span class="icon">🏠</span>
<span id="infoAddress">пр. Абая 123, Алматы</span>
</div>
<button class="btn-map" id="btnMap">Построить маршрут</button>
</div>
</div>
</section>
<!-- Countdown -->
<section class="countdown-section">
<div class="container">
<div class="countdown-label fade-in">До начала праздника</div>
<div class="countdown fade-in">
<div class="countdown-item">
<span class="countdown-value" id="cdDays">00</span>
<span class="countdown-label-small">Дней</span>
</div>
<div class="countdown-item">
<span class="countdown-value" id="cdHours">00</span>
<span class="countdown-label-small">Часов</span>
</div>
<div class="countdown-item">
<span class="countdown-value" id="cdMinutes">00</span>
<span class="countdown-label-small">Минут</span>
</div>
<div class="countdown-item">
<span class="countdown-value" id="cdSeconds">00</span>
<span class="countdown-label-small">Секунд</span>
</div>
</div>
<div class="countdown-message" id="countdownMessage">
❤️ Сегодня наш особенный день ❤️
</div>
</div>
</section>
<!-- Program -->
<section class="program">
<div class="container">
<h2 class="section-title fade-in">Программа вечера</h2>
<div class="timeline">
<div class="timeline-item fade-in">
<div class="timeline-content">
<div class="timeline-time">18:00</div>
<div class="timeline-text">Сбор гостей</div>
</div>
</div>
<div class="timeline-item fade-in">
<div class="timeline-content">
<div class="timeline-time">18:30</div>
<div class="timeline-text">Начало мероприятия</div>
</div>
</div>
<div class="timeline-item fade-in">
<div class="timeline-content">
<div class="timeline-time">19:00</div>
<div class="timeline-text">Торжественная часть</div>
</div>
</div>
<div class="timeline-item fade-in">
<div class="timeline-content">
<div class="timeline-time">20:00</div>
<div class="timeline-text">Праздничный ужин</div>
</div>
</div>
<div class="timeline-item fade-in">
<div class="timeline-content">
<div class="timeline-time">21:00</div>
<div class="timeline-text">Музыка и танцы</div>
</div>
</div>
<div class="timeline-item fade-in">
<div class="timeline-content">
<div class="timeline-time">23:00</div>
<div class="timeline-text">Завершение вечера</div>
</div>
</div>
</div>
</div>
</section>
<!-- Venue -->
<section class="venue">
<div class="container">
<div class="venue-content">
<img src="https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=800" alt="Ресторан" class="venue-image fade-in" id="venueImage">
<div class="venue-info fade-in">
<h3 id="venueName">Grand Park Hotel</h3>
<p id="venueDescription">Изысканный ресторан в центре города с панорамным видом и европейской кухней. Идеальное место для вашего праздника.</p>
<p id="venueAddress">📍 пр. Абая 123, Алматы</p>
<div class="venue-buttons">
<a href="#" class="btn-venue" id="btn2gis">2GIS</a>
<a href="#" class="btn-venue" id="btnGoogle">Google Maps</a>
<a href="#" class="btn-venue" id="btnYandex">Яндекс Карты</a>
</div>
</div>
</div>
</div>
</section>
<!-- Dress Code -->
<section class="dresscode">
<div class="container">
<h2 class="section-title fade-in">Dress Code</h2>
<p class="dresscode-text fade-in" id="dresscodeText">Будем рады видеть вас в праздничных и элегантных образах.</p>
<div class="color-palette fade-in">
<div class="color-item">
<div class="color-circle white"></div>
<div class="color-name">Белый</div>
</div>
<div class="color-item">
<div class="color-circle black"></div>
<div class="color-name">Чёрный</div>
</div>
<div class="color-item">
<div class="color-circle gold"></div>
<div class="color-name">Золотой</div>
</div>
<div class="color-item">
<div class="color-circle emerald" style="background: #1a4d3e;"></div>
<div class="color-name">Изумруд</div>
</div>
</div>
</div>
</section>
<!-- Gallery -->
<section class="gallery">
<div class="container">
<h2 class="section-title fade-in">Наши моменты</h2>
<div class="gallery-grid">
<div class="gallery-item fade-in">
<img src="https://images.unsplash.com/photo-1511285560982-1356c11d4606?w=600" alt="Фото 1">
</div>
<div class="gallery-item fade-in">
<img src="https://images.unsplash.com/photo-1519741497674-611481863552?w=600" alt="Фото 2">
</div>
<div class="gallery-item fade-in">
<img src="https://images.unsplash.com/photo-1515934751635-c81c6bc9a2d8?w=600" alt="Фото 3">
</div>
<div class="gallery-item fade-in">
<img src="https://images.unsplash.com/photo-1469334031218-e382a71b716b?w=600" alt="Фото 4">
</div>
<div class="gallery-item fade-in">
<img src="https://images.unsplash.com/photo-1522673607200-1645062cd958?w=600" alt="Фото 5">
</div>
<div class="gallery-item fade-in">
<img src="https://images.unsplash.com/photo-1519225448526-0ca85c53563c?w=600" alt="Фото 6">
</div>
</div>
</div>
</section>
<!-- RSVP -->
<section class="rsvp">
<div class="container">
<h2 class="section-title fade-in">Подтвердите присутствие</h2>
<div class="rsvp-form fade-in" id="rsvpForm">
<form id="rsvpFormElement">
<div class="form-group">
<label>Имя и фамилия</label>
<input type="text" id="guestName" placeholder="Введите ваше имя" required>
</div>
<div class="form-group">
<label>Вы будете присутствовать?</label>
<div class="radio-group">
<label class="radio-option">
<input type="radio" name="attendance" value="yes" checked>
Да, с радостью!
</label>
<label class="radio-option">
<input type="radio" name="attendance" value="no">
К сожалению, не смогу
</label>
</div>
</div>
<div class="form-group">
<label>Количество гостей</label>
<div class="guest-counter">
<button type="button" class="counter-btn" id="counterMinus">−</button>
<span class="counter-value" id="guestCount">1</span>
<button type="button" class="counter-btn" id="counterPlus">+</button>
</div>
</div>
<div class="form-group">
<label>Комментарий</label>
<textarea id="guestComment" placeholder="Пожелания, аллергии, особые предпочтения..."></textarea>
</div>
<button type="submit" class="btn-submit">Подтвердить присутствие</button>
</form>
<div class="success-message" id="successMessage">
<h3>Спасибо! ❤️</h3>
<p>Будем ждать вас на нашем празднике!</p>
</div>
</div>
</div>
</section>
<!-- Final -->
<section class="final">
<div class="container">
<h2 class="fade-in">До встречи на нашем празднике!</h2>
<div class="final-names fade-in" id="finalNames">Aliya & Erlan</div>
<div class="final-heart fade-in">❤️</div>
</div>
</section>
</div>
<!-- Share Button -->
<button class="share-btn" id="shareBtn" title="Поделиться">
<svg viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92z"/></svg>
</button>
<script>
// Configuration - легко редактировать
const CONFIG = {
names: "Нуртас & Аружан",
eventName: "Toy Kesh",
date: "2027-07-07",
time: "18:00",
venue: "Алтын Сарай",
address: "Алматы",
coordinates: { lat: 43.2389, lng: 76.9453 },
invitationText: {
p1: "С большой радостью приглашаем вас разделить с нами этот особенный день и стать частью нашего праздника.",
p2: "Ваши улыбки, тёплые слова и поддержка делают этот момент ещё более значимым для нас.",
p3: "Будем счастливы видеть вас среди дорогих нам людей!"
},
signature: "С любовью, Нуртас & Аружан",
musicUrl: "https://cdn.pixabay.com/download/audio/2022/10/25/audio_24a29c5e6d.mp3"
};
// Apply config
document.getElementById('heroNames').textContent = CONFIG.names;
document.getElementById('heroEvent').textContent = CONFIG.eventName;
document.getElementById('heroDate').textContent = CONFIG.date.split('-').reverse().join('.');
document.getElementById('heroTime').textContent = CONFIG.time;
document.getElementById('invitationText1').textContent = CONFIG.invitationText.p1;
document.getElementById('invitationText2').textContent = CONFIG.invitationText.p2;
document.getElementById('invitationText3').textContent = CONFIG.invitationText.p3;
document.getElementById('invitationSignature').textContent = CONFIG.signature;
document.getElementById('infoTitle').textContent = CONFIG.eventName;
document.getElementById('infoDate').textContent = new Date(CONFIG.date).toLocaleDateString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' });
document.getElementById('infoTime').textContent = CONFIG.time;
document.getElementById('infoVenue').textContent = CONFIG.venue;
document.getElementById('infoAddress').textContent = CONFIG.address;
document.getElementById('venueName').textContent = CONFIG.venue;
document.getElementById('venueAddress').textContent = '📍 ' + CONFIG.address;
document.getElementById('finalNames').textContent = CONFIG.names;
// Open invitation
document.getElementById('openInvitation').addEventListener('click', function() {
document.getElementById('hero').style.display = 'none';
document.getElementById('mainContent').classList.add('visible');
window.scrollTo({ top: 0, behavior: 'smooth' });
initAnimations();
});
// Music toggle
const music = document.getElementById('bgMusic');
const musicToggle = document.getElementById('musicToggle');
let isPlaying = false;
musicToggle.addEventListener('click', function() {
if (isPlaying) {
music.pause();
musicToggle.classList.remove('music-playing');
musicToggle.innerHTML = '<svg viewBox="0 0 24 24"><path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/></svg>';
} else {
music.play();
musicToggle.classList.add('music-playing');
musicToggle.innerHTML = '<svg viewBox="0 0 24 24"><path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4L12 20V7.73l2.27 2.27h.01c-.63.63-1.02 1.5-1.02 2.47 0 2.21 1.79 4 4 4 .97 0 1.84-.39 2.48-1.02l1.48 1.48C19.71 20.89 18.07 21.5 16.5 21.5 12.91 21.5 9.79 19.27 8.55 16.1L3 10.55V3h1.27z"/></svg>';
}
isPlaying = !isPlaying;
});
// Countdown
function updateCountdown() {
const eventDate = new Date(CONFIG.date + 'T' + CONFIG.time).getTime();
const now = new Date().getTime();
const diff = eventDate - now;
if (diff <= 0) {
document.querySelector('.countdown').style.display = 'none';
document.getElementById('countdownMessage').style.display = 'block';
return;
}
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((diff % (1000 * 60)) / 1000);
document.getElementById('cdDays').textContent = String(days).padStart(2, '0');
document.getElementById('cdHours').textContent = String(hours).padStart(2, '0');
document.getElementById('cdMinutes').textContent = String(minutes).padStart(2, '0');
document.getElementById('cdSeconds').textContent = String(seconds).padStart(2, '0');
}
setInterval(updateCountdown, 1000);
updateCountdown();
// Map buttons
document.getElementById('btnMap').addEventListener('click', function() {
const query = encodeURIComponent(CONFIG.venue + ' ' + CONFIG.address);
window.open(`https://www.google.com/maps/search/?api=1&query=${query}`, '_blank');
});
document.getElementById('btn2gis').href = `https://2gis.kz/almaty/search/${encodeURIComponent(CONFIG.venue)}`;
document.getElementById('btnGoogle').href = `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(CONFIG.venue + ' ' + CONFIG.address)}`;
document.getElementById('btnYandex').href = `https://yandex.kz/maps/?text=${encodeURIComponent(CONFIG.venue + ' ' + CONFIG.address)}`;
// RSVP Form
let guestCount = 1;
document.getElementById('counterMinus').addEventListener('click', function() {
if (guestCount > 1) {
guestCount--;
document.getElementById('guestCount').textContent = guestCount;
}
});
document.getElementById('counterPlus').addEventListener('click', function() {
if (guestCount < 10) {
guestCount++;
document.getElementById('guestCount').textContent = guestCount;
}
});
document.getElementById('rsvpFormElement').addEventListener('submit', function(e) {
e.preventDefault();
const rsvp = {
name: document.getElementById('guestName').value,
attendance: document.querySelector('input[name="attendance"]:checked').value,
guests: guestCount,
comment: document.getElementById('guestComment').value,
date: new Date().toISOString()
};
// Save to localStorage
const guests = JSON.parse(localStorage.getItem('toyGuests') || '[]');
guests.push(rsvp);
localStorage.setItem('toyGuests', JSON.stringify(guests));
// Show success
document.getElementById('rsvpFormElement').style.display = 'none';
document.getElementById('successMessage').style.display = 'block';
// Console log for admin
console.log('Новый RSVP:', rsvp);
console.log('Всего гостей:', guests.length);
});
// Share
document.getElementById('shareBtn').addEventListener('click', async function() {
if (navigator.share) {
try {
await navigator.share({
title: CONFIG.eventName,
text: `Приглашение на ${CONFIG.eventName} ${CONFIG.names}`,
url: window.location.href
});
} catch (err) {
console.log('Share cancelled');
}
} else {
navigator.clipboard.writeText(window.location.href);
alert('Ссылка скопирована в буфер обмена!');
}
});
// Scroll animations
function initAnimations() {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.fade-in').forEach(el => observer.observe(el));
}
// Admin panel access (hidden feature)
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.shiftKey && e.key === 'A') {
const password = prompt('Введите пароль администратора:');
if (password === 'admin123') {
showAdminPanel();
}
}
});
function showAdminPanel() {
const guests = JSON.parse(localStorage.getItem('toyGuests') || '[]');
const confirmed = guests.filter(g => g.attendance === 'yes').length;
const declined = guests.filter(g => g.attendance === 'no').length;
const totalGuests = guests.reduce((sum, g) => sum + (g.attendance === 'yes' ? g.guests : 0), 0);
const adminData = `
=== СТАТИСТИКА ГОСТЕЙ ===
Всего ответов: ${guests.length}
Подтвердили: ${confirmed} (${totalGuests} гостей)
Не смогут: ${declined}
Не ответили: ${120 - guests.length}
=== СПИСОК ГОСТЕЙ ===
${guests.map(g => `${g.name} - ${g.attendance === 'yes' ? '✓' : '✗'} (${g.guests} гостей) - ${g.comment || 'без комментария'}`).join('\n')}
`.trim();
console.log(adminData);
alert('Статистика выведена в консоль (F12)\n\nCtrl+Shift+S - экспортировать в CSV');
}
// Export to CSV
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.shiftKey && e.key === 'S') {
const guests = JSON.parse(localStorage.getItem('toyGuests') || '[]');
const csv = 'Имя,Присутствие,Гостей,Комментарий,Дата\n' +
guests.map(g => `"${g.name}",${g.attendance},${g.guests},"${g.comment || ''}",${g.date}`).join('\n');
const blob = new Blob(['\uFEFF' + csv], { type: 'text/csv' });
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'guests.csv';
a.click();
}
});
</script>
</body>
</html>