Compare commits

...

14 Commits

Author SHA1 Message Date
052ed1bcd6 merge: merge main into development_fix keeping development_fix versions
- Keep all development_fix build artifacts and configurations
- Resolve conflicts by preferring development_fix versions
- Maintain existing development_fix branch functionality
2025-08-18 23:47:27 +02:00
66ef8ede14 fix: remove .next build artifacts from git tracking
- Add .next to .gitignore to prevent future conflicts
- Remove all build artifacts from git tracking
- Focus on source code changes only for cleaner merges
2025-08-18 23:40:20 +02:00
766764f4c1 unfo 2025-08-18 23:38:31 +02:00
d7e05e751c i 2025-08-18 23:09:36 +02:00
6bc835a386 ok 2025-08-18 23:09:28 +02:00
3318d2fde0 cad 2025-08-18 23:04:44 +02:00
c4c40c6499 o 2025-08-18 22:51:15 +02:00
f390ba6ec1 ok 2025-08-18 22:50:01 +02:00
42f8db89d6 s 2025-08-18 22:49:47 +02:00
a811bc71fa ok 2025-08-18 22:45:13 +02:00
b73beb1792 ok 2025-08-18 22:45:09 +02:00
08b25f008b - 2025-08-18 22:33:54 +02:00
f1cec99486 add veda logos 2025-08-18 20:12:15 +02:00
c82c6ced3a saved 2025-08-18 18:40:09 +02:00
145 changed files with 1535 additions and 169 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
{"type": "commonjs"}

View File

@ -1 +0,0 @@
{}

View File

@ -1,6 +0,0 @@
{
"version": 3,
"middleware": {},
"functions": {},
"sortedMiddleware": []
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 91 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 219 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 34 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 81 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 111 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1 +0,0 @@
{"type": "module"}

View File

@ -12,7 +12,7 @@ export NEXT_PUBLIC_BASE_PATH="/$PREFIX"
# mkdir -p "out" # mkdir -p "out"
# pnpm install --frozen-lockfile pnpm install
pnpm run build pnpm run build
# local mirror (optional) # local mirror (optional)

View File

@ -21,12 +21,14 @@
"@tailwindcss/typography": "^0.5.13", "@tailwindcss/typography": "^0.5.13",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",
"clsx": "^2.1.0", "clsx": "^2.1.0",
"framer-motion": "^11.18.2",
"next": "^14.0.4", "next": "^14.0.4",
"postcss": "^8.4.39", "postcss": "^8.4.39",
"react": "^18.2.0", "react": "^18.2.0",
"react-card-slider-component": "^1.0.9", "react-card-slider-component": "^1.0.9",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-slick": "^0.30.2", "react-slick": "^0.30.2",
"react-use-measure": "^2.1.7",
"slick-carousel": "^1.8.1", "slick-carousel": "^1.8.1",
"swiper": "^11.1.7", "swiper": "^11.1.7",
"tailwindcss": "^3.4.6" "tailwindcss": "^3.4.6"

BIN
public/images/community.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
public/images/events.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

BIN
public/images/events1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

BIN
public/images/events2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
public/images/events3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

BIN
public/images/events4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

BIN
public/images/nomads.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
public/images/nomads1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
public/images/nomads2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
public/images/nomads3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

BIN
public/images/nomads4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
public/images/private.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

15
src/app/contact/page.jsx Normal file
View File

@ -0,0 +1,15 @@
import { ContactHero } from "@/components/ContactHero"
import { Header } from "@/components/Header"
import { Footer } from "@/components/Footer"
export default function Contact() {
return (
<>
<Header />
<main>
<ContactHero />
</main>
<Footer />
</>
)
}

View File

@ -2,6 +2,10 @@ import { CallToAction3 } from '@/components/CallToAction3'
import { Footer } from '@/components/Footer' import { Footer } from '@/components/Footer'
import { Header } from '@/components/Header' import { Header } from '@/components/Header'
import Exp from '@/components/Exp' import Exp from '@/components/Exp'
import { Community } from '@/components/Community'
import { Retreats } from '@/components/Retreats'
import { Events } from '@/components/Events'
import { Nomads } from '@/components/Nomads'
export default function Itinerary() { export default function Itinerary() {
return ( return (
@ -9,6 +13,10 @@ export default function Itinerary() {
<Header /> <Header />
<main> <main>
<Exp/> <Exp/>
<Community />
<Retreats />
<Events />
<Nomads />
<CallToAction3 /> <CallToAction3 />
</main> </main>
<Footer /> <Footer />

View File

@ -34,7 +34,7 @@ export default function RootLayout({ children }) {
lexend.variable, lexend.variable,
)} )}
> >
<body className="flex h-full flex-col">{children}</body> <body className="flex h-full flex-col pt-20">{children}</body>
</html> </html>
) )
} }

