Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7354a0b963 | |||
| 8c36349037 | |||
| fedd2b2485 | |||
| b1f9a80aa2 | |||
| f8ba718b69 | |||
| 530ed61141 | |||
| c2016a3cc5 | |||
| a416372820 | |||
| e1fdef129b | |||
| 0ee240a1ff | |||
| 270eae2e7b | |||
| edafe120fa | |||
| 8c9f31ef45 | |||
| c5e6667788 | |||
| 16ff7be781 | |||
| 148042e173 |
@@ -19,9 +19,9 @@ export default function BlogPage() {
|
||||
contentWidth="medium"
|
||||
sizing="medium"
|
||||
background="none"
|
||||
cardStyle="solid"
|
||||
cardStyle="glass-elevated"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="solid"
|
||||
secondaryButtonStyle="glass"
|
||||
headingFontWeight="medium"
|
||||
>
|
||||
<ReactLenis root>
|
||||
@@ -29,7 +29,6 @@ export default function BlogPage() {
|
||||
<NavbarLayoutFloatingInline
|
||||
brandName="Luxe Travels"
|
||||
navItems={[
|
||||
{ name: "Home", id: "/" },
|
||||
{ name: "Destinations", id: "destinations" },
|
||||
{ name: "Experiences", id: "experiences" },
|
||||
{ name: "About", id: "about" },
|
||||
|
||||
@@ -4,8 +4,6 @@ import { Inter } from "next/font/google";
|
||||
import "./globals.css";
|
||||
import { ServiceWrapper } from "@/components/ServiceWrapper";
|
||||
import Tag from "@/tag/Tag";
|
||||
import { Raleway } from "next/font/google";
|
||||
import { Instrument_Sans } from "next/font/google";
|
||||
|
||||
const dmSans = DM_Sans({
|
||||
variable: "--font-dm-sans", subsets: ["latin"],
|
||||
@@ -23,12 +21,12 @@ export const metadata: Metadata = {
|
||||
openGraph: {
|
||||
title: "Luxe Travels | Crafting Unforgettable Luxury Journeys", description: "Explore the world's most exclusive destinations with personalized luxury travel experiences curated by our specialists.", url: "https://luxetravels.com", siteName: "Luxe Travels", type: "website", images: [
|
||||
{
|
||||
url: "https://img.b2bpic.net/free-photo/man-reflective-moment-watching-sunrise-rice-terraces-bali_73899-44002.jpg", alt: "Luxury travel destinations"
|
||||
url: "https://images.unsplash.com/photo-1551632786-de41ec802fcf?w=1200&h=800&fit=crop", alt: "Luxury travel destinations"
|
||||
}
|
||||
]
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image", title: "Luxe Travels | Luxury Journey Planning", description: "Discover handpicked luxury destinations and bespoke travel experiences.", images: ["https://img.b2bpic.net/free-photo/man-reflective-moment-watching-sunrise-rice-terraces-bali_73899-44047.jpg"]
|
||||
card: "summary_large_image", title: "Luxe Travels | Luxury Journey Planning", description: "Discover handpicked luxury destinations and bespoke travel experiences.", images: ["https://images.unsplash.com/photo-1551632786-de41ec802fcf?w=1200&h=800&fit=crop"]
|
||||
},
|
||||
robots: {
|
||||
index: true,
|
||||
@@ -36,16 +34,6 @@ export const metadata: Metadata = {
|
||||
}
|
||||
};
|
||||
|
||||
const raleway = Raleway({
|
||||
variable: "--font-raleway",
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
const instrumentSans = Instrument_Sans({
|
||||
variable: "--font-instrument-sans",
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
@@ -54,7 +42,9 @@ export default function RootLayout({
|
||||
return (
|
||||
<html lang="en" suppressHydrationWarning>
|
||||
<ServiceWrapper>
|
||||
<body className={`${instrumentSans.variable} antialiased`}>
|
||||
<body
|
||||
className={`${dmSans.variable} ${inter.variable} antialiased`}
|
||||
>
|
||||
<Tag />
|
||||
{children}
|
||||
|
||||
@@ -451,6 +441,20 @@ export default function RootLayout({
|
||||
|
||||
originalContent = element.textContent;
|
||||
element.contentEditable = 'true';
|
||||
|
||||
if (!element.dataset.webildOriginalWhiteSpace) {
|
||||
const computedStyle = window.getComputedStyle(element);
|
||||
element.dataset.webildOriginalWhiteSpace = computedStyle.whiteSpace;
|
||||
element.dataset.webildOriginalWordWrap = computedStyle.wordWrap;
|
||||
element.dataset.webildOriginalOverflowWrap = computedStyle.overflowWrap;
|
||||
element.dataset.webildOriginalOverflow = computedStyle.overflow;
|
||||
}
|
||||
|
||||
element.style.whiteSpace = 'pre-wrap';
|
||||
element.style.wordWrap = 'break-word';
|
||||
element.style.overflowWrap = 'break-word';
|
||||
element.style.overflow = 'visible';
|
||||
|
||||
element.focus();
|
||||
isEditing = true;
|
||||
|
||||
@@ -560,6 +564,23 @@ export default function RootLayout({
|
||||
element.contentEditable = 'false';
|
||||
isEditing = false;
|
||||
|
||||
if (element.dataset.webildOriginalWhiteSpace) {
|
||||
element.style.whiteSpace = element.dataset.webildOriginalWhiteSpace === 'normal' ? '' : element.dataset.webildOriginalWhiteSpace;
|
||||
delete element.dataset.webildOriginalWhiteSpace;
|
||||
}
|
||||
if (element.dataset.webildOriginalWordWrap) {
|
||||
element.style.wordWrap = element.dataset.webildOriginalWordWrap === 'normal' ? '' : element.dataset.webildOriginalWordWrap;
|
||||
delete element.dataset.webildOriginalWordWrap;
|
||||
}
|
||||
if (element.dataset.webildOriginalOverflowWrap) {
|
||||
element.style.overflowWrap = element.dataset.webildOriginalOverflowWrap === 'normal' ? '' : element.dataset.webildOriginalOverflowWrap;
|
||||
delete element.dataset.webildOriginalOverflowWrap;
|
||||
}
|
||||
if (element.dataset.webildOriginalOverflow) {
|
||||
element.style.overflow = element.dataset.webildOriginalOverflow === 'visible' ? '' : element.dataset.webildOriginalOverflow;
|
||||
delete element.dataset.webildOriginalOverflow;
|
||||
}
|
||||
|
||||
if (element.dataset.beforeInputHandler === 'true') {
|
||||
element.removeEventListener('beforeinput', () => {});
|
||||
delete element.dataset.beforeInputHandler;
|
||||
@@ -865,6 +886,9 @@ export default function RootLayout({
|
||||
|
||||
const handleScroll = () => {
|
||||
if (!isActive) return;
|
||||
|
||||
if (isEditing) return;
|
||||
|
||||
if (selectedElement) {
|
||||
makeUneditable(selectedElement, false);
|
||||
selectedElement.classList.remove(selectedClass);
|
||||
@@ -1238,6 +1262,31 @@ export default function RootLayout({
|
||||
window.addEventListener('scroll', handleScroll, true);
|
||||
window.addEventListener('message', handleMessage, true);
|
||||
|
||||
let lastPathname = window.location.pathname;
|
||||
|
||||
const notifyPageChange = () => {
|
||||
window.parent.postMessage({
|
||||
type: 'webild-page-changed',
|
||||
data: { pathname: window.location.pathname }
|
||||
}, '*');
|
||||
};
|
||||
|
||||
window.addEventListener('popstate', () => {
|
||||
if (lastPathname !== window.location.pathname) {
|
||||
lastPathname = window.location.pathname;
|
||||
notifyPageChange();
|
||||
}
|
||||
}, true);
|
||||
|
||||
const urlCheckInterval = setInterval(() => {
|
||||
if (lastPathname !== window.location.pathname) {
|
||||
lastPathname = window.location.pathname;
|
||||
notifyPageChange();
|
||||
}
|
||||
}, 500);
|
||||
|
||||
notifyPageChange();
|
||||
|
||||
window.webildCleanup = () => {
|
||||
isActive = false;
|
||||
|
||||
@@ -1248,6 +1297,10 @@ export default function RootLayout({
|
||||
removeHoverOverlay();
|
||||
removeElementTypeLabel();
|
||||
|
||||
if (urlCheckInterval) {
|
||||
clearInterval(urlCheckInterval);
|
||||
}
|
||||
|
||||
document.removeEventListener('mouseover', handleMouseOver, true);
|
||||
document.removeEventListener('mouseout', handleMouseOut, true);
|
||||
document.removeEventListener('click', handleClick, true);
|
||||
|
||||
@@ -21,9 +21,9 @@ export default function LandingPage() {
|
||||
contentWidth="medium"
|
||||
sizing="medium"
|
||||
background="none"
|
||||
cardStyle="solid"
|
||||
cardStyle="glass-elevated"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="solid"
|
||||
secondaryButtonStyle="glass"
|
||||
headingFontWeight="medium"
|
||||
>
|
||||
<div id="nav" data-section="nav">
|
||||
@@ -47,7 +47,7 @@ export default function LandingPage() {
|
||||
description="Discover the world's most exclusive destinations curated for discerning travelers seeking unparalleled luxury and authentic experiences."
|
||||
slides={[
|
||||
{
|
||||
imageSrc: "https://img.b2bpic.net/free-photo/man-reflective-moment-watching-sunrise-rice-terraces-bali_73899-44002.jpg", imageAlt: "Bali sunset over rice terraces"
|
||||
imageSrc: "https://images.unsplash.com/photo-1551632786-de41ec802fcf?w=1200&h=800&fit=crop", imageAlt: "Tropical island with turquoise waters"
|
||||
},
|
||||
{
|
||||
imageSrc: "https://img.b2bpic.net/free-photo/man-reflective-moment-watching-sunrise-rice-terraces-bali_73899-44047.jpg", imageAlt: "Maldives crystal clear waters"
|
||||
@@ -94,13 +94,13 @@ export default function LandingPage() {
|
||||
title: "Private Island Escapes", description: "Secluded luxury retreats with personalized service and pristine natural beauty exclusively for our discerning clientele.", imageSrc: "https://img.b2bpic.net/free-photo/swimming-pool-blue-water-tropical-garden-with-sea-view-background_1150-10233.jpg", imageAlt: "Private island villa with ocean view", button: { text: "Learn More", href: "contact" }
|
||||
},
|
||||
{
|
||||
title: "Cultural Immersion", description: "Guided experiences with local experts, private museum access, and authentic cultural encounters in historic destinations.", imageSrc: "https://img.b2bpic.net/free-photo/breathtaking-view-wat-maha-that-buddhist-temple-building-sunlight_482257-125647.jpg", imageAlt: "Ancient temple architectural detail"
|
||||
title: "Cultural Immersion", description: "Guided experiences with local experts, private museum access, and authentic cultural encounters in historic destinations.", imageSrc: "https://img.b2bpic.net/free-photo/breathtaking-view-wat-maha-that-buddhist-temple-building-sunlight_482257-125647.jpg", imageAlt: "Ancient temple architectural detail", button: { text: "Learn More", href: "contact" }
|
||||
},
|
||||
{
|
||||
title: "Adventure & Wellness", description: "Curated wellness retreats combining rejuvenation with adventure activities in nature's most inspiring settings.", imageSrc: "https://img.b2bpic.net/free-photo/woman-swimming-pool-jungle-view_1157-33610.jpg", imageAlt: "Spa and wellness resort setting"
|
||||
title: "Adventure & Wellness", description: "Curated wellness retreats combining rejuvenation with adventure activities in nature's most inspiring settings.", imageSrc: "https://img.b2bpic.net/free-photo/woman-swimming-pool-jungle-view_1157-33610.jpg", imageAlt: "Spa and wellness resort setting", button: { text: "Learn More", href: "contact" }
|
||||
},
|
||||
{
|
||||
title: "Fine Dining Journeys", description: "Exclusive dining experiences with Michelin-starred chefs and farm-to-table culinary adventures.", imageSrc: "https://img.b2bpic.net/free-photo/grilled-foie-gras_1203-3589.jpg", imageAlt: "Gourmet cuisine plating"
|
||||
title: "Fine Dining Journeys", description: "Exclusive dining experiences with Michelin-starred chefs and farm-to-table culinary adventures.", imageSrc: "https://img.b2bpic.net/free-photo/grilled-foie-gras_1203-3589.jpg", imageAlt: "Gourmet cuisine plating", button: { text: "Learn More", href: "contact" }
|
||||
}
|
||||
]}
|
||||
useInvertedBackground={false}
|
||||
@@ -160,7 +160,7 @@ export default function LandingPage() {
|
||||
carouselMode="buttons"
|
||||
features={[
|
||||
{
|
||||
id: "maldives", title: "Maldives", description: "Crystal waters, overwater bungalows, and world-class diving. The ultimate tropical paradise for luxury seekers.", tag: "Tropical Paradise", imageSrc: "https://img.b2bpic.net/free-photo/blurred-shot-terrace-plantation_181624-19548.jpg", imageAlt: "Maldives overwater resort"
|
||||
id: "maldives", title: "Maldives", description: "Crystal waters, overwater bungalows, and world-class diving. The ultimate tropical paradise for luxury seekers.", tag: "Tropical Paradise", imageSrc: "https://images.unsplash.com/photo-1551632786-de41ec802fcf?w=1200&h=800&fit=crop", imageAlt: "Maldives overwater resort"
|
||||
},
|
||||
{
|
||||
id: "paris", title: "Paris", description: "The City of Light offers timeless elegance, world-class cuisine, and iconic landmarks. Exclusive boutique hotels await.", tag: "City of Romance", imageSrc: "https://img.b2bpic.net/free-photo/rice-hills-surrounded-by-greens-trees_181624-46299.jpg", imageAlt: "Eiffel Tower at night"
|
||||
|
||||
@@ -76,9 +76,9 @@ export default function ProductPage({ params }: ProductPageProps) {
|
||||
contentWidth="medium"
|
||||
sizing="medium"
|
||||
background="none"
|
||||
cardStyle="solid"
|
||||
cardStyle="glass-elevated"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="solid"
|
||||
secondaryButtonStyle="glass"
|
||||
headingFontWeight="medium"
|
||||
>
|
||||
<ReactLenis root>
|
||||
@@ -86,10 +86,12 @@ export default function ProductPage({ params }: ProductPageProps) {
|
||||
<NavbarLayoutFloatingInline
|
||||
brandName="Luxe Travels"
|
||||
navItems={[
|
||||
{"name":"Home","id":"/"},
|
||||
{"name":"Shop","id":"/shop"}
|
||||
{"name":"Destinations","id":"destinations"},
|
||||
{"name":"Experiences","id":"experiences"},
|
||||
{"name":"About","id":"about"},
|
||||
{"name":"Contact","id":"contact"}
|
||||
]}
|
||||
button={{ text: "Cart", onClick: () => setCartOpen(true) }}
|
||||
button={{ text: "Plan Your Journey", href: "contact" }}
|
||||
/>
|
||||
</div>
|
||||
<main className="min-h-screen flex items-center justify-center pt-20">
|
||||
@@ -121,9 +123,9 @@ export default function ProductPage({ params }: ProductPageProps) {
|
||||
contentWidth="medium"
|
||||
sizing="medium"
|
||||
background="none"
|
||||
cardStyle="solid"
|
||||
cardStyle="glass-elevated"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="solid"
|
||||
secondaryButtonStyle="glass"
|
||||
headingFontWeight="medium"
|
||||
>
|
||||
<ReactLenis root>
|
||||
@@ -131,10 +133,12 @@ export default function ProductPage({ params }: ProductPageProps) {
|
||||
<NavbarLayoutFloatingInline
|
||||
brandName="Luxe Travels"
|
||||
navItems={[
|
||||
{"name":"Home","id":"/"},
|
||||
{"name":"Shop","id":"/shop"}
|
||||
{"name":"Destinations","id":"destinations"},
|
||||
{"name":"Experiences","id":"experiences"},
|
||||
{"name":"About","id":"about"},
|
||||
{"name":"Contact","id":"contact"}
|
||||
]}
|
||||
button={{ text: "Cart", onClick: () => setCartOpen(true) }}
|
||||
button={{ text: "Plan Your Journey", href: "contact" }}
|
||||
/>
|
||||
</div>
|
||||
<main className="min-h-screen flex items-center justify-center pt-20">
|
||||
@@ -173,9 +177,9 @@ export default function ProductPage({ params }: ProductPageProps) {
|
||||
contentWidth="medium"
|
||||
sizing="medium"
|
||||
background="none"
|
||||
cardStyle="solid"
|
||||
cardStyle="glass-elevated"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="solid"
|
||||
secondaryButtonStyle="glass"
|
||||
headingFontWeight="medium"
|
||||
>
|
||||
<ReactLenis root>
|
||||
@@ -183,10 +187,12 @@ export default function ProductPage({ params }: ProductPageProps) {
|
||||
<NavbarLayoutFloatingInline
|
||||
brandName="Luxe Travels"
|
||||
navItems={[
|
||||
{"name":"Home","id":"/"},
|
||||
{"name":"Shop","id":"/shop"}
|
||||
{"name":"Destinations","id":"destinations"},
|
||||
{"name":"Experiences","id":"experiences"},
|
||||
{"name":"About","id":"about"},
|
||||
{"name":"Contact","id":"contact"}
|
||||
]}
|
||||
button={{ text: "Cart", onClick: () => setCartOpen(true) }}
|
||||
button={{ text: "Plan Your Journey", href: "contact" }}
|
||||
/>
|
||||
</div>
|
||||
<div id="productDetailCard" data-section="productDetailCard">
|
||||
|
||||
@@ -26,9 +26,9 @@ export default function ShopPage() {
|
||||
contentWidth="medium"
|
||||
sizing="medium"
|
||||
background="none"
|
||||
cardStyle="solid"
|
||||
cardStyle="glass-elevated"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="solid"
|
||||
secondaryButtonStyle="glass"
|
||||
headingFontWeight="medium"
|
||||
>
|
||||
<ReactLenis root>
|
||||
@@ -36,10 +36,12 @@ export default function ShopPage() {
|
||||
<NavbarLayoutFloatingInline
|
||||
brandName="Luxe Travels"
|
||||
navItems={[
|
||||
{"name":"Home","id":"/"},
|
||||
{"name":"Shop","id":"/shop"}
|
||||
{"name":"Destinations","id":"destinations"},
|
||||
{"name":"Experiences","id":"experiences"},
|
||||
{"name":"About","id":"about"},
|
||||
{"name":"Contact","id":"contact"}
|
||||
]}
|
||||
button={{ text: "Cart", onClick: () => console.log("cart") }}
|
||||
button={{ text: "Plan Your Journey", href: "contact" }}
|
||||
/>
|
||||
</div>
|
||||
<main className="min-h-screen flex items-center justify-center pt-20">
|
||||
@@ -70,9 +72,9 @@ export default function ShopPage() {
|
||||
contentWidth="medium"
|
||||
sizing="medium"
|
||||
background="none"
|
||||
cardStyle="solid"
|
||||
cardStyle="glass-elevated"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="solid"
|
||||
secondaryButtonStyle="glass"
|
||||
headingFontWeight="medium"
|
||||
>
|
||||
<ReactLenis root>
|
||||
@@ -80,10 +82,12 @@ export default function ShopPage() {
|
||||
<NavbarLayoutFloatingInline
|
||||
brandName="Luxe Travels"
|
||||
navItems={[
|
||||
{"name":"Home","id":"/"},
|
||||
{"name":"Shop","id":"/shop"}
|
||||
{"name":"Destinations","id":"destinations"},
|
||||
{"name":"Experiences","id":"experiences"},
|
||||
{"name":"About","id":"about"},
|
||||
{"name":"Contact","id":"contact"}
|
||||
]}
|
||||
button={{ text: "Cart", onClick: () => console.log("cart") }}
|
||||
button={{ text: "Plan Your Journey", href: "contact" }}
|
||||
/>
|
||||
</div>
|
||||
<div id="productCatalog" data-section="productCatalog">
|
||||
|
||||
Reference in New Issue
Block a user