Новые изменения в проекте

This commit is contained in:
Web-serfer 2026-04-19 19:32:53 +05:00
parent d14d67893b
commit beeec4740e
3 changed files with 129 additions and 9 deletions

View file

@ -42,6 +42,7 @@ const {
role,
tabindex,
title,
'data-modal-target': modalTarget,
...dataAttrs // Все data-* атрибуты
}: Props = Astro.props;
@ -91,10 +92,26 @@ const commonAttrs = Object.fromEntries(
class={classes}
disabled={disabled}
{...commonAttrs}
{...(modalTarget ? { 'data-modal-target': modalTarget } : {})}
>
<slot />
</button>
)}
)}
{modalTarget && (
<script define:vars={{ modalTarget }}>
document.querySelectorAll(`[data-modal-target="${modalTarget}"]`).forEach(btn => {
btn.addEventListener('click', () => {
const modal = document.getElementById(modalTarget);
if (modal) {
modal.classList.add('active');
modal.setAttribute('aria-hidden', 'false');
document.body.style.overflow = 'hidden';
}
});
});
</script>
)}
<style>
.btn {

View file

@ -17,7 +17,10 @@ const title = 'Бесплатная консультация';
Оставьте свои контактные данные, и мы свяжемся с вами в течение 15 минут
</p>
<form class="modal-form" action="#" method="POST" id="consultation-form">
<!-- Honeypot поле для защиты от спама -->
<input type="text" name="website" id="website-field" class="hidden-field" tabindex="-1" autocomplete="off" />
<form class="modal-form" action="#" method="POST" id="consultation-form">
<div class="form-group">
<label for="name" class="form-label">Ваше имя</label>
<input
@ -101,11 +104,45 @@ const title = 'Бесплатная консультация';
});
// Обработка отправки формы
form?.addEventListener('submit', (e) => {
form?.addEventListener('submit', async (e) => {
e.preventDefault();
// Здесь добавь логику отправки формы
console.log('Форма отправлена');
closeModal();
const formData = new FormData(form);
const website = formData.get('website');
if (website) {
console.log('Spam detected');
return;
}
const name = formData.get('name');
const phone = formData.get('phone');
if (!name || !phone) {
alert('Пожалуйста, заполните имя и телефон');
return;
}
try {
const response = await fetch('/api/consultation', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, phone })
});
const result = await response.json();
if (result.success) {
alert('Спасибо! Мы свяжемся с вами в течение 15 минут.');
form.reset();
closeModal();
} else {
alert('Ошибка: ' + result.error);
}
} catch (error) {
console.error('Error:', error);
alert('Ошибка отправки. Попробуйте позже.');
}
});
// Для Astro View Transitions
@ -273,6 +310,13 @@ const title = 'Бесплатная консультация';
text-decoration: none;
}
.hidden-field {
position: absolute;
left: -9999px;
opacity: 0;
pointer-events: none;
}
@media (max-width: 480px) {
.modal-content {
padding: 32px 24px 24px;