footer & nav adaptive

This commit is contained in:
VividTruthKeeper 2022-08-09 00:55:34 +05:00
parent de139b1ab2
commit 197b620ce9
8 changed files with 108 additions and 39 deletions

View File

@ -31,6 +31,7 @@ const App = () => {
type drop = [boolean, React.Dispatch<React.SetStateAction<boolean>>];
// State
const [dropdownBurger, setDropdownBurger] = useState(false);
const [dropdown, setDropdown]: drop = useState(false);
const [burgerOpen, setBurgerOpen]: drop = useState(false);
const [eventData, setEventData]: loaderType = useState(null);
@ -50,7 +51,12 @@ const App = () => {
burgerOpen={burgerOpen}
setBurgerOpen={setBurgerOpen}
/>
<Burger burgerOpen={burgerOpen} setBurgerOpen={setBurgerOpen} />
<Burger
burgerOpen={burgerOpen}
setBurgerOpen={setBurgerOpen}
dropdownBurger={dropdownBurger}
setDropdownBurger={setDropdownBurger}
/>
<div className="inner-body">
<Routes>
<Route path="/" element={<Main />} />
@ -64,7 +70,14 @@ const App = () => {
<Route path="/tournaments" element={<Tournaments />} />
</Routes>
</div>
<Footer dropdown={dropdown} setDropdown={setDropdown} />
<Footer
burgerOpen={burgerOpen}
setBurgerOpen={setBurgerOpen}
dropdown={dropdown}
setDropdown={setDropdown}
dropdownBurger={dropdownBurger}
setDropdownBurger={setDropdownBurger}
/>
</div>
</EventContext.Provider>
);

View File

@ -3,15 +3,17 @@ import { Link } from "react-router-dom";
import { useEffect, useState } from "react";
// Types
import { burger } from "../../types/burger";
import { burgerProps } from "../../types/burger";
// Icons
import arrow from "../../icons/arrow-white-up.svg";
const Burger = ({ burgerOpen, setBurgerOpen }: burger) => {
const [dropdown, setDropdown] = useState(false);
const Burger = ({
burgerOpen,
setBurgerOpen,
dropdownBurger,
setDropdownBurger,
}: burgerProps) => {
useEffect(() => {
if (burgerOpen) {
document.body.style.overflow = "hidden";
@ -25,18 +27,20 @@ const Burger = ({ burgerOpen, setBurgerOpen }: burger) => {
<ul>
<li
className={
dropdown ? "burger-list-first active" : "burger-list-first"
dropdownBurger ? "burger-list-first active" : "burger-list-first"
}
>
<div
className="first-inner"
onClick={() => {
setDropdown((initial) => !initial);
setDropdownBurger((initial) => !initial);
}}
>
<span>О нас</span>
<div
className={dropdown ? "burger-arrow active" : "burger-arrow"}
className={
dropdownBurger ? "burger-arrow active" : "burger-arrow"
}
>
<img src={arrow} alt="" />
</div>

View File

@ -1,19 +1,29 @@
// Modules
import { useEffect } from "react";
import { Link } from "react-router-dom";
// Icons
import youtube from "../../icons/youtube.svg";
import vk from "../../icons/vk.svg";
import twitter from "../../icons/twitter.svg";
import classmates from "../../icons/odnoklassniki.svg";
import linkedin from "../../icons/linkedin.svg";
import instagram from "../../icons/instagram.svg";
import facebook from "../../icons/facebook.svg";
// Types
import { dropdown } from "../../types/dropdown";
import { footerProps } from "../../types/burger";
// Hooks
import useMediaQuery from "../../hooks/useMediaQuery";
const Footer = ({
setDropdown,
setDropdownBurger,
setBurgerOpen,
}: footerProps) => {
const breakpoint: Record<number, boolean> = {
1300: useMediaQuery("(max-width: 1300px)"),
};
useEffect(() => console.log(breakpoint["1300"]), [breakpoint]);
const Footer = ({ dropdown, setDropdown }: dropdown) => {
return (
<footer className="footer">
<div className="footer-top">
@ -22,8 +32,14 @@ const Footer = ({ dropdown, setDropdown }: dropdown) => {
<ul>
<li
onClick={() => {
window.scrollTo(0, 0);
setDropdown(true);
if (breakpoint["1300"]) {
window.scrollTo(0, 0);
setBurgerOpen(true);
setDropdownBurger(true);
} else {
window.scrollTo(0, 0);
setDropdown(true);
}
}}
>
<span>О нас</span>
@ -55,31 +71,11 @@ const Footer = ({ dropdown, setDropdown }: dropdown) => {
</div>
<div className="footer-bottom-right">
<ul>
<li>
<a href="/">
<img src={youtube} alt="" />
</a>
</li>
<li>
<a href="/">
<img src={vk} alt="" />
</a>
</li>
<li>
<a href="/">
<img src={twitter} alt="" />
</a>
</li>
<li>
<a href="/">
<img src={classmates} alt="" />
</a>
</li>
<li>
<a href="/">
<img src={linkedin} alt="" />
</a>
</li>
<li>
<a href="/">
<img src={instagram} alt="" />

View File

@ -2,7 +2,7 @@ import { useState, useEffect } from "react";
// query e.g. "(max-width: 1300px)"
const useMediaQuery = (query: string) => {
const useMediaQuery = (query: string): boolean => {
const [matches, setMatches] = useState(false);
useEffect(() => {

View File

@ -11,6 +11,7 @@
ul {
display: flex;
justify-content: center;
gap: 8rem;
align-items: center;
}
@ -55,3 +56,36 @@
display: block;
}
}
// Adaptive
@media screen and (max-width: 700px) {
.footer-bottom-inner {
display: flex;
flex-direction: column-reverse;
gap: 4.8rem;
p {
text-align: center;
}
}
}
@media screen and (max-width: 900px) {
.footer-top-inner {
display: flex;
justify-content: center;
ul {
padding-left: 1rem;
}
}
.footer-top {
ul {
justify-self: center;
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
row-gap: 5.6rem;
column-gap: 5.6rem;
}
}
}

View File

@ -5,6 +5,7 @@
}
.container {
width: 100%;
padding: 0 5rem;
max-width: 150rem;
margin: 0 auto;

View File

@ -220,6 +220,20 @@
// Adaptive
@media screen and (max-width: 1300px) {
.nav {
min-height: 9rem;
}
.nav-logo {
a {
width: 6.4rem;
height: 6.4rem;
img {
width: 6.4rem;
height: 6.4rem;
}
}
}
.nav-content {
display: flex;
justify-content: flex-end;

View File

@ -6,4 +6,11 @@ export interface burger {
setBurgerOpen: React.Dispatch<boolean | ((initial: boolean) => boolean)>;
}
export interface dropdownBurger {
dropdownBurger: boolean;
setDropdownBurger: React.Dispatch<boolean | ((initial: boolean) => boolean)>;
}
export type navProps = burger & dropdown;
export type burgerProps = burger & dropdownBurger;
export type footerProps = dropdownBurger & dropdown & burger;