├── src ├── App.css ├── Home │ ├── Home.css │ └── Home.js ├── Home.css ├── images │ └── screenshot.png ├── Footer.css ├── setupTests.js ├── App.test.js ├── Footer.js ├── Card.js ├── reportWebVitals.js ├── index.css ├── SearchPage.css ├── index.js ├── App.js ├── Card.css ├── Header.css ├── Header.js ├── Search.css ├── Banner.js ├── SearchResult.js ├── SearchResult.css ├── Banner.css ├── Search.js ├── Home.js ├── logo.svg └── SearchPage.js ├── .firebaserc ├── public ├── favicon.ico ├── logo192.png ├── logo512.png ├── robots.txt ├── manifest.json └── index.html ├── firebase.json ├── .gitignore ├── README.md ├── package.json └── .firebase └── hosting.YnVpbGQ.cache /src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Home/Home.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Home.css: -------------------------------------------------------------------------------- 1 | .home__section { 2 | display: flex; 3 | padding: 30px; 4 | } -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "airbnb-clone-ozngrsc" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozngrsc/Airbnb-Clone/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozngrsc/Airbnb-Clone/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozngrsc/Airbnb-Clone/HEAD/public/logo512.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozngrsc/Airbnb-Clone/HEAD/src/images/screenshot.png -------------------------------------------------------------------------------- /src/Footer.css: -------------------------------------------------------------------------------- 1 | .footer { 2 | border-top: 1px solid lightgray; 3 | padding: 20px; 4 | background-color: #f7f7f7; 5 | text-align: center; 6 | } 7 | 8 | .footer > p { 9 | padding: 5px; 10 | font-size: 14px; 11 | } -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /src/Home/Home.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./Home.css"; 3 | 4 | // ES7 snippets to do 'rfce' 5 | 6 | function Home() { 7 | return ( 8 |
9 |

Home component

10 |
11 | ); 12 | } 13 | 14 | export default Home; 15 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "build", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ], 9 | "rewrites": [ 10 | { 11 | "source": "**", 12 | "destination": "/index.html" 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Footer.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./Footer.css"; 3 | 4 | function Footer() { 5 | return ( 6 |
7 |

© 2022 Airbnb clone by Ozngrsc

8 |

Privacy · Terms · Sitemap · Company Details

9 |
10 | ); 11 | } 12 | 13 | export default Footer; 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /src/Card.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./Card.css"; 3 | 4 | function Card({ src, title, description, price }) { 5 | return ( 6 |
7 | 8 |
9 |

{title}

10 |

{description}

11 |

{price}

