├── src
├── vite-env.d.ts
├── assets
│ ├── icon1.png
│ ├── icon2.png
│ ├── icon3.png
│ ├── icon4.png
│ ├── logo1.png
│ ├── logo2.png
│ ├── hero-img.png
│ ├── HeroVector.png
│ ├── gallery1.jpeg
│ ├── gallery2.jpeg
│ ├── gallery3.jpeg
│ ├── gallery4.jpeg
│ ├── gallery5.jpeg
│ ├── gallery6.jpeg
│ ├── partners1.png
│ ├── partners2.png
│ ├── partners3.png
│ ├── plusGroup.png
│ ├── plusGroup2.png
│ ├── profile1.jpeg
│ ├── profile2.jpeg
│ ├── profile3.jpeg
│ ├── profile4.jpeg
│ ├── appdownload.png
│ ├── bookingImage1.jpeg
│ └── bookingImage2.jpeg
├── components
│ ├── atoms
│ │ ├── List.tsx
│ │ ├── Button.tsx
│ │ ├── Input.tsx
│ │ ├── Text.tsx
│ │ └── Image.tsx
│ ├── pages
│ │ └── Home.tsx
│ ├── molecules
│ │ ├── Card.tsx
│ │ └── SubscribeForm.tsx
│ ├── organs
│ │ ├── NewsLetter.tsx
│ │ ├── Services.tsx
│ │ ├── HeroSection.tsx
│ │ ├── Partners.tsx
│ │ ├── Footer.tsx
│ │ ├── Testimonials.tsx
│ │ ├── BookingSteps.tsx
│ │ ├── TopDestination.tsx
│ │ └── NavBar.tsx
│ └── particles
│ │ └── DataLists.tsx
├── main.tsx
├── index.css
└── App.tsx
├── public
├── icon.png
├── logo1.png
└── vite.svg
├── Jadoo-Travel-Agency.png
├── postcss.config.js
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── index.html
├── tailwind.config.js
├── .eslintrc.cjs
├── tsconfig.json
├── package.json
└── README.md
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/public/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/public/icon.png
--------------------------------------------------------------------------------
/public/logo1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/public/logo1.png
--------------------------------------------------------------------------------
/src/assets/icon1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/icon1.png
--------------------------------------------------------------------------------
/src/assets/icon2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/icon2.png
--------------------------------------------------------------------------------
/src/assets/icon3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/icon3.png
--------------------------------------------------------------------------------
/src/assets/icon4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/icon4.png
--------------------------------------------------------------------------------
/src/assets/logo1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/logo1.png
--------------------------------------------------------------------------------
/src/assets/logo2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/logo2.png
--------------------------------------------------------------------------------
/Jadoo-Travel-Agency.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/Jadoo-Travel-Agency.png
--------------------------------------------------------------------------------
/src/assets/hero-img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/hero-img.png
--------------------------------------------------------------------------------
/src/assets/HeroVector.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/HeroVector.png
--------------------------------------------------------------------------------
/src/assets/gallery1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/gallery1.jpeg
--------------------------------------------------------------------------------
/src/assets/gallery2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/gallery2.jpeg
--------------------------------------------------------------------------------
/src/assets/gallery3.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/gallery3.jpeg
--------------------------------------------------------------------------------
/src/assets/gallery4.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/gallery4.jpeg
--------------------------------------------------------------------------------
/src/assets/gallery5.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/gallery5.jpeg
--------------------------------------------------------------------------------
/src/assets/gallery6.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/gallery6.jpeg
--------------------------------------------------------------------------------
/src/assets/partners1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/partners1.png
--------------------------------------------------------------------------------
/src/assets/partners2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/partners2.png
--------------------------------------------------------------------------------
/src/assets/partners3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/partners3.png
--------------------------------------------------------------------------------
/src/assets/plusGroup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/plusGroup.png
--------------------------------------------------------------------------------
/src/assets/plusGroup2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/plusGroup2.png
--------------------------------------------------------------------------------
/src/assets/profile1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/profile1.jpeg
--------------------------------------------------------------------------------
/src/assets/profile2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/profile2.jpeg
--------------------------------------------------------------------------------
/src/assets/profile3.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/profile3.jpeg
--------------------------------------------------------------------------------
/src/assets/profile4.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/profile4.jpeg
--------------------------------------------------------------------------------
/src/assets/appdownload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/appdownload.png
--------------------------------------------------------------------------------
/src/assets/bookingImage1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/bookingImage1.jpeg
--------------------------------------------------------------------------------
/src/assets/bookingImage2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Signor1/jadoo-travels/HEAD/src/assets/bookingImage2.jpeg
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | })
8 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true
8 | },
9 | "include": ["vite.config.ts"]
10 | }
11 |
--------------------------------------------------------------------------------
/src/components/atoms/List.tsx:
--------------------------------------------------------------------------------
1 | type ListProps = {
2 | className?: string
3 | children: React.ReactNode | string
4 | }
5 |
6 | export const List = ({ className, children, ...rest }: ListProps) => {
7 | return (
8 | <>
9 |
{children}
10 | >
11 | )
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/atoms/Button.tsx:
--------------------------------------------------------------------------------
1 | type ButtonProps = {
2 | className: string
3 | children: string | React.ReactNode
4 | } & Omit, 'children'>
5 |
6 | export const Button = ({ className, children, ...rest }: ButtonProps) => {
7 | return (
8 |
9 | )
10 | }
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 | .vercel
26 |
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './App'
4 | import './index.css'
5 | import { BrowserRouter } from "react-router-dom";
6 |
7 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
8 |
9 |
10 |
11 |
12 | ,
13 | )
14 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Jadoo | Travel Agency
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: ["./src/**/*.{js,jsx,ts,tsx}"],
4 | theme: {
5 | extend: {
6 | colors: {
7 | color1: "#D7573B",
8 | color2: "#FA9C0F",
9 | color3: "#152F37",
10 | color4: "#35528B",
11 | },
12 | fontFamily: {
13 | poppins: ["Poppins"],
14 | },
15 | },
16 | },
17 | plugins: [],
18 | };
19 |
--------------------------------------------------------------------------------
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: { browser: true, es2020: true },
3 | extends: [
4 | 'eslint:recommended',
5 | 'plugin:@typescript-eslint/recommended',
6 | 'plugin:react-hooks/recommended',
7 | ],
8 | parser: '@typescript-eslint/parser',
9 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
10 | plugins: ['react-refresh'],
11 | rules: {
12 | 'react-refresh/only-export-components': 'warn',
13 | },
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/atoms/Input.tsx:
--------------------------------------------------------------------------------
1 | type InputProps = {
2 | containerClass: string
3 | inputClass: string
4 | children?: React.ReactNode
5 | } & Omit, 'children'>
6 |
7 | export const Input = ({ containerClass, inputClass, children, ...rest }: InputProps) => {
8 | return (
9 |
10 |
11 | {children}
12 |
13 | )
14 | }
--------------------------------------------------------------------------------
/src/components/atoms/Text.tsx:
--------------------------------------------------------------------------------
1 | type TextOwnProps = {
2 | className: string
3 | children?: React.ReactNode
4 | as?: E
5 | }
6 |
7 | type TextProps = TextOwnProps & Omit, keyof TextOwnProps>
8 |
9 | export const Text = ({ className, children, as }: TextProps) => {
10 | const Component = as || 'div'
11 | return (
12 | {children}
13 | )
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/atoms/Image.tsx:
--------------------------------------------------------------------------------
1 | type ImageOwnProps = {
2 | className: string
3 | image: string
4 | alt: string
5 | objectCover?: string
6 | as?: T
7 | }
8 |
9 | type ImageProps = ImageOwnProps & Omit, keyof ImageOwnProps>
10 |
11 | export const Image = ({ className, image, alt, objectCover, as, ...rest }: ImageProps) => {
12 | const Component = as || 'div'
13 | return (
14 |
15 |
16 |
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true
22 | },
23 | "include": ["src"],
24 | "references": [{ "path": "./tsconfig.node.json" }]
25 | }
26 |
--------------------------------------------------------------------------------
/src/components/pages/Home.tsx:
--------------------------------------------------------------------------------
1 | import BookingSteps from "../organs/BookingSteps"
2 | import HeroSection from "../organs/HeroSection"
3 | import NewsLetter from "../organs/NewsLetter"
4 | import Partners from "../organs/Partners"
5 | import Services from "../organs/Services"
6 | import Testimonials from "../organs/Testimonials"
7 | import TopDestination from "../organs/TopDestination"
8 |
9 |
10 | const Home = () => {
11 | return (
12 | <>
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | >
21 | )
22 | }
23 |
24 | export default Home
--------------------------------------------------------------------------------
/src/components/molecules/Card.tsx:
--------------------------------------------------------------------------------
1 | import { Image } from "../atoms/Image"
2 |
3 | type CardProps = {
4 | cardClass: string
5 | imageWrapperClass: string
6 | imageAlt: string
7 | imageSrc: string
8 | textWrapperClass?: string
9 | cover?: string
10 | children?: React.ReactNode
11 | }
12 |
13 | export const Card = ({ cardClass, imageWrapperClass, imageAlt, imageSrc, textWrapperClass, children, cover, ...rest }: CardProps) => {
14 | return (
15 |
16 |
17 |
18 | {children}
19 |
20 |
21 | )
22 | }
23 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap');
2 |
3 | @tailwind base;
4 | @tailwind components;
5 | @tailwind utilities;
6 |
7 | /* @layer components {
8 | .pseudoBefore {
9 | @apply relative z-10 before: absolute before:-z-10 before:content-[''];
10 | }
11 | } */
12 |
13 | .cardPseudo {
14 | position: relative;
15 | /* z-index: 5; */
16 | }
17 |
18 | .cardPseudo::after {
19 | content: "";
20 | position: absolute;
21 | bottom: 1.5rem;
22 | left: 1.5rem;
23 | width: 80px;
24 | height: 80px;
25 | border-radius: 1.5rem 0 1rem 0;
26 | z-index: -1;
27 | transition: 300ms cubic-bezier(1, 0, 0, 1);
28 | }
29 |
30 | .cardPseudo:hover::after {
31 | bottom: -1.5rem;
32 | left: -1.5rem;
33 | }
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { Routes, Route, useLocation } from "react-router-dom";
2 | //importing react slick slider
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 |
6 | import { animateScroll } from "react-scroll";
7 |
8 | import NavBar from "./components/organs/NavBar"
9 | import Home from "./components/pages/Home";
10 | import { useEffect } from "react";
11 | import Footer from "./components/organs/Footer";
12 |
13 | function App() {
14 | const directory = useLocation();
15 | useEffect(() => {
16 | animateScroll.scrollToTop({
17 | duration: 0,
18 | });
19 | }, [directory.pathname]);
20 |
21 | return (
22 |
23 |
24 |
25 | } />
26 |
27 |
28 |
29 | )
30 | }
31 |
32 | export default App
33 |
--------------------------------------------------------------------------------
/src/components/molecules/SubscribeForm.tsx:
--------------------------------------------------------------------------------
1 | import { Envelope } from '@phosphor-icons/react'
2 | import { Input } from '../atoms/Input'
3 | import { Button } from '../atoms/Button'
4 | import { NewsletterTexts } from '../particles/DataLists'
5 |
6 | export const SubscribeForm = () => {
7 | return (
8 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/organs/NewsLetter.tsx:
--------------------------------------------------------------------------------
1 | import { Image } from "../atoms/Image"
2 | import { Text } from "../atoms/Text"
3 | import { SubscribeForm } from "../molecules/SubscribeForm"
4 | import { NewsletterTexts } from "../particles/DataLists"
5 | import groupOfPlus from "../../assets/plusGroup2.png"
6 |
7 |
8 | const NewsLetter = () => {
9 | return (
10 |
11 |
12 |
13 |
15 |
16 | {NewsletterTexts.firstText}
17 |
18 |
19 |
20 |
21 |
22 | )
23 | }
24 |
25 | export default NewsLetter
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jadoo",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@emotion/react": "^11.11.1",
14 | "@phosphor-icons/react": "^2.0.10",
15 | "react": "^18.2.0",
16 | "react-awesome-reveal": "^4.2.5",
17 | "react-dom": "^18.2.0",
18 | "react-router-dom": "^6.14.1",
19 | "react-scroll": "^1.8.9",
20 | "react-slick": "^0.29.0",
21 | "slick-carousel": "^1.8.1"
22 | },
23 | "devDependencies": {
24 | "@types/react": "^18.0.37",
25 | "@types/react-dom": "^18.0.11",
26 | "@types/react-scroll": "^1.8.7",
27 | "@types/react-slick": "^0.23.10",
28 | "@typescript-eslint/eslint-plugin": "^5.59.0",
29 | "@typescript-eslint/parser": "^5.59.0",
30 | "@vitejs/plugin-react": "^4.0.0",
31 | "autoprefixer": "^10.4.14",
32 | "eslint": "^8.38.0",
33 | "eslint-plugin-react-hooks": "^4.6.0",
34 | "eslint-plugin-react-refresh": "^0.3.4",
35 | "postcss": "^8.4.24",
36 | "tailwindcss": "^3.3.2",
37 | "typescript": "^5.0.2",
38 | "vite": "^4.3.9"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Jadoo Travel Agency Landing Page
4 |
5 | This project is a landing page for Jadoo Travel Agency built using React, TypeScript, and Vite.
6 |
7 | ## Features
8 |
9 | - Beautiful and modern design
10 | - Responsive layout for various screen sizes
11 | - Smooth scrolling navigation
12 | - Interactive components and animations
13 | - Information about Jadoo Travel Agency services
14 |
15 | ## Technologies Used
16 |
17 | - React
18 | - TypeScript
19 | - Vite
20 | - HTML5
21 | - CSS3
22 | - TailwindCSS
23 | - JavaScript
24 | - React Router
25 | - Other libraries and dependencies (specified in package.json)
26 |
27 | ## Getting Started
28 |
29 | ### Prerequisites
30 |
31 | - Node.js (v14 or higher)
32 | - npm or Yarn
33 |
34 | ### Installation
35 |
36 | 1. Clone the repository:
37 |
38 | ```bash
39 | git clone https://github.com/your-username/jadoo-travel-agency.git
40 | ```
41 |
42 | 2. Navigate to the project directory:
43 |
44 | ```bash
45 | cd jadoo-travel-agency
46 | ```
47 |
48 | 3. Install the dependencies:
49 |
50 | ```bash
51 | npm install
52 | ```
53 |
54 | or
55 |
56 | ```bash
57 | yarn install
58 | ```
59 |
60 | 4. Start the development server:
61 |
62 | ```bash
63 | npm run dev
64 | ```
65 |
66 | or
67 |
68 | ```bash
69 | yarn dev
70 | ```
71 |
72 | 5. Open your browser and visit `http://localhost:3000` to see the landing page.
73 |
74 | ## Project Structure
75 |
76 | The project structure follows a standard React application structure:
77 |
78 | - **public:** Contains static assets such as images, fonts, and the index.html file.
79 | - **src:**
80 | - **components:** Reusable components used in the landing page.
81 | - **pages:** Top-level pages or views for different sections of the landing page.
82 | - **styles:** Stylesheets, SCSS files, or CSS modules for styling components and pages.
83 | - **utils:** Utility functions or helper modules.
84 | - **App.tsx:** The main entry point of the application.
85 | - **index.tsx:** Initializes the React application and renders the root component.
86 |
87 | ## Deployment
88 |
89 | To deploy the Jadoo Travel Agency landing page, you can follow the deployment instructions specific to your chosen hosting platform (e.g., Netlify, Vercel, GitHub Pages, etc.). Typically, you need to build the project and configure the hosting platform to serve the generated files.
90 |
91 | ## Credits
92 |
93 | This project was developed by [SignorDev](https://github.com/signor1). It was created as a sample landing page for a travel agency based on the Jadoo brand.
94 |
95 | ## Demo
96 |
97 | [View Project](https://jadoo-tour.vercel.app)
98 |
99 | Feel free to explore the code, customize it, and use it as a foundation for your own projects. Happy traveling with Jadoo Travel Agency!
100 |
--------------------------------------------------------------------------------
/src/components/organs/Services.tsx:
--------------------------------------------------------------------------------
1 | import { Image } from "../atoms/Image"
2 | import { Text } from "../atoms/Text"
3 | import { ServiceTexts } from "../particles/DataLists"
4 | import GroupOfPlus from "../../assets/plusGroup.png"
5 | import { Card } from "../molecules/Card"
6 | import { useCallback } from "react"
7 | import Icon1 from "../../assets/icon1.png"
8 | import Icon2 from "../../assets/icon2.png"
9 | import Icon3 from "../../assets/icon3.png"
10 | import Icon4 from "../../assets/icon4.png"
11 | import { Fade } from "react-awesome-reveal"
12 |
13 |
14 |
15 |
16 | const Services = () => {
17 |
18 | const renderServiceIcon = useCallback((element: number) => {
19 | switch (element) {
20 | case 0:
21 | return Icon1;
22 | case 1:
23 | return Icon2;
24 | case 2:
25 | return Icon3;
26 | case 3:
27 | return Icon4;
28 | default:
29 | return "";
30 | }
31 | }, []);
32 | return (
33 |
34 |
35 |
36 |
37 | {ServiceTexts.firstText}
38 |
39 |
40 | {ServiceTexts.secondText}
41 |
42 |
43 |
44 | {
45 | ServiceTexts.cards.map((card, index) => (
46 |
47 |
48 |
49 | {card.firstText}
50 |
51 |
52 | {card.secondText}
53 |
54 |
55 | ))
56 | }
57 |
58 |
59 |
60 |
61 | )
62 | }
63 |
64 | export default Services
--------------------------------------------------------------------------------
/src/components/organs/HeroSection.tsx:
--------------------------------------------------------------------------------
1 | import { Image } from "../atoms/Image"
2 | import bgImage from "../../assets/HeroVector.png"
3 | import heroImage from "../../assets/hero-img.png"
4 | import { Text } from "../atoms/Text"
5 | import { HeroTexts } from "../particles/DataLists"
6 | import { Button } from "../atoms/Button"
7 | import { Play } from "@phosphor-icons/react"
8 | import { Fade, Slide } from "react-awesome-reveal"
9 |
10 |
11 | const HeroSection = () => {
12 | return (
13 |
14 |
15 |
16 |
17 |
18 | {HeroTexts.firstText}
19 |
20 |
21 | {HeroTexts.secondText}
22 |
23 |
24 | {HeroTexts.thirdText}
25 |
26 |
27 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | )
53 | }
54 |
55 | export default HeroSection
--------------------------------------------------------------------------------
/src/components/organs/Partners.tsx:
--------------------------------------------------------------------------------
1 | import Slider from "react-slick"
2 | import partners1 from "../../assets/partners1.png"
3 | import partners2 from "../../assets/partners2.png"
4 | import partners3 from "../../assets/partners3.png"
5 | import { Card } from "../molecules/Card"
6 |
7 |
8 |
9 | const Partners = () => {
10 | // Slider settings
11 | const settings = {
12 | dots: false,
13 | infinite: true,
14 | autoplay: true,
15 | slidesToShow: 6,
16 | slidesToScroll: 1,
17 | initialSlide: 0,
18 | responsive: [
19 | {
20 | breakpoint: 1024,
21 | settings: {
22 | slidesToShow: 4,
23 | slidesToScroll: 1,
24 | infinite: true,
25 | dots: false,
26 | },
27 | },
28 | {
29 | breakpoint: 600,
30 | settings: {
31 | slidesToShow: 2,
32 | slidesToScroll: 1,
33 | initialSlide: 2,
34 | dots: false,
35 | },
36 | },
37 | {
38 | breakpoint: 480,
39 | settings: {
40 | slidesToShow: 2,
41 | slidesToScroll: 1,
42 | dots: false,
43 | },
44 | },
45 | ],
46 |
47 | };
48 | return (
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | )
63 | }
64 |
65 | export default Partners
--------------------------------------------------------------------------------
/src/components/organs/Footer.tsx:
--------------------------------------------------------------------------------
1 | import { Image } from "../atoms/Image"
2 | import logo from "../../assets/logo2.png"
3 | import { Text } from "../atoms/Text"
4 | import { FooterTexts } from "../particles/DataLists"
5 | import { List } from "../atoms/List"
6 | import { Link } from "react-router-dom"
7 | import { FacebookLogo, InstagramLogo, TwitterLogo } from "@phosphor-icons/react"
8 | import app from "../../assets/appdownload.png"
9 |
10 |
11 | const Footer = () => {
12 | return (
13 |
96 | )
97 | }
98 |
99 | export default Footer
--------------------------------------------------------------------------------
/src/components/organs/Testimonials.tsx:
--------------------------------------------------------------------------------
1 | import { useCallback, useRef } from "react";
2 | import { Text } from "../atoms/Text"
3 | import { TestimonialTexts } from "../particles/DataLists"
4 | import Slider from "react-slick";
5 | import { Button } from "../atoms/Button";
6 | import { CaretDown, CaretUp } from "@phosphor-icons/react";
7 | import { Card } from "../molecules/Card";
8 | import ProfileImg1 from "../../assets/profile1.jpeg"
9 | import ProfileImg2 from "../../assets/profile2.jpeg"
10 | import ProfileImg3 from "../../assets/profile3.jpeg"
11 | import ProfileImg4 from "../../assets/profile4.jpeg"
12 |
13 | const Testimonials = () => {
14 | const sliderRef = useRef();
15 |
16 | // Function for next button
17 | const next = () => {
18 | if (sliderRef.current) {
19 | sliderRef.current.slickNext();
20 | }
21 | };
22 | // function for previous button
23 | const previous = () => {
24 | if (sliderRef.current) {
25 | sliderRef.current.slickPrev();
26 | }
27 | };
28 |
29 | // Slider settings
30 | const settings = {
31 | dots: false,
32 | infinite: true,
33 | slidesToShow: 1,
34 | slidesToScroll: 1,
35 | vertical: true,
36 | verticalSwiping: true,
37 |
38 | };
39 |
40 | const renderProfileImg = useCallback((element: number) => {
41 | switch (element) {
42 | case 0:
43 | return ProfileImg2;
44 | case 1:
45 | return ProfileImg1;
46 | case 2:
47 | return ProfileImg3;
48 | case 3:
49 | return ProfileImg4;
50 | default:
51 | return "";
52 | }
53 | }, [])
54 |
55 | return (
56 |
57 |
58 | {/* Text and Steps Container */}
59 |
60 |
61 | {TestimonialTexts.firstText}
62 |
63 |
64 | {TestimonialTexts.secondText}
65 |
66 |
67 | {/* Testimonial Slides Container */}
68 |
69 |
70 |
(sliderRef.current = slider)} {...settings}>
71 | {
72 | TestimonialTexts.feedBacks.map((feedBack, index) => (
73 |
74 |
75 |
76 | {feedBack.text}
77 |
78 |
79 |
80 | {feedBack.person}
81 |
82 |
83 | {feedBack.location}
84 |
85 |
86 |
87 |
88 | ))
89 | }
90 |
91 |
92 | {/* Controllers */}
93 |
94 |
97 |
100 |
101 |
102 |
103 |
104 | )
105 | }
106 |
107 | export default Testimonials
--------------------------------------------------------------------------------
/src/components/organs/BookingSteps.tsx:
--------------------------------------------------------------------------------
1 | import { useCallback } from 'react'
2 | import { List } from '../atoms/List'
3 | import { Text } from '../atoms/Text'
4 | import { BookingStepsTexts } from '../particles/DataLists'
5 | import { AirplaneInFlight, AirplaneTilt, Buildings, MapTrifold, Receipt, Wallet } from '@phosphor-icons/react'
6 | import { Card } from '../molecules/Card'
7 | import CardImage1 from "../../assets/bookingImage1.jpeg"
8 | import CardImage2 from "../../assets/bookingImage2.jpeg"
9 |
10 | const BookingSteps = () => {
11 |
12 | const renderIcons = useCallback((element: number) => {
13 | switch (element) {
14 | case 0:
15 | return ;
16 | case 1:
17 | return ;
18 | case 2:
19 | return ;
20 | default:
21 | return "";
22 | }
23 | }, [])
24 |
25 | return (
26 |
27 |
28 | {BookingStepsTexts.firstText}
29 |
30 |
31 | {/* Text and Steps Container */}
32 |
33 |
34 | {BookingStepsTexts.secondText}
35 |
36 |
37 | {
38 | BookingStepsTexts.listOfSteps.map((step, index) => (
39 |
40 |
41 | {renderIcons(index)}
42 |
43 |
44 | {step.text}
45 |
46 |
47 |
48 | ))
49 | }
50 |
51 |
52 | {/* Card Container */}
53 |
54 | {/* First Card */}
55 |
56 |
57 | {BookingStepsTexts.cardOne.name}
58 |
59 |
60 | {BookingStepsTexts.cardOne.date}
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | {BookingStepsTexts.cardOne.people}
77 |
78 |
79 |
80 | {/* Second Absolute Card */}
81 |
82 |
83 | {BookingStepsTexts.cardTwo.status}
84 |
85 |
86 | {BookingStepsTexts.cardTwo.destination}
87 |
88 |
89 | {BookingStepsTexts.cardTwo.completion}
90 |
91 |
92 |
93 |
94 |
95 | )
96 | }
97 |
98 | export default BookingSteps
--------------------------------------------------------------------------------
/src/components/organs/TopDestination.tsx:
--------------------------------------------------------------------------------
1 | import { useCallback, useRef } from "react";
2 | import { Text } from "../atoms/Text"
3 | import { TopDestinationTexts } from "../particles/DataLists"
4 | import Slider from "react-slick";
5 | import { Card } from "../molecules/Card";
6 | import City1 from "../../assets/gallery1.jpeg"
7 | import City2 from "../../assets/gallery2.jpeg"
8 | import City3 from "../../assets/gallery3.jpeg"
9 | import City4 from "../../assets/gallery4.jpeg"
10 | import City5 from "../../assets/gallery5.jpeg"
11 | import City6 from "../../assets/gallery6.jpeg"
12 | import { Button } from "../atoms/Button";
13 | import { AirplaneTilt, CaretLeft, CaretRight } from "@phosphor-icons/react";
14 |
15 |
16 | const TopDestination = () => {
17 |
18 | const sliderRef = useRef();
19 |
20 | // Function for next button
21 | const next = () => {
22 | if (sliderRef.current) {
23 | sliderRef.current.slickNext();
24 |
25 | }
26 | };
27 | // function for previous button
28 | const previous = () => {
29 | if (sliderRef.current) {
30 | sliderRef.current.slickPrev();
31 | }
32 |
33 | };
34 |
35 | // Slider settings
36 | const settings = {
37 | dots: false,
38 | infinite: true,
39 | speed: 500,
40 | slidesToShow: 3,
41 | slidesToScroll: 1,
42 | initialSlide: 0,
43 | responsive: [
44 | {
45 | breakpoint: 1024,
46 | settings: {
47 | slidesToShow: 2,
48 | slidesToScroll: 1,
49 | infinite: true,
50 | dots: false,
51 | },
52 | },
53 | {
54 | breakpoint: 600,
55 | settings: {
56 | slidesToShow: 2,
57 | slidesToScroll: 1,
58 | initialSlide: 2,
59 | dots: false,
60 | },
61 | },
62 | {
63 | breakpoint: 480,
64 | settings: {
65 | slidesToShow: 1,
66 | slidesToScroll: 1,
67 | dots: false,
68 | },
69 | },
70 | ],
71 | };
72 |
73 | const renderCities = useCallback((element: number) => {
74 | switch (element) {
75 | case 0:
76 | return City1;
77 | case 1:
78 | return City2;
79 | case 2:
80 | return City3;
81 | case 3:
82 | return City4;
83 | case 4:
84 | return City5;
85 | case 5:
86 | return City6;
87 | default:
88 | return "";
89 | }
90 | }, [])
91 |
92 | return (
93 |
94 |
95 | {TopDestinationTexts.firstText}
96 |
97 |
98 | {TopDestinationTexts.secondText}
99 |
100 |
101 | {/* Controllers */}
102 |
103 |
106 |
109 |
110 |
111 | {/* Slides */}
112 |
113 |
(sliderRef.current = slider)} {...settings}>
114 | {
115 | TopDestinationTexts.cards.map((card, index) => (
116 |
117 |
118 |
119 |
120 | {card.country}
121 |
122 |
123 | {card.price}
124 |
125 |
126 |
127 |
128 |
129 | {card.duration}
130 |
131 |
132 |
133 |
134 | ))
135 | }
136 |
137 |
138 |
139 |
140 | )
141 | }
142 |
143 | export default TopDestination
--------------------------------------------------------------------------------
/src/components/particles/DataLists.tsx:
--------------------------------------------------------------------------------
1 | export const NavLinks = [
2 | {
3 | name: "Destination",
4 | url: "/"
5 | },
6 | {
7 | name: "Hotels",
8 | url: "/"
9 | },
10 | {
11 | name: "Flights",
12 | url: "/"
13 | },
14 | {
15 | name: "Bookings",
16 | url: "/"
17 | }
18 |
19 | ];
20 |
21 | export const NavButtons = [
22 | {
23 | name: "Login",
24 | url: "/"
25 | },
26 | {
27 | name: "Signup",
28 | url: "/"
29 | }
30 |
31 | ];
32 |
33 |
34 | export const HeroTexts = {
35 | firstText: "BEST DESITNATIONS AROUND THE WORLD",
36 | secondText: "Travel, enjoy and live a new and full life.",
37 | thirdText: "Built Wicket longer admire do barton vantity itself do in it. Preferred to sportsmen it engrossed listening. Park gate sell they west hard for the.",
38 | firstButton: "Find out more",
39 | secondButton: 'Play Demo'
40 | }
41 |
42 |
43 | export const ServiceTexts = {
44 | firstText: "CATEGORY",
45 | secondText: "We Offer Best Services",
46 | cards: [
47 | {
48 | firstText: "Calculated Weather",
49 | secondText: "Built Wicket longer admire do barton vantity itself do in it."
50 | },
51 | {
52 | firstText: "Best Flight",
53 | secondText: "engrossed listening. Park gate sell they west hard for the."
54 | },
55 | {
56 | firstText: "Local Events",
57 | secondText: "barton vantity itself do in it.Preferred to men it engrossed listening."
58 | },
59 | {
60 | firstText: "Customizition",
61 | secondText: "We deliver outsourced aviation services for military customers."
62 | }
63 | ]
64 | }
65 |
66 | export const TopDestinationTexts = {
67 | firstText: "Top selling",
68 | secondText: "Top Destinations",
69 | cards: [
70 | {
71 | country: "Rome, Italy",
72 | price: "5.42k",
73 | duration: "10 days trip"
74 | },
75 | {
76 | country: "London, UK",
77 | price: "4.2k",
78 | duration: "12 days trip"
79 | },
80 | {
81 | country: "Paris, France",
82 | price: "15k",
83 | duration: "26 days trip"
84 | },
85 | {
86 | country: "New York, USA",
87 | price: "4.5k",
88 | duration: "8 days trip"
89 | },
90 | {
91 | country: "Warsaw, Poland",
92 | price: "3.9k",
93 | duration: "14 days trip"
94 | },
95 | {
96 | country: "Dubai, UAE",
97 | price: "9.2k",
98 | duration: "17 days trip"
99 | },
100 | ]
101 | }
102 |
103 | export const BookingStepsTexts = {
104 | firstText: "Easy and Fast",
105 | secondText: "Book your next trip in 3 easy steps",
106 | listOfSteps: [
107 | {
108 | text: "Choose Destination lorem ipsum dolor sit amet, consectetur adipiscing elit.Urna, tortor tempus."
109 | },
110 | {
111 | text: "Make Payment lorem ipsum dolor sit amet, consectetur adipiscing elit.Uma, totor tempus."
112 | },
113 | {
114 | text: "Reach Airport on Selected Date lorem ipsum dolor sit amet.consectetur adipiscing elit.Uma totor tempus."
115 | }
116 | ],
117 | cardOne:
118 | {
119 | name: "Trip To Greece",
120 | date: "14-29 June | by Robbin Jobs",
121 | people: "24 people going"
122 | },
123 | cardTwo: {
124 | status: "Ongoing",
125 | destination: "Trip to Rome",
126 | completion: "40% Completed"
127 | }
128 |
129 | }
130 |
131 | export const TestimonialTexts = {
132 | firstText: "TESTIMONIALS",
133 | secondText: "What people say about Us.",
134 | feedBacks: [
135 | {
136 | text: "You did a fabulous job. There were no hitches. Thank you again for all your work planning this trip.",
137 | person: "Mike taylor",
138 | location: "Lahore, Pakistan"
139 | },
140 | {
141 | text: "Jadoo was great with the entire process from planning to updates during the trip. We had 11 people and everything was perfectly executed. We appreciate all of her hard work. It was truly the trip of a lifetime. Thank you!",
142 | person: "Gina",
143 | location: "Owerri, Nigeria"
144 | },
145 | {
146 | text: "Booking through you was very easy and made our lives so much easier. I have nothing bad to say! Thank you for giving us tips and guidance before we left on what to bring and such, that was very helpful!",
147 | person: "Emma",
148 | location: "Vancouver, Canada"
149 | },
150 | {
151 | text: "Thank you for your recommendation and putting the trip together. The resort was absolutely beautiful. The infinity pools, the palm trees in the main pool, the infinity pool in out preferred area overlooking the gulf and the golf course were exceptional....",
152 | person: "Loveth",
153 | location: "Lagos, Nigeria"
154 | },
155 | ],
156 | }
157 |
158 | export const NewsletterTexts = {
159 | firstText: "Subscribe to get information, latest news and other interesting offers about Jadoo.",
160 | placeholderText: "Your email",
161 | buttonText: "Subscribe"
162 | }
163 |
164 | export const FooterTexts = {
165 | underLogoText: "Book your trip in minutes, get full control for much longer.",
166 | quickLinks: {
167 | caption: "Quick Links",
168 | links: [
169 | {
170 | name: "Destination",
171 | url: "/"
172 | },
173 | {
174 | name: "Hotels",
175 | url: "/"
176 | },
177 | {
178 | name: "Flights",
179 | url: "/"
180 | },
181 | {
182 | name: "Bookings",
183 | url: "/"
184 | },
185 | {
186 | name: "Login",
187 | url: "/"
188 | },
189 | {
190 | name: "Signup",
191 | url: "/"
192 | }
193 | ]
194 | },
195 | contacts: {
196 | caption: "Contacts",
197 | links: [
198 | {
199 | name: "FAQs",
200 | url: "/"
201 | },
202 | {
203 | name: "Help",
204 | url: "/"
205 | },
206 | {
207 | name: "Policies",
208 | url: "/"
209 | },
210 | {
211 | name: "Terms & Conditions",
212 | url: "/"
213 | }
214 | ]
215 | },
216 | more: {
217 | caption: "More",
218 | links: [
219 | {
220 | name: "Career",
221 | url: "/"
222 | },
223 | {
224 | name: "Airlines",
225 | url: "/"
226 | },
227 | {
228 | name: "Airline Fees",
229 | url: "/"
230 | },
231 | {
232 | name: "Low Fare Tips",
233 | url: "/"
234 | }
235 | ]
236 | }
237 | }
--------------------------------------------------------------------------------
/src/components/organs/NavBar.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from "react"
2 | import { Image } from "../atoms/Image";
3 | import { Button } from "../atoms/Button"
4 | import Logo from "../../assets/logo1.png"
5 | import { NavButtons, NavLinks } from "../particles/DataLists"
6 | import { List } from "../atoms/List";
7 | import { NavLink, useNavigate } from "react-router-dom";
8 | import { ArrowCircleRight, CirclesFour } from "@phosphor-icons/react";
9 | import { Slide } from "react-awesome-reveal";
10 |
11 |
12 |
13 | const NavBar = () => {
14 | const navigate = useNavigate()
15 |
16 | const [open, setOpen] = useState(false)
17 | // const [scrollY, setScrollY] = useState(0)
18 | const [navBarColor, setNavBarColor] = useState(false)
19 |
20 | const handleToggle = () => {
21 | setOpen(!open)
22 | }
23 |
24 | const listenScrollEvent = () => {
25 | window.scrollY > 10 ? setNavBarColor(true) : setNavBarColor(false);
26 | };
27 |
28 | useEffect(() => {
29 | window.addEventListener("scroll", listenScrollEvent);
30 | return () => {
31 | window.removeEventListener("scroll", listenScrollEvent);
32 | };
33 | }, []);
34 |
35 |
36 | return (
37 |
38 |
39 |
80 |
81 |
82 |
83 | {/* Mobile Nav */}
84 |
114 |
115 | )
116 | }
117 |
118 | export default NavBar
--------------------------------------------------------------------------------