pages updated

This commit is contained in:
Selvi 2025-11-26 19:01:02 +05:30
parent 9249b1fa29
commit 0713049d30
20 changed files with 658 additions and 271 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://skyandsoil.metatronnest.com/</loc></url><url><loc>https://skyandsoil.metatronnest.com/about/</loc></url><url><loc>https://skyandsoil.metatronnest.com/projects/</loc></url><url><loc>https://skyandsoil.metatronnest.com/lifestyle/</loc></url><url><loc>https://skyandsoil.metatronnest.com/contact/</loc></url><url><loc>https://skyandsoil.metatronnest.com/compare/</loc></url><url><loc>https://skyandsoil.metatronnest.com/properties/1/</loc></url><url><loc>https://skyandsoil.metatronnest.com/properties/2/</loc></url><url><loc>https://skyandsoil.metatronnest.com/properties/3/</loc></url><url><loc>https://skyandsoil.metatronnest.com/properties/4/</loc></url><url><loc>https://skyandsoil.metatronnest.com/properties/5/</loc></url></urlset>
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://skyandsoil.metatronnest.com/</loc></url><url><loc>https://skyandsoil.metatronnest.com/about/</loc></url><url><loc>https://skyandsoil.metatronnest.com/projects/</loc></url><url><loc>https://skyandsoil.metatronnest.com/residential-real-estate/</loc></url><url><loc>https://skyandsoil.metatronnest.com/lifestyle/</loc></url><url><loc>https://skyandsoil.metatronnest.com/contact/</loc></url><url><loc>https://skyandsoil.metatronnest.com/compare/</loc></url><url><loc>https://skyandsoil.metatronnest.com/privacy-policy/</loc></url><url><loc>https://skyandsoil.metatronnest.com/terms-of-service/</loc></url><url><loc>https://skyandsoil.metatronnest.com/residential-real-estate/barca-at-godrej-msr-city/</loc></url><url><loc>https://skyandsoil.metatronnest.com/residential-real-estate/godrej-woods/</loc></url><url><loc>https://skyandsoil.metatronnest.com/residential-real-estate/godrej-hoskote/</loc></url><url><loc>https://skyandsoil.metatronnest.com/residential-real-estate/godrej-lakeside-orchard/</loc></url><url><loc>https://skyandsoil.metatronnest.com/residential-real-estate/godrej-tiara/</loc></url></urlset>

View File

@ -23,16 +23,26 @@ const staticLinks = [
{ url: "/" },
{ url: "/about/" },
{ url: "/projects/" },
{ url: "/residential-real-estate/" },
{ url: "/lifestyle/" },
{ url: "/contact/" },
{ url: "/compare/" },
{ url: "/privacy-policy/" },
{ url: "/terms-of-service/" },
];
// ✅ Dynamic properties (IDs from src/data/properties.ts)
const propertyIds = [1, 2, 3, 4, 5];
const propertyLinks = propertyIds.map(id => ({ url: `/properties/${id}/` }));
// ✅ Dynamic property pages (manual slugs)
const propertyPages = [
{ slug: "/residential-real-estate/barca-at-godrej-msr-city/" },
{ slug: "/residential-real-estate/godrej-woods/" },
{ slug: "/residential-real-estate/godrej-hoskote/" },
{ slug: "/residential-real-estate/godrej-lakeside-orchard/" },
{ slug: "/residential-real-estate/godrej-tiara/" },
];
// Combine static + dynamic links
const propertyLinks = propertyPages.map(page => ({ url: page.slug }));
// Combine static + property links
const allLinks = [...staticLinks, ...propertyLinks].map(link => ({
url: formatUrl(link.url),
}));

View File

