feat: criacao do formulario, validacoes

This commit is contained in:
Guilherme de Camargo Barbosa 2023-01-15 20:03:23 -03:00
parent 3eab2a97fd
commit abc784aeb4
45 changed files with 3082 additions and 1852 deletions

61
package-lock.json generated
View File

@ -17,6 +17,7 @@
"@types/react-dom": "^18.0.10",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.6.1",
"react-scripts": "5.0.1",
"typescript": "^4.9.4",
"web-vitals": "^2.1.4"
@ -3074,6 +3075,14 @@
}
}
},
"node_modules/@remix-run/router": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.2.1.tgz",
"integrity": "sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ==",
"engines": {
"node": ">=14"
}
},
"node_modules/@rollup/plugin-babel": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
@ -13941,6 +13950,36 @@
"node": ">=0.10.0"
}
},
"node_modules/react-router": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.6.1.tgz",
"integrity": "sha512-YkvlYRusnI/IN0kDtosUCgxqHeulN5je+ew8W+iA1VvFhf86kA+JEI/X/8NqYcr11hCDDp906S+SGMpBheNeYQ==",
"dependencies": {
"@remix-run/router": "1.2.1"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
"react": ">=16.8"
}
},
"node_modules/react-router-dom": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.6.1.tgz",
"integrity": "sha512-u+8BKUtelStKbZD5UcY0NY90WOzktrkJJhyhNg7L0APn9t1qJNLowzrM9CHdpB6+rcPt6qQrlkIXsTvhuXP68g==",
"dependencies": {
"@remix-run/router": "1.2.1",
"react-router": "6.6.1"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
"react": ">=16.8",
"react-dom": ">=16.8"
}
},
"node_modules/react-scripts": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
@ -18833,6 +18872,11 @@
"source-map": "^0.7.3"
}
},
"@remix-run/router": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.2.1.tgz",
"integrity": "sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ=="
},
"@rollup/plugin-babel": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
@ -26573,6 +26617,23 @@
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
"integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A=="
},
"react-router": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.6.1.tgz",
"integrity": "sha512-YkvlYRusnI/IN0kDtosUCgxqHeulN5je+ew8W+iA1VvFhf86kA+JEI/X/8NqYcr11hCDDp906S+SGMpBheNeYQ==",
"requires": {
"@remix-run/router": "1.2.1"
}
},
"react-router-dom": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.6.1.tgz",
"integrity": "sha512-u+8BKUtelStKbZD5UcY0NY90WOzktrkJJhyhNg7L0APn9t1qJNLowzrM9CHdpB6+rcPt6qQrlkIXsTvhuXP68g==",
"requires": {
"@remix-run/router": "1.2.1",
"react-router": "6.6.1"
}
},
"react-scripts": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",

View File

