DEV Community

Cover image for Let's build Airbnb Home page with Nextjs and ChakraUI - Part 1
Muhammad  Ahmad
Muhammad Ahmad

Posted on • Edited on

11 9

Let's build Airbnb Home page with Nextjs and ChakraUI - Part 1

1.Create a Nextjs app

yarn create next-app --typescript
Enter fullscreen mode Exit fullscreen mode

2.Install Chakra UI

yarn add @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^4
Enter fullscreen mode Exit fullscreen mode

3.Create components/layout/header.tsx

import { Box, Link, Heading, Flex, Text, Button } from "@chakra-ui/react";

const Header = () => {
  return (
    <Box
      position="relative"
      bgImage="url('/airbnb-home.jpg')"
      bgPosition="center"
      bgRepeat="no-repeat"
      bgSize="cover"
      p={6}
    >
      <Link to="/">
        <Heading as="h1" size="4xl" isTruncated>
          <Box
            as="span"
            height="1px"
            width="1px"
            clip="rect(1px, 1px, 1px, 1px)"
            position="absolute !important"
            overflow="hidden"
          >
            AirBnb
          </Box>
          <svg
            viewBox="0 0 1000 1000"
            role="presentation"
            aria-hidden="true"
            focusable="false"
            style={{
              height: "32px",
              width: "32px",
              display: "block",
              fill: "#ffffff"
            }}
          >
            <title>AirBnb</title>
            <path d="m499.3 736.7c-51-64-81-120.1-91-168.1-10-39-6-70 11-93 18-27 45-40 80-40s62 13 80 40c17 23 21 54 11 93-11 49-41 105-91 168.1zm362.2 43c-7 47-39 86-83 105-85 37-169.1-22-241.1-102 119.1-149.1 141.1-265.1 90-340.2-30-43-73-64-128.1-64-111 0-172.1 94-148.1 203.1 14 59 51 126.1 110 201.1-37 41-72 70-103 88-24 13-47 21-69 23-101 15-180.1-83-144.1-184.1 5-13 15-37 32-74l1-2c55-120.1 122.1-256.1 199.1-407.2l2-5 22-42c17-31 24-45 51-62 13-8 29-12 47-12 36 0 64 21 76 38 6 9 13 21 22 36l21 41 3 6c77 151.1 144.1 287.1 199.1 407.2l1 1 20 46 12 29c9.2 23.1 11.2 46.1 8.2 70.1zm46-90.1c-7-22-19-48-34-79v-1c-71-151.1-137.1-287.1-200.1-409.2l-4-6c-45-92-77-147.1-170.1-147.1-92 0-131.1 64-171.1 147.1l-3 6c-63 122.1-129.1 258.1-200.1 409.2v2l-21 46c-8 19-12 29-13 32-51 140.1 54 263.1 181.1 263.1 1 0 5 0 10-1h14c66-8 134.1-50 203.1-125.1 69 75 137.1 117.1 203.1 125.1h14c5 1 9 1 10 1 127.1.1 232.1-123 181.1-263.1z"></path>
          </svg>
        </Heading>
      </Link>
      <Box margin="0 auto" maxW="64rem" py={{ base: "1rem", lg: "8rem" }}>
        <Heading
          as="h2"
          fontSize={{ base: "2.25rem", lg: "3rem" }}
          mb="4"
        >
          Book a trip. Host travels. All on Airbnb.
        </Heading>
        <Flex
          justify="start"
          flexDirection={{ base: "column", lg: "row" }}
          align-items={"center"}
          maxWidth="42rem"
          wrap
          marginX={{ base: "auto", lg: "0" }}
        >
          <Box
            pr={{ base: 0, lg: 5 }}
            width={{ base: "100%", lg: "50%" }}
            mb={{ base: "1rem", lg: "0" }}
          >
            <Text mb="0.5rem">Find places to stay and things to do</Text>
            <Button
              as={Link}
              bg="white"
              color="black"
              fontWeight="bold"
              px={"2.5rem"}
              py={"1.5rem"}
              width="full"
              border="2px solid white"
              _hover={{ bg: "gray.300", textDecoration: "none" }}
            >
              Explore
            </Button>
          </Box>
          <Box
            pl={{ base: 0, lg: 5 }}
            width={{ base: "100%", lg: "50%" }}
          >
            <Text mb="0.5rem">Earn money from your extra space</Text>
            <Button
              as={Link}
              bg="transparent"
              color="white"
              fontWeight="bold"
              px={"2.5rem"}
              py={"1.5rem"}
              width="full"
              border="2px solid white"
              _hover={{ bg: "gray.800", textDecoration: "none" }}
            >
              Host
            </Button>
          </Box>
        </Flex>
      </Box>
    </Box>
  );
};

export default Header;
Enter fullscreen mode Exit fullscreen mode

4.Create components/layout/layout.tsx

import { Fragment } from "react";
import { Box } from "@chakra-ui/react";
import Header from "./header";

function Layout(props) {
  return (
    <Fragment>
      <Header />
      <Box textAlign="center" fontSize="xl" w={"100%"}>
        <Box pt={10} pb={10}>
          {props.children}
        </Box>
      </Box>
    </Fragment>
  );
}

export default Layout;
Enter fullscreen mode Exit fullscreen mode

5.Update pages/_app.tsx with ChakraProvider and Layout

import { AppProps } from "next/app";
import { ChakraProvider } from "@chakra-ui/react";
import Layout from "../components/layout/layout";

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <ChakraProvider>
      <Layout>
        <Component {...pageProps} />
      </Layout>
    </ChakraProvider>
  );
}
export default MyApp;
Enter fullscreen mode Exit fullscreen mode

Result
Header

Github Repo:
Chakra-airbnb

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay