From 30492cc1432828358d64f0605681df96225abdbe Mon Sep 17 00:00:00 2001 From: hermansemykozov Date: Mon, 17 Feb 2020 03:39:10 +0200 Subject: [PATCH 1/5] CHANGE: remove antd as dependency and use pure html/css for styling --- package.json | 1 - src/components/app/header/header.module.css | 26 +- src/components/app/header/index.js | 84 +++--- .../app/header/lang-switcher/index.js | 26 ++ .../lang-switcher/lang-switcher.module.css | 36 +++ src/components/app/hero/hero.module.css | 23 +- src/components/app/hero/index.js | 11 +- src/components/app/index.js | 10 +- .../basket/basket-item/basket-item.module.css | 57 +++- .../basket-item/icons/squared-minus.svg | 1 + .../basket/basket-item/icons/squared-plus.svg | 1 + src/components/basket/basket-item/index.js | 43 +-- .../basket/basket-row/basket-row.module.css | 3 - src/components/basket/basket-row/index.js | 21 +- src/components/basket/basket.module.css | 15 +- src/components/basket/index.js | 17 +- src/components/button/button.module.css | 64 +++++ src/components/button/index.js | 47 ++++ src/components/card/card.module.css | 13 + src/components/card/index.js | 12 + src/components/container/container.module.css | 6 + src/components/container/index.js | 7 + src/components/content/index.js | 9 +- src/components/loader/index.js | 8 +- src/components/loader/loader.module.css | 51 ++++ src/components/menu/index.js | 32 +-- src/components/menu/menu.module.css | 29 ++ .../pages/checkout/checkout.module.css | 28 ++ src/components/pages/checkout/index.js | 76 +++--- src/components/pages/error/index.js | 14 +- src/components/pages/not-found/index.js | 20 +- src/components/pages/restaurants/index.js | 1 - src/components/pages/thank-you/index.js | 22 +- src/components/product/icons/minus.svg | 1 + src/components/product/icons/plus.svg | 1 + src/components/product/product.component.js | 40 ++- src/components/product/product.module.css | 92 ++++--- src/components/rate/icons/star-empty.svg | 3 + src/components/rate/icons/star.svg | 3 + src/components/rate/index.js | 26 +- src/components/rate/rate.module.css | 18 +- src/components/rate/star-icon.js | 16 ++ src/components/restaurant/index.js | 106 ++++++-- .../restaurant/restaurant.module.css | 4 + src/components/restaurants-index/index.js | 86 +++--- .../restaurants-index/restaurant-item.js | 51 ++-- .../restaurant-item.module.css | 14 +- src/components/reviews/review-form/index.js | 58 ++-- .../review-form/review-form.module.css | 51 +++- src/components/reviews/review/index.js | 26 +- .../reviews/review/review.module.css | 39 ++- src/components/tabs/index.js | 45 ++++ src/components/tabs/tabs.module.css | 0 src/hooks/use-tabs.js | 14 + src/index.css | 253 +++++++++++------- 55 files changed, 1174 insertions(+), 587 deletions(-) create mode 100644 src/components/app/header/lang-switcher/index.js create mode 100644 src/components/app/header/lang-switcher/lang-switcher.module.css create mode 100644 src/components/basket/basket-item/icons/squared-minus.svg create mode 100644 src/components/basket/basket-item/icons/squared-plus.svg delete mode 100644 src/components/basket/basket-row/basket-row.module.css create mode 100644 src/components/button/button.module.css create mode 100644 src/components/button/index.js create mode 100644 src/components/card/card.module.css create mode 100644 src/components/card/index.js create mode 100644 src/components/container/container.module.css create mode 100644 src/components/container/index.js create mode 100644 src/components/menu/menu.module.css create mode 100644 src/components/product/icons/minus.svg create mode 100644 src/components/product/icons/plus.svg create mode 100644 src/components/rate/icons/star-empty.svg create mode 100644 src/components/rate/icons/star.svg create mode 100644 src/components/rate/star-icon.js create mode 100644 src/components/tabs/index.js create mode 100644 src/components/tabs/tabs.module.css create mode 100644 src/hooks/use-tabs.js diff --git a/package.json b/package.json index 03ba780..0280ab5 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "private": true, "proxy": "http://localhost:3001/", "dependencies": { - "antd": "^3.23.1", "classnames": "^2.2.6", "connected-react-router": "^6.5.2", "history": "^4.10.1", diff --git a/src/components/app/header/header.module.css b/src/components/app/header/header.module.css index 6df55d4..26ad699 100644 --- a/src/components/app/header/header.module.css +++ b/src/components/app/header/header.module.css @@ -1,22 +1,34 @@ .header { height: 60px; - background: #1d1d1d; - padding: 14px; + background: var(--black); + padding: 16px; text-align: center; } +.headerNav { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + position: relative; +} + .goBackBtn { padding: 0; border: none; font-size: 24px; - color: #fff; - font-weight: 400 !important; + color: var(--white); + font-weight: 400; cursor: pointer; + display: flex !important; + flex-direction: row; + align-items: center; } .goBackBtn > span { color: #fff; text-transform: none; + margin-left: 4px; } .goBackBtn:hover, @@ -24,12 +36,12 @@ opacity: 8; } -.langSwitcher .langSwitcherBtn:not(.ant-radio-button-wrapper-disabled)::before { - background-color: #d9d9d9 !important; +.goBackBtn > svg { + margin-bottom: -3px; } .goBackBtnText { - display: none !important; + display: none; } .logo { diff --git a/src/components/app/header/index.js b/src/components/app/header/index.js index 09ee2f6..cbd8804 100644 --- a/src/components/app/header/index.js +++ b/src/components/app/header/index.js @@ -4,10 +4,25 @@ import { useHistory, useLocation } from "react-router-dom"; import Logo from "./logo"; import styles from "./header.module.css"; import { Link } from "react-router-dom"; -import { Button, Icon, Col, Row, Radio } from "antd"; +import { Button } from "../../button"; +import { Container } from "../../container"; +import { LangSwitcher } from "./lang-switcher"; import i18n from "../../../contexts/i18n-context"; +const ArrowIcon = () => ( + +); + function Header() { const { t, language, setLanguage } = useContext(i18n); const history = useHistory(); @@ -16,47 +31,34 @@ function Header() { return (
- - - - - {showBackBtn && ( - - )} - - - - - - - - { - setLanguage(e.target.value); - }} + +
+
+ {showBackBtn && ( + + )} +
+
+ + + +
+ { + setLanguage(e.target.value); + }} + /> +
+
); } diff --git a/src/components/app/header/lang-switcher/index.js b/src/components/app/header/lang-switcher/index.js new file mode 100644 index 0000000..64fcc28 --- /dev/null +++ b/src/components/app/header/lang-switcher/index.js @@ -0,0 +1,26 @@ +import React from "react"; + +import styles from "./lang-switcher.module.css"; + +export const LangSwitcher = ({ lang, onChange }) => ( +
+ + +
+); diff --git a/src/components/app/header/lang-switcher/lang-switcher.module.css b/src/components/app/header/lang-switcher/lang-switcher.module.css new file mode 100644 index 0000000..cf25a93 --- /dev/null +++ b/src/components/app/header/lang-switcher/lang-switcher.module.css @@ -0,0 +1,36 @@ +.langSwitcher { + position: relative; +} + +.langSwitcherBtn { + color: var(--white); + position: relative; + cursor: pointer; +} + +.langSwitcherBtn:first-child { + margin-right: 1px; +} + +.langSwitcherBtn:first-child:after { + content: ""; + position: absolute; + left: 100%; + top: 0; + height: 100%; + width: 1px; + background-color: var(--grey); +} + +.langSwitcherBtn > input { + display: none; +} + +.langSwitcherBtn > input:checked ~ span { + color: var(--yellow); +} + +.langSwitcherBtn > span { + display: inline-block; + padding: 3px 6px; +} diff --git a/src/components/app/hero/hero.module.css b/src/components/app/hero/hero.module.css index 02f1e5d..ae0c600 100644 --- a/src/components/app/hero/hero.module.css +++ b/src/components/app/hero/hero.module.css @@ -30,24 +30,19 @@ justify-content: center; flex-direction: column; z-index: 2; + color: var(--white); } .heading { - color: #fff !important; - margin: 0 !important; - font-weight: 700 !important; - font-size: 36px !important; + margin: 0; + font-size: 36px; + font-weight: 900; } .description { - color: #fff; - font-size: 16px !important; - line-height: 24px !important; - margin: 0 0 8px !important; -} - -.colorWhite { - color: #fff; + font-size: 16px; + line-height: 24px; + margin: 0 0 14px; } @media all and (max-width: 992px) { @@ -64,7 +59,7 @@ } .heading { - font-size: 26px !important; - line-height: 31px !important; + font-size: 26px; + line-height: 31px; } } diff --git a/src/components/app/hero/index.js b/src/components/app/hero/index.js index 9e9b576..ba4647d 100644 --- a/src/components/app/hero/index.js +++ b/src/components/app/hero/index.js @@ -1,20 +1,15 @@ import React from "react"; import styles from "./hero.module.css"; -import { Typography } from "antd"; function Hero({ img, heading, description, children }) { return (
{img && hero-banner}
- - {heading} - - - {description} - -
{children}
+

{heading}

+

{description}

+
{children}
); diff --git a/src/components/app/index.js b/src/components/app/index.js index 92838cf..2af57db 100644 --- a/src/components/app/index.js +++ b/src/components/app/index.js @@ -1,9 +1,9 @@ -import { Layout, Typography } from "antd"; +import { Layout } from "antd"; import React, { useContext, useState } from "react"; import Header from "./header"; import CheckoutPage from "../pages/checkout"; -import { Redirect, Route, Switch } from "react-router-dom"; +import { Route, Switch } from "react-router-dom"; import { Provider as UserProvider } from "../../contexts/user-context"; import i18n from "../../contexts/i18n-context"; import ThankYouPage from "../pages/thank-you"; @@ -26,11 +26,7 @@ function App() { ( - - {t("sign_in_page")} - - )} + render={() =>

{t("sign_in_page")}

} /> } /> diff --git a/src/components/basket/basket-item/basket-item.module.css b/src/components/basket/basket-item/basket-item.module.css index 8e5d1a9..4b09808 100644 --- a/src/components/basket/basket-item/basket-item.module.css +++ b/src/components/basket/basket-item/basket-item.module.css @@ -1,19 +1,37 @@ .basketItem { margin-bottom: 5px; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} + +.basketItem > * { + flex: 1 0 50%; +} + +.basketItem > *:last-child { + text-align: right; +} + +.basketItem p { + margin-bottom: 0; } .counter { - display: inline-block; + display: inline-flex; + align-items: center; } .count { - color: #1d1d1d !important; + color: var(--black); } -.price { +.basketItem .price { width: 40px; text-align: right; display: inline-block; + margin-top: -1px; } .count:not(:last-child) { @@ -22,16 +40,31 @@ .button { display: inline-block; - border-color: #8e8e8e !important; - background-color: #8e8e8e !important; - padding: 1px 3px !important; + padding: 0; margin: 3px; - color: #fff !important; + cursor: pointer; +} + +.button > img { + vertical-align: bottom; +} + +.name, +.name span { + color: var(--black); + line-height: 1.2; + font-size: 14px; +} + +.name > a { + display: inline-block; + text-decoration: none; + color: var(--black); } -.button:hover, -.button:focus { - border-color: #8e8e8e !important; - background-color: #8e8e8e !important; - color: rgba(255, 255, 255, 0.5) !important; +.info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; } diff --git a/src/components/basket/basket-item/icons/squared-minus.svg b/src/components/basket/basket-item/icons/squared-minus.svg new file mode 100644 index 0000000..6aac3af --- /dev/null +++ b/src/components/basket/basket-item/icons/squared-minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/basket/basket-item/icons/squared-plus.svg b/src/components/basket/basket-item/icons/squared-plus.svg new file mode 100644 index 0000000..390eb09 --- /dev/null +++ b/src/components/basket/basket-item/icons/squared-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/basket/basket-item/index.js b/src/components/basket/basket-item/index.js index e4c49f2..b0c3d13 100644 --- a/src/components/basket/basket-item/index.js +++ b/src/components/basket/basket-item/index.js @@ -1,42 +1,47 @@ import React from "react"; import cx from "classnames"; -import { Button, Col, Row, Typography } from "antd"; import { increment, decrement } from "../../../redux/ac"; +import { Button } from "../../button"; import styles from "./basket-item.module.css"; import { connect } from "react-redux"; import { Link } from "react-router-dom"; +import MinusIcon from "./icons/squared-minus.svg"; +import PlusIcon from "./icons/squared-plus.svg"; + function BasketItem({ product, amount, restaurant, increment, decrement }) { return ( - - +
+
- {product.name} + {product.name} - - +
+
+ {amount}
- +

${product.price * amount} - - - +

+
+
); } diff --git a/src/components/basket/basket-row/basket-row.module.css b/src/components/basket/basket-row/basket-row.module.css deleted file mode 100644 index 51ef4d6..0000000 --- a/src/components/basket/basket-row/basket-row.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.basketRow { - margin-bottom: 5px; -} diff --git a/src/components/basket/basket-row/index.js b/src/components/basket/basket-row/index.js index 597891e..e6a62a2 100644 --- a/src/components/basket/basket-row/index.js +++ b/src/components/basket/basket-row/index.js @@ -1,18 +1,17 @@ -import { Col, Row, Typography } from "antd"; import React from "react"; - -import styles from "./basket-row.module.css"; +import cx from "classnames"; +import styles from "../basket-item/basket-item.module.css"; function BasketRow({ align = "top", leftContent, rightContent, bold = false }) { return ( - - - {leftContent} - - - {rightContent} - - +
+
+

{leftContent}

+
+
+

{rightContent}

+
+
); } diff --git a/src/components/basket/basket.module.css b/src/components/basket/basket.module.css index 1dc3c06..7c5f99d 100644 --- a/src/components/basket/basket.module.css +++ b/src/components/basket/basket.module.css @@ -1,16 +1,21 @@ .basket { padding: 13px 16px 20px; - background-color: #fff0db; + background-color: var(--pink); +} + +.basket a { + text-decoration: none; } .hr { - margin: 14px 0 !important; + margin: 14px 0; } .title { text-align: center; - margin-bottom: 20px !important; - font-size: 18px !important; + margin: 20px 0 16px; + font-size: 18px; + font-weight: 600; } .lastRow { @@ -20,8 +25,6 @@ .button { margin-top: 22px; font-size: 18px; - background-color: #e4661e !important; - border-color: #e4661e !important; } @media all and (max-width: 767px) { diff --git a/src/components/basket/index.js b/src/components/basket/index.js index 4485137..30fd59a 100644 --- a/src/components/basket/index.js +++ b/src/components/basket/index.js @@ -1,4 +1,3 @@ -import Button from "antd/es/button"; import cx from "classnames"; import React, { useContext } from "react"; import { Link } from "react-router-dom"; @@ -7,6 +6,7 @@ import { TransitionGroup, CSSTransition } from "react-transition-group"; import styles from "./basket.module.css"; import BasketRow from "./basket-row"; import BasketItem from "./basket-item"; +import { Button } from "../button"; import { connect } from "react-redux"; import { orderedProductsSelector, @@ -14,7 +14,6 @@ import { } from "../../redux/selectors"; import "./basket.css"; import i18n from "../../contexts/i18n-context"; -import { Typography } from "antd"; function Basket({ title = "Basket", @@ -27,22 +26,14 @@ function Basket({ if (!total) { return (
- - {t("select_meal")} - +

{t("select_meal")}

); } return (
- - {t("basket")} - +

{t("basket")}

{orderProducts.map(({ product, amount, restaurant }) => ( @@ -62,7 +53,7 @@ function Basket({ {!hideButton && ( - diff --git a/src/components/button/button.module.css b/src/components/button/button.module.css new file mode 100644 index 0000000..e3d3009 --- /dev/null +++ b/src/components/button/button.module.css @@ -0,0 +1,64 @@ +.button { + text-decoration: none; + overflow: hidden; + border-radius: 4px; + font-weight: 700; + font-size: 18px; + line-height: 28px; + display: inline-block; + outline: none; + box-shadow: none; + transition: 0.2s all; + cursor: pointer; + padding: 11px 20px; + height: 50px; + text-transform: uppercase; +} + +.button:focus, +.button:hover, +.button:active, +.button.active { + opacity: 0.8; +} + +.button.primary { + background-color: var(--orange); + border: 1px solid var(--orange); + color: var(--white); +} + +.button.outline { + background-color: transparent; + color: var(--orange); + border: 1px solid var(--orange); +} + +.button.outline:focus, +.button.outline:hover, +.button.outline:active, +.button.outline.active { + opacity: 1; + background-color: var(--orange); + color: var(--orange); +} + +.unstyled { + box-shadow: none; + border: none; + outline: none; + background-color: transparent; + display: inline-block; +} + +.button.sm { + font-size: 16px; + line-height: 24px; + height: 34px; + padding: 5px 20px; +} + +.button.block { + display: block; + width: 100%; +} diff --git a/src/components/button/index.js b/src/components/button/index.js new file mode 100644 index 0000000..decee5b --- /dev/null +++ b/src/components/button/index.js @@ -0,0 +1,47 @@ +import React from "react"; +import cx from "classnames"; + +import styles from "./button.module.css"; + +export const Button = ({ + type = "primary", + buttonType = "button", + size, + block, + className, + handleClick, + children +}) => + type === "unstyled" ? ( + + ) : ( + + ); diff --git a/src/components/card/card.module.css b/src/components/card/card.module.css new file mode 100644 index 0000000..43b9aa6 --- /dev/null +++ b/src/components/card/card.module.css @@ -0,0 +1,13 @@ +.card { + padding: 0; + border: 1px solid var(--grey); + background-color: var(--white); + color: var(--black); + text-decoration: none; + outline: none; + transition: 0.2s all; +} + +.card.hoverable:hover { + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); +} diff --git a/src/components/card/index.js b/src/components/card/index.js new file mode 100644 index 0000000..f8aed2f --- /dev/null +++ b/src/components/card/index.js @@ -0,0 +1,12 @@ +import React from "react"; +import cx from "classnames"; + +import styles from "./card.module.css"; + +export const Card = ({ className, hoverable, children }) => ( +
+ {children} +
+); diff --git a/src/components/container/container.module.css b/src/components/container/container.module.css new file mode 100644 index 0000000..6169f3d --- /dev/null +++ b/src/components/container/container.module.css @@ -0,0 +1,6 @@ +.container { + margin: 0 auto; + padding: 0 12px; + max-width: 884px; + width: 100%; +} diff --git a/src/components/container/index.js b/src/components/container/index.js new file mode 100644 index 0000000..e26f3bf --- /dev/null +++ b/src/components/container/index.js @@ -0,0 +1,7 @@ +import React from "react"; +import cx from "classnames"; +import styles from "./container.module.css"; + +export const Container = ({ children, className }) => ( +
{children}
+); diff --git a/src/components/content/index.js b/src/components/content/index.js index a71fb69..ec42022 100644 --- a/src/components/content/index.js +++ b/src/components/content/index.js @@ -1,5 +1,4 @@ import React, { useEffect } from "react"; -import { Row, Col } from "antd"; import Restaurant from "../restaurant"; import { connect } from "react-redux"; import { restaurantSelector, restaurantsLoading } from "../../redux/selectors"; @@ -13,13 +12,7 @@ function Content({ restaurant, fetchRestaurants, loading }) { console.log("---", 123); if (loading || !restaurant) return ; - return ( - - - - - - ); + return ; } export default connect( diff --git a/src/components/loader/index.js b/src/components/loader/index.js index f2cd7c9..9933bae 100644 --- a/src/components/loader/index.js +++ b/src/components/loader/index.js @@ -1,9 +1,13 @@ import React from "react"; -import { Spin } from "antd"; import styles from "./loader.module.css"; function Loader() { - return ; + return ( +
+
+
+
+ ); } Loader.propTypes = {}; diff --git a/src/components/loader/loader.module.css b/src/components/loader/loader.module.css index 6091f1b..1193a53 100644 --- a/src/components/loader/loader.module.css +++ b/src/components/loader/loader.module.css @@ -4,3 +4,54 @@ width: 100px; display: block; } + +/* spinner */ + +.spinner { + width: 40px; + height: 40px; + position: relative; + margin: 100px auto; +} + +.double-bounce1, +.double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: var(--green); + opacity: 0.9; + position: absolute; + top: 0; + left: 0; + + -webkit-animation: sk-bounce 2s infinite ease-in-out; + animation: sk-bounce 2s infinite ease-in-out; +} + +.double-bounce2 { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} + +@-webkit-keyframes sk-bounce { + 0%, + 100% { + -webkit-transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + } +} + +@keyframes sk-bounce { + 0%, + 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} diff --git a/src/components/menu/index.js b/src/components/menu/index.js index 45a00d8..1a76191 100644 --- a/src/components/menu/index.js +++ b/src/components/menu/index.js @@ -1,7 +1,6 @@ import React from "react"; import Product from "../product"; import * as PropTypes from "prop-types"; -import { Col, Row, Typography } from "antd"; import Basket from "../basket"; import { connect } from "react-redux"; import { @@ -11,6 +10,8 @@ import { import Loader from "../loader"; import { fetchProducts } from "../../redux/ac"; +import styles from "./menu.module.css"; + class Menu extends React.Component { state = { error: null @@ -34,28 +35,21 @@ class Menu extends React.Component { } render() { - if (this.state.error) - return ( - - {this.state.error.message} - - ); + if (this.state.error) return

{this.state.error.message}

; if (this.props.loading) return ; return ( - <> - - - {this.props.restaurant.menu.map(id => ( - - ))} - - - - - - +
+
+ {this.props.restaurant.menu.map(id => ( + + ))} +
+
+ +
+
); } } diff --git a/src/components/menu/menu.module.css b/src/components/menu/menu.module.css new file mode 100644 index 0000000..d0338a8 --- /dev/null +++ b/src/components/menu/menu.module.css @@ -0,0 +1,29 @@ +.menuWrapper { + display: flex; + flex-direction: column; + padding-bottom: 60px; +} + +.menuWrapper > * { + padding: 12px 0; +} + +@media all and (min-width: 768px) { + .menuWrapper { + flex-direction: row; + justify-content: space-between; + padding-bottom: 0; + } + + .menuWrapper > *:first-child { + flex: 1 0 calc(100% - 300px - 2 * 24px); + } + + .menuWrapper > *:last-child { + flex: 1 0 calc(300px - 24px); + } + + .menuWrapper > * { + padding: 0 12px; + } +} diff --git a/src/components/pages/checkout/checkout.module.css b/src/components/pages/checkout/checkout.module.css index 0b6b3fc..50ec6c1 100644 --- a/src/components/pages/checkout/checkout.module.css +++ b/src/components/pages/checkout/checkout.module.css @@ -3,12 +3,40 @@ overflow-x: hidden; } +.container { + padding: 0; +} + +.checkoutInnerContent { + display: flex; + flex-direction: column-reverse; +} + +.checkoutInnerContent > * { + flex: 1 0 100%; +} + @media all and (min-width: 768px) { .checkoutContent { margin-top: 40px; min-height: calc(100vh - 100px); padding: 16px; } + + .checkoutInnerContent { + flex-direction: row; + justify-content: space-between; + } + + .checkoutInnerContent > * { + flex: 1 0 calc(50% - 24px); + padding: 0 15px; + } + + .container { + max-width: 760px; + padding: initial; + } } @media all and (min-width: 1200px) { diff --git a/src/components/pages/checkout/index.js b/src/components/pages/checkout/index.js index b0b6204..d9dcc1b 100644 --- a/src/components/pages/checkout/index.js +++ b/src/components/pages/checkout/index.js @@ -1,51 +1,43 @@ import React from "react"; -import { Button, Col, Form, Input, Row, Layout } from "antd"; import Basket from "../../basket"; +import { Button } from "../../button"; +import { Container } from "../../container"; import styles from "./checkout.module.css"; function CheckoutPage({ history }) { return ( - - - -
- - - - - - - - - - -
- - - - -
-
+
+ +
+
+
+
+ + +
+
+ + +
+
+ +