@ -10,11 +10,14 @@
"@types/node": "^16.18.11",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.10",
"formik": "^2.2.9",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.6.1",
"react-scripts": "5.0.1",
"typescript": "^4.9.4",
"web-vitals": "^2.1.4"
"web-vitals": "^2.1.4",
"yup": "^0.32.11"
},
"scripts": {
"start": "react-scripts start",

View File

@ -1,13 +1,18 @@
import { BrowserRouter } from "react-router-dom"
import { Footer } from "./components/Footer";
import { Header } from "./components/Header";
import { Main } from "./components/Main";
import { TopButton } from "./components/TopButton";
import { WhatsappButton } from "./components/WhatsappButton";
export function App() {
return (
<>
<BrowserRouter>
<Header />
<Main />
<Footer />
</>
<WhatsappButton />
<TopButton />
</BrowserRouter>
);
}

View File

@ -0,0 +1,92 @@
import { Icon } from "../../Icon";
import { NavigationLinks } from "../../NavigationLinks";
import style from "./style.module.css";
export function ContainerFooter() {
const linksInfoInstitucional = [
{
slug: "quem-somos",
text: "Quem Somos"
},
{
slug: "politica-de-privacidade",
text: "Política de Privacidade"
},
{
slug: "seguranca",
text: "Segurança"
},
{
slug: "seja-um-Revendedor",
text: "Seja um Revendedor"
}
]
const linksInfoDoubts = [
{
slug: "entrega",
text: "Entrega"
},
{
slug: "pagamento",
text: "Pagamento"
},
{
slug: "trocas-e-devoluções",
text: "Trocas e Devoluções"
},
{
slug: "duvidas-frequentes",
text: "Dúvidas Frequentes"
}
]
const linksInfoContactUs = [
{
slug: "contato",
text: "Atendimento ao Consumidor"
},
{
slug: "contato",
text: "(11) 4159 9504"
},
{
slug: "whatsapp",
text: "Atendimento Online"
},
{
slug: "whatsapp",
text: "(11) 99433-8825"
}
]
return (
<div className={style.containerFooter}>
<div className={style.contentFooter}>
<div className={style.contentListInstitucional}>
<h4>INSTITUCIONAL</h4>
<NavigationLinks links={linksInfoInstitucional} />
</div>
<div className={style.contentListDoubt}>
<h4>DÚVIDAS</h4>
<NavigationLinks links={linksInfoDoubts} />
</div>
<div className={style.contentListContact}>
<h4>FALE CONOSCO</h4>
<NavigationLinks links={linksInfoContactUs} />
</div>
<div className={style.contentListIcons}>
<div className={style.contentListIconsWrapper}>
<div className={style.listIcons}>
<Icon name="facebook" />
<Icon name="instagram" />
<Icon name="twitter" />
<Icon name="youtube" />
<Icon name="linkedin" />
</div>
<span>www.loremipsum.com</span>
</div>
</div>
</div>
</div>
);
}

View File

@ -0,0 +1,89 @@
.containerFooter {
width: 100%;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
margin-top: 3.125rem;
}
.contentFooter {
width: 90%;
display: flex;
justify-content: center;
align-items: flex-start;
}
.contentListInstitucional,
.contentListDoubt,
.contentListContact {
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
.contentListInstitucional ul,
.contentListDoubt ul,
.contentListContact ul {
list-style: none;
}
.contentListInstitucional h4,
.contentListDoubt h4,
.contentListContact h4 {
font-weight: 500;
font-size: 28px;
color: var(--gray-1100);
margin-bottom: 0.75rem;
}
.contentListInstitucional a,
.contentListDoubt a,
.contentListContact a {
text-decoration: none;
}
.contentListInstitucional ul a:last-child ,
.contentListDoubt ul a:last-child ,
.contentListContact ul a:last-child {
text-decoration: underline;
text-decoration-color: var(--gray-1100);
}
.contentListInstitucional li,
.contentListDoubt li,
.contentListContact li {
font-weight: 400;
font-size: 1.5rem;
color: var(--gray-1100);
margin-bottom: 0.75rem;
}
.contentListIcons {
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-end;
}
.contentListIconsWrapper {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
.contentListIconsWrapper span {
font-weight: 400;
font-size: 1.75rem;
color: var(--gray-1100);
}
.listIcons {
display: flex;
gap: 0.625rem;
margin-bottom: 0.75rem;
}

View File

@ -0,0 +1,39 @@
import { Icon } from "../../Icon";
import style from "./style.module.css";
export function ContainerFooterInfo() {
return (
<div className={style.containerFooterInfo}>
<div className={style.containerInfoWrapper}>
<div className={style.contentInfoFooter}>
<span>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor
</span>
</div>
<div className={style.contentIconsPay}>
<Icon name="mastercard" />
<Icon name="visa" />
<Icon name="dinners" />
<Icon name="elo" />
<Icon name="hipercard" />
<Icon name="paypal" />
<Icon name="boleto" />
<span></span>
<Icon name="vtexPci" />
</div>
<div className={style.iconsVtexAndM3}>
<div className={style.contentVtexIcon}>
<span>Powered by</span>
<Icon name="iconvtex" />
</div>
<div className={style.contentM3Icon}>
<span>Developed by</span>
<Icon name="iconM3" />
</div>
</div>
</div>
</div>
);
}

View File

@ -0,0 +1,77 @@
.containerFooterInfo {
width: 100%;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
background-color: var(--black);
color: var(--white);
padding: 2.063rem 0;
margin-top: 3.125rem;
}
.containerInfoWrapper {
width: 90%;
display: flex;
justify-content: space-between;
align-items: center;
}
.contentInfoFooter {
flex: 1;
display: flex;
justify-content: flex-start;
align-items: center;
}
.contentInfoFooter span,
.contentVtexIcon span,
.contentM3Icon span {
font-size: 1.25rem;
line-height: 23.44px;
}
.contentInfoFooter span {
max-width: 467px;
}
.contentIconsPay {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
gap: 0.75rem;
}
.contentVtexIcon span,
.contentM3Icon span {
white-space: nowrap;
}
.contentIconsPay img {
width: 9.33%;
}
.iconsVtexAndM3 {
flex: 1;
display: flex;
justify-content: flex-end;
align-items: center;
}
.contentVtexIcon,
.contentM3Icon {
display: flex;
justify-content: center;
align-items: center;
gap: 0.75rem;
}
.contentVtexIcon img {
margin-right: 0.75rem;
}
.iconsVtexAndM3 img {
width: 40.78%;
}

View File

@ -0,0 +1,15 @@
import style from "./style.module.css";
export function ContainerNewsletter() {
return (
<div className={style.containerNewsLetter}>
<div className={style.contentNewsLetter}>
<h3>Assine nossa Newsletter</h3>
<form action="/">
<input type="text" />
<button type="submit">ENVIAR</button>
</form>
</div>
</div>
);
}

View File

@ -0,0 +1,45 @@
.containerNewsLetter {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid var(--black);
border-bottom: 1px solid var(--black);
margin-top: 5.25rem;
}
.contentNewsLetter {
width: 37%;
padding: 1rem 0;
}
.contentNewsLetter h3{
font-weight: 500;
font-size: 2.25rem;
color: var(--gray-1100);
margin-bottom: 0.5rem;
}
.contentNewsLetter form{
width: 100%;
display: flex;
}
.contentNewsLetter form input{
width: 73%;
height: 59px;
border: 1px solid var(--gray-100);
margin-right: 0.5rem;
font-size: 1.75rem;
font-weight: 400;
padding: 0.813rem 1rem;
}
.contentNewsLetter form button{
width: 27%;
background-color: var(--black);
color: var(--white);
font-size: 1.5rem;
font-weight: 700;
padding: 0.875rem 1.25rem;
}

View File

@ -1,131 +1,15 @@
import iconFace from "../../assets/icon-facebook.svg";
import iconInsta from "../../assets/icon-instagram.svg";
import iconYoutube from "../../assets/icon-youtube.svg";
import iconTwitter from "../../assets/icon-twitter.svg";
import iconIN from "../../assets/icon-in.svg";
import iconBoleto from "../../assets/Boleto.svg";
import iconElo from "../../assets/Elo.svg";
import iconHiper from "../../assets/Hiper.svg";
import iconMaster from "../../assets/Master.svg";
import iconDiners from "../../assets/Diners.svg";
import iconPagSeguro from "../../assets/Pagseguro.svg";
import iconVisa from "../../assets/Visa.svg";
import iconVtexPCI from "../../assets/vtex-pci-200.svg";
import iconVtex from "../../assets/icon-vtex.svg";
import iconM3 from "../../assets/icon-m3.svg";
import { ContainerNewsletter } from "./ContainerNewsLetter";
import { ContainerFooter } from "./ContainerFooter";
import { ContainerFooterInfo } from "./ContainerFooterInfo";
import style from "./style.module.css";
export function Footer() {
return (
<footer>
<div className={style.containerNewsLetter}>
<div className={style.contentNewsLetter}>
<h3>Assine nossa Newsletter</h3>
<form action="/">
<input type="text" />
<button type="submit">ENVIAR</button>
</form>
</div>
</div>
<div className={style.containerFooter}>
<div className={style.contentFooter}>
<div className={style.contentListInstitucional}>
<h4>INSTITUCIONAL</h4>
<ul>
<a href="/">
<li>Quem Somos</li>
</a>
<a href="/">
<li>Política de Privacidade</li>
</a>
<a href="/">
<li>Segurança</li>
</a>
<a href="/">
<li>Seja um Revendedor</li>
</a>
</ul>
</div>
<div className={style.contentListDoubt}>
<h4>DÚVIDAS</h4>
<ul>
<a href="/">
<li>Entrega</li>
</a>
<a href="/">
<li>Pagamento</li>
</a>
<a href="/">
<li>Trocas e Devoluções</li>
</a>
<a href="/">
<li>Dúvidas Frequentes</li>
</a>
</ul>
</div>
<div className={style.contentListContact}>
<h4>FALE CONOSCO</h4>
<ul>
<a href="/">
<li>
<span>Atendimento ao Consumidor</span>
<span>(11) 4159 9504</span>
</li>
</a>
<a href="/">
<li>
<span>Atendimento Online</span>
<span className={style.line}>(11) 99433-8825</span>
</li>
</a>
</ul>
</div>
<div className={style.contentListIcons}>
<div className={style.contentListIconsWrapper}>
<div className={style.listIcons}>
<img src={iconFace} alt="icone do facebook" />
<img src={iconInsta} alt="icone do Instagram" />
<img src={iconTwitter} alt="icone do Twitter" />
<img src={iconYoutube} alt="icone do Youtube" />
<img src={iconIN} alt="icone do LinkedIn" />
</div>
<span>www.loremipsum.com</span>
</div>
</div>
</div>
</div>
<div className={style.containerFooterInfo}>
<div className={style.containerInfoWrapper}>
<div className={style.contentInfoFooter}>
<span>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor
</span>
</div>
<div className={style.contentIconsPay}>
<img src={iconMaster} alt="icone Master Card" />
<img src={iconVisa} alt="icone Visa" />
<img src={iconDiners} alt="icone Diners" />
<img src={iconElo} alt="icone Elo" />
<img src={iconHiper} alt="icone Hiper Card" />
<img src={iconPagSeguro} alt="icone PayPal" />
<img src={iconBoleto} alt="icone Boleto" />
<span></span>
<img src={iconVtexPCI} alt="icone Vtex PCI 200" />
</div>
<div className={style.iconsVtexAndM3}>
<div className={style.contentVtexIcon}>
<span>Powered by</span>
<img src={iconVtex} alt="icone Vtex" />
</div>
<div className={style.contentM3Icon}>
<span>Developed by</span>
<img src={iconM3} alt="icone M3" />
</div>
</div>
</div>
</div>
<ContainerNewsletter />
<ContainerFooter />
<ContainerFooterInfo />
</footer>
);
}

View File

@ -1,238 +0,0 @@
.containerNewsLetter {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid var(--black);
border-bottom: 1px solid var(--black);
margin-top: 5.25rem;
}
.contentNewsLetter {
width: 37%;
padding: 1rem 0;
}
.contentNewsLetter h3{
font-weight: 500;
font-size: 2.25rem;
color: var(--gray-1100);
margin-bottom: 0.5rem;
}
.contentNewsLetter form{
width: 100%;
display: flex;
}
.contentNewsLetter form input{
width: 73%;
height: 59px;
border: 1px solid var(--gray-100);
margin-right: 0.5rem;
font-size: 1.75rem;
font-weight: 400;
padding: 0.813rem 1rem;
}
.contentNewsLetter form button{
width: 27%;
background-color: var(--black);
color: var(--white);
font-size: 1.5rem;
font-weight: 700;
padding: 0.875rem 1.25rem;
}
.containerFooter {
width: 100%;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
margin-top: 3.125rem;
}
.contentFooter {
width: 90%;
display: flex;
justify-content: center;
align-items: flex-start;
}
.contentListInstitucional,
.contentListDoubt,
.contentListContact {
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
.contentListInstitucional ul,
.contentListDoubt ul,
.contentListContact ul {
list-style: none;
}
.contentListInstitucional h4,
.contentListDoubt h4,
.contentListContact h4 {
font-weight: 500;
font-size: 28px;
color: var(--gray-1100);
margin-bottom: 0.75rem;
}
.contentListInstitucional a,
.contentListDoubt a,
.contentListContact a {
text-decoration: none;
}
.contentListInstitucional ul a:last-child ,
.contentListDoubt ul a:last-child ,
.contentListContact ul a:last-child {
text-decoration: underline;
text-decoration-color: var(--gray-1100);
}
.contentListInstitucional li,
.contentListDoubt li,
.contentListContact li {
font-weight: 400;
font-size: 1.5rem;
color: var(--gray-1100);
margin-bottom: 0.75rem;
}
.contentListContact li {
display: flex;
flex-direction: column;
}
.contentListContact li span {
font-weight: 400;
font-size: 1.5rem;
color: var(--gray-1100);
}
.contentListContact li span:first-child {
margin-bottom: 0.75rem;
}
.contentListContact a{
text-decoration: none !important;
}
.contentListContact li span.line{
text-decoration: underline;
text-decoration-color: var(--gray-1100);
}
.contentListIcons {
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-end;
}
.contentListIconsWrapper {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
.contentListIconsWrapper span {
font-weight: 400;
font-size: 1.75rem;
color: var(--gray-1100);
}
.listIcons {
display: flex;
gap: 0.625rem;
margin-bottom: 0.75rem;
}
.containerFooterInfo {
width: 100%;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
background-color: var(--black);
color: var(--white);
padding: 2.063rem 0;
margin-top: 3.125rem;
}
.containerInfoWrapper {
width: 90%;
display: flex;
justify-content: space-between;
align-items: center;
}
.contentInfoFooter {
flex: 1;
display: flex;
justify-content: flex-start;
align-items: center;
}
.contentInfoFooter span,
.contentVtexIcon span,
.contentM3Icon span {
font-size: 1.25rem;
line-height: 23.44px;
}
.contentInfoFooter span {
max-width: 467px;
}
.contentIconsPay {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
gap: 0.75rem;
}
.contentVtexIcon span,
.contentM3Icon span {
white-space: nowrap;
}
.contentIconsPay img {
width: 9.33%;
}
.iconsVtexAndM3 {
flex: 1;
display: flex;
justify-content: flex-end;
align-items: center;
}
.contentVtexIcon,
.contentM3Icon {
display: flex;
justify-content: center;
align-items: center;
gap: 0.75rem;
}
.contentVtexIcon img {
margin-right: 0.75rem;
}
.iconsVtexAndM3 img {
width: 40.78%;
}

View File

@ -0,0 +1,37 @@
import { NavigationLinks } from "../../NavigationLinks";
import imgHome from "../../../assets/home 1.svg";
import imgArrowRight from "../../../assets/arrow-point-to-right (3).svg";
import style from "./style.module.css";
export function ContainerBreadCrumb() {
const linksBreadCrumb = [
{
slug: "",
text: "",
icon: `${imgHome}`,
alt: "Casinha"
},
{
slug: "",
text: "",
icon: `${imgArrowRight}`,
alt: "seta para a direita"
},
{
slug: "institucional",
text: "institucional",
},
];
return (
<div className={style.containerBreadCrumbs}>
<div className={style.contentWrapper}>
<div className={style.contentBreadCrumb}>
<NavigationLinks links={linksBreadCrumb} />
</div>
</div>
</div>
);
}

View File

@ -0,0 +1,46 @@
.containerBreadCrumbs {
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.contentWrapper {
width: 90%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 1.375rem 0;
}
.contentBreadCrumb {
display: flex;
justify-content: flex-start;
align-items: center;
width: 100%;
list-style: none;
}
.contentBreadCrumb ul{
display: flex;
justify-content: flex-start;
align-items: center;
list-style: none;
}
.contentBreadCrumb ul a {
text-decoration: none;
}
.contentBreadCrumb li {
font-size: 24px;
font-weight: 400;
text-transform: uppercase;
color: var(--gray-300);
}
.contentBreadCrumb img, .contentBreadCrumb span {
margin-right: 0.547rem;
}

View File

@ -0,0 +1,30 @@
import { NavigationLinks } from "../../NavigationLinks";
import style from "./style.module.css";
export function ContainerList() {
const linksInfo = [
{
slug: "cursos",
text: "Cursos",
},
{
slug: "saiba-mais",
text: "Saiba mais",
},
{
slug: "institucional",
text: "INSTITUCIONAIS",
},
];
return (
<div className={style.containerList}>
<div className={style.contentWrapper}>
<div className={style.contentListButtons}>
<NavigationLinks links={linksInfo} />
</div>
</div>
</div>
);
}

View File

@ -0,0 +1,38 @@
.containerList {
background-color: var(--black);
width: 100%;
max-height: 118px;
display: flex;
justify-content: center;
align-items: center;
}
.contentWrapper {
width: 90%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 1.375rem 0;
}
.contentListButtons {
width: 100%;
}
.contentListButtons ul {
display: flex;
list-style: none;
}
.contentListButtons ul a {
text-decoration: none;
color: var(--white);
text-transform: uppercase;
font-size: 28px;
font-weight: 500;
}
.contentListButtons ul li {
margin-right: 3.482rem;
}

View File

@ -0,0 +1,32 @@
import { Button } from "../../button";
import { LogoM3Academy } from "../../LogoM3Academy";
import logo from "../../../assets/Logo-M3Academy 1 (1).svg";
import style from "./style.module.css";
export function ContainerPrincipal() {
return (
<div className={style.containerHeader}>
<div className={style.contentWrapper}>
<div className={style.contentHeader}>
<div className={style.contentLogo}>
<LogoM3Academy link="/" src={logo} alt="Logo da M3 academy" />
</div>
<div className={style.contentSearch}>
<span>
<input type="text" />
<Button iconName="search" />
</span>
</div>
<div className={style.contentInfoHeader}>
<div className={style.contentLogin}>
<a href="/">Entrar</a>
</div>
<Button iconName="miniCart" className={style.miniCart} />
</div>
</div>
</div>
</div>
);
}

View File

@ -108,38 +108,9 @@
max-width: 54.68px;
background-color: transparent;
cursor: pointer;
border: none;
}
.miniCart img {
width: 100%;
}
.containerList {
background-color: var(--black);
width: 100%;
max-height: 118px;
display: flex;
justify-content: center;
align-items: center;
}
.contentListButtons {
width: 100%;
}
.contentListButtons ul {
display: flex;
list-style: none;
}
.contentListButtons ul li {
margin-right: 3.482rem;
}
.contentListButtons ul li a {
text-decoration: none;
color: var(--white);
text-transform: uppercase;
font-size: 28px;
font-weight: 500;
}
}

View File

@ -1,56 +1,13 @@
import logo from "../../assets/Logo-M3Academy 1 (1).svg";
import imgSearch from "../../assets/search 2.svg";
import imgMiniCart from "../../assets/cart 1.svg";
import style from "./style.module.css";
import { ContainerPrincipal } from "./ContainerPrincipal";
import { ContainerList } from "./ContainerList";
import { ContainerBreadCrumb } from "./ContainerBreadCrumbs";
export function Header() {
return (
<>
<header className={style.containerHeader}>
<div className={style.contentWrapper}>
<div className={style.contentHeader}>
<div className={style.contentLogo}>
<figure>
<img src={logo} alt="Logo da M3 academy" />
</figure>
</div>
<div className={style.contentSearch}>
<span>
<input type="text" />
<button>
<img src={imgSearch} alt="Logo de pesquisa" />
</button>
</span>
</div>
<div className={style.contentInfoHeader}>
<div className={style.contentLogin}>
<a href="/">Entrar</a>
</div>
<button className={style.miniCart}>
<img src={imgMiniCart} alt="Logo carrinho" />
</button>
</div>
</div>
</div>
</header>
<div className={style.containerList}>
<div className={style.contentWrapper}>
<div className={style.contentListButtons}>
<ul>
<li>
<a href="/">cursos</a>
</li>
<li>
<a href="/">Saiba mais</a>
</li>
<li>
<a href="/">INSTITUCIONAIS</a>
</li>
</ul>
</div>
</div>
</div>
</>
<header>
<ContainerPrincipal />
<ContainerList />
<ContainerBreadCrumb />
</header>
);
}

View File

@ -0,0 +1,390 @@
//import { SVGAttributes } from 'react';
import iconBoleto from "../../assets/Boleto.svg";
import iconElo from "../../assets/Elo.svg";
import iconHiper from "../../assets/Hiper.svg";
import iconMaster from "../../assets/Master.svg";
import iconDiners from "../../assets/Diners.svg";
import iconPayPal from "../../assets/Pagseguro.svg";
import iconVisa from "../../assets/Visa.svg";
import iconVtexPCI from "../../assets/vtex-pci-200.svg";
import iconVtex from "../../assets/icon-vtex.svg";
import iconM3 from "../../assets/icon-m3.svg";
interface IconProps {
name:
| "search"
| "miniCart"
| "home"
| "arrowRight"
| "whatsapp"
| "arrowTop"
| "facebook"
| "instagram"
| "twitter"
| "youtube"
| "mastercard"
| "visa"
| "dinners"
| "elo"
| "hipercard"
| "paypal"
| "boleto"
| "vtexPci"
| "iconvtex"
| "iconM3"
| "linkedin";
color?: string;
}
export function Icon(props: IconProps) {
const { name } = props;
switch (name) {
case "search":
return (
<svg
width="36"
height="36"
viewBox="0 0 36 36"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_3751_533)">
<path
d="M25.7949 22.6886C27.5246 20.3265 28.5592 17.4252 28.5592 14.2799C28.5592 6.40637 22.1531 0.000244141 14.2796 0.000244141C6.40606 0.000244141 0 6.40637 0 14.2799C0 22.1534 6.40613 28.5596 14.2797 28.5596C17.4249 28.5596 20.3266 27.5248 22.6886 25.7951L32.0435 35.15L35.15 32.0436C35.15 32.0435 25.7949 22.6886 25.7949 22.6886ZM14.2797 24.1658C8.82824 24.1658 4.39377 19.7313 4.39377 14.2799C4.39377 8.82848 8.82824 4.39401 14.2797 4.39401C19.7311 4.39401 24.1655 8.82848 24.1655 14.2799C24.1655 19.7313 19.731 24.1658 14.2797 24.1658Z"
fill="#292929"
/>
</g>
<defs>
<clipPath id="clip0_3751_533">
<rect width="35.15" height="35.15" rx="5" fill="white" />
</clipPath>
</defs>
</svg>
);
case "miniCart":
return (
<svg
width="55"
height="55"
viewBox="0 0 55 55"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_3751_539)">
<path
d="M54.3344 7.95273C54.0351 7.57862 53.5819 7.36086 53.1027 7.36086H11.1231L9.9492 2.27412C9.78398 1.55848 9.14672 1.05151 8.41228 1.05151H1.57728C0.706248 1.05151 0 1.75776 0 2.6289C0 3.50004 0.706248 4.20619 1.57728 4.20619H7.15753L15.1259 38.7358C15.291 39.4515 15.9283 39.9585 16.6628 39.9585H48.2656C49.1367 39.9585 49.8428 39.2522 49.8428 38.3812C49.8428 37.51 49.1366 36.8039 48.2656 36.8039H17.9176L16.7044 31.5462H48.3709C49.1086 31.5462 49.7478 31.0348 49.9097 30.3151L54.6416 9.28438C54.7467 8.81682 54.6338 8.32694 54.3344 7.95273Z"
fill="white"
/>
<path
d="M23.1338 42.0615C19.9449 42.0615 17.3503 44.6559 17.3503 47.845C17.3503 51.0341 19.9448 53.6285 23.1338 53.6285C26.3228 53.6285 28.9173 51.0341 28.9173 47.845C28.9173 44.6559 26.3229 42.0615 23.1338 42.0615Z"
fill="white"
/>
<path
d="M42.0614 42.0615C38.8725 42.0615 36.278 44.6559 36.278 47.845C36.278 51.0341 38.8724 53.6285 42.0614 53.6285C45.2504 53.6285 47.8449 51.0341 47.8449 47.845C47.8449 44.6559 45.2505 42.0615 42.0614 42.0615Z"
fill="white"
/>
</g>
<defs>
<clipPath id="clip0_3751_539">
<rect width="54.68" height="54.68" fill="white" />
</clipPath>
</defs>
</svg>
);
case "home":
return (
<svg
width="32"
height="32"
viewBox="0 0 32 32"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_3851_47)">
<path
d="M30.9231 14.8352L28.692 12.6041L16.4148 0.326808C15.9789 -0.108936 15.2724 -0.108936 14.8366 0.326808L2.55921 12.6041L0.326997 14.8364C-0.101226 15.2798 -0.088997 15.9863 0.354399 16.4146C0.786939 16.8323 1.47263 16.8323 1.90517 16.4146L2.23105 16.0864V30.1339C2.23105 30.7503 2.73075 31.25 3.34719 31.25H27.9018C28.5183 31.25 29.018 30.7503 29.018 30.1339V16.0864L29.345 16.4134C29.7884 16.8417 30.4949 16.8294 30.9231 16.386C31.3409 15.9535 31.3409 15.2677 30.9231 14.8352ZM18.9729 29.0178H12.2762V20.0888H18.9729V29.0178ZM26.7857 29.0178H21.2051V18.9727C21.2051 18.3563 20.7054 17.8566 20.089 17.8566H11.1601C10.5436 17.8566 10.0439 18.3563 10.0439 18.9727V29.0178H4.46333V13.8542L15.6245 2.69296L26.7857 13.8542V29.0178Z"
fill="#C4C4C4"
/>
</g>
<defs>
<clipPath id="clip0_3851_47">
<rect width="31.25" height="31.25" fill="white" />
</clipPath>
</defs>
</svg>
);
case "arrowRight":
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_3751_560)">
<path
d="M11.9417 7.03685L5.22531 0.320703C4.79807 -0.106746 4.10537 -0.106746 3.67833 0.320703C3.25126 0.747771 3.25126 1.44043 3.67833 1.86747L9.62128 7.81023L3.67851 13.7528C3.25144 14.18 3.25144 14.8726 3.67851 15.2997C4.10558 15.7269 4.79824 15.7269 5.22548 15.2997L11.9418 8.58344C12.1554 8.3698 12.262 8.0901 12.262 7.81026C12.262 7.53029 12.1552 7.25038 11.9417 7.03685Z"
fill="#C4C4C4"
/>
</g>
<defs>
<clipPath id="clip0_3751_560">
<rect
width="15.62"
height="15.62"
fill="white"
transform="matrix(1 0 0 -1 0 15.6201)"
/>
</clipPath>
</defs>
</svg>
);
case "whatsapp":
return (
<svg
width="66"
height="66"
viewBox="0 0 66 66"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_3751_658)">
<path
d="M33.0083 0H32.9917C14.7964 0 0 14.8005 0 33C0 40.2188 2.3265 46.9095 6.28237 52.3421L2.16975 64.6016L14.8541 60.5468C20.0723 64.0035 26.2969 66 33.0083 66C51.2036 66 66 51.1954 66 33C66 14.8046 51.2036 0 33.0083 0Z"
fill="#4CAF50"
/>
<path
d="M52.21 46.6001C51.4139 48.8483 48.2542 50.7128 45.7338 51.2573C44.0095 51.6244 41.7573 51.9173 34.1755 48.774C24.4777 44.7563 18.2324 34.9016 17.7457 34.2623C17.2795 33.6229 13.8269 29.0441 13.8269 24.3086C13.8269 19.5731 16.2318 17.2673 17.2012 16.2773C17.9973 15.4646 19.3132 15.0934 20.5754 15.0934C20.9838 15.0934 21.3509 15.114 21.6809 15.1305C22.6503 15.1718 23.137 15.2295 23.7764 16.7599C24.5725 18.678 26.5113 23.4135 26.7423 23.9003C26.9774 24.387 27.2125 25.047 26.8825 25.6864C26.5732 26.3464 26.3009 26.6393 25.8142 27.2003C25.3274 27.7613 24.8654 28.1903 24.3787 28.7925C23.9332 29.3164 23.4299 29.8774 23.9909 30.8468C24.5519 31.7955 26.4907 34.9594 29.3452 37.5004C33.0288 40.7798 36.0153 41.8275 37.0837 42.273C37.8798 42.603 38.8285 42.5246 39.4102 41.9059C40.1485 41.1098 41.0602 39.7898 41.9883 38.4904C42.6483 37.5581 43.4815 37.4426 44.356 37.7726C45.247 38.082 49.9619 40.4126 50.9313 40.8953C51.9007 41.382 52.54 41.613 52.7752 42.0214C53.0062 42.4298 53.0062 44.3479 52.21 46.6001Z"
fill="white"
/>
</g>
<defs>
<clipPath id="clip0_3751_658">
<rect width="66" height="66" fill="white" />
</clipPath>
</defs>
</svg>
);
case "arrowTop":
return (
<svg
width="25"
height="13"
viewBox="0 0 25 13"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M23.7428 11.396C23.741 11.6959 23.6177 11.9953 23.373 12.226L23.3728 12.2261C22.8669 12.7035 22.037 12.7035 21.5311 12.2261L21.5232 12.2345L21.5311 12.2261L12.3457 3.5599L12.0712 3.30091L11.7967 3.5599L2.61178 12.2258C2.61176 12.2258 2.61174 12.2259 2.61172 12.2259C2.10542 12.7033 1.27569 12.7032 0.769767 12.2259L0.769708 12.2258C0.525704 11.9957 0.402467 11.6972 0.400037 11.398C0.401876 11.0981 0.525111 10.7986 0.769783 10.5678L0.769785 10.5678L11.1506 0.77376C11.4013 0.537305 11.7333 0.415845 12.0712 0.415845C12.4093 0.415845 12.7415 0.537555 12.9921 0.773941C12.9921 0.77395 12.9921 0.773959 12.9922 0.773967L23.3728 10.568L23.3729 10.5681C23.6171 10.7983 23.7404 11.0968 23.7428 11.396Z"
fill="white"
stroke="white"
strokeWidth="0.8"
/>
</svg>
);
case "facebook":
return (
<svg
width="70"
height="71"
viewBox="0 0 70 71"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_4744_313)">
<path
d="M38.3557 55.2232V37.329H44.3468L45.2457 30.3532H38.3557V25.9002C38.3557 23.8812 38.9129 22.5052 41.8052 22.5052L45.4882 22.5037V16.2643C44.8513 16.1814 42.665 15.9912 40.1204 15.9912C34.8068 15.9912 31.1691 19.2415 31.1691 25.2093V30.3532H25.1598V37.329H31.1691V55.2232H38.3557Z"
fill="#303030"
/>
</g>
<circle
cx="35"
cy="35.2412"
r="34"
stroke="#303030"
strokeWidth="2"
/>
<defs>
<clipPath id="clip0_4744_313">
<rect
width="39.148"
height="39.232"
fill="white"
transform="translate(15.75 15.9912)"
/>
</clipPath>
</defs>
</svg>
);
case "instagram":
return (
<svg
width="70"
height="71"
viewBox="0 0 70 71"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_4744_318)">
<path
d="M44.1992 15.9912H26.5932C20.6143 15.9912 15.75 20.8481 15.75 26.8178V44.3964C15.75 50.3663 20.6143 55.223 26.5932 55.223H44.1992C50.1786 55.223 55.0429 50.3661 55.0429 44.3964V26.8178C55.0431 20.8481 50.1786 15.9912 44.1992 15.9912ZM51.5568 44.3964C51.5568 48.447 48.2563 51.7422 44.1994 51.7422H26.5932C22.5366 51.7424 19.2363 48.447 19.2363 44.3964V26.8178C19.2363 22.7675 22.5366 19.472 26.5932 19.472H44.1992C48.2561 19.472 51.5566 22.7675 51.5566 26.8178V44.3964H51.5568Z"
fill="#303030"
/>
<path
d="M35.3965 25.4987C29.8136 25.4987 25.2717 30.0335 25.2717 35.6077C25.2717 41.1817 29.8136 45.7163 35.3965 45.7163C40.9794 45.7163 45.5213 41.1817 45.5213 35.6077C45.5213 30.0335 40.9794 25.4987 35.3965 25.4987ZM35.3965 42.2352C31.7362 42.2352 28.758 39.2621 28.758 35.6075C28.758 31.9526 31.7359 28.9793 35.3965 28.9793C39.0571 28.9793 42.035 31.9526 42.035 35.6075C42.035 39.2621 39.0568 42.2352 35.3965 42.2352Z"
fill="#303030"
/>
<path
d="M45.9459 22.5472C45.2742 22.5472 44.6144 22.8187 44.14 23.2945C43.6633 23.7679 43.3893 24.4269 43.3893 25.0999C43.3893 25.7707 43.6635 26.4295 44.14 26.9052C44.6141 27.3786 45.2742 27.6525 45.9459 27.6525C46.6199 27.6525 47.2776 27.3786 47.7541 26.9052C48.2305 26.4295 48.5024 25.7705 48.5024 25.0999C48.5024 24.4269 48.2305 23.7679 47.7541 23.2945C47.2799 22.8187 46.6199 22.5472 45.9459 22.5472Z"
fill="#303030"
/>
</g>
<circle
cx="35"
cy="35.2412"
r="34"
stroke="#303030"
strokeWidth="2"
/>
<defs>
<clipPath id="clip0_4744_318">
<rect
width="39.2931"
height="39.232"
fill="white"
transform="translate(15.75 15.9912)"
/>
</clipPath>
</defs>
</svg>
);
case "twitter":
return (
<svg
width="70"
height="71"
viewBox="0 0 70 71"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle
cx="35"
cy="35.2412"
r="34"
stroke="#303030"
strokeWidth="2"
/>
<path
d="M59.9828 20.554C58.1893 21.3407 56.2783 21.8622 54.2859 22.1154C56.3356 20.8916 57.9 18.9686 58.6354 16.6506C56.7244 17.79 54.6145 18.5948 52.3659 19.0439C50.5513 17.1118 47.9651 15.9152 45.1438 15.9152C39.67 15.9152 35.2632 20.3581 35.2632 25.8048C35.2632 26.5885 35.3295 27.342 35.4923 28.0594C27.2725 27.6585 19.9992 23.719 15.1132 17.7177C14.2602 19.1976 13.7598 20.8916 13.7598 22.7152C13.7598 26.1394 15.5231 29.1747 18.1515 30.932C16.563 30.9018 15.0047 30.4407 13.6845 29.7142C13.6845 29.7444 13.6845 29.7836 13.6845 29.8227C13.6845 34.6274 17.1116 38.6182 21.6058 39.5376C20.801 39.7576 19.9239 39.8631 19.0136 39.8631C18.3806 39.8631 17.7416 39.8269 17.1418 39.6943C18.4228 43.6098 22.058 46.4883 26.3803 46.5818C23.0165 49.2132 18.7453 50.7987 14.1215 50.7987C13.3107 50.7987 12.533 50.7625 11.7554 50.663C16.135 53.4873 21.3255 55.0999 26.9229 55.0999C45.1167 55.0999 55.0636 40.0289 55.0636 26.9653C55.0636 26.5282 55.0485 26.1062 55.0274 25.6872C56.9897 24.2947 58.6385 22.5555 59.9828 20.554Z"
fill="#303030"
/>
</svg>
);
case "youtube":
return (
<svg
width="70"
height="71"
viewBox="0 0 70 71"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle
cx="35"
cy="35.2412"
r="34"
stroke="#303030"
strokeWidth="2"
/>
<path
d="M55.6054 24.7388C55.0895 22.8207 53.5772 21.3087 51.6594 20.7922C48.1558 19.8336 34.1412 19.8336 34.1412 19.8336C34.1412 19.8336 20.1271 19.8336 16.6235 20.7559C14.7426 21.2718 13.1934 22.821 12.6775 24.7388C11.7555 28.2421 11.7555 35.5075 11.7555 35.5075C11.7555 35.5075 11.7555 42.8096 12.6775 46.2763C13.194 48.1941 14.7057 49.7061 16.6238 50.2225C20.164 51.1814 34.1417 51.1814 34.1417 51.1814C34.1417 51.1814 48.1558 51.1814 51.6594 50.2592C53.5775 49.743 55.0895 48.231 55.6059 46.3132C56.5277 42.8096 56.5277 35.5444 56.5277 35.5444C56.5277 35.5444 56.5646 28.2421 55.6054 24.7388ZM29.6792 42.2196V28.7955L41.3331 35.5075L29.6792 42.2196Z"
fill="#303030"
/>
</svg>
);
case "mastercard":
return <img src={iconMaster} alt="icone Master Card" />;
case "visa":
return <img src={iconVisa} alt="icone Visa" />;
case "dinners":
return <img src={iconDiners} alt="icone Diners" />;
case "elo":
return <img src={iconElo} alt="icone Elo" />;
case "hipercard":
return <img src={iconHiper} alt="icone Hiper Card" />;
case "paypal":
return <img src={iconPayPal} alt="icone PayPal" />;
case "boleto":
return <img src={iconBoleto} alt="icone Boleto" />;
case "vtexPci":
return <img src={iconVtexPCI} alt="icone Vtex PCI 200" />;
case "iconvtex":
return <img src={iconVtex} alt="icone Vtex" />;
case "iconM3":
return <img src={iconM3} alt="icone M3" />;
case "linkedin":
return (
<svg
width="70"
height="71"
viewBox="0 0 70 71"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle
cx="35"
cy="35.2412"
r="34"
stroke="#303030"
strokeWidth="2"
/>
<g clipPath="url(#clip0_4744_333)">
<path
d="M26.8893 27.9594H20.5962C20.3169 27.9594 20.0906 28.1858 20.0906 28.465V48.6821C20.0906 48.9614 20.3169 49.1877 20.5962 49.1877H26.8893C27.1686 49.1877 27.3949 48.9614 27.3949 48.6821V28.465C27.3949 28.1858 27.1686 27.9594 26.8893 27.9594Z"
fill="#303030"
/>
<path
d="M23.7451 17.9089C21.4553 17.9089 19.5924 19.7698 19.5924 22.0571C19.5924 24.3454 21.4553 26.2069 23.7451 26.2069C26.0331 26.2069 27.8944 24.3453 27.8944 22.0571C27.8945 19.7698 26.0331 17.9089 23.7451 17.9089Z"
fill="#303030"
/>
<path
d="M42.8963 27.4569C40.3688 27.4569 38.5004 28.5435 37.3671 29.7781V28.465C37.3671 28.1858 37.1408 27.9594 36.8615 27.9594H30.8347C30.5554 27.9594 30.3291 28.1858 30.3291 28.465V48.6821C30.3291 48.9614 30.5554 49.1877 30.8347 49.1877H37.1141C37.3934 49.1877 37.6197 48.9614 37.6197 48.6821V38.6793C37.6197 35.3086 38.5353 33.9955 40.8849 33.9955C43.4439 33.9955 43.6473 36.1006 43.6473 38.8528V48.6822C43.6473 48.9615 43.8736 49.1878 44.1529 49.1878H50.4346C50.7139 49.1878 50.9402 48.9615 50.9402 48.6822V37.5928C50.9402 32.5807 49.9845 27.4569 42.8963 27.4569Z"
fill="#303030"
/>
</g>
<defs>
<clipPath id="clip0_4744_333">
<rect
width="31.3478"
height="31.3478"
fill="white"
transform="translate(19.5924 17.8744)"
/>
</clipPath>
</defs>
</svg>
);
}
}

