├── 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 | {alt} 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 | {imageAlt} 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 |
    9 | 10 |
    11 | 12 |
    13 | 14 | 17 |
    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 | Plus 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 | Vector 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 | Hero Background Vector 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 | Hero Image 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 |
    14 |
    15 |
    16 | Logo 17 | 18 | {FooterTexts.underLogoText} 19 | 20 |
    21 | 22 |
    23 | 24 | {FooterTexts.quickLinks.caption} 25 | 26 |
      27 | { 28 | FooterTexts.quickLinks.links.map((link, index) => ( 29 | 30 | {link.name} 31 | 32 | )) 33 | } 34 |
    35 |
    36 | 37 |
    38 | 39 | {FooterTexts.contacts.caption} 40 | 41 |
      42 | { 43 | FooterTexts.contacts.links.map((link, index) => ( 44 | 45 | {link.name} 46 | 47 | )) 48 | } 49 |
    50 |
    51 | 52 |
    53 | 54 | {FooterTexts.more.caption} 55 | 56 |
      57 | { 58 | FooterTexts.more.links.map((link, index) => ( 59 | 60 | {link.name} 61 | 62 | )) 63 | } 64 |
    65 |
    66 | 67 |
    68 |
      69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 |
    85 | 86 | 87 | Discover Our App 88 | 89 | App Download 90 |
    91 |
    92 | 93 | Copyright 2023. Jadoo.com. All rights reserved. 94 | 95 |
    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 --------------------------------------------------------------------------------