Compare commits

...
This repository has been archived on 2026-11-14. You can view files and clone it, but cannot push or open issues or pull requests.

21 Commits

Author SHA1 Message Date
6f50bff45a Inline CSS and JS to fix MIME type issue on Gitea Pages 2026-05-22 16:44:46 +05:00
6ab250ed12 Update image photo_13.jpg for Gitea Pages 2026-05-22 16:36:24 +05:00
fe1929859a Update image photo_12.jpg for Gitea Pages 2026-05-22 16:36:22 +05:00
52cc1730d2 Update image photo_11.jpg for Gitea Pages 2026-05-22 16:36:21 +05:00
d6c7224b19 Update image photo_10.jpg for Gitea Pages 2026-05-22 16:36:20 +05:00
0d55735e98 Update image photo_09.jpg for Gitea Pages 2026-05-22 16:36:18 +05:00
2e68d3fe3b Update image photo_08.jpg for Gitea Pages 2026-05-22 16:36:16 +05:00
17b5a63b88 Update image photo_07.jpg for Gitea Pages 2026-05-22 16:36:15 +05:00
5c0d951802 Update image photo_06.jpg for Gitea Pages 2026-05-22 16:36:14 +05:00
d5c3668730 Update image photo_05.jpg for Gitea Pages 2026-05-22 16:36:13 +05:00
b98fe51c97 Update image photo_04.jpg for Gitea Pages 2026-05-22 16:36:11 +05:00
15c1cae4ff Update image photo_03.jpg for Gitea Pages 2026-05-22 16:36:10 +05:00
bbf7de2a12 Update image photo_02.jpg for Gitea Pages 2026-05-22 16:36:08 +05:00
7a67e81f8d Update image photo_01.jpg for Gitea Pages 2026-05-22 16:36:06 +05:00
44a427d571 Update data/shifts.json for Gitea Pages 2026-05-22 16:35:40 +05:00
aa09223e3b Update .gitignore for Gitea Pages 2026-05-22 16:35:21 +05:00
c121fa0e34 Update script.js for Gitea Pages 2026-05-22 16:35:20 +05:00
bda18cf2e0 Update style.css for Gitea Pages 2026-05-22 16:35:19 +05:00
64f020bbec Update index.html for Gitea Pages 2026-05-22 16:35:15 +05:00
daced25fd2 chore: trigger gitea pages rebuild 2026-05-22 15:49:04 +05:00
90d12a5710 Inline CSS into index.html
Gitea Pages serves style.css with Content-Type: text/plain instead of
text/css, so browsers refuse to apply it. Inline the stylesheet to bypass
the MIME issue entirely.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:22:17 +05:00

View File