View File

@ -0,0 +1,16 @@
interface LogoM3AcademyProps {
link: string;
src: string;
alt: string;
}
export function LogoM3Academy(props: LogoM3AcademyProps) {
const {link, src, alt } = props;
return (
<a href={link}>
<figure>
<img src={src} alt={alt} />
</figure>
</a>
);
}

View File

@ -1,70 +1,38 @@
import imgHome from "../../assets/home 1.svg";
import imgArrowRight from "../../assets/arrow-point-to-right (3).svg";
import { useState } from "react"
import { Routes, Route } from "react-router-dom"
import { Contato } from "../../pages/Contato";
import { Entrega } from "../../pages/Entrega";
import { FormaPagamento } from "../../pages/FormaPagamento";
import { SegurancaPrivacidade } from "../../pages/SegurancaPrivacidade";
import { Sobre } from "../../pages/Sobre";
import { TrocaDevolucao } from "../../pages/TrocaDevolucao";
import { SideBar } from "../SideBar";
import style from "./style.module.css";
export function Main() {
const [selectedLinkId, setSelectedLinkId] = useState("");
function handleClickLink(uid?: string) {
if(uid) {
setSelectedLinkId(uid);
}
}
return (
<main className={style.containerMain}>
<div className={style.contentWrapper}>
<div className={style.contentBreadCrumb}>
<img src={imgHome} alt="Casinha" />
<img src={imgArrowRight} alt="seta para a direita" />
<span>institucional</span>
</div>
<div className={style.contentMain}>
<h1> INSTITUCIONAL</h1>
<aside>
<ul>
<a href="/">
<li className={style.active}>Sobre</li>
</a>
<a href="/">
<li>Forma de Pagamento</li>
</a>
<a href="/">
<li>Entrega</li>
</a>
<a href="/">
<li>Troca e Devolução</li>
</a>
<a href="/">
<li>Segurança e Privacidade</li>
</a>
<a href="/">
<li>Contato</li>
</a>
</ul>
</aside>
<div className={style.contentInfoList}>
<h2>Sobre</h2>
<div className={style.dataList}>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
Sed ut perspiciatis unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam, eaque ipsa
quae ab illo inventore veritatis et quasi architecto beatae
vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia
voluptas sit aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos qui ratione voluptatem sequi
nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor
sit amet, consectetur, adipisci velit, sed quia non numquam eius
modi tempora incidunt ut labore et dolore magnam aliquam quaerat
voluptatem. Ut enim ad minima veniam, quis nostrum
exercitationem ullam corporis suscipit laboriosam, nisi ut
aliquid ex ea commodi consequatur? Quis autem vel eum iure
reprehenderit qui in ea voluptate velit esse quam nihil
molestiae consequatur, vel illum qui dolorem eum fugiat quo
voluptas nulla pariatur?
</p>
</div>
</div>
<SideBar handleClickLink={handleClickLink} selectedLinkId={selectedLinkId}/>
<Routes>
<Route path="/" element={<Sobre />} />
<Route path="/forma-de-pagamento" element={<FormaPagamento />} />
<Route path="/entrega" element={<Entrega />} />
<Route path="/troca-e-devolucao" element={<TrocaDevolucao />} />
<Route path="/seguranca-e-privacidade" element={<SegurancaPrivacidade />} />
<Route path="/contato" element={<Contato />} />
</Routes>
</div>
</div>
</main>

View File

@ -15,24 +15,6 @@
padding: 1.375rem 0 0;
}
.contentBreadCrumb {
display: flex;
justify-content: flex-start;
align-items: center;
width: 100%;
}
.contentBreadCrumb span {
font-size: 24px;
font-weight: 400;
text-transform: uppercase;
color: var(--gray-300);
}
.contentBreadCrumb img, .contentBreadCrumb span {
margin-right: 0.547rem;
}
.contentMain {
width: 100%;
display: grid;
@ -70,32 +52,7 @@
font-weight: 400;
}
.contentMain aside ul li.active{
background-color: var(--black);
color: var(--white);
font-weight: 700;
}
.contentMain aside ul a{
text-decoration: none;
}
.contentInfoList {
grid-area: contentInfo;
margin-left: 1.875rem;
}
.contentInfoList h2 {
margin: 0.75rem 0;
font-weight: 700;
color: var(--gray-1300);
font-size: 48px;
}
.dataList p {
color: var(--gray-900);
font-weight: 400;
line-height: 30.47px;
font-size: 26px;
}

View File

@ -0,0 +1,21 @@
import { AnchorHTMLAttributes } from "react";
import { Link } from "react-router-dom";
interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement>{
uid?: string;
slug: string;
text: string;
icon?: string;
alt?: string;
}
export function LinkPath({ slug, text, icon, alt, ...rest}: LinkProps) {
return (
<Link to={`/${slug}`} {...rest}>
<li>
{icon && <img src={icon} alt={alt} />}
{text}
</li>
</Link>
);
}

View File

@ -0,0 +1,34 @@
import { LinkPath } from "./LinkPath";
interface NavigationProps {
links: LinkProps[];
}
interface LinkProps {
uid?: string;
slug: string;
text: string;
icon?: string;
alt?: string;
}
export function NavigationLinks(props: NavigationProps) {
const { links} = props;
return (
<nav>
<ul>
{links.map((info: LinkProps, index) => (
<LinkPath
key={index}
alt={info.alt}
icon={info.icon}
slug={info.slug}
text={info.text}
/>
))}
</ul>
</nav>
);
}

View File

@ -0,0 +1,71 @@
import { Link, useLocation } from "react-router-dom";
import style from "./style.module.css";
interface SidebarProps {
selectedLinkId: string;
handleClickLink: (uid?: string) => void;
}
export function SideBar({ selectedLinkId, handleClickLink }: SidebarProps) {
const location = useLocation()
const pathAtual = location.pathname
const pathAtualFormatted = pathAtual.split("/")[1]
const linksInfoAsside = [
{
uid: "1",
slug: "",
text: "Sobre",
},
{
uid: "2",
slug: "forma-de-pagamento",
text: "Forma de Pagamento",
},
{
uid: "3",
slug: "entrega",
text: "Entrega",
},
{
uid: "4",
slug: "troca-e-devolucao",
text: "Troca e Devolução",
},
{
uid: "5",
slug: "seguranca-e-privacidade",
text: "Segurança e Privacidade",
},
{
uid: "6",
slug: "contato",
text: "Contato",
},
];
return (
<aside>
<nav>
<ul>
{linksInfoAsside.map((info) => (
<Link
onClick={()=> handleClickLink(info.uid)}
key={info.uid}
to={`/${info.slug}`}
>
<li
className={
selectedLinkId === info.uid ||
pathAtualFormatted === info.slug ? style.active : ""
}>
{info.text}
</li>
</Link>
))}
</ul>
</nav>
</aside>
);
}

View File

@ -0,0 +1,5 @@
.active{
background-color: var(--black);
color: var(--white) !important;
font-weight: 700 !important;
}

View File

@ -0,0 +1,13 @@
import { Icon } from "../Icon";
import style from "./style.module.css";
export function TopButton() {
return (
<a className={style.topButton} href="#top">
<span>
<Icon name="arrowTop" />
</span>
</a>
)
}

View File

@ -0,0 +1,12 @@
.topButton {
display: flex;
justify-content: center;
align-items: center;
position: fixed;
right: 30px;
bottom: 140px;
width: 66px;
height: 66px;
background-color: var(--gray-300);
border-radius: 50%;
}

View File

@ -0,0 +1,13 @@
import { Icon } from "../Icon";
import style from "./style.module.css";
export function WhatsappButton() {
return (
<a className={style.WhatsappButton} href="/">
<span>
<Icon name="whatsapp"/>
</span>
</a>
)
}

View File

@ -0,0 +1,7 @@
.WhatsappButton {
position: fixed;
right: 30px;
bottom: 220px;
width: 66px;
height: 66px;
}

View File

@ -0,0 +1,40 @@
import { Icon } from "../Icon";
import { ButtonHTMLAttributes } from "react";
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
title?: string;
iconName:
| "search"
| "miniCart"
| "home"
| "arrowRight"
| "whatsapp"
| "arrowTop"
| "facebook"
| "instagram"
| "twitter"
| "youtube"
| "mastercard"
| "visa"
| "dinners"
| "elo"
| "hipercard"
| "paypal"
| "boleto"
| "vtexPci"
| "iconvtex"
| "iconM3"
| "linkedin";
}
export function Button({iconName, title, ...rest }: ButtonProps) {
return (
<button {...rest}>
<Icon name={iconName} />
{title}
</button>
);
}

