Compare commits
No commits in common. "052ed1bcd65a32a73dae5237aa78691f3905aca4" and "f3180f66429cfbc56f0e22e90aba89631026eed3" have entirely different histories.
052ed1bcd6
...
f3180f6642
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 18 KiB |
BIN
.next/cache/webpack/client-development-fallback/0.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development-fallback/index.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development-fallback/index.pack.gz.old
vendored
Normal file
BIN
.next/cache/webpack/client-development/10.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development/11.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development/12.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development/5.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development/6.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development/7.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development/8.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-development/9.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/client-production/5.pack
vendored
Normal file
BIN
.next/cache/webpack/edge-server-production/0.pack
vendored
Normal file
BIN
.next/cache/webpack/server-development/10.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/11.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/12.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/3.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/4.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/5.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/6.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/7.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/8.pack.gz
vendored
Normal file
BIN
.next/cache/webpack/server-development/9.pack.gz
vendored
Normal file
1
.next/package.json
Normal file
@ -0,0 +1 @@
|
||||
{"type": "commonjs"}
|
1
.next/react-loadable-manifest.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
6
.next/server/middleware-manifest.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 3,
|
||||
"middleware": {},
|
||||
"functions": {},
|
||||
"sortedMiddleware": []
|
||||
}
|
1
.next/static/media/1.c1dd8c88.svg
Normal file
After Width: | Height: | Size: 91 KiB |
1
.next/static/media/2.61fe5d45.svg
Normal file
After Width: | Height: | Size: 219 KiB |
BIN
.next/static/media/26a46d62cd723877-s.woff2
Normal file
1
.next/static/media/3.27cdc0c2.svg
Normal file
After Width: | Height: | Size: 34 KiB |
1
.next/static/media/4.f84323cb.svg
Normal file
After Width: | Height: | Size: 81 KiB |
1
.next/static/media/5.b17316e3.svg
Normal file
After Width: | Height: | Size: 111 KiB |
BIN
.next/static/media/55c55f0601d81cf3-s.woff2
Normal file
BIN
.next/static/media/581909926a08bbc8-s.woff2
Normal file
1
.next/static/media/6.e4517726.svg
Normal file
After Width: | Height: | Size: 170 KiB |
BIN
.next/static/media/630e0b819503bca7-s.woff2
Normal file
BIN
.next/static/media/6a1a9d784472a388-s.woff2
Normal file
BIN
.next/static/media/84455f2b5a591033-s.p.woff2
Normal file
BIN
.next/static/media/8e9860b6e62d6359-s.woff2
Normal file
BIN
.next/static/media/97e0cb1ae144a2a9-s.woff2
Normal file
BIN
.next/static/media/act1.42297fa8.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
.next/static/media/act2.4b9f1132.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
.next/static/media/act3.c6e86186.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
.next/static/media/avatar-1.c78616b7.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
.next/static/media/avatar-2.c72e5a40.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
.next/static/media/avatar-3.eaa9ef6f.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
.next/static/media/avatar-4.16b4e29e.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
.next/static/media/avatar-5.e7f7faf2.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
.next/static/media/background-auth.4bcf3f4b.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
.next/static/media/background-call-to-action.c015e16f.jpg
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
.next/static/media/background-call-to-action2.d9f87ea8.png
Normal file
After Width: | Height: | Size: 17 MiB |
BIN
.next/static/media/background-call-to-action4.f1074346.png
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
.next/static/media/background-faqs.55d2e36a.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
.next/static/media/df0a9ae256c0569c-s.woff2
Normal file
BIN
.next/static/media/e4af272ccee01ff0-s.p.woff2
Normal file
1
.next/static/media/logo_name.9eb5fb93.svg
Normal file
After Width: | Height: | Size: 396 KiB |
BIN
.next/static/media/newfeatures0.da45213f.png
Normal file
After Width: | Height: | Size: 2.0 MiB |
BIN
.next/static/media/newfeatures3.f677537c.png
Normal file
After Width: | Height: | Size: 2.6 MiB |
BIN
.next/static/media/veda1.3bc26d7d.jpg
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
.next/static/media/veda2.d6a4a301.jpg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
.next/static/media/veda3.deca791e.jpg
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
.next/static/media/veda4.153182c1.jpg
Normal file
After Width: | Height: | Size: 28 KiB |
1
.next/types/package.json
Normal file
@ -0,0 +1 @@
|
||||
{"type": "module"}
|
4
build.sh
@ -12,11 +12,11 @@ export NEXT_PUBLIC_BASE_PATH="/$PREFIX"
|
||||
|
||||
# mkdir -p "out"
|
||||
|
||||
pnpm install
|
||||
# pnpm install --frozen-lockfile
|
||||
pnpm run build
|
||||
|
||||
# local mirror (optional)
|
||||
# rsync -rav --delete dist/ "${HOME}/hero/var/www/$PREFIX/"
|
||||
|
||||
# deploy to veda server
|
||||
rsync -avz --delete out/ "root@veda.info:/root/hero/www/info/$PREFIX/"
|
||||
rsync -avz --delete out/ "root@veda.info:/root/hero/www/info/$PREFIX/"
|
@ -21,14 +21,12 @@
|
||||
"@tailwindcss/typography": "^0.5.13",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"clsx": "^2.1.0",
|
||||
"framer-motion": "^11.18.2",
|
||||
"next": "^14.0.4",
|
||||
"postcss": "^8.4.39",
|
||||
"react": "^18.2.0",
|
||||
"react-card-slider-component": "^1.0.9",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-slick": "^0.30.2",
|
||||
"react-use-measure": "^2.1.7",
|
||||
"slick-carousel": "^1.8.1",
|
||||
"swiper": "^11.1.7",
|
||||
"tailwindcss": "^3.4.6"
|
||||
|
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 1.9 MiB |
Before Width: | Height: | Size: 349 KiB |
Before Width: | Height: | Size: 349 KiB |
Before Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 2.8 MiB |
Before Width: | Height: | Size: 349 KiB |
Before Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 229 KiB |
Before Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 167 KiB |
@ -1,15 +0,0 @@
|
||||
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 />
|
||||
</>
|
||||
)
|
||||
}
|
@ -2,10 +2,6 @@ import { CallToAction3 } from '@/components/CallToAction3'
|
||||
import { Footer } from '@/components/Footer'
|
||||
import { Header } from '@/components/Header'
|
||||
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() {
|
||||
return (
|
||||
@ -13,10 +9,6 @@ export default function Itinerary() {
|
||||
<Header />
|
||||
<main>
|
||||
<Exp/>
|
||||
<Community />
|
||||
<Retreats />
|
||||
<Events />
|
||||
<Nomads />
|
||||
<CallToAction3 />
|
||||
</main>
|
||||
<Footer />
|
||||
|
@ -34,7 +34,7 @@ export default function RootLayout({ children }) {
|
||||
lexend.variable,
|
||||
)}
|
||||
>
|
||||
<body className="flex h-full flex-col pt-20">{children}</body>
|
||||
<body className="flex h-full flex-col">{children}</body>
|
||||
</html>
|
||||
)
|
||||
}
|
||||
|
@ -9,8 +9,6 @@ import { Pricing } from '@/components/Pricing'
|
||||
import Route from '@/components/Route';
|
||||
import { SecondaryFeatures } from '@/components/SecondaryFeatures'
|
||||
import { Testimonials } from '@/components/Testimonials'
|
||||
import { Boat } from '@/components/Boat'
|
||||
import { Experiences } from '@/components/Experiences'
|
||||
import ThirdFeatures from '@/components/ThirdFeatures'
|
||||
import NewFeatures from '@/components/NewFeatures'
|
||||
import NewFeatures2 from '@/components/NewFeatures2'
|
||||
@ -19,7 +17,6 @@ import Boats from '@/components/Boats'
|
||||
import Carousel from '@/components/Carousel'
|
||||
import CNNVIDEO from '@/components/CNNVIDEO'
|
||||
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<>
|
||||
@ -27,8 +24,7 @@ export default function Home() {
|
||||
<main>
|
||||
<Hero />
|
||||
<CallToAction />
|
||||
<Experiences />
|
||||
<Boat />
|
||||
<SecondaryFeatures />
|
||||
<NewFeatures />
|
||||
<NewFeatures2 />
|
||||
<CallToAction2 />
|
||||
|
@ -1,197 +0,0 @@
|
||||
'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>
|
||||
)
|
||||
}
|