pages updated
This commit is contained in:
parent
9249b1fa29
commit
0713049d30
BIN
public/assets/images/about/privacy-policy-banner.jpg
Normal file
BIN
public/assets/images/about/privacy-policy-banner.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
BIN
public/assets/images/about/terms-banner.jpg
Normal file
BIN
public/assets/images/about/terms-banner.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
BIN
public/assets/images/projects/residential-real-estate.jpg
Normal file
BIN
public/assets/images/projects/residential-real-estate.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
@ -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>
|
||||
@ -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),
|
||||
}));
|
||||
|
||||
160
src/app/privacy-policy/page.tsx
Normal file
160
src/app/privacy-policy/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@ -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}</>;
|
||||
}
|
||||
@ -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}.`,
|
||||
};
|
||||
}
|
||||
@ -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} />;
|
||||
}
|
||||
39
src/app/residential-real-estate/[slug]/page.tsx
Normal file
39
src/app/residential-real-estate/[slug]/page.tsx
Normal 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} />;
|
||||
}
|
||||
11
src/app/residential-real-estate/page.tsx
Normal file
11
src/app/residential-real-estate/page.tsx
Normal 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 />;
|
||||
}
|
||||
169
src/app/terms-of-service/page.tsx
Normal file
169
src/app/terms-of-service/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
@ -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"
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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"
|
||||
>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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 */}
|
||||
|
||||
@ -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"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user