From 26e78edf5c2d84b9f08a79f0c55de0e6a747b800 Mon Sep 17 00:00:00 2001 From: "diana.dolgolyova" Date: Tue, 10 Mar 2026 13:25:53 +0300 Subject: [PATCH] feat: about stats cards, pricing popular badge, back-to-top button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - About: add 3 stat cards (13 trainers, 6 styles, 2 locations) - Pricing: highlight first plan with gold "Популярный" badge - BackToTop: floating gold button appears after 600px scroll Co-Authored-By: Claude Opus 4.6 --- src/app/page.tsx | 2 ++ src/components/sections/About.tsx | 29 ++++++++++++++++ src/components/sections/Pricing.tsx | 52 +++++++++++++++++------------ src/components/ui/BackToTop.tsx | 28 ++++++++++++++++ 4 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 src/components/ui/BackToTop.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index 0fd937a..c69df1e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -5,6 +5,7 @@ import { Classes } from "@/components/sections/Classes"; import { Pricing } from "@/components/sections/Pricing"; import { FAQ } from "@/components/sections/FAQ"; import { Contact } from "@/components/sections/Contact"; +import { BackToTop } from "@/components/ui/BackToTop"; export default function HomePage() { return ( @@ -16,6 +17,7 @@ export default function HomePage() { + ); } diff --git a/src/components/sections/About.tsx b/src/components/sections/About.tsx index 7e2f847..8c84fc4 100644 --- a/src/components/sections/About.tsx +++ b/src/components/sections/About.tsx @@ -1,7 +1,14 @@ +import { Users, Layers, MapPin } from "lucide-react"; import { siteContent } from "@/data/content"; import { SectionHeading } from "@/components/ui/SectionHeading"; import { Reveal } from "@/components/ui/Reveal"; +const stats = [ + { icon: , value: "13", label: "тренеров" }, + { icon: , value: "6", label: "направлений" }, + { icon: , value: "2", label: "зала в Минске" }, +]; + export function About() { const { about } = siteContent; @@ -22,6 +29,28 @@ export function About() { ))} + + {/* Stats */} + +
+ {stats.map((stat, i) => ( +
+
+ {stat.icon} +
+ + {stat.value} + + + {stat.label} + +
+ ))} +
+
); diff --git a/src/components/sections/Pricing.tsx b/src/components/sections/Pricing.tsx index 3aafd59..fb85d32 100644 --- a/src/components/sections/Pricing.tsx +++ b/src/components/sections/Pricing.tsx @@ -54,28 +54,38 @@ export function Pricing() { {pricing.subtitle}

- {pricing.items.map((item, i) => ( -
0 ? "border-t border-neutral-100 dark:border-white/[0.04]" : "" - }`} - > -
-

- {item.name} -

- {item.note && ( -

- {item.note} -

- )} + {pricing.items.map((item, i) => { + const isPopular = i === 0; + return ( +
0 ? "border-t border-neutral-100 dark:border-white/[0.04]" : "" + } ${isPopular ? "bg-[#c9a96e]/[0.04] dark:bg-[#c9a96e]/[0.03]" : ""}`} + > +
+
+

+ {item.name} +

+ {isPopular && ( + + Популярный + + )} +
+ {item.note && ( +

+ {item.note} +

+ )} +
+ + {item.price} +
- - {item.price} - -
- ))} + ); + })}
diff --git a/src/components/ui/BackToTop.tsx b/src/components/ui/BackToTop.tsx new file mode 100644 index 0000000..6834312 --- /dev/null +++ b/src/components/ui/BackToTop.tsx @@ -0,0 +1,28 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { ChevronUp } from "lucide-react"; + +export function BackToTop() { + const [visible, setVisible] = useState(false); + + useEffect(() => { + function handleScroll() { + setVisible(window.scrollY > 600); + } + window.addEventListener("scroll", handleScroll, { passive: true }); + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + return ( + + ); +}