12 |
13 |
14 | ); 15 | } 16 | 17 | export default Card; 18 | -------------------------------------------------------------------------------- /src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | } 4 | 5 | body { 6 | margin: 0; 7 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 8 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 9 | sans-serif; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | 14 | code { 15 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 16 | monospace; 17 | } 18 | -------------------------------------------------------------------------------- /src/SearchPage.css: -------------------------------------------------------------------------------- 1 | .searchPage__info { 2 | padding: 20px; 3 | } 4 | 5 | .searchPage__info > p { 6 | margin-bottom: 10px; 7 | font-size: 14px; 8 | } 9 | 10 | .searchPage__info > h1 { 11 | margin-bottom: 30px; 12 | } 13 | 14 | .searchPage__info > button { 15 | border-radius: 30px; 16 | text-transform: inherit; 17 | margin: 5px; 18 | border-color: gainsboro; 19 | color: black; 20 | } 21 | 22 | .searchPage__info > button:hover { 23 | border-color: grey; 24 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./App.css"; 3 | import Footer from "./Footer"; 4 | import Header from "./Header"; 5 | import Home from "./Home"; 6 | import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; 7 | import SearchPage from "./SearchPage"; 8 | 9 | function App() { 10 | return ( 11 |
12 | 13 |
14 | 15 | 16 | } /> 17 | } /> 18 | 19 | 20 |
21 | 22 |
23 | ); 24 | } 25 | 26 | export default App; 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Airbnb-Clone 2 | 3 | Get out and stretch your imagination! 4 | 5 | Click demo to try it by yourself! 6 | 7 | You can select a date by clicking Search Dates. You can also specify the number of people. In addition, you can open the "Search Page" by clicking the "Explore Nearby" and "Search Airbnb" buttons. 8 | 9 | ## Airbnb-Clone Demo Link 10 | 11 | You can view the site here 12 | [Click Me](https://airbnb-clone-ozngrsc.web.app/) 13 | 14 | ## Topics 15 | 16 | - ReactJS 17 | - JavaScript 18 | - React Router 19 | - React Icons 20 | - React Date Picker 21 | - Material UI 22 | - Flexbox 23 | - Responsive Design (for PC and Tablet) 24 | - Deploy the App Live on Firebase 25 | 26 | 27 | 28 | ## Author 29 | 30 | Ozan Gürsucu (ozngrsc) 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/Card.css: -------------------------------------------------------------------------------- 1 | .card { 2 | margin: 10px; 3 | border: 0px solid black; 4 | border-radius: 10px; 5 | overflow: hidden; 6 | box-shadow: 0px 6px 18px -9px rgba(0, 0, 0, 0.75); 7 | transition: transform 100ms ease-in; 8 | cursor: pointer; 9 | } 10 | 11 | .card:hover { 12 | transform: scale(1.07); 13 | } 14 | 15 | .card > img { 16 | object-fit: fill; 17 | min-width: 300px; 18 | min-height: 200px; 19 | width: 100%; 20 | } 21 | 22 | .card__info { 23 | margin-top: -9px; 24 | border-radius: 10px; 25 | padding: 20px; 26 | padding-top: 20px; 27 | border: 1; 28 | } 29 | 30 | .card__info > h2 { 31 | font-size: 18px; 32 | font-weight: 600; 33 | } 34 | 35 | .card__info > h4 { 36 | font-size: 14px; 37 | font-weight: 300; 38 | margin-top: 8px; 39 | margin-bottom: 8px; 40 | } -------------------------------------------------------------------------------- /src/Header.css: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | position: sticky; 6 | top: 0; 7 | background-color: white; 8 | z-index: 100; 9 | width: 100%; 10 | margin-top: 30px; 11 | margin-bottom: 30px; 12 | } 13 | 14 | .header__icon { 15 | object-fit: contain; 16 | height: 100px; 17 | margin-left: 20px; 18 | padding: 10px; 19 | height: 30px; 20 | } 21 | 22 | .header__center { 23 | display: flex; 24 | flex: 1; 25 | align-items: center; 26 | max-width: fit-content; 27 | padding: 10px; 28 | height: 30px; 29 | border: 1px solid lightgray; 30 | border-radius: 999px; 31 | } 32 | 33 | .header__center > input { 34 | border: none; 35 | padding: 10px; 36 | outline-width: 0; 37 | /* width: 250px; */ 38 | } 39 | 40 | .header__right { 41 | display: flex; 42 | align-items: center; 43 | justify-content: space-between; 44 | width: 15vw; 45 | margin-right: 80px; 46 | } -------------------------------------------------------------------------------- /src/Header.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./Header.css"; 3 | import SearchIcon from "@mui/icons-material/Search"; 4 | import LanguageIcon from "@mui/icons-material/Language"; 5 | import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; 6 | import AccountCircleIcon from "@mui/icons-material/AccountCircle"; 7 | import { Link } from "react-router-dom"; 8 | 9 | function Header() { 10 | return ( 11 |
12 | 13 | 18 | 19 |
20 | 21 | 22 |
23 | 24 |
25 |

Become a host