@ -0,0 +1,160 @@
import Link from "next/link";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import InnerBanner from "@/components/InnerBanner";
export default function PrivacyPolicy() {
return (
<div className="min-h-screen bg-white dark:bg-black">
{/* Header */}
<Header />
{/* Inner Banner */}
<InnerBanner
title="Privacy Policy"
subtitle="Learn how we protect and manage your data"
breadcrumbs={[
{ label: "Home", href: "/" },
{ label: "Privacy Policy" }
]}
backgroundImage="/assets/images/about/privacy-policy-banner.jpg"
/>
{/* Page Content */}
<div className="max-w-4xl mx-auto px-6 py-20">
<h1 className="text-4xl md:text-5xl font-bold text-foreground mb-8">
Privacy Policy
</h1>
<div className="prose prose-lg dark:prose-invert max-w-none">
<p className="text-gray-600 dark:text-gray-400 mb-6">
Last updated: {new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
</p>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">1. Introduction</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
Welcome to Sky and Soil. We respect your privacy and are committed to protecting your personal data.
This privacy policy will inform you about how we look after your personal data when you visit our website
and tell you about your privacy rights and how the law protects you.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">2. Information We Collect</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
We may collect, use, store and transfer different kinds of personal data about you which we have grouped together as follows:
</p>
<ul className="list-disc pl-6 text-gray-600 dark:text-gray-400 space-y-2">
<li><strong>Identity Data:</strong> includes first name, last name, username or similar identifier.</li>
<li><strong>Contact Data:</strong> includes email address, telephone numbers, and mailing address.</li>
<li><strong>Technical Data:</strong> includes internet protocol (IP) address, browser type and version, time zone setting and location, browser plug-in types and versions, operating system and platform.</li>
<li><strong>Usage Data:</strong> includes information about how you use our website and services.</li>
<li><strong>Marketing and Communications Data:</strong> includes your preferences in receiving marketing from us and your communication preferences.</li>
</ul>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">3. How We Use Your Information</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
We will only use your personal data when the law allows us to. Most commonly, we will use your personal data in the following circumstances:
</p>
<ul className="list-disc pl-6 text-gray-600 dark:text-gray-400 space-y-2">
<li>To provide and maintain our services</li>
<li>To notify you about changes to our services</li>
<li>To provide customer support</li>
<li>To gather analysis or valuable information so that we can improve our services</li>
<li>To monitor the usage of our services</li>
<li>To detect, prevent and address technical issues</li>
<li>To provide you with news, special offers and general information about other goods, services and events which we offer</li>
</ul>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">4. Data Security</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
We have put in place appropriate security measures to prevent your personal data from being accidentally lost,
used or accessed in an unauthorized way, altered or disclosed. In addition, we limit access to your personal data
to those employees, agents, contractors and other third parties who have a business need to know.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">5. Data Retention</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
We will only retain your personal data for as long as necessary to fulfil the purposes we collected it for,
including for the purposes of satisfying any legal, accounting, or reporting requirements.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">6. Your Legal Rights</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
Under certain circumstances, you have rights under data protection laws in relation to your personal data, including the right to:
</p>
<ul className="list-disc pl-6 text-gray-600 dark:text-gray-400 space-y-2">
<li>Request access to your personal data</li>
<li>Request correction of your personal data</li>
<li>Request erasure of your personal data</li>
<li>Object to processing of your personal data</li>
<li>Request restriction of processing your personal data</li>
<li>Request transfer of your personal data</li>
<li>Right to withdraw consent</li>
</ul>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">7. Cookies</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
Our website uses cookies to distinguish you from other users of our website. This helps us to provide you
with a good experience when you browse our website and also allows us to improve our site.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">8. Third-Party Links</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
Our website may include links to third-party websites, plug-ins and applications. Clicking on those links
or enabling those connections may allow third parties to collect or share data about you. We do not control
these third-party websites and are not responsible for their privacy statements.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">9. Contact Us</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
If you have any questions about this Privacy Policy, please contact us:
</p>
<ul className="list-none text-gray-600 dark:text-gray-400 space-y-2">
<li>Email: hello@skyandsoil.com</li>
<li>Phone: +91 80 1234 5678</li>
<li>Address: Bangalore, Karnataka</li>
</ul>
</section>
</div>
<div className="mt-12">
<Link
href="/"
className="inline-flex items-center text-primary hover:underline"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className="w-5 h-5 mr-2"
>
<path strokeLinecap="round" strokeLinejoin="round" d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18" />
</svg>
Back to Home
</Link>
</div>
</div>
{/* Footer */}
<Footer />
</div>
);
}

View File

@ -1,11 +1,93 @@
import PropertiesClient from "@/components/PropertiesClient";
import { Metadata } from "next";
import Link from "next/link";
import Image from "next/image";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import InnerBanner from "@/components/InnerBanner";
export const metadata: Metadata = {
title: "Our Properties | Sky and Soil Real Estate",
description: "Browse our exclusive collection of premium apartments, villas, and plots in North Bengaluru. Find your perfect home with Sky and Soil.",
};
export default function ProjectsPage() {
const categories = [
{
id: 1,
title: "Residential Real Estate",
description: "Discover our premium residential properties featuring modern architecture, luxury amenities, and prime locations. From spacious apartments to exclusive villas, find your dream home with world-class facilities and exceptional living experiences.",
image: "/assets/images/projects/residential-real-estate.jpg",
href: "/residential-real-estate",
properties: "Residential Real Estate"
}
];
export default function PropertiesPage() {
return <PropertiesClient />;
return (
<div className="min-h-screen bg-gray-50 dark:bg-black">
<Header />
<InnerBanner
title="Our Projects"
subtitle="Explore our diverse portfolio of real estate projects"
breadcrumbs={[
{ label: "Home", href: "/" },
{ label: "Projects" }
]}
/>
<div className="max-w-7xl mx-auto px-6 py-24">
<div className="text-center mb-12">
<h2 className="text-3xl md:text-4xl font-bold text-foreground mb-4">
Project Categories
</h2>
<p className="text-lg text-gray-600 dark:text-gray-400">
Browse through our carefully curated collection of properties
</p>
</div>
<div className="space-y-8">
{categories.map((category) => (
<div
key={category.id}
className="group bg-white dark:bg-gray-900 rounded-2xl overflow-hidden border border-gray-200 dark:border-gray-800 hover:border-primary dark:hover:border-primary shadow-lg hover:shadow-2xl transition-all duration-300"
>
<div className="grid grid-cols-1 md:grid-cols-12 gap-0">
{/* Image Section - Left */}
<div className="md:col-span-5 relative h-64 md:h-96 overflow-hidden">
<Image
src={category.image}
alt={category.title}
fill
className="object-cover group-hover:scale-110 transition-transform duration-500"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent md:bg-gradient-to-r md:from-transparent md:to-black/10" />
{/* Badge */}
<div className="absolute top-4 left-4 bg-primary text-white px-4 py-2 rounded-full text-sm font-semibold shadow-lg">
{category.properties}
</div>
</div>
{/* Content Section - Right */}
<div className="md:col-span-7 p-6 md:p-10 lg:p-12 flex flex-col justify-center">
<h3 className="text-2xl md:text-3xl lg:text-4xl font-bold text-foreground mb-4 group-hover:text-primary transition-colors">
{category.title}
</h3>
<p className="text-gray-600 dark:text-gray-400 text-sm md:text-base lg:text-lg mb-8 leading-relaxed">
{category.description}
</p>
<Link
href={category.href}
className="inline-flex items-center gap-2 px-8 py-4 bg-gradient-to-r from-primary to-blue-600 text-white rounded-xl font-semibold hover:shadow-xl transition-all duration-300 transform hover:scale-105 w-fit"
>
View More
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
</Link>
</div>
</div>
</div>
))}
</div>
</div>
<Footer />
</div>
);
}

View File

@ -1,34 +0,0 @@
import { Metadata } from "next";
import { properties } from "@/data/properties";
// Required for static site generation with dynamic routes
export function generateStaticParams() {
return properties.map((property) => ({
id: property.id.toString(),
}));
}
export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise<Metadata> {
const resolvedParams = await params;
const property = properties.find(p => p.id === parseInt(resolvedParams.id));
if (!property) {
return {
title: "Property Not Found | Sky and Soil",
description: "The requested property could not be found."
};
}
return {
title: `${property.title} | Sky and Soil`,
description: `Explore ${property.title} in ${property.location}. ${property.overview.bhk} ${property.category} starting at ${property.price}.`,
};
}
export default function PropertyLayout({
children,
}: {
children: React.ReactNode;
}) {
return <>{children}</>;
}

View File

@ -1,26 +0,0 @@
import { Metadata } from "next";
import { properties } from "@/data/properties";
// Required for static site generation with dynamic routes
export function generateStaticParams() {
return properties.map((property) => ({
id: property.id.toString(),
}));
}
export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise<Metadata> {
const resolvedParams = await params;
const property = properties.find(p => p.id === parseInt(resolvedParams.id));
if (!property) {
return {
title: "Property Not Found | Sky and Soil",
description: "The requested property could not be found."
};
}
return {
title: `${property.title} | Sky and Soil`,
description: `Explore ${property.title} in ${property.location}. ${property.overview.bhk} ${property.category} starting at ${property.price}.`,
};
}

View File

@ -1,20 +0,0 @@
import { properties } from "@/data/properties";
import { notFound } from "next/navigation";
import PropertyDetailClient from "@/components/PropertyDetailClient";
export async function generateStaticParams() {
return properties.map((property) => ({
slug: property.slug,
}));
}
export default async function PropertyDetailPage({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const property = properties.find(p => p.slug === slug);
if (!property) {
notFound();
}
return <PropertyDetailClient property={property} />;
}

View File

@ -0,0 +1,39 @@
import { notFound } from "next/navigation";
import PropertyDetailClient from "@/components/PropertyDetailClient";
import { properties } from "@/data/properties";
import { Metadata } from "next";
// Generate static params for all properties
export async function generateStaticParams() {
return properties.map((property) => ({
slug: property.slug,
}));
}
// Generate metadata for SEO
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
const { slug } = await params;
const property = properties.find((p) => p.slug === slug);
if (!property) {
return {
title: "Property Not Found",
};
}
return {
title: `${property.title} | Sky and Soil`,
description: property.description,
};
}
export default async function PropertyDetailPage({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const property = properties.find((p) => p.slug === slug);
if (!property) {
notFound();
}
return <PropertyDetailClient property={property} />;
}

View File

@ -0,0 +1,11 @@
import PropertiesClient from "@/components/PropertiesClient";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Residential Real Estate | Sky and Soil",
description: "Browse our exclusive collection of premium apartments, villas, and plots in North Bengaluru.",
};
export default function ResidentialRealEstatePage() {
return <PropertiesClient />;
}

View File

@ -0,0 +1,169 @@
import Link from "next/link";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import InnerBanner from "@/components/InnerBanner";
export default function TermsOfService() {
return (
<div className="min-h-screen bg-white dark:bg-black">
<Header />
<InnerBanner
title="Terms of Service"
subtitle="Please read our terms and conditions carefully"
breadcrumbs={[
{ label: "Home", href: "/" },
{ label: "Terms of Service" }
]}
backgroundImage="/assets/images/about/terms-banner.jpg"
/>
<div className="max-w-4xl mx-auto px-6 py-20">
<h1 className="text-4xl md:text-5xl font-bold text-foreground mb-8">
Terms of Service
</h1>
<div className="prose prose-lg dark:prose-invert max-w-none">
<p className="text-gray-600 dark:text-gray-400 mb-6">
Last updated: {new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
</p>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">1. Agreement to Terms</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
By accessing and using the Sky and Soil website, you accept and agree to be bound by the terms and
provision of this agreement. If you do not agree to abide by the above, please do not use this service.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">2. Use License</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
Permission is granted to temporarily access the materials (information or software) on Sky and Soil's
website for personal, non-commercial transitory viewing only. This is the grant of a license, not a
transfer of title, and under this license you may not:
</p>
<ul className="list-disc pl-6 text-gray-600 dark:text-gray-400 space-y-2">
<li>Modify or copy the materials</li>
<li>Use the materials for any commercial purpose or for any public display (commercial or non-commercial)</li>
<li>Attempt to decompile or reverse engineer any software contained on Sky and Soil's website</li>
<li>Remove any copyright or other proprietary notations from the materials</li>
<li>Transfer the materials to another person or "mirror" the materials on any other server</li>
</ul>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">3. Property Information Disclaimer</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
All property information, including but not limited to descriptions, photographs, floor plans, pricing,
and availability, is provided for informational purposes only and is subject to change without notice.
While we strive to ensure accuracy, we make no warranties or representations regarding the completeness
or accuracy of such information.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">4. User Responsibilities</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
As a user of this website, you agree to:
</p>
<ul className="list-disc pl-6 text-gray-600 dark:text-gray-400 space-y-2">
<li>Provide accurate and complete information when submitting inquiries or contact forms</li>
<li>Not use the website for any unlawful purpose or to solicit others to perform unlawful acts</li>
<li>Not infringe on the intellectual property rights of others</li>
<li>Not transmit any viruses, malware, or other malicious code</li>
<li>Not attempt to gain unauthorized access to any portion of the website</li>
</ul>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">5. Intellectual Property</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
The content, organization, graphics, design, compilation, magnetic translation, digital conversion,
and other matters related to the website are protected under applicable copyrights, trademarks, and
other proprietary rights. The copying, redistribution, use, or publication by you of any such matters
or any part of the website is strictly prohibited.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">6. Limitation of Liability</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
In no event shall Sky and Soil or its suppliers be liable for any damages (including, without limitation,
damages for loss of data or profit, or due to business interruption) arising out of the use or inability
to use the materials on Sky and Soil's website, even if Sky and Soil or a Sky and Soil authorized
representative has been notified orally or in writing of the possibility of such damage.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">7. Accuracy of Materials</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
The materials appearing on Sky and Soil's website could include technical, typographical, or photographic
errors. Sky and Soil does not warrant that any of the materials on its website are accurate, complete, or
current. Sky and Soil may make changes to the materials contained on its website at any time without notice.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">8. Links to Third-Party Sites</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
Sky and Soil has not reviewed all of the sites linked to its website and is not responsible for the
contents of any such linked site. The inclusion of any link does not imply endorsement by Sky and Soil
of the site. Use of any such linked website is at the user's own risk.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">9. Modifications to Terms</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
Sky and Soil may revise these terms of service for its website at any time without notice. By using
this website you are agreeing to be bound by the then current version of these terms of service.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">10. Governing Law</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
These terms and conditions are governed by and construed in accordance with the laws of India, and you
irrevocably submit to the exclusive jurisdiction of the courts in Bangalore, Karnataka.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold text-foreground mb-4">11. Contact Information</h2>
<p className="text-gray-600 dark:text-gray-400 mb-4">
If you have any questions about these Terms of Service, please contact us:
</p>
<ul className="list-none text-gray-600 dark:text-gray-400 space-y-2">
<li>Email: hello@skyandsoil.com</li>
<li>Phone: +91 80 1234 5678</li>
<li>Address: Bangalore, Karnataka</li>
</ul>
</section>
</div>
<div className="mt-12">
<Link
href="/"
className="inline-flex items-center text-primary hover:underline"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className="w-5 h-5 mr-2"
>
<path strokeLinecap="round" strokeLinejoin="round" d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18" />
</svg>
Back to Home
</Link>
</div>
</div>
<Footer />
</div>
);
}

View File

@ -1,6 +1,6 @@
"use client";
import { useState } from "react";
import { useState, useEffect } from "react";
import Image from "next/image";
const faqs = [
@ -37,121 +37,84 @@ export default function FAQ() {
const [activeCard, setActiveCard] = useState(0);
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
const [isHovering, setIsHovering] = useState(false);
const [activeTab, setActiveTab] = useState("General");
// Derive activeTab from activeCard to ensure sync
const activeTab = carouselImages[activeCard].label;
// Reset open FAQ when active card changes
useEffect(() => {
setOpenIndex(null);
}, [activeCard]);
const faqs = [
// General
// Building Exterior
{
category: "General",
question: "What types of properties do you offer?",
answer: "We offer a wide range of properties including luxury apartments, premium villas, and sustainable eco-homes designed to blend with nature."
category: "Building Exterior",
question: "What materials are used for the exterior?",
answer: "We use high-grade, weather-resistant materials including natural stone cladding and premium texture paints to ensure durability and elegance."
},
{
category: "General",
question: "Where are your projects located?",
answer: "Our projects are strategically located in prime areas of Bangalore, including North Bangalore, Sarjapur Road, and Whitefield, ensuring excellent connectivity and appreciation potential."
category: "Building Exterior",
question: "Is the building earthquake resistant?",
answer: "Yes, all our structures are RCC framed and designed to be earthquake resistant, adhering to the highest safety standards and seismic zones."
},
{
category: "General",
question: "Do you offer customization options?",
answer: "Yes, for select premium villas and apartments, we offer customization options for interiors and layout modifications, subject to structural feasibility."
category: "Building Exterior",
question: "How is the exterior maintenance handled?",
answer: "The society association manages exterior maintenance, including regular cleaning and painting, ensuring the building retains its pristine look for years."
},
{
category: "General",
question: "What is the starting price of your properties?",
answer: "Our properties start from ₹1.17 Cr for premium apartments and go up to ₹5 Cr+ for luxury villas, catering to a wide range of budgets."
category: "Building Exterior",
question: "Are there eco-friendly features in the design?",
answer: "Absolutely. We incorporate vertical gardens, solar reflective paints, and rainwater harvesting systems into the building's exterior design."
},
// Booking
// Luxury Amenities
{
category: "Booking",
question: "How can I book a site visit?",
answer: "You can book a site visit by clicking the 'Book a Visit' button on our website or by contacting our sales team directly through the contact form."
category: "Luxury Amenities",
question: "What recreational facilities are available?",
answer: "Residents enjoy access to a fully equipped clubhouse, temperature-controlled swimming pool, indoor games room, and a dedicated yoga deck."
},
{
category: "Booking",
question: "What is the booking amount?",
answer: "The booking amount varies by project but typically ranges from 5% to 10% of the total property value. Our sales team can provide specific details for your chosen unit."
category: "Luxury Amenities",
question: "Is there a gym within the premises?",
answer: "Yes, we provide a state-of-the-art gymnasium with modern cardio and strength training equipment, open 24/7 for residents."
},
{
category: "Booking",
question: "What documents are required for booking?",
answer: "You will need KYC documents (Aadhar Card, PAN Card), passport-sized photographs, and a cheque/draft for the booking amount."
category: "Luxury Amenities",
question: "Are there play areas for children?",
answer: "We have safe, designated play zones for children of all ages, featuring modern play equipment and soft flooring for safety."
},
{
category: "Booking",
question: "Can I cancel my booking?",
answer: "Yes, cancellation policies are outlined in the booking agreement. Generally, a cancellation fee may apply depending on the stage of the booking."
category: "Luxury Amenities",
question: "Do you offer concierge services?",
answer: "Yes, our premium properties feature a concierge desk to assist residents with daily tasks, guest management, and facility bookings."
},
// Finance
// Modern Architecture
{
category: "Finance",
question: "Do you provide assistance with home loans?",
answer: "Yes, we have tie-ups with leading banks and financial institutions to help you secure the best home loan rates and assist with the documentation process."
category: "Modern Architecture",
question: "What is the architectural style of the project?",
answer: "Our projects feature contemporary architecture with clean lines, open floor plans, and large windows to maximize natural light and ventilation."
},
{
category: "Finance",
question: "Which banks have approved your projects?",
answer: "Our projects are approved by major banks including SBI, HDFC, ICICI, Axis Bank, and others, ensuring a smooth loan approval process."
category: "Modern Architecture",
question: "Who are the architects behind the design?",
answer: "We collaborate with award-winning international architects who specialize in creating sustainable and aesthetically stunning living spaces."
},
{
category: "Finance",
question: "What are the payment plans available?",
answer: "We offer flexible payment plans such as construction-linked plans (CLP) and down-payment plans to suit your financial planning."
category: "Modern Architecture",
question: "Are the homes Vastu compliant?",
answer: "Yes, the majority of our units are designed in accordance with Vastu Shastra principles to ensure harmony and positive energy flow."
},
{
category: "Finance",
question: "Are there any hidden charges?",
answer: "We believe in complete transparency. All charges including GST, registration, and maintenance deposits are clearly communicated at the time of booking."
},
// Legal
{
category: "Legal",
question: "Are your projects RERA registered?",
answer: "Absolutely. All our projects are fully compliant with RERA regulations and we ensure complete transparency in all our dealings."
},
{
category: "Legal",
question: "Is the land title clear?",
answer: "Yes, all our projects are built on land with clear and marketable titles. We provide legal opinion reports from reputed law firms upon request."
},
{
category: "Legal",
question: "What legal documents will I receive?",
answer: "You will receive the Sale Agreement, Sale Deed, Occupancy Certificate (OC), and other relevant documents upon completion and registration."
},
{
category: "Legal",
question: "Do you assist with property registration?",
answer: "Yes, our team will guide you through the entire registration process and assist with the necessary paperwork at the sub-registrar's office."
},
// Amenities
{
category: "Amenities",
question: "What amenities are included in your projects?",
answer: "Our projects feature world-class amenities such as swimming pools, clubhouses, landscaped gardens, 24/7 security, and dedicated fitness centers."
},
{
category: "Amenities",
question: "Is there a dedicated play area for kids?",
answer: "Yes, all our projects include safe and well-equipped children's play areas, ensuring a fun environment for your little ones."
},
{
category: "Amenities",
question: "Do you have power backup?",
answer: "We provide 100% power backup for common areas and elevators, and partial/full backup for individual apartments depending on the project."
},
{
category: "Amenities",
question: "Is there a gym and swimming pool?",
answer: "Yes, a state-of-the-art gymnasium and a temperature-controlled swimming pool are standard amenities in most of our luxury projects."
},
category: "Modern Architecture",
question: "How is privacy ensured in the design?",
answer: "The layout is thoughtfully designed to ensure no two apartments look into each other, providing maximum privacy for all residents."
}
];
const categories = ["General", "Booking", "Finance", "Legal", "Amenities"];
const categories = carouselImages.map(img => img.label);
const filteredFaqs = faqs.filter(faq => faq.category === activeTab);
const toggleFAQ = (index: number) => {
@ -266,8 +229,8 @@ export default function FAQ() {
<button
key={category}
onClick={() => {
setActiveTab(category);
setOpenIndex(null);
const index = categories.indexOf(category);
setActiveCard(index);
}}
className={`px-4 py-2 rounded-full text-sm font-medium transition-all duration-300 ${activeTab === category
? "bg-primary text-white shadow-lg scale-105"

View File

@ -34,10 +34,8 @@ export default function Footer() {
<div>
<h4 className="font-semibold text-foreground mb-4">Legal</h4>
<ul className="space-y-2 text-sm text-gray-600 dark:text-gray-400">
<li><Link href="#" className="hover:text-primary transition-colors">Privacy Policy</Link></li>
<li><Link href="#" className="hover:text-primary transition-colors">Terms of Service</Link></li>
<li><Link href="#" className="hover:text-primary transition-colors">Disclaimer</Link></li>
<li><Link href="#" className="hover:text-primary transition-colors">RERA Compliance</Link></li>
<li><Link href="/privacy-policy" className="hover:text-primary transition-colors">Privacy Policy</Link></li>
<li><Link href="/terms-of-service" className="hover:text-primary transition-colors">Terms of Service</Link></li>
</ul>
</div>

View File

@ -100,7 +100,7 @@ export default function Properties({ layout = "slider" }: PropertiesProps) {
}
>
<Link
href={`/properties/${property.slug}`}
href={`/residential-real-estate/${property.slug}`}
className="group/card block bg-white dark:bg-gray-900 rounded-2xl overflow-hidden border border-gray-100 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 shadow-lg hover:shadow-2xl transition-all duration-300 h-full flex flex-col"
>
{/* Image */}
@ -154,7 +154,7 @@ export default function Properties({ layout = "slider" }: PropertiesProps) {
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{filteredProperties.map((property) => (
<Link
href={`/properties/${property.slug}`}
href={`/residential-real-estate/${property.slug}`}
key={property.id}
className="group bg-white dark:bg-gray-900 rounded-2xl overflow-hidden border border-gray-100 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 shadow-sm hover:shadow-xl transition-all duration-300 flex flex-col"
>

View File

@ -62,97 +62,97 @@ export default function PropertyCard({ property }: PropertyCardProps) {
setIsWishlisted(false);
} else {
// Add to wishlist
wishlist.push(property.id);
localStorage.setItem("wishlist", JSON.stringify(wishlist));
const updated = [...wishlist, property.id];
localStorage.setItem("wishlist", JSON.stringify(updated));
setIsWishlisted(true);
}
};
return (
<Link href={`/properties/${property.slug}`}>
<div className="group bg-white dark:bg-gray-900 rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 border border-gray-200 dark:border-gray-800">
{/* Image Section */}
<div className="relative h-64 overflow-hidden">
<Image
src={property.image}
alt={property.title}
fill
className="object-cover group-hover:scale-110 transition-transform duration-500"
/>
<Link
href={`/residential-real-estate/${property.slug}`}
className="group block bg-white dark:bg-gray-900 rounded-2xl overflow-hidden border border-gray-100 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 shadow-sm hover:shadow-xl transition-all duration-300"
>
<div className="relative h-64 w-full overflow-hidden">
<Image
src={property.image}
alt={property.title}
fill
className="object-cover group-hover:scale-110 transition-transform duration-500"
/>
{/* Status Badge */}
{property.status && (
<div className={`absolute top-4 left-4 px-3 py-1 rounded-full text-xs font-semibold ${property.status === "Sold Out"
{/* Status Badge */}
{property.status && (
<div className={`absolute top-4 left-4 px-3 py-1 rounded-full text-xs font-semibold ${property.status === "Sold Out"
? "bg-red-500 text-white"
: property.status === "New Launch"
? "bg-green-500 text-white"
: "bg-white/90 text-gray-900"
}`}>
{property.status}
</div>
)}
}`}>
{property.status}
</div>
)}
{/* Action Buttons */}
<div className="absolute top-4 right-4 flex gap-2 opacity-0 group-hover:opacity-100 transition-opacity">
<button
onClick={handleCompareClick}
className={`p-2 rounded-full shadow-lg transition-all ${inCompare
{/* Action Buttons */}
<div className="absolute top-4 right-4 flex gap-2 opacity-0 group-hover:opacity-100 transition-opacity">
<button
onClick={handleCompareClick}
className={`p-2 rounded-full shadow-lg transition-all ${inCompare
? "bg-primary text-white scale-110"
: "bg-white hover:bg-gray-100 text-gray-700"
}`}
aria-label={inCompare ? "Remove from compare" : "Add to compare"}
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
</svg>
</button>
<button
onClick={handleShareClick}
className="p-2 bg-white rounded-full shadow-lg hover:bg-gray-100 transition-colors"
aria-label="Share"
>
<svg className="w-5 h-5 text-gray-700" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z" />
</svg>
</button>
<button
onClick={handleWishlistClick}
className={`p-2 rounded-full shadow-lg transition-all ${isWishlisted
}`}
aria-label={inCompare ? "Remove from compare" : "Add to compare"}
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
</svg>
</button>
<button
onClick={handleShareClick}
className="p-2 bg-white rounded-full shadow-lg hover:bg-gray-100 transition-colors"
aria-label="Share"
>
<svg className="w-5 h-5 text-gray-700" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z" />
</svg>
</button>
<button
onClick={handleWishlistClick}
className={`p-2 rounded-full shadow-lg transition-all ${isWishlisted
? "bg-red-500 text-white scale-110"
: "bg-white hover:bg-gray-100 text-gray-700"
}`}
aria-label={isWishlisted ? "Remove from wishlist" : "Add to wishlist"}
>
<svg className="w-5 h-5" fill={isWishlisted ? "currentColor" : "none"} stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" />
</svg>
</button>
</div>
}`}
aria-label={isWishlisted ? "Remove from wishlist" : "Add to wishlist"}
>
<svg className="w-5 h-5" fill={isWishlisted ? "currentColor" : "none"} stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" />
</svg>
</button>
</div>
</div>
{/* Content Section */}
<div className="p-6">
<h3 className="text-xl font-bold text-foreground mb-2 group-hover:text-primary transition-colors">
{property.title}
</h3>
<div className="flex items-center text-gray-600 dark:text-gray-400 text-sm mb-4">
<svg className="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
{property.location}
</div>
{/* Content Section */}
<div className="p-6">
<h3 className="text-xl font-bold text-foreground mb-2 group-hover:text-primary transition-colors">
{property.title}
</h3>
<div className="flex items-center text-gray-600 dark:text-gray-400 text-sm mb-4">
<svg className="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
{property.location}
<div className="flex items-center justify-between pt-4 border-t border-gray-200 dark:border-gray-800">
<div>
<div className="text-2xl font-bold text-primary">{property.price}</div>
<div className="text-sm text-gray-500 dark:text-gray-400">{property.overview.size}</div>
</div>
<div className="flex items-center justify-between pt-4 border-t border-gray-200 dark:border-gray-800">
<div>
<div className="text-2xl font-bold text-primary">{property.price}</div>
<div className="text-sm text-gray-500 dark:text-gray-400">{property.overview.size}</div>
</div>
<div className="text-right">
<div className="text-sm font-semibold text-foreground">{property.overview.bhk}</div>
<div className="text-xs text-gray-500 dark:text-gray-400">Possession: {property.overview.possession}</div>
</div>
<div className="text-right">
<div className="text-sm font-semibold text-foreground">{property.overview.bhk}</div>
<div className="text-xs text-gray-500 dark:text-gray-400">Possession: {property.overview.possession}</div>
</div>
</div>
</div>

View File

@ -129,7 +129,8 @@ export default function PropertyDetailClient({ property }: { property: Property
subtitle={property.location}
breadcrumbs={[
{ label: "Home", href: "/" },
{ label: "Properties", href: "/projects" },
{ label: "Projects", href: "/projects" },
{ label: "Residential Real Estate", href: "/residential-real-estate" },
{ label: property.title }
]}
backgroundImage={property.image}

View File

@ -50,7 +50,7 @@ export default function PropertyFilters({ onFilterChange }: PropertyFiltersProps
return (
<div className="bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 sticky top-28 z-40">
<div className="max-w-7xl mx-auto px-6 py-4">
<div className="max-w-7xl mx-auto px-6 py-4 max-[930px]:hidden">
{/* Main Filter Bar */}
<div className="flex flex-col md:flex-row gap-4 items-center">
{/* Search */}

View File

@ -1,7 +1,7 @@
"use client";
import Link from "next/link";
import { useEffect } from "react";
import { useEffect, useState } from "react";
import Image from "next/image";
import { ThemeToggle } from "@/components/ThemeToggle";
@ -11,6 +11,8 @@ interface SidebarProps {
}
export default function Sidebar({ isOpen, onClose }: SidebarProps) {
const [isProjectsOpen, setIsProjectsOpen] = useState(false);
// Prevent scrolling when sidebar is open
useEffect(() => {
if (isOpen) {
@ -76,13 +78,45 @@ export default function Sidebar({ isOpen, onClose }: SidebarProps) {
>
About
</Link>
<Link
href="/projects"
className="text-lg font-medium text-gray-600 dark:text-gray-300 hover:text-primary transition-colors"
onClick={onClose}
>
Projects
</Link>
<div className="flex flex-col space-y-2">
<div className="flex items-center justify-between">
<Link
href="/projects"
className="text-lg font-medium text-gray-600 dark:text-gray-300 hover:text-primary transition-colors"
onClick={onClose}
>
Projects
</Link>
<button
onClick={() => setIsProjectsOpen(!isProjectsOpen)}
className="p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className={`w-5 h-5 transition-transform duration-200 ${isProjectsOpen ? "rotate-180" : ""}`}
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M19.5 8.25l-7.5 7.5-7.5-7.5"
/>
</svg>
</button>
</div>
<div className={`overflow-hidden transition-all duration-300 ${isProjectsOpen ? "max-h-40 opacity-100" : "max-h-0 opacity-0"}`}>
<Link
href="/residential-real-estate"
className="block text-base font-medium text-gray-500 dark:text-gray-400 hover:text-primary transition-colors pl-4 py-2"
onClick={onClose}
>
Residential Real Estate
</Link>
</div>
</div>
<Link
href="/lifestyle"
className="text-lg font-medium text-gray-600 dark:text-gray-300 hover:text-primary transition-colors"