View File

@ -32,4 +32,5 @@ body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-weight: 400;
}
position: relative;
}

136
src/pages/Contato/index.tsx Normal file
View File

@ -0,0 +1,136 @@
import { Formik, Field, Form } from "formik";
import * as Yup from "yup";
import style from "./style.module.css";
const schema = Yup.object().shape({
name: Yup.string().required('*Campo Obrigatório'),
email: Yup.string().email('*E-mail inválido').required('*Campo Obrigatório'),
cpf: Yup.string().required('*Campo Obrigatório').min(11,'*Número incorreto'),
date: Yup.string().required('*Campo Obrigatório'),
phone: Yup.string().required('*Campo Obrigatório').min(11, '*Número incorreto'),
instagram: Yup.string(),
accept: Yup.boolean().required('*')
})
export function Contato() {
return (
<div className={style.contentInfoList}>
<h2>Preencha o formulário</h2>
<div className={style.dataList}>
<Formik
validationSchema={schema}
initialValues={
{
name: '',
email: '',
cpf: '',
date: '',
phone: '',
instagram: '',
accept: '',
}
}
onSubmit={(values, actions) => {
actions.resetForm()
}}
>
{({values, errors}) => (
<Form className={style.formContent}>
<div className={style.contentInput}>
<label htmlFor="name">Nome</label>
<Field
id="name"
name="name"
placeholder="Seu nome completo"
type="text"
/>
{errors.name && (
<span>{errors.name}</span>
)}
</div>
<div className={style.contentInput}>
<label htmlFor="email">E-mail</label>
<Field
id="email"
name="email"
placeholder="Seu e-mail"
type="email"
/>
{errors.email && (
<span>{errors.email}</span>
)}
</div>
<div className={style.contentInput}>
<label htmlFor="cpf">CPF</label>
<Field
id="cpf"
name="cpf"
placeholder="000.000.000-00"
type="text"
/>
{errors.cpf && (
<span>{errors.cpf}</span>
)}
</div>
<div className={style.contentInput}>
<label htmlFor="date">Data de Nascimento</label>
<Field
id="date"
name="date"
placeholder="00.00.0000"
type="text"
/>
{errors.date && (
<span>{errors.date}</span>
)}
</div>
<div className={style.contentInput}>
<label htmlFor="phone">Telefone</label>
<Field
id="phone"
name="phone"
placeholder="(00) 00000-0000"
type="text"
/>
{errors.phone && (
<span>{errors.phone}</span>
)}
</div>
<div className={style.contentInput}>
<label htmlFor="instagram">Instagram</label>
<Field
id="instagram"
name="instagram"
placeholder="@seuuser"
type="text"
/>
</div>
<div className={style.contentCheckbox}>
<Field
id="accept1"
name="accept"
type="checkbox"
className={style.checkbox}
/>
{errors.accept && (
<span>{errors.accept}</span>
)}
<label htmlFor="accept1">Declaro que li e aceito</label>
</div>
<button type="submit">CADASTRE-SE</button>
</Form>
)}
</Formik>
</div>
</div>
);
}

