upd main gradient

This commit is contained in:
2026-04-16 16:31:22 +05:00
parent 211e8b3fa0
commit 3889cf2ad9
40 changed files with 114 additions and 93 deletions
+12 -5
View File
@@ -122,17 +122,24 @@ html {
-webkit-text-fill-color: transparent;
}
.text-gradient-saturated {
background: linear-gradient(45deg, #7a55ff 0%, #c932e8 75%, #ff79d2 95%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.bg-gradient {
background: linear-gradient(87deg, #798fff 15%, #d375ff 100%);
}
.bg-gradient-saturated {
background: linear-gradient(45deg, #7A55FF 0%, #C932E8 75%, #FF79D2 95%);
background: linear-gradient(45deg, #7a55ff 0%, #c932e8 75%, #ff79d2 95%);
}
.upside-table-mask {
-webkit-mask-image:url('/img/cases/UpsideTowers/table_mask.png');
mask-image: url('/img/cases/UpsideTowers/table_mask.png');
-webkit-mask-image: url("/img/cases/UpsideTowers/table_mask.png");
mask-image: url("/img/cases/UpsideTowers/table_mask.png");
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-size: 100% 100%;
@@ -142,8 +149,8 @@ html {
}
.upside-tablet-mask {
-webkit-mask-image:url('/img/cases/UpsideTowers/tablet_mask.png');
mask-image: url('/img/cases/UpsideTowers/tablet_mask.png');
-webkit-mask-image: url("/img/cases/UpsideTowers/tablet_mask.png");
mask-image: url("/img/cases/UpsideTowers/tablet_mask.png");
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-size: 100% 100%;
+1 -1
View File
@@ -222,7 +222,7 @@ export function FeedbackForm() {
) : (
<div className="bg-[#37393B99] aspect-[643/480] w-full rounded-2xl flex justify-center items-center">
<div className="flex gap-3 justify-center items-center">
<div className="bg-gradient p-3 rounded-full">
<div className="bg-gradient-saturated p-3 rounded-full">
<div className="text-white lg:size-[1.667vw] size-6">
<CheckIcon />
</div>
+2 -2
View File
@@ -143,7 +143,7 @@ export function Header() {
<div className="md:justify-end flex flex-1 justify-center">
<Link
href={"/form"}
className="btnm bg-gradient font-medium lg:px-[1.667vw] lg:py-[1.181vw] py-[17px] px-6 text-nowrap lg:rounded-[1.111vw] rounded-2xl flex items-center"
className="btnm bg-gradient-saturated font-medium lg:px-[1.667vw] lg:py-[1.181vw] py-[17px] px-6 text-nowrap lg:rounded-[1.111vw] rounded-2xl flex items-center"
>
Оставить заявку
</Link>
@@ -257,7 +257,7 @@ export function Header() {
<a
target="_blank"
href={"https://dprofile.ru/graff.estate"}
className="max-xl:hidden rounded-[20px] bg-[#37393B99] backdrop-blur-[20px] hover:bg-[#232425] py-5 pl-[63px] pr-[33px] right-5 fixed z-[2] top-5 overflow-clip bg-[url(/img/components/header/dp.png)] bg-no-repeat bg-right-bottom"
className="max-lg:hidden rounded-[20px] bg-[#37393B99] backdrop-blur-[20px] hover:bg-[#232425] py-5 pl-[63px] pr-[33px] right-5 fixed z-[2] top-5 overflow-clip bg-[url(/img/components/header/dp.png)] bg-no-repeat bg-right-bottom"
>
<img
src={"/img/components/header/show_case.png"}
@@ -42,7 +42,7 @@ export function ArticleButtonLinkInput({
{link && title && (
<Link
href={link}
className="bg-gradient btnm w-fit flex gap-2 items-center px-6 py-4 font-medium rounded-2xl"
className="bg-gradient-saturated btnm w-fit flex gap-2 items-center px-6 py-4 font-medium rounded-2xl"
>
{title ?? "Название кнопки"}
<span className="text-white lg:size-[1.111vw] size-4">
+1 -1
View File
@@ -17,7 +17,7 @@ export function ArticleFormActions({
<>
<div className="space-y-2 absolute left-7 top-5 z-[2]">
<button
className="flex items-center gap-2 lg:py-[0.556vw] lg:px-[0.833vw] py-2 px-3 bg-gradient disabled:bg-[#232425] group disabled:bg-none lg:rounded-[0.833vw] rounded-xl cursor-pointer"
className="flex items-center gap-2 lg:py-[0.556vw] lg:px-[0.833vw] py-2 px-3 bg-gradient-saturated disabled:bg-[#232425] group disabled:bg-none lg:rounded-[0.833vw] rounded-xl cursor-pointer"
disabled={disabled}
onClick={() => handleSave(false)}
>
+1 -1
View File
@@ -55,7 +55,7 @@ function CookiesPopup() {
</div>
<Button
onClick={handlePopupClick}
className="flex items-center gap-x-1 w-full justify-center btns bg-gradient rounded-xl 2xl:py-[0.556vw] py-2 hover:opacity-80 transition-opacity cursor-pointer"
className="flex items-center gap-x-1 w-full justify-center btns bg-gradient-saturated rounded-xl 2xl:py-[0.556vw] py-2 hover:opacity-80 transition-opacity cursor-pointer"
>
Принять
</Button>
+1 -1
View File
@@ -27,7 +27,7 @@ function FeedbackModal({ id }: { id: string }) {
return (
<div className="fixed top-[50%] translate-y-[-50%] flex md:flex-row flex-col md:max-w-[695px] max-w-[422px] max-[360px]:max-w-[340px] z-[15] md:p-[48px] p-[32px] max-[360px]:p-[24px] bg-[#37393B99] backdrop-blur-xl backdrop-opacity-60 rounded-2xl">
<div className="flex md:flex-col flex-row md:justify-center items-center md:max-w-[200px] md:gap-y-[16px] gap-x-[24px]">
<div className="p-3 rounded-full bg-gradient translate-x-[4px]">
<div className="p-3 rounded-full bg-gradient-saturated translate-x-[4px]">
<div className="z-10 absolute top-[-4px] left-[-4.3px] w-[56px] h-[56px] rounded-full bg-gradient-to-r from-[#6078F299] to-[#C868F599]" />
<div className="text-white lg:size-[1.389vw] size-4 relative z-20">
<CheckIcon />
+1 -1
View File
@@ -11,7 +11,7 @@ export function FormModalHeader({
return (
<div className="flex justify-end top-4 right-4 h-[60px] w-full items-end absolute z-[1]">
<button
className="disabled:bg-transparent bg-gradient disabled:bg-none flex gap-2 items-center p-4 rounded-2xl cursor-pointer"
className="disabled:bg-transparent bg-gradient-saturated disabled:bg-none flex gap-2 items-center p-4 rounded-2xl cursor-pointer"
disabled={disabled}
onClick={submitHandler}
>
+1 -1
View File
@@ -172,7 +172,7 @@ export default function QuestionFormModal({
) : (
<div className="bg-[#37393B99] aspect-[643/480] w-full rounded-2xl flex justify-center items-center">
<div className="flex gap-3 justify-center items-center">
<div className="bg-gradient p-3 rounded-full">
<div className="bg-gradient-saturated p-3 rounded-full">
<div className="text-white lg:size-[1.667vw] size-6">
<CheckIcon />
</div>
+1 -1
View File
@@ -57,7 +57,7 @@ function TelegramPopup() {
href={"https://t.me/graffestate"}
target="_blank"
onClick={handlePopupClick}
className="flex items-center gap-x-1 w-full justify-center btns bg-gradient 2xl:rounded-[0.886vw] rounded-xl 2xl:py-[0.556vw] py-2 hover:opacity-80 transition-opacity"
className="flex items-center gap-x-1 w-full justify-center btns bg-gradient-saturated 2xl:rounded-[0.886vw] rounded-xl 2xl:py-[0.556vw] py-2 hover:opacity-80 transition-opacity"
>
Перейти
</Link>
@@ -95,7 +95,7 @@ export function ArticleSyncPage({ slug }: { slug: string }) {
) : block.type === "ButtonLink" ? (
<Link
href={block.link}
className="bg-gradient btnm w-fit flex gap-3 items-center px-6 py-4 rounded-2xl"
className="bg-gradient-saturated btnm w-fit flex gap-3 items-center px-6 py-4 rounded-2xl"
>
{block.title}
<div className="text-white lg:size-[1.111vw] size-4">
@@ -94,7 +94,7 @@ export function ArticlesList() {
</div>
<Link
href={"https://t.me/graffestate"}
className="bg-gradient lg:rounded-[1.111vw] rounded-2xl p-[1.111vw] pl-[1.667vw] flex items-center w-fit lg:gap-[0.556vw] gap-2 group relative cursor-pointer"
className="bg-gradient-saturated lg:rounded-[1.111vw] rounded-2xl p-[1.111vw] pl-[1.667vw] flex items-center w-fit lg:gap-[0.556vw] gap-2 group relative cursor-pointer"
>
<div className="group-hover:bg-black/10 absolute top-0 left-0 w-full h-full rounded-2xl transition-colors" />
<div className="btnm font-medium z-[1]">В телеграм</div>
@@ -134,7 +134,7 @@ export function Calculator() {
Оцените эффективность
<br />
инструмента
<span className="text-gradient"> GRAFF.estate</span>
<span className="text-gradient-saturated"> GRAFF.estate</span>
</Title>
<div className="md:flex gap-x-[0.833vw] gap-y-4 md:items-end grid relative max-md:bg-[#232425B8] max-md:rounded-[25px] max-md:p-4 max-md:pt-10 w-full lg:justify-center md:max-lg:justify-stretch max-md:order-2">
{selectedRegion && (
@@ -73,7 +73,7 @@ export function Clients({ showTitle = true }: { showTitle?: boolean }) {
<div className="flex justify-between items-center">
{showTitle && (
<Title className="mx-auto">
<span className="text-gradient">
<span className="text-gradient-saturated">
{count !== undefined && getCompaniesCount(count)}
</span>{" "}
уже внедрили наш продукт в свою цепочку продаж
@@ -31,7 +31,9 @@ export function PresentationDesktop() {
<div className="mt-[100px] mb-[240px] max-lg:hidden relative">
<Title className="mb-16">
Интерактивная презентация{" "}
<span className="text-gradient">улучшает опыт выбора недвижимости</span>{" "}
<span className="text-gradient-saturated">
улучшает опыт выбора недвижимости
</span>{" "}
и&nbsp;увеличивает темпы продаж квартир в&nbsp;жилом комплексе
</Title>
<div className="relative h-[233.334vw]" ref={container}>
@@ -67,7 +67,7 @@ export function PresentationMini() {
<div ref={titleContainer}>
<Title>
Интерактивная презентация{" "}
<span className="text-gradient">
<span className="text-gradient-saturated">
улучшает&nbsp;опыт выбора&nbsp;недвижимости
</span>{" "}
и&nbsp;увеличивает темпы продаж
+1 -1
View File
@@ -60,7 +60,7 @@ export function Projects({
{title && (
<Title>
За 15 лет работы мы реализовали{" "}
<span className="text-gradient">
<span className="text-gradient-saturated">
{projects && getProjectsCount(projects?.length)}{" "}
для&nbsp;застройщиков
</span>{" "}
+6 -2
View File
@@ -26,8 +26,12 @@ export function Statistics({ customTitle = false }: { customTitle?: boolean }) {
{!customTitle && (
<Title>
Мы разрабатываем
<span className="text-gradient"> эффективный продукт,</span> которым
пользуются уже {count !== undefined && getCompaniesCount(count)}
<span className="text-gradient-saturated">
{" "}
эффективный продукт,
</span>{" "}
которым пользуются уже{" "}
{count !== undefined && getCompaniesCount(count)}
</Title>
)}
<div
@@ -48,12 +48,17 @@ export function Streaming() {
>
<Title className="max-md:hidden select-none">
Уникальная технология
<span className="text-gradient"> удаленной демонстрации</span>{" "}
<span className="text-gradient-saturated">
{" "}
удаленной демонстрации
</span>{" "}
дает&nbsp;возможность презентовать объект покупателю из&nbsp;любой точки
мира
</Title>
<Title headerLevel={2} className="md:hidden text-center select-none">
<span className="text-gradient">Удаленная демонстрация </span>
<span className="text-gradient-saturated">
Удаленная демонстрация {" "}
</span>
презентуйте объект покупателю из&nbsp;любой точки мира
</Title>
<div
@@ -95,7 +100,7 @@ export function Streaming() {
</p>
<Link
href={"/form"}
className="btnm font-medium group-hover:scale-105 duration-500 lg:px-[1.667vw] lg:py-[1.181vw] px-6 py-[17px] transition-transform lg:rounded-[0.833vw] rounded-xl bg-gradient"
className="btnm font-medium group-hover:scale-105 duration-500 lg:px-[1.667vw] lg:py-[1.181vw] px-6 py-[17px] transition-transform lg:rounded-[0.833vw] rounded-xl bg-gradient-saturated"
>
Оставить заявку
</Link>
@@ -59,7 +59,7 @@ export function StreamingProject({
</div>
<div className="lg:hidden absolute right-4 bottom-4">
<Link
className="bg-gradient btns flex gap-2 items-center px-3 py-2 font-medium rounded-xl"
className="bg-gradient-saturated btns flex gap-2 items-center px-3 py-2 font-medium rounded-xl"
href={streaming.find((s) => s.title === title)?.url ?? "/"}
>
Смотреть
@@ -42,7 +42,7 @@ export function InterierConfiguratorCard({ slide }: { slide: number }) {
alt=""
className="rounded-full w-[4.444vw] aspect-square"
/>
<div className="bg-gradient rounded-full p-[0.538vw] absolute z-[1] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2">
<div className="bg-gradient-saturated rounded-full p-[0.538vw] absolute z-[1] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2">
<div className="text-white lg:size-[1.076vw] size-[1.076vw]">
<SwitchIcon />
</div>
@@ -62,7 +62,7 @@ export function PackageTitle({ slide }: { slide: number }) {
<p
className={clsx(
"px-[0.833vw] py-[0.764vw] rounded-[1.181vw] btnm font-medium relative w-[8.056vw] h-[2.5vw]",
slide > 12 && "bg-gradient",
slide > 12 && "bg-gradient-saturated",
slide <= 12 && "bg-[#B5F54E] text-black"
)}
>
+1 -1
View File
@@ -44,7 +44,7 @@ export default function PrimeFAQ() {
/>
<button
onClick={() => setModal(<QuestionFormModal />)}
className="w-full bg-gradient rounded-[1.111vw] btn-l py-[1.111vw] text-[1.111vw] mt-[0.556vw]
className="w-full bg-gradient-saturated rounded-[1.111vw] btn-l py-[1.111vw] text-[1.111vw] mt-[0.556vw]
md:max-lg:text-[2.083vw] md:max-lg:rounded-[2.083vw] md:max-lg:py-[3.125vw] md:max-lg:mt-[1.302vw]
max-md:text-[4.444vw] max-md:py-[5.556vw] max-md:rounded-[4.444vw] max-md:mt-[2.222vw]"
>
+4 -2
View File
@@ -61,8 +61,10 @@ export function PrimeDesktopPage() {
<div className="max-lg:hidden space-y-[3.333vw]">
<Title headerLevel={2}>
Интерактивная презентация улучшает{" "}
<span className="text-gradient">опыт выбора недвижимости</span> и
увеличивает темпы продаж квартир в&nbsp;жилом комплексе
<span className="text-gradient-saturated">
опыт выбора недвижимости
</span>{" "}
и увеличивает темпы продаж квартир в&nbsp;жилом комплексе
</Title>
<div className="relative h-[1498.368vh]">
<div className="h-[93.684vh] sticky top-[3.333vw] -mx-[1.389vw] px-[1.389vw]">
@@ -1,19 +1,19 @@
import { PropsWithChildren } from 'react';
import { useUnit } from 'effector-react';
import { PropsWithChildren } from "react";
import { useUnit } from "effector-react";
import {
$configurationStore,
setEquipment,
setDesign,
toggleOption,
toggleSeason,
} from '@/stores/configurator-store/configurationStore';
} from "@/stores/configurator-store/configurationStore";
import {
Design,
Equipment,
ExtraSeasons,
OptionFeatures,
OptionTitles,
} from '@/types/IConfigurator';
} from "@/types/IConfigurator";
function CheckboxItem<T extends keyof OptionTitles, V extends OptionTitles[T]>({
titleCategory,
@@ -29,16 +29,16 @@ function CheckboxItem<T extends keyof OptionTitles, V extends OptionTitles[T]>({
const { opts } = configurator[titleCategory];
function handleCheck(item: V[number]) {
if (typeof opts === 'number') {
if (typeof opts === "number") {
return;
}
if (titleCategory === 'Оборудование') {
if (titleCategory === "Оборудование") {
setEquipment(item as Equipment);
} else if (titleCategory === 'Дизайн интерьеров') {
} else if (titleCategory === "Дизайн интерьеров") {
setDesign(item as Design);
} else if (titleCategory === 'Опции') {
} else if (titleCategory === "Опции") {
toggleOption(item as OptionFeatures);
} else if (titleCategory === 'Сезонность') {
} else if (titleCategory === "Сезонность") {
toggleSeason(item as ExtraSeasons);
}
}
@@ -46,33 +46,33 @@ function CheckboxItem<T extends keyof OptionTitles, V extends OptionTitles[T]>({
return (
<label
className={`relative p-3 bg-[#37393B99] rounded-2xl flex-shrink-0 flex flex-col items-start justify-between snap-always ${className} ${
titleCategory === 'Оборудование'
? 'w-[167px] h-[154px] md:aspect-[242/100] md:flex-1'
: 'w-[160px] h-[154px] md:w-full'
titleCategory === "Оборудование"
? "w-[167px] h-[154px] md:aspect-[242/100] md:flex-1"
: "w-[160px] h-[154px] md:w-full"
}
md:cursor-pointer`}
>
{item === 'Лето' ? (
<div className='text-[10px] bg-gradient px-2 py-0.5 rounded-[30px]'>
{item === "Лето" ? (
<div className="text-[10px] bg-gradient-saturated px-2 py-0.5 rounded-[30px]">
уже в пакете
</div>
) : (
<input
type='checkbox'
type="checkbox"
className={`absolute w-4 h-4 rounded-[4px] appearance-none border border-gray-500
checked:bg-gradient checked:shadow-[0px_0px_2px_0px_#7874F3]
checked:bg-gradient-saturated checked:shadow-[0px_0px_2px_0px_#7874F3]
checked:before:content-[""] checked:before:absolute checked:before:w-full checked:before:h-full
checked:before:bg-[url(/icons/check.svg)] before:bg-[length:14px] checked:before:bg-center checked:before:bg-no-repeat
checked:scale-110 transition-transform
${
titleCategory === 'Сезонность'
? 'pointer-events-none bg-white outline-none border-transparent'
: ''
titleCategory === "Сезонность"
? "pointer-events-none bg-white outline-none border-transparent"
: ""
}`}
checked={
Array.isArray(opts) &&
(titleCategory === ('Опции' as const) ||
titleCategory === ('Сезонность' as const))
(titleCategory === ("Опции" as const) ||
titleCategory === ("Сезонность" as const))
? opts.includes(item as OptionFeatures & ExtraSeasons)
: opts === item
}
@@ -80,11 +80,11 @@ function CheckboxItem<T extends keyof OptionTitles, V extends OptionTitles[T]>({
/>
)}
{children}
<div className='flex flex-col gap-1'>
{<p className='btns text-wrap '>{item.split('.')[0]}</p>}
{titleCategory === 'Дизайн интерьеров' && (
<p className='text-[10px] leading-[120%] text-[#7A7A7A] break-words whitespace-normal'>
{item.split('.')[1]}
<div className="flex flex-col gap-1">
{<p className="btns text-wrap ">{item.split(".")[0]}</p>}
{titleCategory === "Дизайн интерьеров" && (
<p className="text-[10px] leading-[120%] text-[#7A7A7A] break-words whitespace-normal">
{item.split(".")[1]}
</p>
)}
</div>
@@ -30,7 +30,7 @@ export function AwardsCard({ className }: { className?: string }) {
</div>
<Link
href={"https://dprofile.ru/graff.estate"}
className="px-6 py-4 bg-gradient self-start rounded-2xl btnm z-[1] font-medium"
className="px-6 py-4 bg-gradient-saturated self-start rounded-2xl btnm z-[1] font-medium"
>
Смотреть кейсы
</Link>
@@ -81,7 +81,7 @@ export function TagsFilters({
)}
<button
onClick={handleApplyClick}
className="bg-gradient rounded-2xl btnm flex items-center gap-2 pl-6 py-4 pr-4 font-medium z-[11] -mb-5 mt-5 cursor-pointer"
className="bg-gradient-saturated rounded-2xl btnm flex items-center gap-2 pl-6 py-4 pr-4 font-medium z-[11] -mb-5 mt-5 cursor-pointer"
>
Применить
<div className="text-white lg:size-[1.389vw] size-4">
@@ -82,7 +82,7 @@ export default function AvailableDemos() {
</p>
<Link
href={"/form"}
className="btnm font-medium group-hover:scale-105 duration-500 lg:px-[1.667vw] lg:py-[1.181vw] px-6 py-[17px] transition-transform lg:rounded-[0.833vw] rounded-xl bg-gradient"
className="btnm font-medium group-hover:scale-105 duration-500 lg:px-[1.667vw] lg:py-[1.181vw] px-6 py-[17px] transition-transform lg:rounded-[0.833vw] rounded-xl bg-gradient-saturated"
>
Оставить заявку
</Link>
@@ -47,7 +47,7 @@ export default function StreamFAQ() {
<QuestionFormModal products={["Удаленная демонстрация"]} />
)
}
className="w-full bg-gradient rounded-[1.111vw] btn-l py-[1.111vw] text-[1.111vw] mt-[0.556vw]
className="w-full bg-gradient-saturated rounded-[1.111vw] btn-l py-[1.111vw] text-[1.111vw] mt-[0.556vw]
md:max-lg:text-[2.083vw] md:max-lg:rounded-[2.083vw] md:max-lg:py-[3.125vw] md:max-lg:mt-[1.302vw]
max-md:text-[4.444vw] max-md:py-[5.556vw] max-md:rounded-[4.444vw] max-md:mt-[2.222vw]"
>
@@ -99,7 +99,7 @@ export default function InfiniteSlider() {
</div>
<div className="flex gap-[0.833vw] absolute left-1/2 bottom-0 -translate-x-1/2 z-10">
<button
className="lg:rounded-[1.111vw] rounded-2xl text-white bg-gradient lg:p-[1.111vw] p-4"
className="lg:rounded-[1.111vw] rounded-2xl text-white bg-gradient-saturated lg:p-[1.111vw] p-4"
onClick={() => moveSlide("left")}
>
<div className="lg:size-[1.111vw] size-4">
@@ -107,7 +107,7 @@ export default function InfiniteSlider() {
</div>
</button>
<button
className="lg:rounded-[1.111vw] rounded-2xl text-white bg-gradient lg:p-[1.111vw] p-4"
className="lg:rounded-[1.111vw] rounded-2xl text-white bg-gradient-saturated lg:p-[1.111vw] p-4"
onClick={() => moveSlide("right")}
>
<div className="lg:size-[1.111vw] size-4">
+1 -1
View File
@@ -300,7 +300,7 @@ export default function WebDemo() {
</span>
<button
onClick={() => setDemoActive(true)}
className="bg-gradient btn-l py-[1.389vw] px-[2.778vw] rounded-[1.111vw] mt-[2.778vw] text-[1.111vw]
className="bg-gradient-saturated btn-l py-[1.389vw] px-[2.778vw] rounded-[1.111vw] mt-[2.778vw] text-[1.111vw]
md:max-lg:rounded-[2.083vw] md:max-lg:text-[2.083vw] md:max-lg:py-[2.604vw] md:max-lg:px-[5.208vw] md:max-lg:mt-[5.208vw]
max-md:rounded-[4.444vw] max-md:text-[4.444vw] max-md:py-[2.778vw] max-md:px-[5.556vw] max-md:mt-[5.556vw]"
>
@@ -209,7 +209,7 @@ export default function WebDevelopmentTimeline() {
<div className="mb-[1.667vw]">
{" Если короче, то "}
<div
className="inline h-[2.5vw] w-[8.5vw] text-center btn-m text-[0.972vw] py-[0.764vw] px-[1.389vw] rounded-full bg-gradient
className="inline h-[2.5vw] w-[8.5vw] text-center btn-m text-[0.972vw] py-[0.764vw] px-[1.389vw] rounded-full bg-gradient-saturated
max-md:text-[3.333vw] max-md:w-[22.778vw] max-md:h-[7.778vw] max-md:px-[3.333vw] max-md:py-[1.944vw] max-md:leading-[150%]"
>
{isNewClient ? "~4,5 месяца" : "~3 месяца"}
@@ -222,7 +222,7 @@ export default function WebDevelopmentTimeline() {
<div className="text-center accent mt-[4.444vw] flex w-full items-center justify-center gap-[0.556vw] md:max-lg:mt-[4.948vw] md:max-lg:text-[3.125vw] max-md:hidden">
{" Если короче, то "}
<div
className="leading-[120%] w-[8.5vw] text-center btn-m text-[0.972vw] py-[0.764vw] px-[1.389vw] rounded-full bg-gradient mt-[0.356vw]
className="leading-[120%] w-[8.5vw] text-center btn-m text-[0.972vw] py-[0.764vw] px-[1.389vw] rounded-full bg-gradient-saturated mt-[0.356vw]
md:max-lg:text-[1.563vw] md:max-lg:w-[12.677vw] md:max-lg:h-[3.646vw] md:max-lg:px-[1.563vw] md:max-lg:py-[0.911vw] md:max-lg:leading-[120%]"
>
{isNewClient ? "~4,5 месяца" : "~3 месяца"}
+1 -1
View File
@@ -43,7 +43,7 @@ export default function FAQ() {
/>
<button
onClick={() => setModal(<QuestionFormModal />)}
className="w-full bg-gradient rounded-[1.111vw] btn-l py-[1.111vw] text-[1.111vw] mt-[0.556vw]
className="w-full bg-gradient-saturated rounded-[1.111vw] btn-l py-[1.111vw] text-[1.111vw] mt-[0.556vw]
md:max-lg:text-[2.083vw] md:max-lg:rounded-[2.083vw] md:max-lg:py-[3.125vw] md:max-lg:mt-[1.302vw]
max-md:text-[4.444vw] max-md:py-[5.556vw] max-md:rounded-[4.444vw] max-md:mt-[2.222vw]"
>
+2 -2
View File
@@ -68,9 +68,9 @@ export default function WebMain() {
<WebDevelopmentTimeline />
<div className="gap-y-[4.444vw] flex flex-col">
<h2 className="font-medium text-[4.444vw] leading-[95%] tracking-[-0.02em] max-md:text-[8.889vw] bg-gradient-to-r from-[#6078F2] to-[#C868F5] bg-clip-text">
<h2 className="font-medium text-[4.444vw] leading-[95%] tracking-[-0.02em] max-md:text-[8.889vw]">
За 15 лет работы мы реализовали{" "}
<span className="text-transparent bg-clip-text">
<span className="text-gradient-saturated text-transparent">
{count && getProjectsCount(count)} для застройщиков
</span>{" "}
в сфере интерактивных технологий
+2 -3
View File
@@ -60,7 +60,7 @@ export const awards: IAward[] = [
},
},
{
title: "1 строчка в рейтинга",
title: "1 строчка в рейтинге",
description: "в категории экспертиза",
image: "/img/pages/home/awards/raca.png",
year: 2024,
@@ -68,8 +68,7 @@ export const awards: IAward[] = [
content: {
title:
"В 2025 году мы первый раз участвовали в рейтинге рекламных и коммуникационных агенств RACA в категории Production",
description:
`По результатам независимого исследования мы заняли первую строчку рейтинга и получили оценку 9,50/10 за экспертизу в категории, а также заняли второе место за уровень клиентского сервиса, обогнав лидеров прошлого года.
description: `По результатам независимого исследования мы заняли первую строчку рейтинга и получили оценку 9,50/10 за экспертизу в категории, а также заняли второе место за уровень клиентского сервиса, обогнав лидеров прошлого года.
По итогам интегрального рейтинга мы вошли в Топ-4 в категории Production.`,
images: ["/img/pages/home/awards/content/raca/1.png"],
+2 -2
View File
@@ -36,7 +36,7 @@ export function Button({
"group cursor-pointer relative px-6 py-2",
rounded && `rounded-${rounded}`,
"min-w-fit",
color === "primary" && "bg-gradient",
color === "primary" && "bg-gradient-saturated",
color === "secondary" && "outline-1 outline-[#3D425C]",
icon && "pr-4",
"flex gap-1 items-center overflow-hidden",
@@ -45,7 +45,7 @@ export function Button({
"justify-between"
)}
>
<span className="group-hover:opacity-10 absolute top-0 left-0 w-full h-full transition-opacity bg-black opacity-0"></span>
<span className="group-hover:opacity-10 absolute top-0 left-0 w-full h-full bg-black opacity-0 transition-opacity"></span>
<span className={clsx("relative font-medium", !icon && "m-auto")}>
{children}
</span>
+9 -9
View File
@@ -1,4 +1,5 @@
import { PropsWithChildren } from 'react';
import clsx from "clsx";
import { PropsWithChildren } from "react";
export function GradientButton({
children,
@@ -14,22 +15,21 @@ export function GradientButton({
<button
onClick={onClick}
className={`outline-none lg:p-[0.069vw] md:max-lg:p-[0.13vw] p-px rounded-full cursor-pointer${
className ? ' ' + className : ''
className ? " " + className : ""
}`}
>
<div
className={`lg:p-[0.556vw] p-1 [1.111vw] bg-[#0f1011] rounded-full${
active
? ' [animation:custom-ping_2s_cubic-bezier(0,0,0.25,1)_infinite_both_running]'
: ''
? " [animation:custom-ping_2s_cubic-bezier(0,0,0.25,1)_infinite_both_running]"
: ""
}`}
>
<div
className={`lg:p-[0.972vw] p-[14px] rounded-full bg-[#37393B99] active:bg-gradient-to-r${
active
? ' [background:linear-gradient(to_bottom_left,#BE69F5,#798FFF)]'
: ''
}`}
className={clsx(
`lg:p-[0.972vw] p-[14px] rounded-full bg-[#37393B99]`,
active && "bg-gradient-saturated"
)}
>
{children}
</div>
+1 -1
View File
@@ -23,7 +23,7 @@ export function LocaleSwitch({ value, onChange }: LocaleSwitchProps) {
onClick={handleToggle}
>
<motion.div
className="absolute bg-gradient lg:rounded-[0.556vw] rounded-lg lg:p-[0.556vw] p-2 lg:w-[calc(50%-0.278vw)] w-[calc(50%-4px)] flex items-center justify-center left-[0.278vw] top-1/2"
className="absolute bg-gradient-saturated lg:rounded-[0.556vw] rounded-lg lg:p-[0.556vw] p-2 lg:w-[calc(50%-0.278vw)] w-[calc(50%-4px)] flex items-center justify-center left-[0.278vw] top-1/2"
animate={{
x: value === "ru" ? 0 : "100%",
y: "-50%",
+6 -4
View File
@@ -1,5 +1,6 @@
/* eslint-disable @next/next/no-img-element */
import { useMediaQueries } from "@/hooks/useMediaQueries";
import clsx from "clsx";
import { motion } from "framer-motion";
import Link from "next/link";
@@ -22,9 +23,10 @@ export function ProductItem({
return (
<Link
href={href}
className={`md:p-5 p-2 flex flex-col overflow-hidden justify-between box-border relative max-md:items-start bg-[#37393B99] hover:border-white/8 border-transparent border transition-colors bg-[radial-gradient(farthest-corner_at_top_left,transparent,transparent)] lg:hover:bg-[radial-gradient(farthest-corner_at_top_left,transparent,#7A7A7A50)] lg:rounded-[1.111vw] rounded-2xl${
className ? " " + className : ""
}`}
className={clsx(
`md:p-5 p-2 flex flex-col overflow-hidden justify-between box-border relative max-md:items-start bg-[#37393B99] hover:border-white/8 border-transparent border transition-colors bg-[radial-gradient(farthest-corner_at_top_left,transparent,transparent)] lg:hover:bg-[radial-gradient(farthest-corner_at_top_left,transparent,#7A7A7A50)] lg:rounded-[1.111vw] rounded-2xl`,
className
)}
>
<div className="max-md:hidden space-y-2">
{/* <div className="heading1 flex items-start font-medium">
@@ -35,7 +37,7 @@ export function ProductItem({
)}
{title}
</div> */}
<div className=" heading2 font-medium opacity-60 lg:max-w-[50%]">
<div className="heading2 font-medium opacity-60 lg:max-w-[50%]">
{text}
</div>
</div>
+2 -2
View File
@@ -17,13 +17,13 @@ export function StoriesButton() {
return (
<div className="flex items-center mx-auto">
<div className="flex items-center">
{stories?.slice(0,3).map(({ id, text, preview }, index) => (
{stories?.slice(0, 3).map(({ id, text, preview }, index) => (
<button
onClick={() => setModal(<StoriesModal startIndex={index} />)}
className="aspect-square first:translate-x-2 last:-translate-x-2 w-full rounded-full cursor-pointer outline-none"
key={id}
>
<div className="lg:p-[0.069vw] p-px bg-gradient rounded-full relative aspect-square">
<div className="lg:p-[0.069vw] p-px bg-gradient-saturated rounded-full relative aspect-square">
<img
src={process.env.NEXT_PUBLIC_S3_BUCKET + preview}
alt={text}