View File

@ -9,6 +9,8 @@ import { Pricing } from '@/components/Pricing'
import Route from '@/components/Route'; import Route from '@/components/Route';
import { SecondaryFeatures } from '@/components/SecondaryFeatures' import { SecondaryFeatures } from '@/components/SecondaryFeatures'
import { Testimonials } from '@/components/Testimonials' import { Testimonials } from '@/components/Testimonials'
import { Boat } from '@/components/Boat'
import { Experiences } from '@/components/Experiences'
import ThirdFeatures from '@/components/ThirdFeatures' import ThirdFeatures from '@/components/ThirdFeatures'
import NewFeatures from '@/components/NewFeatures' import NewFeatures from '@/components/NewFeatures'
import NewFeatures2 from '@/components/NewFeatures2' import NewFeatures2 from '@/components/NewFeatures2'
@ -17,6 +19,7 @@ import Boats from '@/components/Boats'
import Carousel from '@/components/Carousel' import Carousel from '@/components/Carousel'
import CNNVIDEO from '@/components/CNNVIDEO' import CNNVIDEO from '@/components/CNNVIDEO'
export default function Home() { export default function Home() {
return ( return (
<> <>
@ -24,7 +27,8 @@ export default function Home() {
<main> <main>
<Hero /> <Hero />
<CallToAction /> <CallToAction />
<SecondaryFeatures /> <Experiences />
<Boat />
<NewFeatures /> <NewFeatures />
<NewFeatures2 /> <NewFeatures2 />
<CallToAction2 /> <CallToAction2 />

197
src/components/Boat.jsx Normal file
View File

@ -0,0 +1,197 @@
'use client'
import * as Headless from '@headlessui/react'
import { ArrowLongRightIcon } from '@heroicons/react/20/solid'
import { clsx } from 'clsx'
import {
motion,
useMotionValueEvent,
useScroll,
useSpring,
} from 'framer-motion'
import { useCallback, useLayoutEffect, useRef, useState } from 'react'
import useMeasure from 'react-use-measure'
import { Container } from './Container'
import { Link } from './link'
import { Heading, Subheading } from './text'
const testimonials = [
{
img: '/images/veda1.jpg',
name: '0 - 6 Years Old',
title: 'From birth to age 6, we offer ECD programs that change lives forever.',
subtitle: 'A beautiful 50-meter dahabiya offering a tranquil and organic platform for personalized cruises.',
quote: 'VEDA 1',
href: '/phases/phase1',
},
{
img: '/images/veda2.jpg',
name: '6 - 15 Years Old',
title: 'Unlock the Potential of Youth with transformational learning experiences',
subtitle: 'An elegant 45-meter dahabiya, ideal for hosting larger groups, healing retreats, company getaways, and more.',
quote: 'VEDA 2',
href: '/phases/phase2',
},
{
img: '/images/veda3.jpg',
name: '15 - 25 Years Old',
title: 'Skills that Earn & Regenerate Vocational paths that equip young people to live with purpose.',
subtitle: 'A cozy 18-meter dahabeya offering a serene floating home experience, perfect for private groups seeking tranquility and comfort on the Nile.',
quote: 'VEDA 3',
href: '/phases/phase3',
},
{
img: '/images/veda4.jpg',
name: 'All Ages',
title: 'A unique portfolio of impact proven Community-led solutions worth implementing',
subtitle: 'A cozy 55-meter dahabeya offering a serene floating home experience, perfect for smaller groups seeking tranquility and comfort on the Nile.',
quote: 'VEDA 4',
href: '/phases/phase4',
},
]
function TestimonialCard({
subtitle,
name,
title,
img,
href,
children,
bounds,
scrollX,
...props
}) {
let ref = useRef(null)
let computeOpacity = useCallback(() => {
let element = ref.current
if (!element || bounds.width === 0) return 1
let rect = element.getBoundingClientRect()
if (rect.left < bounds.left) {
let diff = bounds.left - rect.left
let percent = diff / rect.width
return Math.max(0.5, 1 - percent)
} else if (rect.right > bounds.right) {
let diff = rect.right - bounds.right
let percent = diff / rect.width
return Math.max(0.5, 1 - percent)
} else {
return 1
}
}, [ref, bounds.width, bounds.left, bounds.right])
let opacity = useSpring(computeOpacity(), {
stiffness: 154,
damping: 23,
})
useLayoutEffect(() => {
opacity.set(computeOpacity())
}, [computeOpacity, opacity])
useMotionValueEvent(scrollX, 'change', () => {
opacity.set(computeOpacity())
})
return (
<motion.div
ref={ref}
style={{ opacity }}
{...props}
className="w-72 shrink-0 snap-start scroll-ml-(--scroll-padding) bg-white rounded-3xl shadow-lg overflow-hidden sm:w-96"
>
{/* Image Section */}
<div className="relative aspect-square overflow-hidden">
<img
alt=""
src={img}
className="w-full h-full object-cover"
/>
</div>
{/* Content Section Below Image */}
<div className="p-6">
<blockquote>
<p className="text-2xl font-bold text-gray-900 lg:text-3xl">
{children}
</p>
</blockquote>
<p className="mt-4 text-sm text-gray-600 leading-6">
{subtitle}
</p>
<Link
href={href}
className="mt-6 inline-flex items-center gap-2 text-sm font-medium text-gold-600 hover:text-gold-700"
>
Learn More
<ArrowLongRightIcon className="h-4 w-4" />
</Link>
</div>
</motion.div>
)
}
export function Boat() {
let scrollRef = useRef(null)
let { scrollX } = useScroll({ container: scrollRef })
let [setReferenceWindowRef, bounds] = useMeasure()
let [activeIndex, setActiveIndex] = useState(0)
useMotionValueEvent(scrollX, 'change', (x) => {
if (scrollRef.current && scrollRef.current.children[0]) {
setActiveIndex(Math.floor(x / scrollRef.current.children[0].clientWidth))
}
})
function scrollTo(index) {
let gap = 32
let width = scrollRef.current.children[0].offsetWidth
scrollRef.current.scrollTo({ left: (width + gap) * index })
}
return (
<div className="pt-12 pb-24">
<Container>
<div ref={setReferenceWindowRef}>
<h2 className="text-base font-semibold leading-7 text-gold-600">OUR OFFERS</h2>
<h2 className="font-display mt-2 text-3xl font-bold tracking-tight text-gray-800 sm:text-4xl">
VEDA DAHABIYAS
</h2>
<p className="mt-2 text-lg tracking-wide font-normal leading-8 text-gray-600">
Discover peaceful platforms where every detail ensures a truly memorable stay. Our fleet of traditional dahabiyas combines authentic Nile heritage with modern comfort, offering intimate sailing experiences that connect you with Egypt's timeless river culture. Each vessel is carefully maintained and uniquely designed to provide the perfect setting for relaxation, reflection, and genuine connection with the magnificent Nile landscape.
</p>
</div>
</Container>
<div
ref={scrollRef}
className={clsx([
'mt-16 flex gap-8 pl-6 pr-6 lg:pl-8',
'[scrollbar-width:none] [&::-webkit-scrollbar]:hidden',
'snap-x snap-mandatory overflow-x-auto overscroll-x-contain scroll-smooth',
'pb-8',
])}
>
{testimonials.map(({ img, name, title, quote, href, subtitle }, testimonialIndex) => (
<TestimonialCard
key={testimonialIndex}
subtitle={subtitle}
name={name}
title={title}
href={href}
img={img}
bounds={bounds}
scrollX={scrollX}
onClick={() => scrollTo(testimonialIndex)}
>
{quote}
</TestimonialCard>
))}
<div className="w-8 shrink-0" />
</div>
</div>
)
}

Some files were not shown because too many files have changed in this diff Show More