This commit is contained in:
2025-09-11 16:42:34 +05:00
parent ea548c4dce
commit 517f67714a
18 changed files with 121 additions and 90 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 532 KiB

After

Width:  |  Height:  |  Size: 721 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+4 -4
View File
@@ -32,9 +32,9 @@ export default function TourPopup({ visible }: { visible: boolean }) {
style={{ opacity: 0 }}
animate={{ y: -40, opacity: 1 }}
transition={{ type: "spring" }}
className="absolute z-[9] bottom-[-40px] left-0 p-[1.111vw] flex flex-col justify-between bg-[#37393B99] backdrop-blur w-[23.611vw] h-auto gap-[1.389vw] rounded-[1.111vw]
md:max-lg:w-[44.271vw] md:max-lg:h-[47.917vw] md:max-lg:rounded-[2.083vw] md:max-lg:p-[2.083vw]
max-md:relative max-md:w-full max-md:mt-[6.667vw] max-md:rounded-[4.444vw] max-md:p-[4.444vw] max-md:h-[102.222vw]"
className="absolute z-[9] bottom-[-40px] left-0 p-[1.111vw] flex flex-col justify-between bg-[#37393B99] backdrop-blur w-[23.611vw] gap-[1.111vw] md:max-lg:gap-[2.083vw] max-md:gap-[4.444vw] rounded-[1.111vw]
md:max-lg:w-[44.271vw] md:max-lg:rounded-[2.083vw] md:max-lg:p-[2.083vw]
max-md:relative max-md:w-full max-md:mt-[6.667vw] max-md:rounded-[4.444vw] max-md:p-[4.444vw]"
>
<span
className="text-start text-[1.389vw] leading-[1.656vw] tracking-[-0.02em] font-medium
@@ -62,7 +62,7 @@ export default function TourPopup({ visible }: { visible: boolean }) {
src="/videos/pages/web/demo/popup.mp4"
/>
<Button
className="w-full rounded-[1.111vw] py-[1.111vw] text-[0.966vw] md:max-lg:rounded-[2.083vw] md:max-lg:py-[2.083vw] md:max-lg:text-[1.823vw] max-md:rounded-[4.444vw] max-md:py-[4.444vw] max-md:text-[3.889vw]"
className="w-full rounded-[1.111vw] py-[1.111vw] text-[0.966vw] md:max-lg:rounded-[2.083vw] md:max-lg:py-[1.111vw] md:max-lg:text-[1.823vw] max-md:rounded-[4.444vw] max-md:py-[4.444vw] max-md:text-[3.889vw]"
onClick={handlePopupBtnClick}
>
Оставить заявку
@@ -8,16 +8,19 @@ import EventLogo2 from "../../../../public/img/pages/about/experience/EventLogo2
import { ArticleCard } from "../BlogPage/ArticleCard";
import { useSearchParams } from "next/navigation";
import { useGetArticlesQuery } from "@/queries/getArticles";
import AchievementsCardsMobile from "./AchievementsCardsMobile";
import { motion } from "framer-motion";
import DisplacementCard from "../../displacement/DisplacementCard";
import DisplacementCardsWrapper from "../../displacement/DisplacementCardsWrapper";
import { useGetProjectsCountQuery } from "@/queries/getProjectsCount";
import { getProjectsCountWithGenitive } from "@/utils/getProjectsCount";
export default function AboutExperience() {
const searchParams = useSearchParams();
const { data: articles } = useGetArticlesQuery(searchParams.getAll("tags"));
const { data: projectsCount } = useGetProjectsCountQuery();
return (
<>
{/* Плитка */}
@@ -29,7 +32,8 @@ export default function AboutExperience() {
>
За 15 лет работы мы реализовали более{" "}
<span className="text-transparent bg-clip-text">
65 проектов в сфере интерактивных технологий
{projectsCount && getProjectsCountWithGenitive(projectsCount)} в
сфере интерактивных технологий
</span>
</h2>
@@ -190,8 +194,8 @@ export default function AboutExperience() {
/>
<AboutEventCard
logo={EventLogo2}
place={"Москва, GOELRO"}
date={"10 сентября 12 сентября"}
place={"Екатеринбург, ЭКСПО"}
date={"30 сентября 3 октября"}
color={"#3F58FF"}
/>
</div>
@@ -223,7 +227,7 @@ export default function AboutExperience() {
/>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
Наш продукт зарегистрирован{" "}
<br className="block min-md:hidden" /> и включен в реестр{" "}
<br className="min-md:hidden block" /> и включен в реестр{" "}
<br className="nidden md:max-lg:block" />
отечественного ПО
</p>
@@ -239,8 +243,8 @@ export default function AboutExperience() {
alt="Заняли 1 место на WOW AWARDS 2024 совместно с застройщиком Upside Development"
/>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
Заняли 1 место на <br className="block min-md:hidden" /> WOW
AWARDS 2024 совместно с застройщиком Upside Development
Мы заняли 1 место на WOW AWARDS 2024 совместно c застройщиком
Upside Development
</p>
</DisplacementCard>
@@ -249,19 +253,19 @@ export default function AboutExperience() {
className="lg:bottom-0 lg:left-[8.194vw]"
>
<img
src={"/img/pages/about/experience/cards/sk.png"}
className="lg:w-[9.444vw] lg:h-[9.444vw] md:w-[25.708vw] md:h-[25.708vw] w-[45.556vw] h-[45.556vw] my-auto object-cover hover:scale-[1.15] transition-all duration-300"
alt="Мы резиденты Сколково"
src={"/img/pages/about/experience/cards/build_up.png"}
className="lg:w-[9.444vw] lg:h-[9.444vw] md:w-[17.708vw] md:h-[17.708vw] w-[25.556vw] h-[25.556vw] my-auto object-cover hover:scale-[1.15] transition-all duration-300"
alt="В 2023 году мы выиграли Build UP в категории IT"
/>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
Мы резиденты Сколково
В 2023 году мы выиграли Build UP в категории IT
</p>
</DisplacementCard>
<DisplacementCard index={3} className="lg:top-0 lg:right-[8.194vw]">
<img
src={"/img/pages/about/experience/cards/map.png"}
className="lg:w-[9.444vw] lg:h-[9.444vw] md:w-[20.708vw] md:h-[20.708vw] w-[35.556vw] h-[35.556vw] my-auto object-cover hover:scale-[1.15] transition-all duration-300"
className="lg:w-[9.444vw] lg:h-[9.444vw] md:w-[20.708vw] md:h-[20.708vw] w-[35.556vw] h-[35.556vw] my-auto object-cover hover:scale-[1.35] scale-[1.25] transition-all duration-300"
alt="Наши интерактивные столы стоят уже в 16 городах России"
/>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
@@ -279,8 +283,8 @@ export default function AboutExperience() {
alt="Каждый наш проект, получил одну или несколько наград на платформе Dprofile"
/>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
Каждый наш проект, получил одну или несколько наград на
платформе Dprofile
Каждый наш проект получил одну или несколько наград на платформе
Dprofile
</p>
</DisplacementCard>
@@ -289,12 +293,12 @@ export default function AboutExperience() {
className="lg:bottom-0 lg:right-[16.389vw]"
>
<img
src={"/img/pages/about/experience/cards/build_up.png"}
className="lg:w-[9.444vw] lg:h-[9.444vw] md:w-[17.708vw] md:h-[17.708vw] w-[25.556vw] h-[25.556vw] my-auto object-cover hover:scale-[1.15] transition-all duration-300"
alt="В 2023 году мы выиграли Build UP в категории IT"
src={"/img/pages/about/experience/cards/sk.png"}
className="lg:w-[9.444vw] lg:h-[9.444vw] md:w-[25.708vw] md:h-[25.708vw] w-[45.556vw] h-[45.556vw] my-auto object-cover hover:scale-[1.15] transition-all duration-300"
alt="Мы резиденты Сколково"
/>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
В 2023 году мы выиграли Build UP в категории IT
Мы - резиденты Сколково
</p>
</DisplacementCard>
</DisplacementCardsWrapper>
+19 -12
View File
@@ -6,22 +6,29 @@ import { motion, useInView } from "framer-motion";
function TeamCarousel() {
return (
<div className="lg:right-[-11vw] lg:top-[-11vw] -right-1/3 -top-1/3 absolute lg:w-[29.611vw] md:w-[50.271vw] w-[95.444vw] aspect-square ">
<motion.div
animate={{ rotate: 360 }}
transition={{ ease: "linear", duration: 50, repeat: Infinity }}
className="w-full h-full aspect-square relative flex items-center justify-center"
className="aspect-square flex relative justify-center items-center w-full h-full"
>
<img src="/img/pages/about/team/3ds_outer.png" alt="" className="w-full h-full" />
<img
src="/img/pages/about/team/3ds_outer.png"
alt=""
className="w-full h-full"
/>
</motion.div>
<motion.div
animate={{ rotate: -360 }}
transition={{ ease: "linear", duration: 50, repeat: Infinity }}
className="absolute inset-0 flex items-center justify-center"
>
<img src="/img/pages/about/team/3ds_inner.png" alt="" className="lg:w-[12.708vw] md:w-[20.828vw] w-[40.833vw]" />
</motion.div>
<motion.div
animate={{ rotate: -360 }}
transition={{ ease: "linear", duration: 50, repeat: Infinity }}
className="flex absolute inset-0 justify-center items-center"
>
<img
src="/img/pages/about/team/3ds_inner.png"
alt=""
className="lg:w-[12.708vw] md:w-[20.828vw] w-[40.833vw]"
/>
</motion.div>
</div>
);
}
@@ -80,7 +87,7 @@ export default function AboutTeam() {
Георгий Уморин
</h3>
<span className="caption md:max-lg:text-[1.302vw] max-md:text-[2.778vw]">
Генеральный директор
Генеральный директор, основатель
</span>
</motion.div>
<motion.div
@@ -120,7 +127,7 @@ export default function AboutTeam() {
<div className="mt-auto space-y-[1.667vw] max-md:space-y-[3.333vw]">
<span className="line1 md:max-lg:text-[12.5vw]">3</span>
<h3 className="headline2">
PMa этим цирком <br /> руководят
3 проджект-менеджера руководят и улучшают проекты
</h3>
</div>
</motion.div>
@@ -33,7 +33,7 @@ export default function AchievementsCardsMobile({
}
title={
web
? "Люди гуляют в окрестностях ЖК"
? "Люди гуляют в окрестностях ЖК"
: "Наш продукт зарегистрирован и включен в реестр отечественного ПО"
}
className="relative w-full md:max-lg:translate-y-[3.125vw] max-md:aspect-[165/240]"
@@ -64,7 +64,7 @@ export default function ContentSlideCards({
exit={{ x: "4.167vw", y: "-4.167vw" }}
transition={{ duration: 0.5, type: "just" }}
className="lg:w-[13.403vw] md:w-[18.229vw] w-[38.889vw] flex flex-col lg:gap-[0.694vw] gap-2 lg:p-[1.389vw] p-4 bg-[#37393B99] backdrop-blur-[5px] rounded-[1.111vw] absolute lg:left-[5.25vw] lg:bottom-[2.625vw] left-0 bottom-0
max-md:bottom-[15vw] max-md:left-[5vw] max-md:rounded-[4.444vw] md:max-lg:p-[2.083vw] md:max-lg:left-[2.083vw] md:max-lg:bottom-[2.083vw]"
max-md:bottom-[15vw] max-md:left-[5vw] max-md:rounded-[4.444vw] md:max-lg:p-[2.083vw] md:max-lg:left-[2.083vw] md:max-lg:bottom-[10vw]"
>
<span className="headline2 z-[3]">Для соцсетей:</span>
<p className="text2 text-[#FFFFFF60]">
@@ -78,7 +78,7 @@ export default function ContentSlideCards({
exit={{ x: "-4.167vw", y: "4.167vw" }}
transition={{ duration: 0.5, type: "just" }}
className="lg:w-[13.403vw] md:w-[18.229vw] w-[38.889vw] flex flex-col lg:gap-[0.694vw] gap-2 lg:p-[1.389vw] p-4 bg-[#37393B99] backdrop-blur-[5px] rounded-[1.111vw] absolute lg:right-[5.25vw] lg:top-[2.625vw] right-0 top-0
max-md:top-[15vw] max-md:right-[5vw] max-md:rounded-[4.444vw] md:max-lg:p-[2.083vw] md:max-lg:right-[2.083vw] md:max-lg:top-[2.083vw]"
max-md:top-[15vw] max-md:right-[5vw] max-md:rounded-[4.444vw] md:max-lg:p-[2.083vw] md:max-lg:right-[2.083vw] md:max-lg:top-[10vw]"
>
<span className="headline2">Для наружной рекламы:</span>
<p className="text2 text-[#FFFFFF60]">
@@ -42,7 +42,6 @@ export default function ContentSlideHall({
return (
<motion.div
// key={id}
initial={{
maxWidth: isLg
? index === 1
@@ -79,7 +78,7 @@ export default function ContentSlideHall({
opacity: active ? 1 : 0,
}}
className="lg:w-[13.403vw] md:w-[18.229vw] w-[38.889vw] flex flex-col lg:gap-[0.694vw] gap-2 lg:p-[1.389vw] p-4 bg-[#37393B99] backdrop-blur-[5px] lg:rounded-[1.111vw] rounded-2xl absolute lg:left-[5.25vw] lg:bottom-[2.625vw] left-0 bottom-0
max-md:bottom-[15vw] max-md:left-[5vw] md:max-lg:p-[2.083vw] md:max-lg:left-[2.083vw] md:max-lg:bottom-[6.083vw]"
max-md:bottom-[15vw] max-md:left-[5vw] md:max-lg:p-[2.083vw] md:max-lg:left-[2.083vw] md:max-lg:bottom-[10vw]"
>
<span className="headline2 z-[3]">По двору:</span>
<p className="text2 text-[#FFFFFF60] ">
@@ -92,7 +91,7 @@ export default function ContentSlideHall({
opacity: active ? 1 : 0,
}}
className="lg:w-[13.403vw] md:w-[18.229vw] w-[38.889vw] flex flex-col lg:gap-[0.694vw] gap-2 lg:p-[1.389vw] p-4 bg-[#37393B99] backdrop-blur-[5px] lg:rounded-[1.111vw] rounded-2xl absolute lg:right-[5.25vw] lg:top-[2.625vw] right-0 top-0
max-md:top-[15vw] max-md:right-[5vw] md:max-lg:p-[2.083vw] md:max-lg:right-[2.083vw] md:max-lg:top-[6.083vw]"
max-md:top-[15vw] max-md:right-[5vw] md:max-lg:p-[2.083vw] md:max-lg:right-[2.083vw] md:max-lg:top-[10vw]"
>
<span className="headline2">По квартире:</span>
<p className="text2 text-[#FFFFFF60] ">
@@ -4,7 +4,7 @@ import { motion, AnimatePresence } from "framer-motion";
import { useRef } from "react";
function Iphone({ active }: { active: boolean }) {
return active ? (
return (
<div className="relative w-[17vw] h-auto aspect-[576/1182] items-center mx-auto my-auto md:max-lg:w-[24.881vw] max-md:w-[50vw]">
<motion.img
initial={{ opacity: 0 }}
@@ -14,26 +14,32 @@ function Iphone({ active }: { active: boolean }) {
className="absolute w-full h-full z-[8]"
alt=""
/>
<motion.video
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
src={"/videos/pages/web/iphone_vid.mp4"}
muted
autoPlay
loop
className="mx-auto w-[98%] h-[99%] translate-y-[0.5%] z-[7] lg:rounded-[3vw] rounded-2xl md:max-lg:rounded-[4vw] max-md:rounded-[8vw]"
/>
<AnimatePresence mode="popLayout">
{active ? (
<motion.video
key={1}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
src={"/videos/pages/web/iphone_vid.mp4"}
muted
autoPlay
loop
className="mx-auto w-[98%] h-[99%] translate-y-[0.5%] z-[7] lg:rounded-[3vw] rounded-2xl md:max-lg:rounded-[4vw] max-md:rounded-[8vw]"
/>
) : (
<motion.img
key={2}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
src={"/img/pages/web/content/iphone_new.png"}
alt=""
className="mx-auto w-auto h-full lg:rounded-[3.333vw] md:rounded-[4.444vw] rounded-3xl"
/>
)}
</AnimatePresence>
</div>
) : (
<motion.img
initial={{ opacity: 0 }}
animate={{ opacity: 1, scale: 0.7 }}
exit={{ opacity: 0 }}
src={"/img/pages/web/content/iphone_disabled.png"}
alt=""
className="mx-auto w-auto h-full lg:rounded-[0.417vw] rounded-2xl"
/>
);
}
@@ -47,7 +53,6 @@ export default function ContentSlideIphone({
index?: number;
}) {
const IphoneRef = useRef(null);
// useParallax(IphoneRef);
const { isMd, isLg } = useMediaQueries();
@@ -78,7 +83,7 @@ export default function ContentSlideIphone({
: "94.444vw",
}}
transition={{ duration: 0.5, type: "just" }}
className="lg:h-[37.361vw] md:h-[68.448vw] h-[151.111vw] relative flex-shrink-0 w-full select-none pointer-events-none"
className="lg:h-[37.361vw] md:max-lg:h-[68.448vw] h-[151.111vw] relative flex-shrink-0 w-full select-none pointer-events-none"
>
<div ref={IphoneRef} className="flex absolute inset-0 items-center">
<motion.div
@@ -86,7 +91,7 @@ export default function ContentSlideIphone({
opacity: active ? 1 : 0,
top:
(isLg && (active ? "1.528vw" : "0.528vw")) ||
(isMd && (active ? "6.528vw" : "0.528vw")) ||
(isMd && (active ? "10vw" : "15.528vw")) ||
"11.111vw",
left: isLg ? (active ? "5.694vw" : "20.694vw") : "0vw",
}}
@@ -164,10 +169,7 @@ export default function ContentSlideIphone({
</p>
</motion.div>
</div>
<AnimatePresence>
<Iphone active={active} />
</AnimatePresence>
<Iphone active={active} />
</motion.div>
);
}
@@ -53,15 +53,17 @@ export default function InfiniteSlider() {
});
return (
<div className="lg:-mx-[3vw] md:-mx-[2.083vw] -mx-[2.778vw] border border-red-500">
<div className="flex overflow-hidden relative w-full " {...handlers}>
<div className="lg:-mx-[3vw] md:-mx-[2.083vw] -mx-[2.778vw]">
<div className="overflow-hidden relative w-full" {...handlers}>
<div
onTransitionEnd={() => setIsAnimating(false)}
className="flex lg:gap-[2vw] md:gap-[2.083vw] gap-[2.778vw]"
style={{
transform: `translateX(${slideOffset}vw)`,
transitionDuration: `${
slideOffset % (-2 * slideWidth) === -offset ? 0 : 0.5
Math.abs((slideOffset % (-2 * slideWidth)) + offset) < 0.1
? 0
: 0.5
}s`,
}}
>
+13 -16
View File
@@ -12,10 +12,10 @@ import { useMediaQuery } from "usehooks-ts";
const cloudsAnimationStyles = `
@keyframes cloudMove {
0% {
transform: translateX(-100%);
transform: translateX(-200%);
}
100% {
transform: translateX(0%);
transform: translateX(-0%);
}
}
@@ -80,10 +80,7 @@ export default function WebDemo() {
return (
<>
<div
className="w-full aspect-[140/68] flex items-center justify-center relative
md:max-lg:items-start "
>
<div className="w-full aspect-[140/68] flex items-center justify-center relative md:max-lg:items-start">
<div className="flex flex-col gap-y-[1.667vw] text-center w-[68.333vw] md:max-lg:w-full md:max-lg:gap-y-[3.125vw] max-md:w-full max-md:gap-[6.667vw]">
<p className="headline1 text-[#7A7A7A] md:max-lg:mb-[calc(4.557vw-3.125vw)] max-md:w-[94.444vw] md:max-lg:mt-[3.125vw]">
С помощью интерактивного сайта
@@ -109,7 +106,7 @@ export default function WebDemo() {
</div>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
Люди гуляют в окрестностях ЖК
Люди гуляют в окрестностях ЖК
</p>
</DisplacementCard>
@@ -129,7 +126,7 @@ export default function WebDemo() {
</div>
<p className="z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]">
Машины ездят по основным магистралям
Машины ездят по основным магистралям
</p>
</DisplacementCard>
@@ -165,8 +162,8 @@ export default function WebDemo() {
"z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw] mt-auto"
}
>
Облака движутся в нужом направлении, как в реальном времени на
вашей локации
Облака движутся в нужном направлении, как в реальном времени
на вашей локации
</p>
</DisplacementCard>
@@ -203,7 +200,7 @@ export default function WebDemo() {
"z-10 text-center btns md:max-lg:text-[1.563vw] max-md:text-[3.333vw]"
}
>
Вся инфраструктура будет отмечена на карте ближайшего окружения
Вся инфраструктура будет отмечена на карте ближайшего окружения
</p>
</DisplacementCard>
@@ -238,7 +235,7 @@ export default function WebDemo() {
width: demoActive ? "100vw" : isMobile ? "100%" : "80vw",
}}
className="relative max-w-full aspect-[1400/784] mx-auto rounded-[1.111vw] overflow-clip
md:max-lg:aspect-[736/1028] md:max-lg:rounded-[2.083vw]
md:max-lg:h-screen md:max-lg:rounded-[2.083vw]
max-md:w-[94.444vw] max-md:aspect-[340/600] max-md:rounded-[4.444vw]"
>
<div className="relative w-full h-full overflow-clip rounded-[1.111vw] md:max-lg:rounded-[2.083vw] max-md:rounded-[4.444vw]">
@@ -260,11 +257,11 @@ export default function WebDemo() {
) : (
<button
onClick={() => setDemoActive(false)}
className="bg-[#37393B99] absolute z-10 top-[1.111vw] right-[1.111vw] backdrop-blur-[20px] btn-l p-[1.389vw] rounded-[1.111vw] text-[1.111vw]
md:max-lg:rounded-[2.083vw] md:max-lg:text-[2.083vw] md:max-lg:p-[2.604vw] md:max-lg:top-[2.083vw] md:max-lg:right-[2.083vw]
max-md:rounded-[4.444vw] max-md:text-[4.444vw] max-md:p-[2.778vw] max-md:top-[4.444vw] max-md:right-[4.444vw]"
className="bg-[#37393B99] absolute z-10 top-[1.111vw] right-[1.111vw] backdrop-blur-[20px] btn-l p-[1.111vw] rounded-[1.111vw] text-[1.111vw]
md:max-lg:rounded-[1.111vw] md:max-lg:text-[2.083vw] md:max-lg:p-[1.111vw] md:max-lg:top-[1.111vw] md:max-lg:right-[1.111vw]
max-md:rounded-[4.444vw] max-md:text-[4.444vw] max-md:p-[2.778vw] max-md:top-[2.222vw] max-md:right-[2.222vw]"
>
<div className="size-10">
<div className="lg:size-[1.111vw] size-5">
<CloseIcon />
</div>
</button>
@@ -109,7 +109,7 @@ export default function WebExperience() {
md:max-lg:p-[4.167vw] md:max-lg:text-[3.125vw]
max-md:rounded-[4.444vw] max-md:p-[8.889vw]"
>
<span className="headline1 z-[1]">Выбор кладовых и паркинга</span>
<span className="headline1 z-[1]">Выбор кладовых и паркинга</span>
<img
src="/img/pages/web/experience/parking.png"
alt=""
+2 -2
View File
@@ -49,9 +49,9 @@ export default function WebMain() {
max-md:text-[8.889vw] max-md:mb-[6.667vw]"
>
<span className="text-transparent bg-clip-text">
Берем создание контента на себя,{" "}
Берем создание контента на себя, 
</span>
берем <br /> классно и в две строчки
используем материалы из основного проекта
</h2>
<InfiniteSlider />
</div>
+21 -1
View File
@@ -1,3 +1,23 @@
export function getProjectsCount(count: number) {
return `${count}\xa0проект${count > 10 && count < 15 ? 'ов' : count % 10 === 1 ? '' : count % 10 === 2 || count % 10 === 3 || count % 10 === 4 ? 'а' : 'ов'}`;
return `${count}\xa0проект${
count > 10 && count < 15
? "ов"
: count % 10 === 1
? ""
: count % 10 === 2 || count % 10 === 3 || count % 10 === 4
? "а"
: "ов"
}`;
}
export function getProjectsCountWithGenitive(count: number) {
return `${count}\xa0проект${
count > 10 && count < 15
? "ов"
: count % 10 === 1
? "а"
: count % 10 === 2 || count % 10 === 3 || count % 10 === 4
? "а"
: "ов"
}`;
}