@ -5,13 +5,318 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Детский лагерь «Сокол» — лето 2025</title>
<meta name="description" content="Детский лагерь «Сокол»: смены, цены, расписание, запись онлайн." />
<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" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="style.css?v=4" />
<style>
/* ========== RESET / BASE ========== */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
font-family: 'Nunito', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 400;
color: #1f2937;
background: #fff;
line-height: 1.6;
}
h1, h2, h3 { margin: 0 0 12px; font-weight: 800; color: #0f172a; line-height: 1.2; }
h2 { font-size: 2rem; }
p { margin: 0 0 12px; }
a { color: #FF6B35; text-decoration: none; }
a:hover { text-decoration: underline; }
img { max-width: 100%; display: block; }
.container { width: 100%; max-width: 1140px; margin: 0 auto; padding: 0 20px; }
:root {
--orange: #FF6B35;
--orange-dark: #e55522;
--blue: #00AAFF;
--gray-bg: #f8fafc;
--border: #e5e7eb;
--shadow: 0 4px 12px rgba(0,0,0,0.08);
--shadow-hover: 0 8px 24px rgba(0,0,0,0.12);
}
/* ========== BUTTONS ========== */
.btn {
display: inline-block;
padding: 14px 28px;
border-radius: 999px;
font-weight: 700;
font-size: 1rem;
cursor: pointer;
border: none;
transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
text-align: center;
}
.btn:hover { transform: translateY(-2px); text-decoration: none; box-shadow: var(--shadow-hover); }
.btn--primary { background: var(--orange); color: #fff; }
.btn--primary:hover { background: var(--orange-dark); color: #fff; }
.btn--secondary { background: #fff; color: var(--orange); border: 2px solid var(--orange); }
.btn--secondary:hover { background: var(--orange); color: #fff; }
.btn--small { padding: 10px 20px; font-size: 0.95rem; }
.btn--ghost { background: transparent; color: var(--blue); border: 2px solid var(--blue); }
.btn--ghost:hover { background: var(--blue); color: #fff; }
/* ========== HEADER ========== */
.header {
position: sticky; top: 0; z-index: 50;
background: #fff;
border-bottom: 1px solid var(--border);
}
.header__inner {
display: flex; align-items: center; justify-content: space-between;
height: 70px;
}
.logo { display: flex; align-items: center; gap: 8px; font-weight: 800; font-size: 1.3rem; color: #0f172a; }
.logo:hover { text-decoration: none; }
.logo__mark { font-size: 1.6rem; }
.nav { display: flex; gap: 24px; }
.nav a { color: #334155; font-weight: 600; }
.nav a:hover { color: var(--orange); text-decoration: none; }
.nav__cta { margin-left: 16px; }
.burger { display: none; background: none; border: none; cursor: pointer; padding: 8px; }
.burger span { display: block; width: 26px; height: 3px; background: #0f172a; margin: 5px 0; border-radius: 2px; transition: 0.3s; }
/* ========== HERO ========== */
.hero { position: relative; min-height: 80vh; display: flex; align-items: center; color: #fff; overflow: hidden; }
.hero__bg {
position: absolute; inset: 0;
background:
linear-gradient(135deg, rgba(255,107,53,0.65) 0%, rgba(0,170,255,0.55) 100%),
url('images/photo_08.jpg') center / cover no-repeat,
linear-gradient(180deg, #4a90e2 0%, #2c5282 100%);
z-index: -1;
}
.hero__bg::after {
content: ''; position: absolute; inset: 0;
background-image:
radial-gradient(circle at 20% 80%, rgba(255,255,255,0.1) 0%, transparent 30%),
radial-gradient(circle at 80% 20%, rgba(255,255,255,0.15) 0%, transparent 40%);
}
.hero__content { position: relative; padding: 80px 20px; }
.hero__title { font-size: 3rem; color: #fff; max-width: 700px; text-shadow: 0 2px 12px rgba(0,0,0,0.3); }
.hero__subtitle { font-size: 1.25rem; max-width: 600px; text-shadow: 0 1px 6px rgba(0,0,0,0.3); }
.hero__buttons { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 24px; }
/* ========== SECTION ========== */
.section { padding: 80px 0; }
.section--gray { background: var(--gray-bg); }
.section__title { text-align: center; }
.section__lead { text-align: center; color: #64748b; margin-bottom: 40px; font-size: 1.1rem; }
/* ========== ABOUT ========== */
.about { display: grid; grid-template-columns: 1.2fr 1fr; gap: 48px; align-items: center; }
.about__points { list-style: none; padding: 0; margin: 20px 0 0; }
.about__points li { padding: 8px 0; font-size: 1.05rem; }
.about__photo {
height: 360px; border-radius: 20px;
background: url('images/photo_05.jpg') center / cover no-repeat;
box-shadow: var(--shadow);
}
/* ========== SHIFTS ========== */
.shifts {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 24px;
}
.shift {
background: #fff;
border-radius: 16px;
padding: 28px;
box-shadow: var(--shadow);
display: flex; flex-direction: column;
transition: transform 0.2s ease, box-shadow 0.2s ease;
border-top: 4px solid var(--orange);
}
.shift:nth-child(even) { border-top-color: var(--blue); }
.shift:hover { transform: translateY(-4px); box-shadow: var(--shadow-hover); }
.shift__name { font-size: 1.25rem; }
.shift__dates { color: #64748b; font-weight: 600; margin-bottom: 12px; }
.shift__desc { flex-grow: 0; color: #334155; }
.shift__includes { list-style: none; padding: 0; margin: 12px 0; font-size: 0.95rem; color: #475569; }
.shift__includes li { padding: 3px 0; }
.shift__includes li::before { content: '✓ '; color: var(--orange); font-weight: 700; }
.shift__price-row {
display: flex; align-items: baseline; justify-content: space-between;
margin: 16px 0 12px; padding-top: 16px; border-top: 1px solid var(--border);
}
.shift__price { font-size: 1.6rem; font-weight: 800; color: #0f172a; }
.shift__price small { font-size: 0.9rem; color: #64748b; font-weight: 600; }
.shift__spots { font-size: 0.9rem; color: #16a34a; font-weight: 700; }
.shift__spots--low { color: #dc2626; }
.shift__buttons { display: flex; gap: 8px; margin-top: auto; }
.shift__buttons .btn { flex: 1; padding: 12px 16px; font-size: 0.95rem; }
/* ========== SCHEDULE ========== */
.schedule {
width: 100%; max-width: 700px; margin: 0 auto;
border-collapse: collapse;
background: #fff; border-radius: 16px; overflow: hidden;
box-shadow: var(--shadow);
}
.schedule th, .schedule td { padding: 14px 20px; text-align: left; border-bottom: 1px solid var(--border); }
.schedule th { background: var(--orange); color: #fff; font-weight: 700; }
.schedule tbody tr:last-child td { border-bottom: none; }
.schedule tbody tr:hover { background: #fff7ed; }
.schedule td:first-child { font-weight: 700; color: var(--orange); width: 100px; }
/* ========== GALLERY ========== */
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 12px;
}
.gallery__item {
aspect-ratio: 1 / 1;
border-radius: 12px;
cursor: pointer;
overflow: hidden;
position: relative;
transition: transform 0.2s ease, box-shadow 0.2s ease;
padding: 0;
border: none;
background: #e5e7eb;
}
.gallery__item img {
width: 100%; height: 100%; object-fit: cover; display: block;
transition: transform 0.3s ease;
}
.gallery__item:hover { transform: scale(1.03); box-shadow: var(--shadow-hover); }
.gallery__item:hover img { transform: scale(1.06); }
/* ========== SIGNUP / FORM ========== */
.signup { display: grid; grid-template-columns: 1fr 1.3fr; gap: 48px; align-items: start; }
.signup__info h2 { text-align: left; }
.signup__note { color: #64748b; font-size: 0.95rem; font-style: italic; }
.form {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
background: #fff;
padding: 32px;
border-radius: 16px;
box-shadow: var(--shadow);
}
.form__field { display: flex; flex-direction: column; gap: 6px; font-weight: 600; font-size: 0.95rem; color: #334155; }
.form__field--wide { grid-column: 1 / -1; }
.form__field input, .form__field select, .form__field textarea {
padding: 12px 14px;
border: 2px solid var(--border);
border-radius: 10px;
font-family: inherit;
font-size: 1rem;
font-weight: 400;
transition: border-color 0.15s ease;
background: #fff;
}
.form__field input:focus, .form__field select:focus, .form__field textarea:focus {
outline: none; border-color: var(--orange);
}
.form__field input:invalid:not(:placeholder-shown) { border-color: #dc2626; }
.form__submit { grid-column: 1 / -1; }
.form__success {
grid-column: 1 / -1;
background: #dcfce7;
color: #166534;
padding: 14px 18px;
border-radius: 10px;
font-weight: 700;
text-align: center;
margin: 0;
}
/* ========== PAYMENT ========== */
.payment-simple {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 20px;
}
.pay-card {
background: #fff;
padding: 28px 24px;
border-radius: 14px;
text-align: center;
box-shadow: var(--shadow);
}
.pay-card__icon { font-size: 2.5rem; margin-bottom: 8px; }
.pay-card h3 { font-size: 1.15rem; }
.pay-card p { margin: 6px 0; color: #334155; }
.pay-card__big { font-size: 1.25rem; font-weight: 700; color: #0f172a; }
.pay-card__hint { font-size: 0.9rem; color: #64748b; font-style: italic; }
.pay-card a { font-weight: 700; }
/* ========== CONTACTS ========== */
.contacts__grid {
display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 20px;
margin-top: 32px;
}
.contact-card {
background: #fff;
padding: 24px;
border-radius: 14px;
text-align: center;
box-shadow: var(--shadow);
}
.contact-card__icon { font-size: 2.5rem; margin-bottom: 8px; }
.contact-card h3 { font-size: 1.1rem; }
.contact-card a { display: block; font-weight: 700; padding: 4px 0; font-size: 1.05rem; }
.contact-card__sub { font-size: 0.9rem; color: #64748b; margin-top: 6px; }
/* ========== FOOTER ========== */
.footer { background: #0f172a; color: #cbd5e1; padding: 32px 0; }
.footer__inner { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px; }
.footer strong { color: #fff; font-size: 1.1rem; }
.footer p { margin: 4px 0 0; font-size: 0.9rem; }
.footer__nav { display: flex; gap: 20px; flex-wrap: wrap; }
.footer__nav a { color: #cbd5e1; font-weight: 600; }
.footer__nav a:hover { color: var(--orange); }
/* ========== LIGHTBOX ========== */
.lightbox {
display: none;
position: fixed; inset: 0; z-index: 100;
background: rgba(0,0,0,0.92);
align-items: center; justify-content: center;
padding: 20px;
}
.lightbox.is-open { display: flex; }
.lightbox__img {
width: min(90vw, 900px); max-height: 85vh;
display: flex; align-items: center; justify-content: center;
}
.lightbox__img img {
max-width: 100%; max-height: 85vh;
border-radius: 12px; object-fit: contain;
box-shadow: 0 10px 40px rgba(0,0,0,0.5);
}
.lightbox__close {
position: absolute; top: 16px; right: 24px;
background: none; border: none; color: #fff; font-size: 3rem; cursor: pointer; line-height: 1;
}
/* ========== MOBILE ========== */
@media (max-width: 860px) {
.nav, .nav__cta { display: none; }
.nav.is-open {
display: flex; flex-direction: column;
position: absolute; top: 70px; left: 0; right: 0;
background: #fff; padding: 20px; gap: 16px;
box-shadow: var(--shadow);
border-top: 1px solid var(--border);
}
.burger { display: block; }
.hero__title { font-size: 2.2rem; }
.hero__subtitle { font-size: 1.1rem; }
.about, .signup { grid-template-columns: 1fr; }
.form { grid-template-columns: 1fr; padding: 24px; }
.section { padding: 56px 0; }
h2 { font-size: 1.6rem; }
}
</style>
</head>
<body>
@ -73,7 +378,7 @@
<h2 class="section__title">Смены и цены</h2>
<p class="section__lead">Выбирайте удобные даты. Места ограничены.</p>
<div class="shifts" id="shifts-grid">
<!-- shift cards rendered by script.js -->
<!-- shift cards rendered by script -->
</div>
</div>
</section>
@ -110,7 +415,7 @@
<h2 class="section__title">Галерея</h2>
<p class="section__lead">Так выглядит лето в «Соколе».</p>
<div class="gallery" id="gallery-grid">
<!-- gallery items rendered by script.js -->
<!-- gallery items rendered by script -->
</div>
</div>
</section>
@ -244,6 +549,160 @@
<div class="lightbox__img" id="lightbox-img"></div>
</div>
<script src="script.js?v=4"></script>
<script>
// ========== DATA ==========
const MOCK_SHIFTS = [
{ id: 1, name: 'Смена 1 — «Старт лета»', dates: '1 июня — 21 июня 2025', price: 120000, currency: 'тенге', spots_left: 12,
description: 'Спорт, творчество, командные игры. Возраст: 7–12 лет.',
includes: ['3-разовое питание', 'проживание в корпусе', 'все мероприятия'] },
{ id: 2, name: 'Смена 2 — «Приключения»', dates: '25 июня — 15 июля 2025', price: 135000, currency: 'тенге', spots_left: 8,
description: 'Походы, квесты, природа. Возраст: 10–15 лет.',
includes: ['3-разовое питание', 'проживание в корпусе', 'все мероприятия', 'поход выходного дня'] },
{ id: 3, name: 'Смена 3 — «Творческая лаборатория»', dates: '19 июля — 8 августа 2025', price: 130000, currency: 'тенге', spots_left: 15,
description: 'Музыка, театр, рисование, мультипликация. Возраст: 8–14 лет.',
includes: ['3-разовое питание', 'проживание в корпусе', 'мастер-классы', 'итоговый концерт'] },
{ id: 4, name: 'Смена 4 — «Прощание с летом»', dates: '12 августа — 30 августа 2025', price: 125000, currency: 'тенге', spots_left: 20,
description: 'Спорт, дискотеки, костры, кино под открытым небом. Возраст: 9–15 лет.',
includes: ['3-разовое питание', 'проживание в корпусе', 'все мероприятия', 'выпускной'] },
];
const GALLERY_ITEMS = [
{ src: 'images/photo_01.jpg', alt: 'Арт-объект I love Sokol' },
{ src: 'images/photo_02.jpg', alt: 'Армрестлинг на стадионе' },
{ src: 'images/photo_03.jpg', alt: 'Зарядка отряда' },
{ src: 'images/photo_04.jpg', alt: 'Гигантские шахматы' },
{ src: 'images/photo_05.jpg', alt: 'Построение лагеря' },
{ src: 'images/photo_06.jpg', alt: 'Пенная вечеринка' },
{ src: 'images/photo_07.jpg', alt: 'Английская телефонная будка' },
{ src: 'images/photo_08.jpg', alt: 'Дружный круг на газоне' },
{ src: 'images/photo_09.jpg', alt: 'Ребята в форме лагеря' },
{ src: 'images/photo_10.jpg', alt: 'Пенная вечеринка на улице' },
{ src: 'images/photo_11.jpg', alt: 'Юный шахматист' },
{ src: 'images/photo_12.jpg', alt: 'Фоторамка у озера' },
{ src: 'images/photo_13.jpg', alt: 'Телефонная будка во дворе' },
];
// ========== HELPERS ==========
const $ = (sel) => document.querySelector(sel);
const fmtPrice = (n) => n.toLocaleString('ru-RU');
async function loadShifts() {
try {
const r = await fetch('data/shifts.json');
if (!r.ok) throw new Error('fetch failed');
return await r.json();
} catch (_) {
return MOCK_SHIFTS;
}
}
// ========== RENDER: SHIFTS ==========
function renderShifts(shifts) {
const grid = $('#shifts-grid');
const select = $('#shift-select');
grid.innerHTML = shifts.map((s) => {
const lowSpots = s.spots_left <= 10;
const includes = s.includes.map((i) => `<li>${i}</li>`).join('');
return `
<article class="shift" data-id="${s.id}">
<h3 class="shift__name">${s.name}</h3>
<div class="shift__dates">📅 ${s.dates}</div>
<p class="shift__desc">${s.description}</p>
<ul class="shift__includes">${includes}</ul>
<div class="shift__price-row">
<div class="shift__price">${fmtPrice(s.price)} <small>${s.currency}</small></div>
<div class="shift__spots ${lowSpots ? 'shift__spots--low' : ''}">
Мест: ${s.spots_left}
</div>
</div>
<div class="shift__buttons">
<button class="btn btn--primary" data-action="signup" data-shift="${s.id}">Выбрать смену</button>
</div>
</article>
`;
}).join('');
select.innerHTML = '<option value="">— выберите смену —</option>' +
shifts.map((s) => `<option value="${s.id}">${s.name} (${s.dates})</option>`).join('');
grid.addEventListener('click', (e) => {
const btn = e.target.closest('button[data-action]');
if (!btn) return;
const shiftId = btn.dataset.shift;
if (btn.dataset.action === 'signup') {
select.value = shiftId;
$('#signup').scrollIntoView({ behavior: 'smooth' });
setTimeout(() => $('input[name="child_name"]').focus(), 600);
}
});
}
// ========== RENDER: GALLERY ==========
function renderGallery() {
const grid = $('#gallery-grid');
grid.innerHTML = GALLERY_ITEMS.map((g, i) => `
<button class="gallery__item" data-i="${i}" aria-label="${g.alt}">
<img src="${g.src}" alt="${g.alt}" loading="lazy" />
</button>
`).join('');
grid.addEventListener('click', (e) => {
const item = e.target.closest('.gallery__item');
if (!item) return;
const g = GALLERY_ITEMS[Number(item.dataset.i)];
const lb = $('#lightbox-img');
lb.innerHTML = `<img src="${g.src}" alt="${g.alt}" />`;
$('#lightbox').classList.add('is-open');
});
}
// ========== LIGHTBOX ==========
function initLightbox() {
const lb = $('#lightbox');
const close = () => lb.classList.remove('is-open');
$('#lightbox-close').addEventListener('click', close);
lb.addEventListener('click', (e) => { if (e.target === lb) close(); });
document.addEventListener('keydown', (e) => { if (e.key === 'Escape') close(); });
}
// ========== BURGER MENU ==========
function initBurger() {
const nav = $('#nav');
const burger = $('#burger');
burger.addEventListener('click', () => nav.classList.toggle('is-open'));
nav.addEventListener('click', (e) => {
if (e.target.tagName === 'A') nav.classList.remove('is-open');
});
}
// ========== FORM ==========
function initForm() {
const form = $('#signup-form');
const success = $('#form-success');
form.addEventListener('submit', (e) => {
e.preventDefault();
if (!form.checkValidity()) {
form.reportValidity();
return;
}
const data = Object.fromEntries(new FormData(form).entries());
console.log('Заявка:', data);
success.hidden = false;
form.querySelectorAll('input, select, textarea').forEach((el) => { el.value = ''; });
success.scrollIntoView({ behavior: 'smooth', block: 'center' });
setTimeout(() => { success.hidden = true; }, 8000);
});
}
// ========== INIT ==========
(async function init() {
const shifts = await loadShifts();
renderShifts(shifts);
renderGallery();
initLightbox();
initBurger();
initForm();
})();
</script>
</body>
</html>