Refactor code structure for improved readability and maintainability

This commit is contained in:
2025-07-26 13:48:36 +09:00
parent 3c93956ae6
commit 72d04e034d
18 changed files with 268 additions and 233 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

+25 -30
View File
@@ -22,7 +22,7 @@ function SwiperButton({
onClick={onClick}
disabled={disabled}
className={`
w-12 h-12
w-10 h-10 sm:w-12 sm:h-12
border border-gray-200
transition-colors duration-200
flex items-center justify-center
@@ -35,19 +35,19 @@ function SwiperButton({
`}
aria-label={direction === "next" ? "Next slide" : "Previous slide"}
>
<img src={iconPath} alt="" className={`w-5 h-5`} />
<img src={iconPath} alt="" className={`w-4 h-4 sm:w-5 sm:h-5`} />
</button>
);
}
function Slide({ title, imageSrc }: { title: string; imageSrc: string }) {
return (
<div className="flex flex-col bg-[#1068B0] py-6 px-3.5 relative">
<h2 className={`${fluxgore.className} text-4xl text-white leading-none`}>
<div className="flex flex-col bg-[#1068B0] py-4 px-3 sm:py-6 sm:px-3.5 relative">
<h2 className={`${fluxgore.className} text-2xl sm:text-3xl lg:text-4xl text-white leading-none`}>
{title}
</h2>
<img
className="w-full h-auto object-cover mt-7"
className="w-full h-auto object-cover mt-4 sm:mt-7"
src={imageSrc}
alt="Slide Image"
/>
@@ -86,16 +86,16 @@ function Activities() {
};
return (
<div className="bg-[#F4F4F4] relative pt-20 pb-32">
<div className="container mx-auto">
<div className="flex flex-row justify-between items-center">
<div className="bg-[#F4F4F4] relative pt-12 pb-16 sm:pt-16 sm:pb-24 lg:pt-20 lg:pb-32">
<div className="container mx-auto px-4">
<div className="flex space-y-6 flex-row sm:justify-between sm:items-center sm:space-y-0">
<h1
className={`${fluxgore.className} text-7xl text-[#060606] relative`}
className={`${fluxgore.className} text-3xl sm:text-5xl lg:text-7xl text-[#060606] relative max-w-2xs md:max-w-full`}
>
Активности фестиваля
</h1>
<div className="flex items-center space-x-5">
<div className="flex items-center justify-center space-x-3 sm:space-x-5">
<SwiperButton
onClick={handlePrevious}
direction="prev"
@@ -110,11 +110,11 @@ function Activities() {
</div>
</div>
<div className="container mx-auto overflow-visible">
<div className="mt-16 overflow-visible">
<div className="container mx-auto px-4 overflow-visible">
<div className="mt-8 sm:mt-12 lg:mt-16 overflow-visible">
<Swiper
spaceBetween={20}
slidesPerView={3}
spaceBetween={15}
slidesPerView={1}
onSwiper={handleSwiperInit}
onSlideChange={handleSlideChange}
watchOverflow={false}
@@ -122,9 +122,15 @@ function Activities() {
breakpoints={{
640: {
slidesPerView: 1,
spaceBetween: 15,
},
768: {
slidesPerView: 2,
spaceBetween: 20,
},
1024: {
slidesPerView: 3,
spaceBetween: 20,
},
}}
>
@@ -136,28 +142,17 @@ function Activities() {
</SwiperSlide>
<SwiperSlide>
<Slide
title="Автовыставка"
imageSrc="/images/activities/car1.png"
title="дрифт такси"
imageSrc="/images/activities/taxi.png"
/>
</SwiperSlide>
<SwiperSlide>
<Slide
title="Автовыставка"
imageSrc="/images/activities/car1.png"
/>
</SwiperSlide>
<SwiperSlide>
<Slide
title="Автовыставка"
imageSrc="/images/activities/car1.png"
/>
</SwiperSlide>
<SwiperSlide>
<Slide
title="Автовыставка"
imageSrc="/images/activities/car1.png"
title="SMP Race такси"
imageSrc="/images/activities/race_taxi.png"
/>
</SwiperSlide>
</Swiper>
</div>
</div>
+32 -10
View File
@@ -1,3 +1,4 @@
/* eslint-disable @next/next/no-img-element */
import { fluxgore } from "@/utils/fonts";
import Button from "./Button";
@@ -14,7 +15,7 @@ function CoverHeading({ children, textPosition }: CoverHeadingProps) {
className={`${fluxgore.className} text-white relative`}
style={{
textAlign: textAlign,
fontSize: "8vw", // Changed from fixed 130px to 8vw
fontSize: "clamp(50px, 10vw, 7vw)", // Slightly smaller on all screen sizes
lineHeight: "1",
}}
>
@@ -23,7 +24,7 @@ function CoverHeading({ children, textPosition }: CoverHeadingProps) {
<span
className="absolute top-0 text-black"
style={{
transform: `translate(1.1vw, 0.7vw)`, // Changed from fixed pixels to vw
transform: `translate(clamp(6px, 1.5vw, 1vw), clamp(4px, 1vw, 0.6vw))`, // Adjusted shadow offset
textAlign: textAlign,
zIndex: 1,
}}
@@ -37,7 +38,7 @@ function CoverHeading({ children, textPosition }: CoverHeadingProps) {
<span
className="absolute top-0 text-black"
style={{
transform: `translate(calc(-100% + 1.1vw), 0.7vw)`, // Changed from fixed pixels to vw
transform: `translate(calc(-100% + clamp(6px, 1.5vw, 1vw)), clamp(4px, 1vw, 0.6vw))`, // Adjusted shadow offset
textAlign: textAlign,
zIndex: 1,
}}
@@ -54,7 +55,7 @@ function CoverHeading({ children, textPosition }: CoverHeadingProps) {
zIndex: 3,
display: "block",
textAlign: textAlign,
WebkitTextStroke: "0.75vw black", // Changed from fixed 12px to 0.75vw
WebkitTextStroke: "clamp(3px, 1vw, 0.6vw) black", // Adjusted stroke width
paintOrder: "stroke fill",
}}
>
@@ -67,10 +68,9 @@ function CoverHeading({ children, textPosition }: CoverHeadingProps) {
function DateBox() {
return (
<div
className={`${fluxgore.className} bg-white text-black px-6 py-2 inline-block`}
className={`${fluxgore.className} bg-white text-black px-6 py-2 inline-blockt text-3xl md:text-[40px]`}
style={{
transform: "skewX(-15deg)",
fontSize: "2vw", // Changed from 40px to 2.5vw
lineHeight: "1.2",
filter: `
drop-shadow(8px 8px 0px black)
@@ -94,16 +94,36 @@ function Cover() {
className="bg-cover bg-center bg-no-repeat relative justify-center items-center py-36"
style={{ backgroundImage: "url('/images/cover.svg')" }}
>
<div className="container mx-auto max-w-5/7 mb-24">
<div className="container mx-auto mb-24">
{/* Top row with ФЕСТИВАЛЬ and date box */}
<div className="flex align-center justify-center pb-7 md:hidden">
<DateBox />
</div>
{/* <div className="flex align-center justify-center pb-7 md:hidden">
<DateBox />
</div>
<div className="flex flex-row items-center space-x-16">
<CoverHeading>ФЕСТИВАЛЬ</CoverHeading>
<DateBox />
<div className="hidden md:block">
<DateBox />
</div>
</div>
<CoverHeading textPosition="right">ТЕХНИЧЕСКИХ</CoverHeading>
<CoverHeading>ВИДОВ СПОРТА</CoverHeading>
<CoverHeading>ВИДОВ СПОРТА</CoverHeading> */}
<img
src="/images/cover_text.png"
alt="Фестиваль технических видов спорта 2025"
className="w-full max-w-3xl mx-auto hidden md:block"
/>
<img
src="/images/cover_text_mobile.png"
alt="Фестиваль технических видов спорта 2025"
className="w-full max-w-3xl mx-auto md:hidden"
/>
</div>
<div className="flex justify-center items-center">
@@ -129,7 +149,9 @@ function CoverSoon() {
{/* Top row with ФЕСТИВАЛЬ and date box */}
<div className="flex flex-row items-center space-x-16">
<CoverHeading>ФЕСТИВАЛЬ</CoverHeading>
<DateBox />
<div className="hidden md:block">
<DateBox />
</div>
</div>
<CoverHeading textPosition="right">ТЕХНИЧЕСКИХ</CoverHeading>
+35 -29
View File
@@ -11,27 +11,27 @@ interface EventCardProps {
function EventCard(props: EventCardProps) {
return (
<div className="flex flex-row bg-[#272727] py-5 px-2.5">
<div className="w-1/3">
<div className="flex flex-col md:flex-row bg-[#272727] py-5 px-2.5 md:py-5 md:px-2.5 p-4">
<div className="w-full md:w-1/3 mb-4 md:mb-0">
<img
className="w-2/3 h-auto object-cover"
className="w-full md:w-2/3 h-auto object-cover rounded"
src={props.image}
alt={props.title}
/>
</div>
<div className="w-1/3">
<div className="w-full md:w-1/3 mb-4 md:mb-0 md:px-4">
<h2
className={`${fluxgore.className} text-4xl text-white leading-none`}
className={`${fluxgore.className} text-2xl md:text-4xl text-white leading-tight md:leading-none`}
>
{props.title}
</h2>
<p
className={`${gothampro.className} text-[#E6E6E6] text-base mt-6 leading-none`}
className={`${gothampro.className} text-[#E6E6E6] text-sm md:text-base mt-4 md:mt-6 leading-relaxed md:leading-none`}
>
{props.description}
</p>
</div>
<div className="flex justify-end w-1/3">
<div className="flex justify-center md:justify-end w-full md:w-1/3">
<Button variant="blue" shadowEnabled={false}>
регистрация
</Button>
@@ -43,7 +43,7 @@ function EventCard(props: EventCardProps) {
function Events() {
return (
<div
className="bg-[#161616] relative pt-64 pb-32"
className="bg-[#161616] relative pt-32 md:pt-64 pb-16 md:pb-32"
style={{
backgroundImage: `url('/images/noise.svg')`,
backgroundSize: "cover",
@@ -52,25 +52,27 @@ function Events() {
}}
>
<img
className="absolute top-0 object-cover"
className="absolute top-0 w-full object-cover"
src="/images/events/paper_tear.png"
alt="Paper tear"
/>
<div className="container mx-auto">
<div className="flex flex-row justify-between">
<h1 className={`${fluxgore.className} text-7xl text-white relative`}>
<div className="container mx-auto px-4">
<div className="flex flex-col md:flex-row md:justify-between space-y-6 md:space-y-0">
<h1
className={`${fluxgore.className} text-4xl md:text-7xl text-white relative`}
>
что вас ждет
</h1>
<p
className={`${gothampro.className} text-[#E6E6E6] opacity-90 text-xl max-w-[536px] leading-none self-end`}
className={`${gothampro.className} text-[#E6E6E6] opacity-90 text-base md:text-xl max-w-full md:max-w-[536px] leading-relaxed md:leading-none md:self-end`}
>
[Для участия в соревнованиях нажмите кнопку регистрация]
</p>
</div>
<div className="flex flex-col space-y-7 mt-36">
<div className="flex flex-col space-y-4 md:space-y-7 mt-16 md:mt-36">
<EventCard
image="/events/yuka.png"
title="YUKA Drive Fest Джимхана"
@@ -80,27 +82,31 @@ function Events() {
link="#"
/>
<EventCard
image="/events/yuka.png"
title="YUKA Drive Fest Джимхана"
description="YUKA Drive Fest Джимхана впервые врывается в Москву, и местом его дебюта станет наш Фестиваль технических видов спорта!
Это не просто гонки, это настоящий танец на асфальте, где мастерство водителя и мощь автомобиля сливаются воедино.
Под чутким руководством и вдохновляющим присутствием легендарного Аркадия Цареградцева, амбассадора и супер-босса соревнований, лучшие джимханисты страны покажут невероятные трюки, демонстрируя виртуозное владение машиной. Скорость, точность, дым из-под колес и филигранные маневры в ограниченном пространстве – вот что такое Джимхана."
image="/events/moscow_fight.png"
title="Дрифт«Битва за Москву»"
description="Любительский турнир по дрифту, который вырос из проекта «Дорога в дрифт», созданного в 2021 году для поиска новых талантов. За три года он превратился в полноценные соревнования с привлекательным призовым фондом.
Во второй день фестиваля, 8 сентября, пройдет дрифт-гонка, где главным призом станет электромобиль «Москвич».
Соревнования проводятся по традиционной олимпийской системе. Чтобы принять участие, необходимо подать заявку на сайте и дождаться приглашения от организаторов."
link="#"
/>
<EventCard
image="/events/yuka.png"
title="YUKA Drive Fest Джимхана"
description="YUKA Drive Fest Джимхана впервые врывается в Москву, и местом его дебюта станет наш Фестиваль технических видов спорта!
Это не просто гонки, это настоящий танец на асфальте, где мастерство водителя и мощь автомобиля сливаются воедино.
Под чутким руководством и вдохновляющим присутствием легендарного Аркадия Цареградцева, амбассадора и супер-босса соревнований, лучшие джимханисты страны покажут невероятные трюки, демонстрируя виртуозное владение машиной. Скорость, точность, дым из-под колес и филигранные маневры в ограниченном пространстве – вот что такое Джимхана."
image="/events/moto.png"
title="КуБок ШОС по Мотокроссу"
description="Уникальная возможность увидеть настоящую битву моторов и мастерства на трассе.
Лучшие гонщики со всего мира соберутся, чтобы продемонстрировать невероятные прыжки, головокружительные виражи и бескомпромиссную борьбу за победу.
Приготовьтесь к взрыву адреналина и незабываемым эмоциям, ведь Кубок ШОС по Мотокроссу обещает стать одним из самых ярких зрелищ фестиваля!"
link="#"
/>
<EventCard
image="/events/yuka.png"
title="YUKA Drive Fest Джимхана"
description="YUKA Drive Fest Джимхана впервые врывается в Москву, и местом его дебюта станет наш Фестиваль технических видов спорта!
Это не просто гонки, это настоящий танец на асфальте, где мастерство водителя и мощь автомобиля сливаются воедино.
Под чутким руководством и вдохновляющим присутствием легендарного Аркадия Цареградцева, амбассадора и супер-босса соревнований, лучшие джимханисты страны покажут невероятные трюки, демонстрируя виртуозное владение машиной. Скорость, точность, дым из-под колес и филигранные маневры в ограниченном пространстве – вот что такое Джимхана."
image="/events/cart.png"
title="Кубок по Фиджитал картингу"
description="На Фестивале технических видов спорта 2025 впервые состоится Кубок по Фиджитал Картингу!
Это уникальное состязание, где виртуальная реальность встречается с реальной трассой.
Участники будут сражаться на симуляторах, а затем переносить свои навыки на настоящий картинг, демонстрируя невероятную адаптивность и мастерство."
link="#"
/>
</div>
+108 -94
View File
@@ -4,13 +4,19 @@ import Link from "next/link";
/* eslint-disable @next/next/no-img-element */
function Footer() {
return (
<footer className="bg-[#0D0D0D] py-36 ">
<div className="container mx-auto flex flex-col space-y-9">
<div className="flex flex-row justify-between items-center">
<div className="flex flex-col space-y-16">
<img src="/logos/tech_logo_text.svg" alt="Tech Fest Logo" />
<footer className="bg-[#0D0D0D] py-16 md:py-36">
<div className="container mx-auto px-4 flex flex-col space-y-9">
<div className="flex flex-col md:flex-row md:justify-between md:items-start space-y-8 md:space-y-0">
{/* Logo and Social Links */}
<div className="flex flex-row md:flex-col md:space-y-16 space-x-16">
<img
src="/logos/tech_logo_text.svg"
alt="Tech Fest Logo"
className="w-32 md:w-auto"
/>
<ul className="hidden md:flex space-x-2 items-center">
{/* Social Links - visible on all screen sizes */}
<ul className="flex space-x-2 items-center">
<li>
<Link
href="https://t.me/your_channel"
@@ -59,106 +65,114 @@ function Footer() {
</ul>
</div>
<div className="flex flex-col space-y-7">
<h3 className={`${fluxgore.className} text-[18px] text-[#E6E6E6]`}>
ПЛОЩАДКИ
</h3>
<div className="flex flex-col space-y-2">
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
{/* Navigation Columns - Stack on mobile, side by side on desktop */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<div className="flex flex-col space-y-4 md:space-y-7">
<h3
className={`${fluxgore.className} text-base md:text-[18px] text-[#E6E6E6]`}
>
YUKA Drive Fest
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
ЭКСПО
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Мотокросс
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Дрифт Битва за Москву
</Link>
СОБЫТИЯ
</h3>
<div className="flex flex-col space-y-2">
<Link
href="/#cover"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
YUKA Drive Fest
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
ЭКСПО
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Мотокросс
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Дрифт Битва за Москву
</Link>
</div>
</div>
</div>
<div className="flex flex-col space-y-7">
<h3 className={`${fluxgore.className} text-[18px] text-[#E6E6E6]`}>
ПЛОЩАДКИ
</h3>
<div className="flex flex-col space-y-2">
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
<div className="flex flex-col space-y-4 md:space-y-7">
<h3
className={`${fluxgore.className} text-base md:text-[18px] text-[#E6E6E6]`}
>
YUKA Drive Fest
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
ЭКСПО
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Мотокросс
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Дрифт Битва за Москву
</Link>
ИНФОРМАЦИЯ
</h3>
<div className="flex flex-col space-y-2">
<Link
href="/#about"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
О фестивале
</Link>
<Link
href="/#program"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Программа
</Link>
<Link
href="/#tickets"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Билеты
</Link>
<Link
href="/#contacts"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Контакты
</Link>
</div>
</div>
</div>
<div className="flex flex-col space-y-7">
<h3 className={`${fluxgore.className} text-[18px] text-[#E6E6E6]`}>
ПЛОЩАДКИ
</h3>
<div className="flex flex-col space-y-2">
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
<div className="flex flex-col space-y-4 md:space-y-7">
<h3
className={`${fluxgore.className} text-base md:text-[18px] text-[#E6E6E6]`}
>
YUKA Drive Fest
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
ЭКСПО
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Мотокросс
</Link>
<Link
href="/#cover"
className={`${gothampro.className} text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Дрифт Битва за Москву
</Link>
УЧАСТИЕ
</h3>
<div className="flex flex-col space-y-2">
<Link
href="/#registration"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Регистрация
</Link>
<Link
href="/#sponsors"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Партнеры
</Link>
<Link
href="/#media"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Пресса
</Link>
<Link
href="/#volunteer"
className={`${gothampro.className} text-sm md:text-base text-[#E6E6E6] opacity-60 hover:text-blue-500 transition-colors duration-200`}
>
Волонтерство
</Link>
</div>
</div>
</div>
</div>
<p
className={`${gothampro.className} text-[18px] text-[#E6E6E6] opacity-40`}
className={`${gothampro.className} text-sm md:text-[18px] text-[#E6E6E6] opacity-40 text-center md:text-left`}
>
© 2025 АНО &quot;СОК&quot;
</p>
+14 -14
View File
@@ -6,7 +6,7 @@ function Info() {
return (
<div className={gothampro.className}>
<div
className="bg-[#161616] relative overflow-hidden"
className="bg-[#161616] relative overflow-hidden px-4"
style={{
backgroundImage: `url('/images/noise.svg')`,
backgroundSize: "cover",
@@ -17,13 +17,13 @@ function Info() {
<div className="container mx-auto pt-36">
<div className="flex flex-row">
<div className="flex-1 basis-1/3">
<p className="text-white opacity-60 text-base uppercase font-medium">
<p className="text-white opacity-60 text-sm md:text-base uppercase font-medium">
[ о нас ]
</p>
</div>
<div className="flex-col max-w-2/3">
<p className="text-white text-4xl font-normal">
<p className="text-white text-base md:text-4xl font-normal">
Фестиваль технических видов спорта 2025 это седьмой{" "}
<span className="text-[#1068B0]">год драйва и эмоций</span>!
</p>
@@ -34,7 +34,7 @@ function Info() {
<div className="flex-1 basis-2/12"></div>
<div className="flex-col max-w-10/12">
<p className="text-white text-4xl font-normal">
<p className="text-white text-base md:text-4xl font-normal">
Организованный Департаментом спорта Москвы и РАФ в День города,
он объединяет фанатов скорости и семьи.
</p>
@@ -45,7 +45,7 @@ function Info() {
<div className="flex-1 basis-1/3"></div>
<div className="flex-col max-w-2/3">
<p className="text-white text-base font-normal max-w-2/5">
<p className="text-white text-base md:text-base font-normal md:max-w-2/5">
В этом году, помимо традиционной «Битвы за Москву» по дрифту,
вас ждут абсолютно новые для фестиваля соревнования:{" "}
<span className="text-[#1068B0]">
@@ -63,7 +63,7 @@ function Info() {
<div className="flex flex-row mt-8">
<div className="flex-1 basis-1/3"></div>
<div className="flex-col min-w-2/3 justify-start items-start">
<div className="flex-col md:min-w-2/3 justify-start items-start">
<Button
onClick={() => {
console.log("test");
@@ -77,24 +77,24 @@ function Info() {
</div>
</div>
<div className="container mx-auto flex flex-row pt-24 pb-56">
<div className="w-1/3">
<div className="container mx-auto flex flex-col md:flex-row pt-12 md:pt-24 pb-28 md:pb-56 gap-4 md:gap-0">
<div className="w-full md:w-1/3 flex justify-center md:justify-start">
<img
src="/images/info/moto.png"
alt="moto"
className="w-1/2 h-auto object-cover"
className="w-3/4 md:w-1/2 h-auto object-cover"
/>
</div>
<div className="w-1/3">
<div className="w-full md:w-1/3 flex justify-center">
<img
src="/images/info/podium.png"
alt="car"
className="w-full h-auto object-cover"
className="w-3/4 md:w-full h-auto object-cover"
/>
</div>
<div className="flex w-1/3">
<div className="w-1/3"></div>
<div className="w-2/3">
<div className="flex w-full md:w-1/3 justify-center md:justify-start">
<div className="w-0 md:w-1/3"></div>
<div className="w-3/4 md:w-2/3">
<img
src="/images/info/jump.png"
alt="jump"
+8 -8
View File
@@ -4,31 +4,31 @@ import Button from "./Button";
function Map() {
return (
<div className="bg-[#272727] relative pt-14 pb-32">
<div className="container mx-auto flex flex-row">
<div className="flex flex-col w-1/2">
<h1 className={`${fluxgore.className} text-7xl text-white relative`}>
<div className="container mx-auto flex flex-col lg:flex-row px-4">
<div className="flex flex-col w-full lg:w-1/2 mb-8 lg:mb-0">
<h1 className={`${fluxgore.className} text-4xl md:text-5xl lg:text-7xl text-white relative`}>
как нас найти
</h1>
<h2 className={`${fluxgore.className} text-4xl text-[#1068B0] mt-20`}>
<h2 className={`${fluxgore.className} text-2xl md:text-3xl lg:text-4xl text-[#1068B0] mt-10 lg:mt-20`}>
5-7 сентября 2025
</h2>
<p
className={`${gothampro.className} text-3xl text-[#E6E6E6] mt-5 font-medium max-w-2/3`}
className={`${gothampro.className} text-lg md:text-xl lg:text-3xl text-[#E6E6E6] mt-5 font-medium lg:max-w-2/3`}
>
г. Москва парк Технических видов спорта, МЦД2 станция Курьяново
</p>
<div className="flex flex-col justify-end flex-grow mt-10">
<div className="flex flex-col justify-end flex-grow mt-6 lg:mt-10">
<Button shadowEnabled={false}>схема проезда</Button>
</div>
</div>
<div className="w-1/2">
<div className="w-full lg:w-1/2">
<iframe
src="https://yandex.com/map-widget/v1/?um=constructor%3Ad4445ea405fa54c9148340a7de87f7a4b9df164b35ff2fe504cf79adc1fab55c&amp;source=constructor"
className="w-full h-[500px]"
className="w-full h-[300px] md:h-[400px] lg:h-[500px]"
frameBorder="0"
></iframe>
</div>
+5 -14
View File
@@ -95,7 +95,7 @@ function Navbar() {
{/* Mobile Menu Button */}
<button
onClick={toggleMenu}
className="lg:hidden p-2 rounded-md hover:bg-white hover:bg-opacity-10 transition-colors"
className="lg:hidden p-2 rounded-md hover:bg-white hover:bg-opacity-10 hover:text-black transition-colors"
aria-label="Toggle menu"
>
<svg
@@ -174,10 +174,7 @@ function Navbar() {
rel="noopener noreferrer"
className="w-10 h-10 bg-white bg-opacity-10 hover:bg-opacity-20 rounded-full flex items-center justify-center transition-all duration-200"
>
<svg
className="w-5 h-5 fill-white"
viewBox="0 0 24 24"
>
<svg className="w-5 h-5 fill-black" viewBox="0 0 24 24">
<path d="M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" />
</svg>
</Link>
@@ -187,10 +184,7 @@ function Navbar() {
rel="noopener noreferrer"
className="w-10 h-10 bg-white bg-opacity-10 hover:bg-opacity-20 rounded-full flex items-center justify-center transition-all duration-200"
>
<svg
className="w-5 h-5 fill-white"
viewBox="0 0 24 24"
>
<svg className="w-5 h-5 fill-black" viewBox="0 0 24 24">
<path d="M15.684 0H8.316C1.592 0 0 1.592 0 8.316v7.368C0 22.408 1.592 24 8.316 24h7.368C22.408 24 24 22.408 24 15.684V8.316C24 1.592 22.408 0 15.684 0zm3.692 17.123h-1.744c-.66 0-.864-.525-2.05-1.71-1.033-1.001-1.49-.996-1.701-.996-.346 0-.444.097-.444.574v1.563c0 .422-.135.678-1.253.678-1.846 0-3.896-1.118-5.335-3.202C4.624 10.857 4.03 8.57 4.03 8.096c0-.21.097-.405.574-.405h1.744c.428 0 .59.194.756.648.83 2.405 2.229 4.506 2.807 4.506.213 0 .31-.097.31-.632V9.98c-.062-1.438-.84-1.563-.84-2.077 0-.17.135-.34.359-.34h2.744c.359 0 .487.194.487.632v3.473c0 .359.159.487.259.487.213 0 .383-.128.773-.518 1.205-1.315 2.067-3.34 2.067-3.34.118-.248.311-.485.73-.485h1.744c.523 0 .634.27.523.632-.24.749-2.42 4.062-2.42 4.062-.194.31-.259.446 0 .747.194.226 1.116.96 1.394 1.315.757.973.525 1.528.157 1.528z" />
</svg>
</Link>
@@ -200,10 +194,7 @@ function Navbar() {
rel="noopener noreferrer"
className="w-10 h-10 bg-white bg-opacity-10 hover:bg-opacity-20 rounded-full flex items-center justify-center transition-all duration-200"
>
<svg
className="w-5 h-5 fill-white"
viewBox="0 0 24 24"
>
<svg className="w-5 h-5 fill-black" viewBox="0 0 24 24">
<path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z" />
</svg>
</Link>
@@ -215,4 +206,4 @@ function Navbar() {
);
}
export default Navbar;
export default Navbar;
+11 -9
View File
@@ -4,7 +4,7 @@ import { fluxgore } from "@/utils/fonts";
function Partners() {
return (
<div
className="bg-[#161616] relative py-52"
className="bg-[#161616] relative py-16 sm:py-32 lg:py-52"
style={{
backgroundImage: `url('/images/noise.svg')`,
backgroundSize: "cover",
@@ -12,35 +12,37 @@ function Partners() {
backgroundBlendMode: "overlay",
}}
>
<div className="container mx-auto">
<h1 className={`${fluxgore.className} text-7xl text-white relative`}>
<div className="container mx-auto px-4">
<h1
className={`${fluxgore.className} text-4xl sm:text-5xl md:text-6xl lg:text-7xl text-white relative`}
>
партнеры
</h1>
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-24 mt-16">
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-8 sm:gap-12 md:gap-16 lg:gap-24 mt-8 sm:mt-12 lg:mt-16">
<img
src="/logos/dep.svg"
className="w-auto h-24 object-contain"
className="w-auto h-16 sm:h-20 lg:h-24 object-contain"
alt="Dep Logo"
/>
<img
src="/logos/mos.svg"
className="w-auto h-24 object-contain"
className="w-auto h-16 sm:h-20 lg:h-24 object-contain"
alt="Mos Logo"
/>
<img
src="/logos/raf.png"
className="w-auto h-24 object-contain"
className="w-auto h-16 sm:h-20 lg:h-24 object-contain"
alt="Raf Logo"
/>
<img
src="/logos/ctvs.png"
className="w-auto h-24 object-contain"
className="w-auto h-16 sm:h-20 lg:h-24 object-contain"
alt="Ctvs Logo"
/>
<img
src="/logos/smp.png"
className="w-auto h-24 object-contain"
className="w-auto h-16 sm:h-20 lg:h-24 object-contain"
alt="SMP Logo"
/>
</div>
+13 -13
View File
@@ -15,8 +15,8 @@ function SchemeSelect({
onClick,
}: SchemeSelectProps) {
const baseClasses = `${fluxgore.className} leading-none cursor-pointer transition-all duration-300 ease-in-out hover:opacity-80 transform hover:scale-105`;
const activeClasses = "text-[#1E1E1E] text-4xl";
const inactiveClasses = "text-[#0D0D0D] text-xl opacity-50 self-end";
const activeClasses = "text-[#1E1E1E] text-2xl md:text-4xl";
const inactiveClasses = "text-[#0D0D0D] text-base md:text-xl opacity-50 self-end";
return (
<p
@@ -35,14 +35,14 @@ interface SchemeItemProps {
function SchemeItem({ time, title }: SchemeItemProps) {
return (
<div className="flex flex-row items-center space-x-2.5">
<div className="flex flex-col md:flex-row md:items-center space-y-1 md:space-y-0 md:space-x-2.5">
<span
className={`${gothampro.className} text-white bg-[#1068B0] text-xl px-7 py-2.5`}
className={`${gothampro.className} text-white bg-[#1068B0] text-base md:text-xl px-4 md:px-7 py-1.5 md:py-2.5 text-center`}
>
{time}
</span>
<span
className={`${gothampro.className} text-[#0D0D0D] text-xl font-medium`}
className={`${gothampro.className} text-[#0D0D0D] text-base md:text-xl font-medium`}
>
{title}
</span>
@@ -63,17 +63,17 @@ function Scheme() {
];
return (
<div className="bg-[#F4F4F4] relative pt-20 pb-32">
<div className="bg-[#F4F4F4] relative pt-10 md:pt-20 pb-16 md:pb-32 px-4 md:px-0">
<div className="container mx-auto">
<div className="flex flex-row justify-between">
<div className="flex flex-col md:flex-row md:justify-between space-y-4 md:space-y-0">
<h1
className={`${fluxgore.className} text-7xl text-[#060606] relative`}
className={`${fluxgore.className} text-4xl md:text-7xl text-[#060606] relative`}
>
схема фестиваля
</h1>
<p
className={`${gothampro.className} text-[#060606] text-xl max-w-[354px] leading-none self-end`}
className={`${gothampro.className} text-[#060606] text-base md:text-xl max-w-full md:max-w-[354px] leading-normal md:leading-none md:self-end`}
>
[Выберите площадку, чтобы увидеть расписание]
</p>
@@ -82,10 +82,10 @@ function Scheme() {
<img
src="/images/scheme/map.png"
alt="Festival Map"
className="mt-20 w-full h-auto"
className="mt-10 md:mt-20 w-full h-auto"
/>
<div className="flex flex-row mt-40 space-x-5 justify-center">
<div className="flex flex-col md:flex-row mt-10 md:mt-40 space-y-3 md:space-y-0 md:space-x-5 items-center justify-center">
<Button shadowEnabled={false} variant="blue">
5 сентября
</Button>
@@ -97,7 +97,7 @@ function Scheme() {
</Button>
</div>
<div className="flex flex-row mt-14 space-x-12 justify-center min-h-10">
<div className="flex flex-wrap md:flex-row mt-8 md:mt-14 gap-3 md:gap-0 md:space-x-12 justify-center min-h-10">
{venues.map((venue) => (
<SchemeSelect
key={venue.name}
@@ -109,7 +109,7 @@ function Scheme() {
))}
</div>
<div className="grid grid-cols-2 gap-4 mt-20 max-w-4xl mx-auto">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 mt-10 md:mt-20 max-w-4xl mx-auto">
<SchemeItem time="10:00-10:30" title="Открытие фестиваля" />
<SchemeItem time="10:00-10:30" title="Открытие фестиваля" />
<SchemeItem time="10:00-10:30" title="Открытие фестиваля" />
+15 -11
View File
@@ -10,12 +10,14 @@ function VideoStats(props: VideoStatsProps) {
const { number, label } = props;
return (
<div className="flex flex-col">
<h1 className={`${fluxgore.className} text-8xl text-[#1068B0] relative`}>
<h1
className={`${fluxgore.className} text-4xl md:text-8xl text-[#1068B0] relative`}
>
{number}
</h1>
<p
className={`${gothampro.className} text-[#E6E6E6] text-xl max-w-[536px] leading-normal uppercase`}
className={`${gothampro.className} text-[#E6E6E6] text-sm md:text-xl max-w-[536px] leading-normal uppercase`}
>
{label}
</p>
@@ -26,7 +28,7 @@ function VideoStats(props: VideoStatsProps) {
function Video() {
return (
<div
className="bg-[#161616] relative overflow-hidden pt-20"
className="bg-[#161616] relative overflow-hidden pt-10 md:pt-20"
style={{
backgroundImage: `url('/images/noise.svg')`,
backgroundSize: "cover",
@@ -40,14 +42,16 @@ function Video() {
alt="Lines"
/>
<div className="container mx-auto">
<div className="flex flex-row space-x-16">
<h1 className={`${fluxgore.className} text-7xl text-white relative`}>
<div className="container mx-auto px-4">
<div className="flex flex-col md:flex-row space-y-6 md:space-y-0 md:space-x-16">
<h1
className={`${fluxgore.className} text-4xl md:text-7xl text-white relative`}
>
как это Было
</h1>
<p
className={`${gothampro.className} text-[#E6E6E6] opacity-90 text-xl max-w-[536px] leading-none`}
className={`${gothampro.className} text-[#E6E6E6] opacity-90 text-base md:text-xl max-w-full md:max-w-[536px] leading-relaxed md:leading-none`}
>
Прошлый фестиваль технических видов спорта стал незабываемым
праздником скорости и мастерства, собрав рекордное количество
@@ -55,7 +59,7 @@ function Video() {
</p>
</div>
<div className="flex mt-14">
<div className="flex mt-8 md:mt-14">
<iframe
src="https://www.youtube.com/embed/FVzlAMLPFh0?si=E_EaXkQ3tJYtyf_s"
title="YouTube video player"
@@ -66,12 +70,12 @@ function Video() {
className="w-full h-auto aspect-video"
style={{
clipPath:
"polygon(60px 0, 100% 0, 100% calc(100% - 60px), calc(100% - 60px) 100%, 0 100%, 0 60px)",
"polygon(30px 0, 100% 0, 100% calc(100% - 30px), calc(100% - 30px) 100%, 0 100%, 0 30px)",
}}
></iframe>
</div>
<div className="grid grid-cols-4 gap-24 mt-36 pb-64">
<div className="grid grid-cols-2 md:grid-cols-4 gap-8 md:gap-24 mt-16 md:mt-36 pb-32 md:pb-64">
<VideoStats number="260" label="[ единиц техники ]" />
<VideoStats
number="11"
@@ -86,7 +90,7 @@ function Video() {
</div>
<img
className="absolute bottom-0 object-cover"
className="absolute bottom-0 object-cover w-full"
src="/images/video/paper_tear.png"
alt="Paper tear"
/>
+2 -1
View File
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import Activities from "@/components/Activities";
import Cover from "@/components/Cover";
import Events from "@/components/Events";
@@ -17,7 +18,7 @@ export default function Home() {
<Cover />
<Info />
<Video />
<Scheme />
{/* <Scheme /> */}
<Events />
<Activities />
<Partners />