View File

@ -0,0 +1,125 @@
.contentInfoList {
grid-area: contentInfo;
margin-left: 1.875rem;
}
.contentInfoList h2 {
margin: 0.75rem 0;
font-weight: 700;
color: var(--gray-1300);
font-size: 48px;
}
.dataList p {
color: var(--gray-900);
font-weight: 400;
line-height: 30.47px;
font-size: 26px;
}
.formContent button[type="submit"] {
background-color: var(--black);
color: var(--white);
font-size: 32px;
text-transform: uppercase;
width: 100%;
border-radius: 1.563rem;
padding: 1rem;
line-height: 32.81px;
font-family: "Roboto";
}
.contentInput {
display: flex;
flex-direction: column;
width: 100%;
margin-bottom: 0.75rem;
position: relative;
}
.contentInput label{
font-size: 28px;
color: var(--black2);
margin-bottom: 0.75rem;
}
.contentInput input{
border: 1px solid var(--black2);
border-radius: 1.563rem;
padding: 0.938rem 1.25rem;
font-size: 28px;
}
.contentInput input::placeholder {
font-size: 28px;
color: var(--gray-700);
}
.contentInput span{
color: var(--red);
font-size: 24px;
position: absolute;
top: 17px;
right: 22px;
}
.contentCheckbox {
display: flex;
justify-content: center;
align-items: center;
vertical-align: middle;
cursor: pointer;
margin-bottom: 0.75rem;
}
.checkbox {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.contentCheckbox label {
position: relative;
display: inline-block;
font-size: 28px;
color: var(--black2);
text-decoration: underline;
}
.contentCheckbox label::before {
content: "";
display: inline-block;
vertical-align: middle;
height: 2.197rem;
width: 2.275rem;
background: var(--white);
border: 1px solid var(--black);
transition: all 0.2s ease;
position: absolute;
top: 50%;
right: -45px;
transform: translate(0, -50%);
border-radius: 0.188rem;
}
.contentCheckbox label:focus::before, .checkbox label:hover::before {
background: var(--gray-300);
}
.contentCheckbox input:checked + label::before {
background: var(--black);
border-color: var(--black);
}
.contentCheckbox input:checked + label::after {
opacity: 1;
}
.contentCheckbox span {
color: var(--red);
font-size: 24px;
}

View File

@ -0,0 +1,33 @@
import style from "./style.module.css";
export function Entrega() {
return (
<div className={style.contentInfoList}>
<h2>Entrega</h2>
<div className={style.dataList}>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum. Sed ut
perspiciatis unde omnis iste natus error sit voluptatem accusantium
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo
inventore veritatis et quasi architecto beatae vitae dicta sunt
explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut
odit aut fugit, sed quia consequuntur magni dolores eos qui ratione
voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum
quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam
eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat
voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate
velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum
fugiat quo voluptas nulla pariatur?
</p>
</div>
</div>
);
}

View File

@ -0,0 +1,18 @@
.contentInfoList {
grid-area: contentInfo;
margin-left: 1.875rem;
}
.contentInfoList h2 {
margin: 0.75rem 0;
font-weight: 700;
color: var(--gray-1300);
font-size: 48px;
}
.dataList p {
color: var(--gray-900);
font-weight: 400;
line-height: 30.47px;
font-size: 26px;
}

View File

@ -0,0 +1,33 @@
import style from "./style.module.css";
export function FormaPagamento() {
return (
<div className={style.contentInfoList}>
<h2>Forma de Pagamento</h2>
<div className={style.dataList}>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum. Sed ut
perspiciatis unde omnis iste natus error sit voluptatem accusantium
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo
inventore veritatis et quasi architecto beatae vitae dicta sunt
explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut
odit aut fugit, sed quia consequuntur magni dolores eos qui ratione
voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum
quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam
eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat
voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate
velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum
fugiat quo voluptas nulla pariatur?
</p>
</div>
</div>
);
}

View File

@ -0,0 +1,18 @@
.contentInfoList {
grid-area: contentInfo;
margin-left: 1.875rem;
}
.contentInfoList h2 {
margin: 0.75rem 0;
font-weight: 700;
color: var(--gray-1300);
font-size: 48px;
}
.dataList p {
color: var(--gray-900);
font-weight: 400;
line-height: 30.47px;
font-size: 26px;
}

View File

@ -0,0 +1,33 @@
import style from "./style.module.css";
export function SegurancaPrivacidade() {
return (
<div className={style.contentInfoList}>
<h2>Segurança e Privacidade</h2>
<div className={style.dataList}>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum. Sed ut
perspiciatis unde omnis iste natus error sit voluptatem accusantium
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo
inventore veritatis et quasi architecto beatae vitae dicta sunt
explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut
odit aut fugit, sed quia consequuntur magni dolores eos qui ratione
voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum
quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam
eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat
voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate
velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum
fugiat quo voluptas nulla pariatur?
</p>
</div>
</div>
);
}

View File

@ -0,0 +1,18 @@
.contentInfoList {
grid-area: contentInfo;
margin-left: 1.875rem;
}
.contentInfoList h2 {
margin: 0.75rem 0;
font-weight: 700;
color: var(--gray-1300);
font-size: 48px;
}
.dataList p {
color: var(--gray-900);
font-weight: 400;
line-height: 30.47px;
font-size: 26px;
}

38
src/pages/Sobre/index.tsx Normal file
View File

@ -0,0 +1,38 @@
import style from "./style.module.css";
export function Sobre() {
return (
<div className={style.contentInfoList}>
<h2>Sobre</h2>
<div className={style.dataList}>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
</p>
<p>
Sed ut perspiciatis unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae
ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit
aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos
qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui
dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed
quia non numquam eius modi tempora incidunt ut labore et dolore magnam
aliquam quaerat voluptatem
</p>
<p>
Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis
suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis
autem vel eum iure reprehenderit qui in ea voluptate velit esse quam
nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo
voluptas nulla pariatur?
</p>
</div>
</div>
);
}

View File

@ -0,0 +1,19 @@
.contentInfoList {
grid-area: contentInfo;
margin-left: 1.875rem;
}
.contentInfoList h2 {
margin: 0.75rem 0;
font-weight: 700;
color: var(--gray-1300);
font-size: 48px;
}
.dataList p {
color: var(--gray-900);
font-weight: 400;
line-height: 30.47px;
font-size: 26px;
margin-bottom: 1.87rem;
}

View File

@ -0,0 +1,33 @@
import style from "./style.module.css";
export function TrocaDevolucao() {
return (
<div className={style.contentInfoList}>
<h2>Troca e Devolução</h2>
<div className={style.dataList}>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum. Sed ut
perspiciatis unde omnis iste natus error sit voluptatem accusantium
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo
inventore veritatis et quasi architecto beatae vitae dicta sunt
explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut
odit aut fugit, sed quia consequuntur magni dolores eos qui ratione
voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum
quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam
eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat
voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate
velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum
fugiat quo voluptas nulla pariatur?
</p>
</div>
</div>
);
}

View File

@ -0,0 +1,18 @@
.contentInfoList {
grid-area: contentInfo;
margin-left: 1.875rem;
}
.contentInfoList h2 {
margin: 0.75rem 0;
font-weight: 700;
color: var(--gray-1300);
font-size: 48px;
}
.dataList p {
color: var(--gray-900);
font-weight: 400;
line-height: 30.47px;
font-size: 26px;
}

2585
yarn.lock

File diff suppressed because it is too large Load Diff