26 | 27 | 28 | 29 |
30 |
31 | ); 32 | } 33 | 34 | export default Header; 35 | -------------------------------------------------------------------------------- /src/Search.css: -------------------------------------------------------------------------------- 1 | .search { 2 | position: absolute; 3 | top: 35px; 4 | left: 25%; 5 | width: 100vw; 6 | } 7 | 8 | .search > h2 { 9 | display: flex; 10 | align-items: center; 11 | justify-content: space-between; 12 | width: 559px; 13 | padding: 10px; 14 | background-color: white; 15 | position: absolute; 16 | left: 0; 17 | top: 380px; 18 | } 19 | 20 | .search > input { 21 | width: 539px; 22 | padding: 20px; 23 | position: absolute; 24 | left: 0; 25 | height: 30px; 26 | top: 420px; 27 | border: none; 28 | margin-top: 2px; 29 | 30 | } 31 | 32 | .search > input:focus { 33 | outline-width: 0; 34 | } 35 | 36 | .searchAirbnb__button { 37 | position: absolute !important; 38 | left: 0 !important; 39 | top: 490px !important; 40 | text-transform: inherit !important; 41 | background-color: #ff7779 !important; 42 | color: white !important; 43 | width: 579px !important; 44 | } 45 | 46 | .searchAirbnb__button:hover { 47 | background-color: white !important; 48 | color: #ff7779 !important; 49 | } -------------------------------------------------------------------------------- /src/Banner.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import "./Banner.css"; 3 | import { Button } from "@mui/material"; 4 | import Search from "./Search"; 5 | import { Link } from "react-router-dom"; 6 | 7 | function Banner() { 8 | const [showSearch, setShowSearch] = useState(false); 9 | 10 | return ( 11 |
12 |
13 | {showSearch && } 14 | 21 |
22 |
23 |

Get out and stretch your imagination

24 |
25 | Plan a different kind of getaway to uncover the hidden gems near you. 26 |
27 | 28 | 31 | 32 |
33 |
34 | ); 35 | } 36 | 37 | export default Banner; 38 | -------------------------------------------------------------------------------- /src/SearchResult.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./SearchResult.css"; 3 | import FavoriteBorderIcon from "@mui/icons-material/FavoriteBorder"; 4 | import StarIcon from "@mui/icons-material/Star"; 5 | 6 | function SearchResult({ 7 | img, 8 | location, 9 | title, 10 | description, 11 | star, 12 | price, 13 | total, 14 | }) { 15 | return ( 16 |
17 | 18 | 19 |
20 |
21 |

{location}

22 |

{title}

23 |

____

24 |

{description}

25 |
26 |
27 |
28 | 29 |

30 | {star} 31 |

32 |
33 |
34 |

{price}

35 |

{total}

