diff --git a/src/app/globals.css b/src/app/globals.css index 8fa84ae2..52ea3f75 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -111,15 +111,15 @@ html { } @utility line1 { - @apply lg:text-[clamp(96px,4.444vw,128px)] md:max-lg:text-[clamp(92px,92px+(100vw-768px)/672*8,100px)] sm:max-md:text-[clamp(40px,40px+(100vw-360px)/408*16,56px)] text-[40px] leading-[85%]; + @apply 2xl:text-[128px] lg:max-2xl:text-[clamp(96px,4.444vw,128px)] md:max-lg:text-[clamp(92px,92px+(100vw-768px)/672*8,100px)] sm:max-md:text-[clamp(40px,40px+(100vw-360px)/408*16,56px)] text-[40px] leading-[85%]; } @utility line2 { - @apply lg:text-[clamp(64px,4.444vw,88px)] md:max-lg:text-[clamp(40px,40px+(100vw-768px)/672*24,64px)] sm:max-md:text-[clamp(32px,32px+(100vw-360px)/408*8,40px)] text-[32px] leading-[95%]; + @apply 2xl:text-[88px] lg:max-2xl:text-[clamp(64px,4.444vw,88px)] md:max-lg:text-[clamp(40px,40px+(100vw-768px)/672*24,64px)] sm:max-md:text-[clamp(32px,32px+(100vw-360px)/408*8,40px)] text-[32px] leading-[95%]; } @utility heading1 { - @apply lg:text-[clamp(24px,24px+(100vw-1440px)/480*4,32px)] md:max-lg:text-2xl text-xl leading-[1.167]; + @apply 2xl:text-[2.083vw] lg:max-2xl:text-[clamp(24px,24px+(100vw-1440px)/480*4,32px)] md:max-lg:text-2xl text-xl leading-[1.167]; } @utility heading2 { @@ -127,19 +127,19 @@ html { } @utility accent { - @apply 2xl:text-[2.604vw] lg:max-2xl:text-[clamp(32px,32px+(100vw-1440px)/480*8,40px)] text-[clamp(24px,32px+(100vw-360px)/1080*8,32px)] lg:leading-[1.1] leading-none; + @apply 2xl:text-[2.604vw] lg:max-2xl:text-[clamp(32px,32px+(100vw-1440px)/480*8,40px)] text-[clamp(16px,16px+(100vw-360px)/1080*8,32px)] lg:leading-[1.1] leading-none; } @utility text1 { - @apply 2xl:text-[1.172vw] lg:max-2xl:text-[clamp(14px,14px+(100vw-1440px)/480*4,18px)] text-sm leading-[1.35]; + @apply 2xl:text-2xl lg:max-2xl:text-[clamp(14px,14px+(100vw-1440px)/480*4,18px)] text-sm leading-[1.35]; } @utility text2 { - @apply 2xl:text-[0.911vw] lg:max-2xl:text-[clamp(12px,12px+(100vw-1440px)/480*2,14px)] text-xs leading-[1.35]; + @apply 2xl:text-xl lg:max-2xl:text-[clamp(12px,12px+(100vw-1440px)/480*2,14px)] text-xs leading-[1.35]; } @utility btnl { - @apply lg:text-[1.25vw] md:max-lg:text-[18px] sm:max-md:text-[clamp(16px,16px+(100vw-360px)/1560*2,18px)] text-base leading-none; + @apply md:text-2xl sm:max-md:text-[clamp(16px,16px+(100vw-360px)/1560*2,18px)] text-base leading-none; } @utility btnm { diff --git a/src/components/ItemActions.tsx b/src/components/ItemActions.tsx index e170d299..6300dd3e 100644 --- a/src/components/ItemActions.tsx +++ b/src/components/ItemActions.tsx @@ -11,7 +11,7 @@ import { SyntheticEvent } from 'react'; import EditIcon from '../../public/icons/edit.svg'; import TrashIcon from '../../public/icons/trash.svg'; import { DeleteItemModal } from './DeleteItemModal'; -import { ArticleFormModal } from './modals/ArticleFormModal'; +import { ArticleContentFormModal } from './modals/ArticleContentFormModal'; import { CompanyFormModal } from './modals/CompanyFormModal'; import { ProjectFormModal } from './modals/ProjectFormModal'; @@ -38,12 +38,11 @@ export function ItemActions({ , 'editCompanyForm' ); - } else { + } else setModal( - , - 'editArticleForm' + , + 'articleContentFormModal' ); - } } function handleDelete(e: SyntheticEvent) { diff --git a/src/components/Layout/Feedback.tsx b/src/components/Layout/Feedback.tsx index f7e16448..83c0b9b5 100644 --- a/src/components/Layout/Feedback.tsx +++ b/src/components/Layout/Feedback.tsx @@ -83,7 +83,7 @@ export function FeedbackForm() { currentPhoneCodeAndCountry={[phoneCode, country]} onClick={setPhoneCodeAndCountry} /> -
+
{open && ( diff --git a/src/components/articleInputs/ArticleContentEditor.tsx b/src/components/articleInputs/ArticleContentEditor.tsx index 05b54b81..ca4c200c 100644 --- a/src/components/articleInputs/ArticleContentEditor.tsx +++ b/src/components/articleInputs/ArticleContentEditor.tsx @@ -1,33 +1,51 @@ import { BundledEditor } from '@/lib/BundledEditor'; -import { useRef } from 'react'; -import { Control, Controller } from 'react-hook-form'; +import { Dispatch, SetStateAction, useRef } from 'react'; +import { Control, FieldArrayWithId, useController } from 'react-hook-form'; import { Editor } from 'tinymce'; import { IArticleInput } from '../modals/ArticleFormModal'; export function ArticleContentEditor({ control, index, + setEditing, + item, }: { index: number; control: Control; + setEditing: Dispatch>; + item: FieldArrayWithId & { content: string }; }) { const ref = useRef(null); + const { + field: { onChange, value }, + } = useController({ + control, + name: `blocks.${index}.content`, + defaultValue: item.content, + }); + return ( -
- ( - { - ref.current = editor; - }} - /> - )} +
+ { + ref.current = editor; + }} + init={{ + content_style: + 'body {color: #fff; background: #14161f; font-size:16px;}', + }} /> +
); } diff --git a/src/components/articleInputs/ArticleContentInput.tsx b/src/components/articleInputs/ArticleContentInput.tsx index f11fb2b0..8e2c1dd3 100644 --- a/src/components/articleInputs/ArticleContentInput.tsx +++ b/src/components/articleInputs/ArticleContentInput.tsx @@ -1,11 +1,12 @@ import { Reorder } from 'framer-motion'; import parse from 'html-react-parser'; -import { useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Control, FieldArrayWithId, UseFieldArrayInsert, UseFieldArrayRemove, + useFormContext, } from 'react-hook-form'; import { BlockActions } from '../BlockActions'; import { IArticleInput } from '../modals/ArticleFormModal'; @@ -13,7 +14,7 @@ import { ArticleContentEditor } from './ArticleContentEditor'; export interface IArticleContentInputProps { index: number; - item: FieldArrayWithId; + item: FieldArrayWithId & { content: string }; control: Control; insert: UseFieldArrayInsert; remove: UseFieldArrayRemove; @@ -30,6 +31,19 @@ export function ArticleContentInput({ const [editing, setEditing] = useState(false); + const [content, setContent] = useState(''); + + const { watch } = useFormContext(); + + useEffect(() => { + const { unsubscribe } = watch(({ blocks }) => { + if (!blocks || !blocks.length || blocks[index]?.type !== 'Content') + return; + setContent(blocks[index].content ?? ''); + }); + return unsubscribe; + }, [index, watch]); + return ( ref.current && ref.current.click()} > {editing ? ( - + ) : (
- {item.type === 'Content' && parse(item.content)} + {item.type === 'Content' && parse(content)}
)} - {}} /> +
- - {fields.map((item, index) => - item.type === 'Content' ? ( - - ) : item.type === 'Quote' ? ( - - ) : item.type === 'Slider' ? ( - - ) : ( - - ) - )} - +
+ + {fields.map((item, index) => + item.type === 'Content' ? ( + + ) : item.type === 'Quote' ? ( + + ) : item.type === 'Slider' ? ( + + ) : ( + + ) + )} + +
diff --git a/src/components/modals/ArticleFormModal.tsx b/src/components/modals/ArticleFormModal.tsx index fb511229..ec9f9d10 100644 --- a/src/components/modals/ArticleFormModal.tsx +++ b/src/components/modals/ArticleFormModal.tsx @@ -72,7 +72,7 @@ export function ArticleFormModal({ handleSave={handleSave} disabled={!title || !tags || !cardImage || !posterImage} /> -
+
({ />
{['Недвижимость', 'Награды', 'Выставки'].map((tag) => ( diff --git a/src/components/modals/StoriesModal.tsx b/src/components/modals/StoriesModal.tsx index 6e646cec..29302f79 100644 --- a/src/components/modals/StoriesModal.tsx +++ b/src/components/modals/StoriesModal.tsx @@ -1,7 +1,7 @@ import { stories } from '@/consts/stories'; import { useMediaQueries } from '@/hooks/useMediaQueries'; import { useModalStore } from '@/stores/useModalStore'; -import { createRef, RefObject, useEffect, useState } from 'react'; +import { createRef, RefObject, useEffect, useRef, useState } from 'react'; import { useSwipeable } from 'react-swipeable'; import CloseIcon from '../../../public/icons/close.svg'; @@ -14,6 +14,8 @@ export function StoriesModal({ startIndex = 0 }: { startIndex?: number }) { const { isLg, isMd } = useMediaQueries(); + const ref = useRef(null); + useEffect(() => { setVideoRefs(stories.map(createRef)); }, []); @@ -41,7 +43,7 @@ export function StoriesModal({ startIndex = 0 }: { startIndex?: number }) { if (currentIndex === videoRefs.length - 1) setModal(null, ''); else setCurrentIndex((prev) => prev + 1); } - }, [currentIndex, currentProgress, setModal, videoRefs]); + }, [currentProgress, setModal, videoRefs]); useEffect(() => { if ( @@ -50,15 +52,37 @@ export function StoriesModal({ startIndex = 0 }: { startIndex?: number }) { !videoRefs[currentIndex].current ) return; + videoRefs.forEach(({ current: video }, index) => { - if (index === currentIndex) video?.play(); - else { + if (index === currentIndex) { + video!.playbackRate = 10; + video?.play(); + } else { video!.currentTime = 0; video?.pause(); } }); }, [currentIndex, videoRefs]); + useEffect(() => { + const slider = ref.current; + if (!slider || isLg || isMd) return; + + function handleTouch(e: TouchEvent) { + if (e.touches[0].clientX > slider!.clientWidth / 2) + setCurrentIndex((prev) => Math.min(videoRefs.length - 1, prev + 1)); + else setCurrentIndex((prev) => Math.max(0, prev - 1)); + } + + slider.addEventListener('touchstart', handleTouch); + + return () => slider.removeEventListener('touchstart', handleTouch); + }, []); + + useEffect(() => { + console.log('currentIndex', currentIndex); + }, [currentIndex]); + const handlers = useSwipeable({ trackMouse: true, preventScrollOnSwipe: true, @@ -71,34 +95,32 @@ export function StoriesModal({ startIndex = 0 }: { startIndex?: number }) { return ( <>
-
+
{!!videoRefs.length && stories.map(({ id, video, title, poster }, index) => (
setCurrentIndex(index)} > @@ -106,22 +128,22 @@ export function StoriesModal({ startIndex = 0 }: { startIndex?: number }) { ref={videoRefs[index]} src={video} poster={poster} + className="absolute left-0 top-0 w-full h-full object-cover object-center md:rounded-xl" playsInline - className="absolute left-0 top-0 w-full h-full object-cover object-center" />
- {index === currentIndex && ( -
+ {currentIndex === index && ( +

{title}

-
+
@@ -129,6 +151,25 @@ export function StoriesModal({ startIndex = 0 }: { startIndex?: number }) { )}
))} +
+

+ {stories[currentIndex].title} +

+
+ {stories.map(({ id }, index) => ( +
+
index ? '100%' : '0%' } + } + /> +
+ ))} +
+
diff --git a/src/components/pages/ArticlePage/ArticleSyncPage.tsx b/src/components/pages/ArticlePage/ArticleSyncPage.tsx index 25298496..f6c4d889 100644 --- a/src/components/pages/ArticlePage/ArticleSyncPage.tsx +++ b/src/components/pages/ArticlePage/ArticleSyncPage.tsx @@ -1,6 +1,7 @@ 'use client'; import { useGetArticleById } from '@/queries/getArticleById'; +import parse from 'html-react-parser'; import Image from 'next/image'; export function ArticleSyncPage({ articleId }: { articleId: string }) { @@ -35,7 +36,11 @@ export function ArticleSyncPage({ articleId }: { articleId: string }) {
-
+
+ {article.blocks.map( + (block) => block.type === 'Content' && parse(block.content) + )} +
); } diff --git a/src/components/pages/BlogPage/ArticlesPageActions.tsx b/src/components/pages/BlogPage/ArticlesPageActions.tsx index 4e133ef4..f572182a 100644 --- a/src/components/pages/BlogPage/ArticlesPageActions.tsx +++ b/src/components/pages/BlogPage/ArticlesPageActions.tsx @@ -21,7 +21,7 @@ export function ArticlesPageActions({ tags }: { tags: string[] }) { modal={} >
-
-
-

+

+
+

Срок реализации объекта

@@ -269,9 +269,9 @@ export function Calculator() { )}

-
+
-

Ежемесячный доход

+

Ежемесячный доход

{calculated ? monthlyIncome : oldMonthlyIncome} diff --git a/src/components/pages/MainPage/Calculator/ConsultationsRange.tsx b/src/components/pages/MainPage/Calculator/ConsultationsRange.tsx index ea85c789..96f33776 100644 --- a/src/components/pages/MainPage/Calculator/ConsultationsRange.tsx +++ b/src/components/pages/MainPage/Calculator/ConsultationsRange.tsx @@ -46,7 +46,7 @@ export function ConsultationRange({ start, root.current!.clientWidth - 48 ), - (root.current!.clientWidth - 48) / 35 + ((root.current!.clientWidth - 48) / 35) * 6 ); el.style.left = `${dx}px`; setOffset(dx); @@ -63,7 +63,7 @@ export function ConsultationRange({

Консультаций в месяц

setOpened((prev) => !prev)} >

{chosen.name}

diff --git a/src/components/pages/MainPage/Clients/Clients.tsx b/src/components/pages/MainPage/Clients/Clients.tsx index 7d794c0e..b5ba1bfb 100644 --- a/src/components/pages/MainPage/Clients/Clients.tsx +++ b/src/components/pages/MainPage/Clients/Clients.tsx @@ -26,8 +26,8 @@ export function Clients() { className="lg:space-y-16 md:max-lg:space-y-12 space-y-10 lg:mt-40 mt-[100px]" ref={ref} > -
- + <div className="flex justify-between"> + <Title className="lg:max-w-2/3a mx-autotext-center"> <span className="text-gradient"> {companies !== undefined && getCompaniesCount(companies.length)} </span>{' '} diff --git a/src/components/pages/MainPage/Map/Slider.tsx b/src/components/pages/MainPage/Map/Slider.tsx index aeb50016..93c9c9a2 100644 --- a/src/components/pages/MainPage/Map/Slider.tsx +++ b/src/components/pages/MainPage/Map/Slider.tsx @@ -41,7 +41,7 @@ export function Slider({ <p className="btnl font-medium opacity-60"> Последнее в{city.startsWith('В') ? 'о' : ''} {prepositionCity(city)} </p> - <div className="flex gap-4"> + <div className="flex gap-1"> {companies.map(({ id, mapIcon, title }, index) => ( <button onClick={() => setCurrent(index)} @@ -52,8 +52,8 @@ export function Slider({ > <Image src={process.env.NEXT_PUBLIC_S3_BUCKET + mapIcon!} - width={48} - height={48} + width={56} + height={56} alt={title} /> </button> diff --git a/src/components/pages/MainPage/Motivation.tsx b/src/components/pages/MainPage/Motivation.tsx index 647bd413..d4c461d2 100644 --- a/src/components/pages/MainPage/Motivation.tsx +++ b/src/components/pages/MainPage/Motivation.tsx @@ -1,5 +1,7 @@ 'use client'; +import { StoriesModal } from '@/components/modals/StoriesModal'; +import { useModalStore } from '@/stores/useModalStore'; import { Title } from '@/ui/Title'; import { motion, useInView } from 'framer-motion'; import Image from 'next/image'; @@ -25,14 +27,14 @@ export function Motivation() { margin: '100% 0px -85% 0px', }); + const { setModal } = useModalStore(); + return ( <div className="lg:space-y-[4.444vw] md:space-y-[6.25vw] space-y-[11.111vw]"> - <Title headerLevel={1} className="sm:max-lg:text-5xla text-center"> - Помогаем девелоперам - <br /> - продавать недвижимость проще и  + <Title headerLevel={1} className="text-center"> + Помогаем девелоперам продавать недвижимость проще и  <span className="relative"> - <span className="text-[#37393B]">быстрее </span> + <span className="text-[#37393B]">быстрее </span> <span className="absolute top-[55%] -left-[2.5%] 2xl:h-1.5 h-1 w-full bg-white" /> </span> дороже @@ -55,8 +57,11 @@ export function Motivation() { className="rounded-2xl h-full w-full object-cover" /> </div> - <div className="max-md:space-y-[4.444vw]a max-md:flex flex-col justify-between lg:w-[28.611vw] md:max-lg:w-[47.135vw] lg:h-[15.694vw] md:max-lg:h-[29.427vw] w-[46.111vw] h-[61.111vw] lg:p-[1.667vw] p-4 lg:col-start-2 lg:row-start-1 row-start-2 bg-[radial-gradient(ellipse_at_bottom_right,#7A7A7A50,transparent)] rounded-2xl relative"> - <p className="font-medium heading2 lg:w-[10.278vw] md:max-lg:w-[19.271vw]"> + <button + onClick={() => setModal(<StoriesModal />, 'stories')} + className="flex flex-col justify-between lg:w-[28.611vw] md:max-lg:w-[47.135vw] lg:h-[15.694vw] md:max-lg:h-[29.427vw] w-[46.111vw] h-[61.111vw] lg:p-[1.667vw] p-4 lg:col-start-2 lg:row-start-1 row-start-2 bg-[radial-gradient(ellipse_at_bottom_right,#7A7A7A50,transparent)] rounded-2xl relative cursor-pointer" + > + <p className="font-medium heading2 lg:w-[10.278vw] md:max-lg:w-[19.271vw] self-start text-left"> Интеграция в офисы продаж </p> <div className="lg:w-[11.667vw] md:max-lg:w-[21.875vw] w-[37.222vw] aspect-square md:absolute relative lg:right-[1.667vw] lg:bottom-[0.903vw] md:max-lg:right-[3.125vw] md:max-lg:bottom-[1.693vw]"> @@ -102,7 +107,7 @@ export function Motivation() { className="absolute top-0 text-white rounded-full" /> */} </div> - </div> + </button> <div className="relative lg:w-[28.611vw] lg:h-[19.028vw] md:max-lg:w-[47.135vw] md:max-lg:h-[29.427vw] overflow-hidden w-[46.111vw] h-[61.111vw] bg-[radial-gradient(ellipse_at_bottom_right,#7A7A7A50,transparent)] col-start-2 row-start-2 lg:p-[1.667vw] p-4 rounded-2xl flex flex-col lg:gap-[1.944vw] md:max-lg:gap-[3.125vw] gap-[3.333vw]"> <p className="heading2 font-medium">Удаленная демонстрация</p> <div className="md:relative absolute lg:w-[19.583vw] md:max-lg:w-[40.885vw] w-[73.333vw] self-center max-md:left-4 max-md:-bottom-0.5"> diff --git a/src/components/pages/MainPage/Presentation/IntegrationCRM.tsx b/src/components/pages/MainPage/Presentation/IntegrationCRM.tsx index fb7a4f32..7c2ce0d2 100644 --- a/src/components/pages/MainPage/Presentation/IntegrationCRM.tsx +++ b/src/components/pages/MainPage/Presentation/IntegrationCRM.tsx @@ -22,22 +22,22 @@ export function IntegrationCRM({ scroll }: { scroll: MotionValue<number> }) { <div className="space-y-15 max-w-9/10"> <div className="space-y-4"> <div className="flex"> - <div className="w-14 h-14 rounded-lg bg-[#B5F54E] flex items-center text-black font-medium justify-center -rotate-[4deg] text1 shadow-[0_2px_10px_0_#00000033] z-[2]"> + <div className="w-16 h-16 rounded-lg bg-[#B5F54E] flex items-center text-black font-medium justify-center -rotate-[4deg] text1 shadow-[0_2px_10px_0_#00000033] z-[2]"> 2K </div> <div className="bg-[#37393B] rounded-lg right-2 relative shadow-[0_2px_10px_0_#00000033] z-[1]"> <Image src={'/img/pages/home/presentation/flat1.png'} - width={56} - height={56} + width={64} + height={64} alt="rooms" /> </div> <div className="bg-[#37393B] rounded-lg -rotate-[4deg] right-4 relative shadow-[0_2px_10px_0_#00000033]"> <Image src={'/img/pages/home/presentation/flat2.png'} - width={48} - height={48} + width={64} + height={64} alt="rooms" /> </div> @@ -51,15 +51,15 @@ export function IntegrationCRM({ scroll }: { scroll: MotionValue<number> }) { <div className="flex"> <Image src={'/img/pages/home/presentation/vova.png'} - width={56} - height={56} + width={64} + height={64} alt="vovka" className="rounded-lg -rotate-[4deg] shadow-[0_2px_10px_0_#00000033] z-[2]" /> - <div className="rounded-lg bg-[#37393B] flex justify-center items-center relative right-2 w-14 h-14 shadow-[0_2px_10px_0_#00000033] z-[1]"> + <div className="rounded-lg bg-[#37393B] flex justify-center items-center relative right-2 w-16 h-16 shadow-[0_2px_10px_0_#00000033] z-[1]"> <MailIcon className="text-white w-8 h-8" /> </div> - <div className="rounded-lg bg-[#37393B] flex justify-center items-center relative right-4 -rotate-[4deg] w-14 h-14 shadow-[0_2px_10px_0_#00000033]"> + <div className="rounded-lg bg-[#37393B] flex justify-center items-center relative right-4 -rotate-[4deg] w-16 h-16 shadow-[0_2px_10px_0_#00000033]"> <PhoneIcon className="w-8 h-8 text-white" /> </div> </div> diff --git a/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx b/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx index 294ad0bd..eb168b4f 100644 --- a/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx +++ b/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx @@ -19,7 +19,7 @@ export function PresentationDesktop() { <Title> Интерактивная презентация{' '} <span className="text-gradient">улучшает опыт выбора недвижимости</span>{' '} - и увеличивают темпы продаж квартир в жилом комплексе + и увеличивают темпы продаж квартир в жилом комплексе
diff --git a/src/components/pages/MainPage/Presentation/PresentationMini.tsx b/src/components/pages/MainPage/Presentation/PresentationMini.tsx index 8bef2b18..4d7d5340 100644 --- a/src/components/pages/MainPage/Presentation/PresentationMini.tsx +++ b/src/components/pages/MainPage/Presentation/PresentationMini.tsx @@ -32,7 +32,7 @@ export function PresentationMini() { return (
-
+
Интерактивная презентация{' '} <span className="text-gradient"> diff --git a/src/components/pages/MainPage/Presentation/SearchAndSelect.tsx b/src/components/pages/MainPage/Presentation/SearchAndSelect.tsx index 1de68d9a..04785728 100644 --- a/src/components/pages/MainPage/Presentation/SearchAndSelect.tsx +++ b/src/components/pages/MainPage/Presentation/SearchAndSelect.tsx @@ -1,7 +1,8 @@ import { search } from '@/consts/presentation/search'; import { useMediaQueries } from '@/hooks/useMediaQueries'; -import { Icon } from '@/ui/Icon'; import { motion, MotionValue, useTransform } from 'framer-motion'; +import HeartIcon from '../../../../../public/icons/hearth.svg'; +import LocationIcon from '../../../../../public/icons/location.svg'; export function SearchAndSelect({ scroll }: { scroll: MotionValue<number> }) { const opacity = useTransform(scroll, [0, 1 / 6], [1, 0]); @@ -17,30 +18,18 @@ export function SearchAndSelect({ scroll }: { scroll: MotionValue<number> }) { > <div className="md:p-6 md:rounded-2xl md:bg-radial-[at_100%_100%] from-[#7A7A7A66] md:backdrop-blur-[500px] xs:max-md:space-y-4 space-y-2 md:flex flex-col justify-between md:flex-1"> <p className="heading2 font-medium">Выбор квартиры на генплане</p> - <div className="xs:max-md:space-y-4 space-y-2"> + <div className="space-y-4"> <div className="flex items-center gap-6"> - <div className="bg-[#FF4517] rounded-[9px] p-[4.5px]"> - <Icon - name="hearth" - color="#232425" - svgProp={{ - className: 'max-md:w-[22.5px] max-md:w-[22.5px] w-5 h-5', - }} - /> + <div className="bg-[#FF4517] rounded-[9px] p-[0.556vw]"> + <HeartIcon className="text-[#232425] w-[1.389vw] h-[1.389vw]" /> </div> <p className="text1 md:max-w-[70%]"> Эмоциональное вовлечение пользователя в выбор квартиры </p> </div> <div className="flex items-center gap-6"> - <div className="bg-[#B5F54E] rounded-[9px] p-[4.5px]"> - <Icon - name="location" - color="#232425" - svgProp={{ - className: 'max-md:w-[22.5px] max-md:w-[22.5px] w-5 h-5', - }} - /> + <div className="bg-[#B5F54E] rounded-[9px] p-[0.556vw]"> + <LocationIcon className="text-[#232425] w-[1.389vw] h-[1.389vw]" /> </div> <p className="text1 md:max-w-[70%]"> Удобство выбора расположения и видовых характеристик diff --git a/src/components/pages/MainPage/Reviews/ReviewTab.tsx b/src/components/pages/MainPage/Reviews/ReviewTab.tsx index b046b1b9..4321c011 100644 --- a/src/components/pages/MainPage/Reviews/ReviewTab.tsx +++ b/src/components/pages/MainPage/Reviews/ReviewTab.tsx @@ -37,13 +37,15 @@ export function ReviewTab({ }} ref={ref} > - <Image - src={image} - width={96} - height={96} - alt={title} - className="rounded-xl aspect-square" - /> + <div className="aspect-square"> + <Image + src={image} + width={96} + height={96} + alt={title} + className="rounded-xl aspect-square" + /> + </div> {active && ( <motion.div key={index} diff --git a/src/components/pages/MainPage/Reviews/Reviews.tsx b/src/components/pages/MainPage/Reviews/Reviews.tsx index 943d63cb..10ce65bf 100644 --- a/src/components/pages/MainPage/Reviews/Reviews.tsx +++ b/src/components/pages/MainPage/Reviews/Reviews.tsx @@ -21,7 +21,7 @@ export function Reviews() { const [currentHovered, setCurrentHovered] = useState<number>(); - const isInView = useInView(ref, { margin: '100% 0px -85% 0px' }); + const isInView = useInView(ref, { margin: '100% 0px -75% 0px' }); return ( <div className="max-lg:space-y-2"> @@ -34,10 +34,8 @@ export function Reviews() { }`} > <VideoPlayer src={reviewsData[tab].src} showMutingBtn ref={videoRef}> - <div className="lg:space-y-6 space-y-4 lg:max-w-[35.208vw] absolute lg:left-6 lg:top-6 md:max-lg:top-4 left-4 bottom-4 transition-opacity z-[5]"> - <p className="max-w-[507px] text2 opacity-80"> - {reviewsData[tab].author} - </p> + <div className="lg:space-y-6 space-y-4 absolute lg:left-6 lg:top-6 md:max-lg:top-4 left-4 bottom-4 transition-opacity z-[5] max-w-[40vw]"> + <p className="text2 opacity-80">{reviewsData[tab].author}</p> <p className="accent font-medium">{reviewsData[tab].text}</p> </div> <div className="absolute flex flex-nowrap bottom-6 left-6 gap-2 z-[6] max-lg:hidden"> diff --git a/src/components/pages/MainPage/Streaming/Streaming.tsx b/src/components/pages/MainPage/Streaming/Streaming.tsx index 321a0811..232a7506 100644 --- a/src/components/pages/MainPage/Streaming/Streaming.tsx +++ b/src/components/pages/MainPage/Streaming/Streaming.tsx @@ -26,12 +26,13 @@ export function Streaming() { <div className="lg:mt-[140px] mt-[100px] lg:space-y-[4.444vw] md:max-lg:space-y-[6.25vw] space-y-[11.111vw]"> <Title className="max-md:hidden"> Уникальная технология - <span className="text-gradient"> удаленной демонстрации</span> дает - возможность презентовать объект покупателю из любой точки мира + <span className="text-gradient"> удаленной демонстрации</span>{' '} + дает возможность презентовать объект покупателю из любой точки + мира <span className="text-gradient">Удаленная демонстрация —</span> - презентуйте объект покупателю из любой точки мира + презентуйте объект покупателю из любой точки мира
+

Начать демонстрацию

- - -
); } diff --git a/src/components/pages/ProjectsPage/ProjectsSection.tsx b/src/components/pages/ProjectsPage/ProjectsSection.tsx index 6a6d54c4..830b1926 100644 --- a/src/components/pages/ProjectsPage/ProjectsSection.tsx +++ b/src/components/pages/ProjectsPage/ProjectsSection.tsx @@ -1,7 +1,7 @@ 'use client'; import { IProject } from '@/types/IProject'; -import Link from 'next/link'; +import { motion } from 'framer-motion'; import { usePathname } from 'next/navigation'; import ArrowMoreIcon from '../../../../public/icons/arrow_more.svg'; import { AwardsCard } from './AwardsCard'; @@ -25,13 +25,21 @@ export function ProjectsSection({ projects }: { projects: IProject[] }) { )} {pathname === '/' && ( - Смотреть все - + )}
); diff --git a/src/components/pages/ProjectsPage/TagsFilters.tsx b/src/components/pages/ProjectsPage/TagsFilters.tsx index 6dba7066..8ea20974 100644 --- a/src/components/pages/ProjectsPage/TagsFilters.tsx +++ b/src/components/pages/ProjectsPage/TagsFilters.tsx @@ -78,7 +78,7 @@ export function TagsFilters({ )}
diff --git a/src/ui/SlideBadge.tsx b/src/ui/SlideBadge.tsx index a2f783e8..5409c1f3 100644 --- a/src/ui/SlideBadge.tsx +++ b/src/ui/SlideBadge.tsx @@ -11,7 +11,7 @@ export function SlideBadge({ }) { return (
diff --git a/src/ui/StoriesButton.tsx b/src/ui/StoriesButton.tsx index b10b6082..a591a097 100644 --- a/src/ui/StoriesButton.tsx +++ b/src/ui/StoriesButton.tsx @@ -18,7 +18,7 @@ export function StoriesButton() { 'stories' ) } - className="p-0.5 cursor-pointer outline-none rounded-full aspect-square relative first:translate-x-2 last:-translate-x-2 [background:linear-gradient(#2a2c34,#2a2c34)_padding-box,linear-gradient(45deg,#FF52E5,#F6D242)_border-box]" + className="p-px cursor-pointer outline-none bg-gradient rounded-full aspect-square relative first:translate-x-2 last:-translate-x-2" key={id} > {title} ))}