This commit is contained in:
2026-01-14 10:54:09 +05:00
10 changed files with 18 additions and 24 deletions
+3 -3
View File
@@ -86,7 +86,7 @@
"title": "Integration with the Developer's CRM System", "title": "Integration with the Developer's CRM System",
"description1": "The system provides real-time updates on lot availability, status and pricing.", "description1": "The system provides real-time updates on lot availability, status and pricing.",
"description2": "The sales tool automatically creates a client profile in your CRM system and assigns a dedicated manager.", "description2": "The sales tool automatically creates a client profile in your CRM system and assigns a dedicated manager.",
"description3": "Graff.estate provides API integration with existing sales systems while capturing user analytics and behavioral data." "description3": "GRAFF.estate provides API integration with existing sales systems while capturing user analytics and behavioral data."
}, },
"videos_title": { "videos_title": {
"search": "Search", "search": "Search",
@@ -148,7 +148,7 @@
"start_demo": "Start demo", "start_demo": "Start demo",
"info": "We'll explain and demonstrate how it works on a call", "info": "We'll explain and demonstrate how it works on a call",
"leave_request": "Leave request", "leave_request": "Leave request",
"demo_available": "Graff.estate stream is available on any device, for demonstration, you only need an internet connection", "demo_available": "GRAFF.estate Stream is available on any device, for demonstration, you only need an internet connection",
"Казань": "Kazan", "Казань": "Kazan",
"Москва": "Moscow", "Москва": "Moscow",
"Владивосток": "Vladivostok", "Владивосток": "Vladivostok",
@@ -205,7 +205,7 @@
"Интерактивная презентация": "Interactive presentation", "Интерактивная презентация": "Interactive presentation",
"Удаленная демонстрация": "Remote showcase", "Удаленная демонстрация": "Remote showcase",
"Архитектурная визуализация": "Architectural rendering", "Архитектурная визуализация": "Architectural rendering",
"Создание сайтов": "Website development", "Создание сайтов": "Development of websites and 360° Web Tours.",
"Web-тур по 360 сферам": "Immersive 360° Web Tour", "Web-тур по 360 сферам": "Immersive 360° Web Tour",
"Виртуальный тур по 360 сферам": "Virtual 360° Tour", "Виртуальный тур по 360 сферам": "Virtual 360° Tour",
"Недвижимость": "Real estate", "Недвижимость": "Real estate",
+1 -1
View File
@@ -199,7 +199,7 @@
"Интерактивная презентация": "Интерактивная презентация", "Интерактивная презентация": "Интерактивная презентация",
"Удаленная демонстрация": "Удаленная демонстрация", "Удаленная демонстрация": "Удаленная демонстрация",
"Архитектурная визуализация": "Архитектурная визуализация", "Архитектурная визуализация": "Архитектурная визуализация",
"Создание сайтов": "Создание сайтов", "Создание сайтов": "Создание сайтов и виртуальных туров по 360° сферам.",
"Недвижимость": "Недвижимость", "Недвижимость": "Недвижимость",
"Награды": "Награды", "Награды": "Награды",
"Выставки": "Выставки", "Выставки": "Выставки",
Binary file not shown.
Binary file not shown.
Binary file not shown.
+5 -5
View File
@@ -3,7 +3,7 @@ import { ProductItem } from "@/ui/ProductItem";
export function Products() { export function Products() {
return ( return (
<div className="grid md:grid-cols-2 grid-cols-3 md:grid-rows-6 grid-rows-2 gap-1 lg:gap-2 rounded-2xl max-h-[calc(100dvh-100px)] lg:h-[38.889vw] md:max-lg:h-[72.917vw] h-full w-full"> <div className="grid max-md:grid-cols-2 max-md:grid-rows-2 md:grid-cols-2 grid-cols-3 md:grid-rows-6 grid-rows-2 gap-1 lg:gap-2 rounded-2xl max-h-[calc(100dvh-100px)] lg:h-[38.889vw] md:max-lg:h-[72.917vw] h-full w-full">
{products.map((product, index) => ( {products.map((product, index) => (
<ProductItem <ProductItem
href={"/" + product.title.toLowerCase()} href={"/" + product.title.toLowerCase()}
@@ -11,10 +11,10 @@ export function Products() {
{...product} {...product}
className={ className={
index < 2 index < 2
? "max-md:aspect-[100/114] md:col-start-1 md:row-span-3" ? "md:col-start-1 md:row-span-3 "
: index === 4 : index === 3
? "col-span-2 md:col-span-1 md:col-start-2 md:row-start-5 md:row-end-7" ? "col-span-2 md:col-span-1 md:col-start-2 md:row-start-4 md:row-end-7 max-md:col-start-2 max-md:col-end-2"
: "max-md:aspect-[100/114] md:col-span-1 md:col-start-2 md:[&:nth-child(3)]:row-start-1 md:[&:nth-child(3)]:row-end-3 md:[&:nth-child(4)]:row-start-3 md:[&:nth-child(4)]:row-end-5" : "md:col-span-1 md:col-start-2 md:[&:nth-child(3)]:row-start-1 md:[&:nth-child(3)]:row-end-4 md:[&:nth-child(4)]:row-start-3 md:[&:nth-child(4)]:row-end-5"
} }
/> />
))} ))}
@@ -44,7 +44,7 @@ function NewStreaming() {
<div className="max-lg:h-[400px] flex-1"> <div className="max-lg:h-[400px] flex-1">
<VideoPlayer src={"/videos/pages/home/streaming.mp4"} showMutingBtn> <VideoPlayer src={"/videos/pages/home/streaming.mp4"} showMutingBtn>
<p className="accent font-medium absolute top-6 left-6 w-[39.861vw] max-lg:w-[90vw] max-lg:text-[20px] "> <p className="accent font-medium absolute top-6 left-6 w-[39.861vw] max-lg:w-[90vw] max-lg:text-[20px] ">
Graff.estate stream is available on any device all you need for GRAFF.estate Stream is available on any device all you need for
a demo is an internet connection. a demo is an internet connection.
</p> </p>
</VideoPlayer> </VideoPlayer>
@@ -1,6 +1,6 @@
import { useModalStore } from '@/stores/useModalStore'; import { useModalStore } from "@/stores/useModalStore";
import { motion } from 'framer-motion'; import { motion } from "framer-motion";
import { PrimeModal } from '../modals/PrimeModal'; import { PrimeModal } from "../modals/PrimeModal";
export function SeasonsCard({ slide }: { slide: number }) { export function SeasonsCard({ slide }: { slide: number }) {
const { setModal } = useModalStore(); const { setModal } = useModalStore();
@@ -9,7 +9,7 @@ export function SeasonsCard({ slide }: { slide: number }) {
<motion.div <motion.div
animate={{ animate={{
opacity: +(slide > 12), opacity: +(slide > 12),
bottom: slide > 12 ? '52.237vh' : '93.684vh', bottom: slide > 12 ? "52.237vh" : "93.684vh",
}} }}
onClick={() => onClick={() =>
setModal( setModal(
@@ -17,7 +17,7 @@ export function SeasonsCard({ slide }: { slide: number }) {
categoryTitle="Сезонность" categoryTitle="Сезонность"
title="Сезонность" title="Сезонность"
text="Сезонность даёт дополнительную глубину презентации: покупатель видит, как жилой комплекс выглядит осенью под золотыми листьями или зимой, украшенной гирляндами." text="Сезонность даёт дополнительную глубину презентации: покупатель видит, как жилой комплекс выглядит осенью под золотыми листьями или зимой, украшенной гирляндами."
packages={['Комфорт+']} packages={["Комфорт+"]}
src="/videos/pages/prime/seasons.mp4" src="/videos/pages/prime/seasons.mp4"
/> />
) )
-6
View File
@@ -22,11 +22,5 @@
"title": "Picture", "title": "Picture",
"text": "Архитектурная визуализация", "text": "Архитектурная визуализация",
"image": "/img/components/products/picture.png" "image": "/img/components/products/picture.png"
},
{
"id": 5,
"title": "Walk",
"text": "Виртуальный тур по 360 сферам",
"image": "/img/components/products/360.png"
} }
] ]
+3 -3
View File
@@ -44,14 +44,14 @@ export function ProductItem({
<motion.div <motion.div
initial={{ opacity: 0 }} initial={{ opacity: 0 }}
animate={{ opacity: 1 }} animate={{ opacity: 1 }}
className="relative md:hidden min-w-16 min-h-16 content-center" className="relative md:hidden min-w-16 min-h-16 content-center mx-auto"
> >
<img <img
src={image} src={image}
alt={text} alt={text}
className="rounded-lg !relative" className="rounded-lg !relative"
width={64} height={84}
height={64} width={84}
/> />
</motion.div> </motion.div>
<motion.div <motion.div