feat: mobile UX, admin polish, rate limiting, and media assets

- Mobile responsiveness improvements across admin and public sections
- Admin: bookings modal, open-day page, team page, layout polish
- Added rate limiting, CSRF hardening, auth-edge improvements
- Scroll reveal, floating contact, back-to-top, Yandex map fixes
- Schedule filters refactor, team profile/info component updates
- New useTrainerPhotos hook
- Added class, team, master-class, and news images
This commit is contained in:
2026-04-10 18:42:54 +03:00
parent bbe485d8fc
commit a587736dd3
74 changed files with 724 additions and 298 deletions
+4 -15
View File
@@ -5,6 +5,7 @@ import { createPortal } from "react-dom";
import { X, CheckCircle, Send, Phone as PhoneIcon, Instagram } from "lucide-react";
import { BRAND } from "@/lib/constants";
import { useFocusTrap } from "@/hooks/useFocusTrap";
import { formatBelarusPhone } from "@/lib/formatting";
interface SignupModalProps {
open: boolean;
@@ -51,19 +52,7 @@ export function SignupModal({
const focusTrapRef = useFocusTrap<HTMLDivElement>(open);
function handlePhoneChange(raw: string) {
let digits = raw.replace(/\D/g, "");
if (!digits.startsWith("375")) {
digits = "375" + digits.replace(/^375?/, "");
}
digits = digits.slice(0, 12);
let formatted = "+375";
const rest = digits.slice(3);
if (rest.length > 0) formatted += " (" + rest.slice(0, 2);
if (rest.length >= 2) formatted += ") ";
if (rest.length > 2) formatted += rest.slice(2, 5);
if (rest.length > 5) formatted += "-" + rest.slice(5, 7);
if (rest.length > 7) formatted += "-" + rest.slice(7, 9);
setPhone(formatted);
setPhone(formatBelarusPhone(raw));
}
useEffect(() => {
@@ -86,7 +75,7 @@ export function SignupModal({
setError("");
const cleanPhone = phone.replace(/\D/g, "");
if (cleanPhone.length < 12) {
if (!/^375(25|29|33|44)\d{7}$/.test(cleanPhone)) {
setError("Введите корректный номер телефона");
return;
}
@@ -288,7 +277,7 @@ export function SignupModal({
</div>
{error && error !== "network" && (
<p id="error-phone" className="text-sm text-red-400">{error}</p>
<p id="error-phone" role="alert" className="text-sm text-red-400">{error}</p>
)}
<button