36 |
37 |
38 |
39 |
40 | ); 41 | } 42 | 43 | export default SearchResult; 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "airbnb-clone", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@emotion/react": "^11.9.0", 7 | "@emotion/styled": "^11.8.1", 8 | "@mui/icons-material": "^5.6.2", 9 | "@mui/material": "^5.6.3", 10 | "@testing-library/jest-dom": "^5.16.4", 11 | "@testing-library/react": "^13.1.1", 12 | "@testing-library/user-event": "^13.5.0", 13 | "date-fns": "^2.28.0", 14 | "firebase": "^9.7.0", 15 | "react": "^18.0.0", 16 | "react-date-range": "^1.4.0", 17 | "react-dom": "^18.0.0", 18 | "react-router-dom": "^6.3.0", 19 | "react-scripts": "5.0.1", 20 | "web-vitals": "^2.1.4" 21 | }, 22 | "scripts": { 23 | "start": "react-scripts start", 24 | "build": "react-scripts build", 25 | "test": "react-scripts test", 26 | "eject": "react-scripts eject" 27 | }, 28 | "eslintConfig": { 29 | "extends": [ 30 | "react-app", 31 | "react-app/jest" 32 | ] 33 | }, 34 | "browserslist": { 35 | "production": [ 36 | ">0.2%", 37 | "not dead", 38 | "not op_mini all" 39 | ], 40 | "development": [ 41 | "last 1 chrome version", 42 | "last 1 firefox version", 43 | "last 1 safari version" 44 | ] 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/SearchResult.css: -------------------------------------------------------------------------------- 1 | .searchResult { 2 | display: flex; 3 | position: relative; 4 | margin: 20px; 5 | padding: 20px; 6 | border-bottom: 1px solid lightgray; 7 | opacity: 1; 8 | cursor: pointer; 9 | } 10 | 11 | .searchResult:hover { 12 | opacity: 0.8; 13 | } 14 | 15 | .searchResult > img { 16 | height: 200px; 17 | width: 350px; 18 | border-radius: 10px; 19 | overflow: hidden; 20 | } 21 | 22 | .searchResult__info { 23 | display: flex; 24 | flex-direction: column; 25 | justify-content: space-between; 26 | padding-left: 20px; 27 | } 28 | 29 | .searchResult__heart { 30 | position: absolute; 31 | top: 20px; 32 | right: 40px; 33 | } 34 | 35 | .searchResult__infoTop { 36 | width: 40vw; 37 | } 38 | 39 | .searchResult__infoTop > h3 { 40 | font-weight: 300; 41 | margin-top: 10px; 42 | } 43 | 44 | .searchResult__infoTop > p { 45 | margin-top: 10px; 46 | font-size: 13px; 47 | color: gray; 48 | } 49 | 50 | .searchResult__infoBottom { 51 | display: flex; 52 | justify-content: space-between; 53 | } 54 | 55 | .searchResult__star { 56 | color: red; 57 | } 58 | 59 | .searchResult__stars { 60 | display: flex; 61 | align-items: center; 62 | } 63 | 64 | .searchResult__price > p { 65 | text-align: right; 66 | } 67 | 68 | .searchResult__price { 69 | position: absolute; 70 | bottom: 20px; 71 | right: 30px; 72 | } -------------------------------------------------------------------------------- /src/Banner.css: -------------------------------------------------------------------------------- 1 | .banner { 2 | background: url(https://media.cntraveller.com/photos/611be85fab1fb48d7ae603af/master/w_1200,c_limit/2brighton-airbnb-mar21-pr.jpg); 3 | height: 50vh; 4 | position: relative; 5 | } 6 | 7 | .banner__info { 8 | background-color: black; 9 | color: white; 10 | padding-top: 25vh; 11 | padding-left: 50px; 12 | padding-right: 50px; 13 | padding-bottom: 40px; 14 | width: 300px; 15 | } 16 | 17 | .banner__search { 18 | display: flex; 19 | flex-direction: column; 20 | } 21 | 22 | .banner__searchButton { 23 | background-color: white !important; 24 | font-weight: 900 !important; 25 | text-transform: inherit !important; 26 | color: #ff7779 !important; 27 | border-color: gainsboro !important; 28 | } 29 | 30 | /* .banner__searchButton:hover { 31 | background-color: #ff7779 !important; 32 | color: white !important; 33 | } 34 | */ 35 | .banner__nearbyButton { 36 | background-color: #ff7779 !important; 37 | color: white !important; 38 | text-transform: inherit !important; 39 | margin-top: 20px !important; 40 | font-weight: 600 !important; 41 | border-color: transparent !important; 42 | } 43 | 44 | .banner__nearbyButton:hover { 45 | border-color: white !important; 46 | background-color: white !important; 47 | color: #ff7779 !important; 48 | } 49 | 50 | .nearby__link { 51 | text-decoration: none; 52 | } 53 | 54 | .banner__info > h5 { 55 | margin-top: 10px; 56 | } -------------------------------------------------------------------------------- /src/Search.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./Search.css"; 3 | import "react-date-range/dist/styles.css"; /* main style file */ 4 | import "react-date-range/dist/theme/default.css"; /* theme css file */ 5 | import { DateRangePicker } from "react-date-range"; 6 | import { useState } from "react"; 7 | import PeopleIcon from "@mui/icons-material/People"; 8 | import { Button } from "@mui/material"; 9 | import { useNavigate } from "react-router-dom"; 10 | import { Link } from "react-router-dom"; 11 | 12 | /* Date Picker Component */ 13 | 14 | function Search() { 15 | const navigate = useNavigate(); 16 | const [startDate, setStartDate] = useState(new Date()); 17 | const [endDate, setEndDate] = useState(new Date()); 18 | 19 | const selectionRange = { 20 | startDate: startDate, 21 | endDate: endDate, 22 | key: "selection", 23 | }; 24 | 25 | function handleSelect(ranges) { 26 | setStartDate(ranges.selection.startDate); 27 | setEndDate(ranges.selection.endDate); 28 | } 29 | 30 | return ( 31 |
32 | 33 | 34 |

35 | Number of guests 36 | 37 |

38 | 39 | 40 | 41 | 42 |
43 | ); 44 | } 45 | 46 | export default Search; 47 | -------------------------------------------------------------------------------- /.firebase/hosting.YnVpbGQ.cache: -------------------------------------------------------------------------------- 1 | asset-manifest.json,1651238860273,a9026c3feb677f694d926be6771622a53d25cf13608908304836008125eace41 2 | favicon.ico,1650965612414,eae62e993eb980ec8a25058c39d5a51feab118bd2100c4deebb2a9c158ec11f9 3 | index.html,1651238860273,32fa830b484cfd1e56ce65a759abc5b50538a32117cacd3b5b0ac01a7174fdec 4 | robots.txt,1650965618251,bfe106a3fb878dc83461c86818bf74fc1bdc7f28538ba613cd3e775516ce8b49 5 | manifest.json,1650965615844,aff3449bdc238776f5d6d967f19ec491b36aed5fb7f23ccff6500736fd58494a 6 | logo192.png,1650965617561,3ee59515172ee198f3be375979df15ac5345183e656720a381b8872b2a39dc8b 7 | logo512.png,1650965617839,ee7e2f3fdb8209c4b6fd7bef6ba50d1b9dba30a25bb5c3126df057e1cb6f5331 8 | static/js/787.9239aff2.chunk.js,1651238860284,422f8cfdb17f5e02046aeb46831e45ee3313b97474243543f5c1fda23bf00e51 9 | static/css/main.548e5b34.css,1651238860283,da12f47235b9168a86e1d66ee09960252a723e8d49dd557f8f8d9efee10c6667 10 | static/css/main.548e5b34.css.map,1651238860284,814b4c4ddfd982453398c50713ca4b3c64401b3521c0c0596eb77c48e10f4c47 11 | static/js/787.9239aff2.chunk.js.map,1651238860284,80b180ae3aac3230077a4457bd293d1858ca161aebcc41707094233f05e9bc10 12 | static/js/main.2c7ac41d.js.LICENSE.txt,1651238860284,a372c1495265b2203107397e2decfa4baf5419fee9d35a3db5e137519fbf9c7d 13 | static/js/main.2c7ac41d.js,1651238860284,1081f5b1da40e1d44db66e3fc71d1d217bf7867cbcd8add3acb2728870d84754 14 | static/js/main.2c7ac41d.js.map,1651238860284,76328421ad12f1c890a30e2782e390ad24c8f5d939c0bf897440ace43b48fc14 15 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/Home.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Banner from "./Banner"; 3 | import Card from "./Card"; 4 | import "./Home.css"; 5 | 6 | function Home() { 7 | return ( 8 |
9 | 10 | 11 |
12 | 17 | 22 | 27 |
28 |
29 | 35 | 41 | 47 |
48 |
49 | ); 50 | } 51 | 52 | export default Home; 53 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/SearchPage.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./SearchPage.css"; 3 | import { Button } from "@mui/material"; 4 | import SearchResult from "./SearchResult"; 5 | 6 | function SearchPage() { 7 | return ( 8 |
9 |
10 |

62 stays · 26 august to 30 august · 2 guest

11 |

Stays nearby

12 | 13 | 14 | 15 | 16 | 17 |
18 | 27 | 28 | 37 | 46 | 55 | 64 | 73 |
74 | ); 75 | } 76 | 77 | export default SearchPage; 78 | --------------------------------------------------------------------------------