Bob AI: Update contact section with custom form and Yandex map

This commit is contained in:
kudinDmitriyUp
2026-06-14 11:06:43 +00:00
parent 372fe8596d
commit acec5d7065
11 changed files with 399 additions and 298 deletions

View File

@@ -1,5 +1,5 @@
import FooterBasic from '@/components/sections/footer/FooterBasic';
import NavbarFloating from '@/components/ui/NavbarFloating';
import NavbarFullscreen from '@/components/ui/NavbarFullscreen';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import SiteBackgroundSlot from "@/components/ui/SiteBackgroundSlot";
import { Outlet } from 'react-router-dom';
@@ -8,32 +8,24 @@ import { StyleProvider } from "@/components/ui/StyleProvider";
export default function Layout() {
const navItems = [
{
"name": "Home",
"name": "Главная",
"href": "#hero"
},
{
"name": "Properties",
"name": "Каталог",
"href": "#products"
},
{
"name": "About",
"name": "О нас",
"href": "#about"
},
{
"name": "Contact",
"href": "#contact"
},
{
"name": "Features",
"name": "Условия",
"href": "#features"
},
{
"name": "Testimonials",
"href": "#testimonials"
},
{
"name": "Metrics",
"href": "#metrics"
"name": "Контакты",
"href": "#contact"
}
];
@@ -41,10 +33,10 @@ export default function Layout() {
<StyleProvider buttonVariant="default" siteBackground="noise" heroBackground="lightRaysCenter">
<SiteBackgroundSlot />
<SectionErrorBoundary name="navbar">
<NavbarFloating
<NavbarFullscreen
logo="Kvadrat Capital"
ctaButton={{
text: "Enquire Now",
text: "Связаться",
href: "#contact",
}}
navItems={navItems} />
@@ -56,51 +48,38 @@ export default function Layout() {
<FooterBasic
columns={[
{
title: "Agency",
title: "Агентство",
items: [
{
label: "About",
label: "О нас",
href: "#about",
},
{
label: "Properties",
label: "Каталог",
href: "#products",
},
{
label: "Careers",
href: "#",
label: "Условия",
href: "#features",
},
],
},
{
title: "Legal",
title: "Контакты",
items: [
{
label: "Privacy",
href: "#",
label: "Грозный, Чеченская Республика",
href: "#contact",
},
{
label: "Terms",
href: "#",
},
],
},
{
title: "Connect",
items: [
{
label: "Twitter",
href: "#",
},
{
label: "Instagram",
href: "#",
label: "Связаться с нами",
href: "#contact",
},
],
},
]}
leftText="© 2024 Kvadrat Capital. All rights reserved."
rightText="Curated with prestige."
leftText="© 2024 Kvadrat Capital. Все права защищены."
rightText="Надежность и доверие."
/>
</SectionErrorBoundary>
</StyleProvider>

View File

@@ -1,22 +1,22 @@
@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap');
@import "tailwindcss";
@import "./styles/masks.css";
@import "./styles/animations.css";
:root {
/* @colorThemes/lightTheme/grayNavyBlue */
--background: #f5f4ef;
--card: #dad6cd;
--foreground: #2a2928;
--primary-cta: #2a2928;
--primary-cta-text: #f5f4ef;
--secondary-cta: #ecebea;
--secondary-cta-text: #2a2928;
--accent: #ffffff;
--background-accent: #c6b180;
--background: #ffffff;
--card: #f8f9fb;
--foreground: #1a1a2e;
--primary-cta: #0f172a;
--primary-cta-text: #ffffff;
--secondary-cta: #1e3a5f;
--secondary-cta-text: #ffffff;
--accent: #1e3a5f;
--background-accent: #f8f9fb;
/* @layout/border-radius/rounded */
--radius: 1.5rem;
--radius: 1rem;
/* @layout/content-width/medium */
--width-content-width: clamp(40rem, 72.5vw, 100rem);
@@ -88,7 +88,7 @@
--color-background-accent: var(--background-accent);
/* Fonts */
--font-sans: 'Manrope', sans-serif;
--font-sans: 'Montserrat', sans-serif;
--font-tight: "Inter Tight", sans-serif;
--font-mono: monospace;

View File

@@ -1,256 +1,36 @@
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import FeaturesMediaCards from '@/components/sections/features/FeaturesMediaCards';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import MetricsSimpleCards from '@/components/sections/metrics/MetricsSimpleCards';
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
import { Award, Shield, Zap } from "lucide-react";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
// AUTO-GENERATED shell by per-section-migrate.
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
// files directly. Non-block content (wrappers, non-inlinable sections) is
// preserved inline; extracted section blocks become <XSection/> refs.
export default function HomePage() {
import React from 'react';
import HeroSection from './HomePage/sections/Hero';
import FeaturesSection from './HomePage/sections/Features';
import ProductsSection from './HomePage/sections/Products';
import AboutSection from './HomePage/sections/About';
import TestimonialsSection from './HomePage/sections/Testimonials';
import MetricsSection from './HomePage/sections/Metrics';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="Kvadrat Capital"
description="Excellence in curated property investments and luxury residential acquisitions."
primaryButton={{
text: "View Portfolio",
href: "#products",
}}
secondaryButton={{
text: "Book Consultation",
href: "#contact",
}}
imageSrc="http://img.b2bpic.net/free-photo/balcony-witu-elegant-furniture-decoration-generative-ai_188544-12681.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesMediaCards
tag="Our Expertise"
title="Why Kvadrat Capital?"
description="We blend market intelligence with sophisticated property management to deliver exceptional returns."
items={[
{
title: "Strategic Investment",
description: "Data-driven insights for high-yield real estate acquisitions.",
imageSrc: "http://img.b2bpic.net/free-photo/architectural-blueprints_1359-454.jpg",
},
{
title: "Client-Centric Service",
description: "Bespoke property brokerage tailored to your lifestyle and portfolio.",
imageSrc: "http://img.b2bpic.net/free-photo/side-view-female-realtor-shaking-hands-with-couple-new-house-deal_23-2148895464.jpg",
},
{
title: "Architectural Prestige",
description: "Curating residential spaces that define modern architectural standards.",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-modern-office-buildings_1359-605.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<FeaturesSection />
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<FeaturesImageBento
tag="Curated Listings"
title="Featured Residential Assets"
description="Explore our exclusive inventory of premium properties."
items={[
{
title: "City Penthouse",
description: "Downtown luxury.",
imageSrc: "http://img.b2bpic.net/free-photo/modern-sauna-with-panoramic-windows-wooden-design_169016-70021.jpg",
},
{
title: "Coastal Villa",
description: "Modern serenity.",
imageSrc: "http://img.b2bpic.net/free-photo/relax-house-thai-style_1150-17982.jpg",
},
{
title: "Urban Oasis",
description: "Refined interiors.",
imageSrc: "http://img.b2bpic.net/free-photo/luxury-bedroom-with-modern-design-elegance-generated-by-ai_188544-23557.jpg",
},
{
title: "Modern Kitchens",
description: "High-end design.",
imageSrc: "http://img.b2bpic.net/free-photo/elegant-young-woman-bikini-male-shirt-posing-with-glass-water-kitchen_627829-11342.jpg",
},
{
title: "Spa Retreats",
description: "Luxury bathrooms.",
imageSrc: "http://img.b2bpic.net/free-photo/modern-kitchen-drawer-made-natural-wood-elegant-premium-interior-design_169016-72733.jpg",
},
{
title: "Sky Terraces",
description: "Rooftop living.",
imageSrc: "http://img.b2bpic.net/free-photo/outdoor-patio-with-table-chair_74190-7542.jpg",
},
{
title: "Architectural Detail",
description: "Craftsmanship.",
imageSrc: "http://img.b2bpic.net/free-photo/vertical-shot-bench-yard-door-old-private-house_181624-6710.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<ProductsSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutFeaturesSplit
tag="Our Heritage"
title="Defining Modern Living"
description="Kvadrat Capital is built on the foundation of trust, transparency, and architectural appreciation."
items={[
{
icon: Shield,
title: "Certified Integrity",
description: "Fully licensed and bonded.",
},
{
icon: Award,
title: "Market Leaders",
description: "Decades of collective experience.",
},
{
icon: Zap,
title: "Swift Closing",
description: "Streamlined acquisition process.",
},
]}
imageSrc="http://img.b2bpic.net/free-photo/happy-couple-receiving-keys-their-new-home-from-realtor_23-2148895470.jpg"
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialRatingCards
tag="Client Stories"
title="What Our Clients Say"
description="Experience excellence through the perspective of those we have served."
testimonials={[
{
name: "Arthur Dent",
role: "Investor",
quote: "Unparalleled expertise in luxury acquisitions.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-happy-mother-home_23-2148321636.jpg",
},
{
name: "Trillian Astra",
role: "Homeowner",
quote: "They made the impossible acquisition simple.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-carefree-brunette-woman-sitting-couch-living-room-online-shopping_1258-201984.jpg",
},
{
name: "Ford Prefect",
role: "Portfolio Owner",
quote: "Professional, reliable, and extremely effective.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-young-businessman-video-calling-mobile-phone_23-2148176223.jpg",
},
{
name: "Zaphod Beeblebrox",
role: "Investor",
quote: "Best real estate team in the industry today.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/serious-executive-with-short-hair-crossed-arms_1149-89.jpg",
},
{
name: "Marvin Android",
role: "Developer",
quote: "A truly superior level of customer service.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/blond-businessman-happy-expression_1194-3863.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsSimpleCards
tag="The Numbers"
title="Proven Performance"
description="Delivering measurable value for every client we partner with."
metrics={[
{
value: "$500M+",
description: "Assets Under Management",
},
{
value: "1.2k+",
description: "Properties Successfully Closed",
},
{
value: "15+",
description: "Years of Excellence",
},
{
value: "98%",
description: "Client Retention Rate",
},
]}
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTwoColumn
tag="General Inquiries"
title="Frequently Asked Questions"
description="Everything you need to know about starting your property journey."
items={[
{
question: "How do I start an investment portfolio?",
answer: "Consult with our team to align your goals.",
},
{
question: "Are your properties vetted?",
answer: "Yes, every asset undergoes strict due diligence.",
},
{
question: "Can I visit a property?",
answer: "Viewings are available upon request and qualification.",
},
{
question: "Do you offer financing assistance?",
answer: "We work with top lenders to facilitate deals.",
},
]}
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Get Started"
text="Your next premium investment is a conversation away."
primaryButton={{
text: "Contact Us",
href: "mailto:hello@kvadrat.capital",
}}
secondaryButton={{
text: "Visit Office",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

View File

@@ -0,0 +1,23 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "about" section.
import React from 'react';
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
import { Award, Shield, Zap } from "lucide-react";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutFeaturesSplit
tag="О нас"
title="Ваш надежный партнер в сфере недвижимости"
description="Kvadrat Capital — ведущее агентство недвижимости в Грозном. Мы помогаем нашим клиентам находить лучшие объекты для жизни и инвестиций, обеспечивая безопасность и прозрачность каждой сделки."
items={[{"icon":"Shield","title":"Надежность","description":"Работаем со всеми надежными застройщиками Чеченской Республики."},{"title":"Опыт","icon":"Award","description":"Более 10 лет успешной работы на рынке недвижимости."},{"icon":"Zap","title":"Оперативность","description":"Быстрое оформление сделок и помощь в получении рассрочки."}]}
imageSrc="http://img.b2bpic.net/free-photo/happy-couple-receiving-keys-their-new-home-from-realtor_23-2148895470.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,122 @@
/* eslint-disable */
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
import ScrollReveal from "@/components/ui/ScrollReveal";
import TextAnimation from "@/components/ui/TextAnimation";
import Button from "@/components/ui/Button";
import Input from "@/components/ui/Input";
import Textarea from "@/components/ui/Textarea";
import Tag from "@/components/ui/Tag";
import { MapPin, Phone, Mail, User } from "lucide-react";
const ContactInline = () => {
return (
<section aria-label="Contact section" className="py-20 bg-background">
<div className="w-content-width mx-auto px-4 md:px-6">
<div className="flex flex-col items-center text-center mb-16">
<ScrollReveal>
<Tag text="Контакты" className="mb-4" />
</ScrollReveal>
<TextAnimation
text="Свяжитесь с нами"
variant="slide-up"
tag="h2"
className="text-4xl md:text-5xl font-bold text-foreground mb-6"
gradientText={false}
/>
<ScrollReveal delay={0.1}>
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
Оставьте заявку, и наши специалисты свяжутся с вами в ближайшее время для консультации.
</p>
</ScrollReveal>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-start">
<ScrollReveal delay={0.2} className="w-full">
<div className="bg-card rounded-theme p-8 shadow-sm">
<form className="space-y-6" onSubmit={(e) => e.preventDefault()}>
<div className="space-y-4">
<div className="relative">
<div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<User className="h-5 w-5 text-muted-foreground" />
</div>
<Input
type="text"
placeholder="Ваше имя"
className="pl-10 bg-background border-none"
required
/>
</div>
<div className="relative">
<div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<Phone className="h-5 w-5 text-muted-foreground" />
</div>
<Input
type="tel"
placeholder="Номер телефона"
className="pl-10 bg-background border-none"
required
/>
</div>
<div className="relative">
<Textarea
placeholder="Ваше сообщение"
className="bg-background border-none min-h-[120px]"
rows={4}
/>
</div>
</div>
<Button
text="Отправить заявку"
variant="primary"
className="w-full"
/>
</form>
</div>
</ScrollReveal>
<ScrollReveal delay={0.3} className="w-full h-full flex flex-col">
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6 mb-8">
<div className="flex items-start space-x-4">
<div className="bg-primary-cta/10 p-3 rounded-full">
<MapPin className="h-6 w-6 text-primary-cta" />
</div>
<div>
<h4 className="font-semibold text-foreground mb-1">Адрес</h4>
<p className="text-muted-foreground">г. Грозный, Чеченская Республика</p>
</div>
</div>
<div className="flex items-start space-x-4">
<div className="bg-primary-cta/10 p-3 rounded-full">
<Phone className="h-6 w-6 text-primary-cta" />
</div>
<div>
<h4 className="font-semibold text-foreground mb-1">Телефон</h4>
<p className="text-muted-foreground">+7 (999) 000-00-00</p>
</div>
</div>
</div>
<div className="flex-grow rounded-theme overflow-hidden min-h-[300px] bg-card">
<iframe
src="https://yandex.ru/map-widget/v1/?ll=45.688928%2C43.318353&z=12"
width="100%"
height="100%"
frameBorder="0"
allowFullScreen={true}
className="w-full h-full border-0"
title="Yandex Map"
></iframe>
</div>
</ScrollReveal>
</div>
</div>
</section>
);
};
export default function ContactSection() {
return (
<div data-webild-section="contact" id="contact">
<ContactInline />
</div>
);
}

View File

@@ -0,0 +1,38 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "faq" section.
import React from 'react';
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTwoColumn
tag="General Inquiries"
title="Frequently Asked Questions"
description="Everything you need to know about starting your property journey."
items={[
{
question: "How do I start an investment portfolio?",
answer: "Consult with our team to align your goals.",
},
{
question: "Are your properties vetted?",
answer: "Yes, every asset undergoes strict due diligence.",
},
{
question: "Can I visit a property?",
answer: "Viewings are available upon request and qualification.",
},
{
question: "Do you offer financing assistance?",
answer: "We work with top lenders to facilitate deals.",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,21 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "features" section.
import React from 'react';
import FeaturesMediaCards from '@/components/sections/features/FeaturesMediaCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FeaturesSection(): React.JSX.Element {
return (
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesMediaCards
tag="Условия"
title="Выгодные условия покупки"
description="Мы предлагаем гибкие и выгодные условия для приобретения недвижимости."
items={[{"description":"Без переплат и скрытых комиссий, сроком до 6 лет.","title":"Исламская рассрочка","imageSrc":"http://img.b2bpic.net/free-photo/architectural-blueprints_1359-454.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/side-view-female-realtor-shaking-hands-with-couple-new-house-deal_23-2148895464.jpg","description":"Возможность приобретения недвижимости без первоначального взноса.","title":"Без первоначального взноса"},{"description":"Принимаем материнский капитал в качестве оплаты.","title":"Материнский капитал","imageSrc":"http://img.b2bpic.net/free-photo/close-up-modern-office-buildings_1359-605.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/architectural-blueprints_1359-454.jpg","description":"Специальные условия и скидки для участников СВО.","title":"Скидки для СВО"},{"imageSrc":"http://img.b2bpic.net/free-photo/side-view-female-realtor-shaking-hands-with-couple-new-house-deal_23-2148895464.jpg","description":"Льготные условия приобретения для пенсионеров.","title":"Скидки пенсионерам"},{"imageSrc":"http://img.b2bpic.net/free-photo/close-up-modern-office-buildings_1359-605.jpg","description":"Сотрудничаем со всеми надежными застройщиками региона.","title":"Все застройщики ЧР"},{"imageSrc":"http://img.b2bpic.net/free-photo/architectural-blueprints_1359-454.jpg","description":"Широкий выбор коммерческих помещений для бизнеса.","title":"Коммерческая недвижимость"},{"imageSrc":"http://img.b2bpic.net/free-photo/side-view-female-realtor-shaking-hands-with-couple-new-house-deal_23-2148895464.jpg","description":"Участки под ИЖС и коммерческую застройку.","title":"Земельные участки"}]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,22 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "hero" section.
import React from 'react';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="Kvadrat Capital"
description="Надежное агентство недвижимости в Грозном. Работаем со всеми застройщиками Чеченской Республики. Исламская рассрочка, материнский капитал, скидки для СВО и пенсионеров."
primaryButton={{"href":"#products","text":"Смотреть каталог"}}
secondaryButton={{"href":"#contact","text":"Связаться с нами"}}
imageSrc="http://img.b2bpic.net/free-photo/balcony-witu-elegant-furniture-decoration-generative-ai_188544-12681.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,38 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "metrics" section.
import React from 'react';
import MetricsSimpleCards from '@/components/sections/metrics/MetricsSimpleCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function MetricsSection(): React.JSX.Element {
return (
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsSimpleCards
tag="The Numbers"
title="Proven Performance"
description="Delivering measurable value for every client we partner with."
metrics={[
{
value: "$500M+",
description: "Assets Under Management",
},
{
value: "1.2k+",
description: "Properties Successfully Closed",
},
{
value: "15+",
description: "Years of Excellence",
},
{
value: "98%",
description: "Client Retention Rate",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,21 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "products" section.
import React from 'react';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ProductsSection(): React.JSX.Element {
return (
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<FeaturesImageBento
tag="Каталог"
title="Актуальные предложения"
description="Ознакомьтесь с нашими эксклюзивными предложениями недвижимости в Грозном."
items={[{"description":"3 комнаты, 120 м², центр города.","imageSrc":"http://img.b2bpic.net/free-photo/modern-sauna-with-panoramic-windows-wooden-design_169016-70021.jpg","title":"ЖК Ахмат Тауэр"},{"description":"2 комнаты, 75 м², развитая инфраструктура.","title":"ЖК Минутка","imageSrc":"http://img.b2bpic.net/free-photo/relax-house-thai-style_1150-17982.jpg"},{"title":"ЖК Европейский","imageSrc":"http://img.b2bpic.net/free-photo/luxury-bedroom-with-modern-design-elegance-generated-by-ai_188544-23557.jpg","description":"4 комнаты, 150 м², премиум класс."},{"title":"ЖК Солнечный","imageSrc":"http://img.b2bpic.net/free-photo/elegant-young-woman-bikini-male-shirt-posing-with-glass-water-kitchen_627829-11342.jpg","description":"1 комната, 45 м², отличный вариант для инвестиций."},{"imageSrc":"http://img.b2bpic.net/free-photo/modern-kitchen-drawer-made-natural-wood-elegant-premium-interior-design_169016-72733.jpg","title":"ТЦ Гранд Парк","description":"Коммерческое помещение, 200 м², первая линия."},{"imageSrc":"http://img.b2bpic.net/free-photo/outdoor-patio-with-table-chair_74190-7542.jpg","title":"Поселок Алды","description":"Участок под ИЖС, 10 соток."},{"imageSrc":"http://img.b2bpic.net/free-photo/vertical-shot-bench-yard-door-old-private-house_181624-6710.jpg","title":"Коттеджный поселок","description":"Таунхаус, 180 м², закрытая территория."}]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,57 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "testimonials" section.
import React from 'react';
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TestimonialsSection(): React.JSX.Element {
return (
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialRatingCards
tag="Client Stories"
title="What Our Clients Say"
description="Experience excellence through the perspective of those we have served."
testimonials={[
{
name: "Arthur Dent",
role: "Investor",
quote: "Unparalleled expertise in luxury acquisitions.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-happy-mother-home_23-2148321636.jpg",
},
{
name: "Trillian Astra",
role: "Homeowner",
quote: "They made the impossible acquisition simple.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-carefree-brunette-woman-sitting-couch-living-room-online-shopping_1258-201984.jpg",
},
{
name: "Ford Prefect",
role: "Portfolio Owner",
quote: "Professional, reliable, and extremely effective.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-young-businessman-video-calling-mobile-phone_23-2148176223.jpg",
},
{
name: "Zaphod Beeblebrox",
role: "Investor",
quote: "Best real estate team in the industry today.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/serious-executive-with-short-hair-crossed-arms_1149-89.jpg",
},
{
name: "Marvin Android",
role: "Developer",
quote: "A truly superior level of customer service.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/blond-businessman-happy-expression_1194-3863.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}