- Com o objetivo de organizar o projeto estruture o projeto de modo que dentro da pasta "src" existam as pastas dos componentes chamada
componentse a pasta de paginas chamadapages. Na pastacomponentsdevem ser criados os componentes funcionais do projeto e napastapage deve conter cada aba da pagina da lojadrip-store, contendo somente a chamada dos componentes criados. Essa organização facilitará a criação de rotas dentro do arquivoApp.js.
├── src/
│ ├── compoments/
│ │ ├── Header
│ │ ├── Footer
│ │ ├── Logo
│ │ ├── ProductListing
│ │ ├── ProductCard
│ │ ├── ProductOptions
│ │ ├── BuyBox
│ │ ├── Section
│ │ ├── FilterGroup
│ │ └── ProductDetails
│ └── pages/
│ ├── HomePage
│ ├── ProductViewPage
│ └── ProductListingPage
├── App.js
└── index.js
- primary #C92071
- secondary #B5B6F2
- tertiary #991956
- error #EE4266
- success #52CA76
- warning #F6AA1C
Grayscale
- dark-gray #1F1F1F
- dark-gray-2 #474747
- dark-gray-3 #666666
- light-gray #8F8F8F
- light-gray-2 #CCCCCC
- light-gray-3 #F5F5F5
- white #FFFFFF
Introdução
-
O layout é a aparência visual consistente em todas as páginas do sistema. Ele inclui partes que são iguais em todas as telas, como o cabeçalho (uma barra no topo da página) e o rodapé (uma área na parte inferior da página).
-
Para criar o layout, usamos componentes especiais como: o
<Header />, que representa o cabeçalho da página e contém elementos como o logo da aplicação; os links de navegação e; o<Footer />, que é exibido na parte inferior da página e pode incluir informações como direitos autorais e links para redes sociais. -
O componente de layout deverá receber uma prop chamada
children, para renderizar as páginas entre os componentes<Header />e<Footer />. -
O componente de layout deverá ser criado no diretório
src/pages
A estrutura acima descrita pode ser visualizada na imagem a seguir.
- Exemplo de código do componente
<Layout />:
import React from 'react';
// Definindo o componente de layout
const Layout = ({ children }) => {
return (
<div>
{/* Componente do cabeçalho */}
<Header />
{/* Conteúdo dinâmico das páginas */}
{children}
{/* Componente do rodapé */}
<Footer />
</div>
);
};
export default Layout;
Requisitos
- Crie um componente
<Logo />emsrc/componentscapaz de renderizar a imagem da logomarca da aplicação. A imagem encontra-se na pastasrc/assetse ela deverá ter o tamanho de 253 pixels de largura (width) e 44 pixels de altura (height).
- Crie um campo de busca que realize o filtro de produtos da plataforma. O campo deve possuir um ícone de lupa ao lado direito e realizar a busca ao ser clicado ou ao pressionar
Enter, redirecionando para a rota/productscom a query string do filtro.
Ex.: Se uma pessoa usuária escrever microondas no campo de busca, ao clicar no ícone de lupa do campo a página deve ser redirecionada para /products?filter=microondas
Aréa de redirecionamento será um lugar no cabeçalho ao lado do compo de pesquisa que tem como objetivo redirecionar o usuário para as telas de login e cadastro.
- Adicionamento um elemento html de link com o texto Cadastre-se. Esse elemento deve ser renderizado em uma fonte de 16px na cor
dark-gray-2com uma sublinhado na mesma cor. - Adicionamento um elemento html de link Entrar. Esse elemento vai ter uma aparencia de "botão", com um preenchimento na cor
primary, largura de 114px por 40px de altura, bordas arrendondadas em 4px e texto em negrito na corwhitee font de 14px.
O carrinho de compras será some um icone renderizado ao lado da area de redirecionamento, não tem ação de clique e pode ser usado o svg que se encontra no diretorio src/assets
- Crie um componente de navegação com 4 links para as principais páginas da plataforma (Home, Produtos, Categorias, Meus Pedidos).
- Quando o usuário estiver na página correspondente ao link, ele deve ter uma coloração diferente e uma linha horizontal abaixo.
Sugestão: Use o componente NavLink do react-router-dom.
-
O fundo do rodapé deve ser na cor
dark-graye o todos os texto devem ser na corwhitepara garantir boa legibilidade. -
Utilize o componente
<Logo />criado no cabeçalho para renderizar a imagem da logo em cor branca. -
Insira um texto (Lorem ipsum) para preencher a descrição da empresa abaixo da logo.
-
Use os svgs da pasta
src/assets, abaixo da descrição, que redirecionem para as respectivas redes ao serem clicados.
- Crie um componente de informações
- Esse componente deve receber uma propriedade chamada
title, onde será o titulo do componente - Esse componente deve receber uma propriedade chamada
informations, onde será um array de objetos.
[
{
"text": "Sobre Drip Store",
"link": "/about"
},
{
"text": "Blog",
"link": "/blog"
},
...
]- As informações (
informations), devem ser renderizadas dinamicamente de acordo com a quantidade de objetos dentro do array.
- Abaixo de todos os elementos do rodapé, insira um
<hr />e logo abaixo uma parágrafo com data atual com o texto "© 2024 Digital Store" para indicar os direitos autorais da página.
Estrutura
Introdução
Componentes compartilhados são componentes onde serão utilizados em duas ou mais páginas. O objetivo destes componentes são de adicionar flexibilidade para atender as necessidades de diferentes páginas.
Requisitos
Esse componente será criado para estabelecer um padrão nas seções que irão compor as páginas.
Este componente será utilizado sempre que for necessário renderizar uma lista de produtos, de imagens, de ícones ou de qualquer outro conteúdo que precise possuir um título.
- Criar um componente
<Section />emsrc/components - O componente deve ser capaz de renderizar um título em posições diferente, elementos filhos que podem ser passados entre as tags de abertura (
<Section>) e fechamento (</Section>) e opcionalmente um link
Propriedades
- A propriedade
titledeve ser usada para renderizar o título (na cordark-gray-2com uma fonte de 24px) - A propriedade
titleAligndeve receber como valor "left" ou "center" e vai definir as duas posições possíveis para o titulo, se essa propriedade não for informada o título deve assumir o valor "left" como posição padrão. - A propriedade
linkdeve ser usada para renderizar um link (na corprimarycom uma fonte de 18px) do lado direito alinhado vertical com o título. O objeto passado para essa propriedade deve seguir o seguinte padrão{ "text": "Show More", "href": "https://redirect.link" } - A propriedade
childrenvai ter como valor todos os elementos filhos da tag<Section />e deve ser usado para tornar esse componente mais dinâmico e reutilizável.
Um componente para exibir informações principais sobre o produto como nome, preço e preço com desconto.
- Criar um componente
<ProductCard />emsrc/components - O componente deve ser capaz de renderizar imagem, nome, preço e preço com desconto
Propriedades
- A propriedade
imagemdeve ser usada para renderizar a imagem do produto nas dimensões 292x321 pixels. - A propriedade
namedeve ser usada para renderizar o nome do produto logo abaixo da imagem - A propriedade
pricedeve ser usada para renderizar o preço (na cordark-graycom uma fonte de 24px) do produto logo abaixo do nome. - Se for propriedade
priceDiscountfor informada, a renderização depricedeve ser alterada, exibindo um preço na corlight-graye com linha cortando o preço - A propriedade
priceDiscountdeve ser usada para renderizar o preço com desconto (na cordark-graycom uma fonte de 24px)
Estrutura
Esse componente atuará como um encapsulador (wrap), ou seja, um componente que acomodará todos os componentes <ProductCard /> dentro dele.
- Criar componente
<ProductListing />emsrc/components - O componente deve ser capaz de receber um lista de produtos e renderizar usando o componente
<ProductCard />
Propriedades
- A propriedade
productsdeve ser usada em um loop usando o componente<ProductCard />para exibir uma lista de produtos - A propriedade
productsdeve receber como valor um array de objetos seguindo o seguinte padrão[ { name: "Nome do produto 1", image: "https://url.imagem/do/produto1.png", price: 200, priceDiscount: 149.9 }, { name: "Nome do produto 2", image: "https://url.imagem/do/produto2.png", price: 49.9 } ]
Exemplo de slide carrossel.
Neste componente as imagens serão exibidas mediante ao clique em icones de setas.
O componente de galeria é uma forma de exibir uma série de itens em uma interface de usuário, permitindo que o usuário navegue entre eles de forma interativa.
O componente de galleria deve receber uma lista de imagens e mais algumas propriedades opcionais para definir a renderização dessas imagens. Este componente vai sempre exibir um slide de imagens que passa para o lado mediante ao clique dos ícones para direita ou para esquerda. Opcionalmente esse componente renderizará thumbnails, que são miniaturas das imagens, na parte inferior do slide
- Criar um componente
<Gallery />emsrc/components - O componente poderá ter as seguintes propriedades:
classNamepode ser usado para passar nome de classes CSS para o elemento que estiver como pai de todos os outros elementos da galeriawidthpode receber um valor em pixel para definir a largura que o slide de imagens deve ser renderizado. Exemplo:<Gallery width="1440">heightpode receber um valor em pixel para definir a altura que o slide de imagens deve ser renderizado. Exemplo:<Gallery height="681">radiusdeve receber uma strig indicando o valor em pixel do arredondamento das bordas da imagem. Exemplo:<Gallery radius="4px">showThumbsnão recebe valor nenhum, quando essa propriedade existir, o componente deve exibir as imagens em miniaturas (com 117px de largura por 95px de altura) na parte inferior do slide de imagens. Caso a propriedadeshowthumbsnão estiver presente, nenhuma miniatura das imagens deve ser exibida. O valor do atributoradiusdeve ser aplicado para arredondar as bordas das imagens em miniaturas.imagesé a propriedade mais importante para o funcionamento desse componente. Essa propriedade deve receber como valor um array de objetos seguindo esse padrão[ { "src": "http://site.com/path/to/image1.png" } { "src": "http://site.com/path/to/image2.png" } { "src": "http://site.com/path/to/image3.png" } { "src": "http://site.com/path/to/image4.png" } { "src": "http://site.com/path/to/image5.png" } ]
- Internamente o componente
<Gallery />deve renderizar a primeira imagem recebida na propriedadeimagense as imagens seguintes devem ficar "escondidas" e ser exibidas somente quando clicar em umas das setas. - Fixo no lado direito e alinhado verticalmente, deve ser renderizado o ícone de seta para a direita que pode ser encontrado no caminho
assets/icons/arrow-right.svg - Fixo no lado esquerdo e alinhado verticalmente, deve ser renderizado o ícone de seta para a esquerda que pode ser encontrado no caminho
assets/icons/arrow-left.svg - Ao clicar na seta da direita, a imagem atual deve deslizar para a esquerda dando espaço para a próxima imagem ser renderizada
- Ao clicar na seta da esquerda, a imagem atual deve deslizar para a direita dando espaço para a imagem anterior ser renderizada
- Quando a primeira imagem estiver renderizada, a seta da esquerda deve ficar desabilitada
- Quando a última imagem estiver renderizada, a seta da direita deve ficar desabilitada
- Ao selecionar uma miniatura da galeria, a imagem em destaque deve ser alterada para exibir a imagem que está na miniatura
- Uma borda de 2px na cor
primarydeve ser aplicada na miniatura que for selecionada
Introdução
A página inicial renderizará uma galeria de imagens, coleções em destaquee e produtos em alta.
React Router DOM
- Criar um componente `<HomePage />` em `src/pages`
- Esse componente deve ser usado como `element` da rota `/`
- Esse componente deve usar o componente `<Layout />` para garantir a reutilização do header e do footer
Requisitos
Aqui deve ser usado o componente <Gallery /> visto anteriormente informando as seguintes propriedades
imagesrecebe um array de objetos seguindo esse padrãoNo diretório[ {"src": "public/home-slide-1.jpeg"} {"src": "public/home-slide-2.jpeg"} ... ]publicpode ser encontrado mais imagens para usar na galeria da home pagewidthrecebe o valor 1440pxheightrecebe o valor 681px
Usando o componente <Section /> deve ser renderizado 3 imagens na horizontal, com bordas arredondadas em 4px.
Caminho para as imagens que deve ser usadas:
public/collection-1.pngpublic/collection-2.pngpublic/collection-3.png
Para essa listagem de imagens deve ser usado elementos comum de HTML e CSS como filhos do componente <Section />
Propriedades para o componente <Section />
titlerecebe o valor Coleções em destaquetitleAlignreceber o valor center
Usando os componentes <Section /> e <ProductListing /> deve ser renderizado uma listagem de produto exibindo no total 8 produtos.
Propriedades de componente <Section />
titledeve receber o valor Produtos em altatitleAligndeve receber o valor left
Propriedades de componente <ProductListing />
productsdeve receber um array de objetos seguindo esse padrãoMais imagens para a listagem de produtos podem ser encontradas no diretório[ { name: "Nome do produto", image: "public/product-thumb-1.png", price: 200, priceDiscount: 149.9 }, { name: "Nome do produto", image: "public/product-thumb-2.png", price: 49.9 } ... ]public
Introdução
A página de listagem de produtos vai renderizar filtros e um lista de produtos, essa pagina vai ser o destino do campo de pesquisa e no menu *Produtos*. Nessa página o usuário vai poder visualizar todos os produtos e filtrar e ordenar o resultado de produtos marcando diferentes campos de seleção.React Router DOM
- Criar um componente
<ProductListingPage />emsrc/pages - Esse componente deve ser usado como
elementda rota/produtos - Esse componente deve usar o componente
<Layout />para garantir a reutilização do header e do footer
Requisitos
Na lateral esquerda da página deve ser renderizado um campo (com 308px de largura e 60px de altura) de seleção para selecionar a ordem em que os produtos devem ser exibidos.
A label desse campo ter renderizar o texto "Ordenar por" com uma fonte de 16px na cor dark-gray-2
Esse campo de ordenação deve exibir as seguintes opções na cor dark-gray-2
Menor preçodeve ordenar os produtos pelo preço mais baratoMaior preçodeve ordenar os produtos pelo preço mais caro
Ainda na lateral esquerda da página, deve ser renderizado um elemento com preenchimento na cor white com uma largura de 308px e uma altura de acordo com o conteúdo renderizado internamente.
Esse elemento também deve ter um título com o texto "Filtrar por" com uma fonte de 16px e na cor dark-gray-2 e um linha horizontal de 1px na cor light-gray-2 separado o título do campo de filtro.
Campos de filtro
Os campos de filtro devem ser inputs (checkbox ou radio) renderizados na esquerda ao lado da label. Esse inputs devem ter 22px de largura e 22px de altura com um preenchimento na cor primary
- Para os campos de filtro vai ser preciso criar um componente
<FilterGroup />emsrc/components - Esse componente deve aceitar as seguintes propriedades
titledeve receber como valor o título do grupo de filtros e renderizar com uma fonte de 14px na cordark-gray-2inputTypedeve receber como valor o tipo checkbox ou radio que separa repassado para o input dentro do componenteoptionsdeve receber como valor um array de objetos seguindo o seguinte padrão[ {"text": "Options 1", "value": "opt1"} {"text": "Options 2"} {"text": "Options 3", "value": "opt3"} {"text": "Options 4"} ]- O atributo
textdeve ser o conteúdo renderizado como label do input. - O atributo
valuesé opcional e quando existir deve ser usado como value do input.
- O atributo
A lado do campos de filtro e ordenação deve aparecer uma lista de produtos usando os componentes <Section /> e <ProductList />
Propriedades para o componente <Section />
titledeve receber como valor o total de produto encontrados e ir alterando de acordo com os filtro aplicadostitleAligndeve receber left como valor
Propriedades para o componente <ProductListing />
productsdeve receber como valor um array de objetos seguindo o seguinte padrãoMais imagens para a listagem de produtos podem ser encontradas no diretório[ { name: "Nome do produto 1", image: "public/product-thumb-1.png", price: 200, priceDiscount: 149.9 }, { name: "Nome do produto 2", image: "public/product-thumb-2.png", price: 49.9 } ]public
Introdução
Essa página vai exibir informações sobre o produto como imagens, nome, preços, descrição, opções e um call to action com o botão COMPRAR.
Também vai ser renderizado uma lista de produtos relacionados
React Router DOM
- Criar um componente `<ProductViewPage />` em `src/pages`
- Esse componente deve ser usado como `element` da rota `/product/:id`
- Esse componente deve usar o componente `<Layout />` para garantir a reutilização do header e do footer
Requisitos
- Deve ser usado o componente
<Gallery />passando as seguintes propriedadeimagesrecebe o valor de um array de objetosTodas as imagens de exemplo para para usar na galeria de produtos podem ser encontradas na diretório[ {"src": "public/product-image-1.png"}, {"src": "public/product-image-2.png"}, ... ]publicshowThumbsessa propriedade não recebe valor, precisa apenas existir na chamada do componentewidthcom o valor de700pxheightcom o valor de570pxradiuscom o valor de4px
- Esse componente deve ficar ao lado do componente
<BuyBox />
Compone de opção do produto vai ser um componente usado como filho do componente <BuyBox /> para listar variações do produto como tamanhos e cores.
- Criar um componente
<ProductOptions />emsrc/components - Propriedades do componente
optionsrecebe como valor um array listando as opções que devem ser renderizadas Exemplo 1:["39", "41", "42" ... ]Exemplo 2:["#000", "#111", "#111" ... ]radiusrecebe uma string que define o valor do atributoborder-radiusquandoshapetiver como valorsquare. Se o shape forcircleessa propriedade deve ser ignoradashaperecebe como valor "square" ou "circle"squaredeve exibir os itens do arrayoptionsno formato de caixa com largura alto e 46px de altura e borda de 1px na corlight-gray-2. O valor doborder-radiusdessa caixa deve ser o valor informado na propriedaderadiuscircledeve exibir os itens do arrayoptionsno formato de círculo com31pxde largura e31pxaltura.
typerecebe como valor "text" ou "color"textdeve exibir os itens do arrayoptionsda forma como eles são informados, como um tamanho de fonte de 24px e cordark-gray-2colordeve usar os itens do arrayoptionscomo preenchimento de cor do shapesquareoucircle
- Ao selecionar qualquer uma das opções geradas pelo por esse componente, deve ser aplicado uma um borda na cor
pramarycom 2px de largura
O buy box no contexto de loja virtual é um espaço usado para exibir informações claras e objetivas sobre o produto, facilitando assim o fluxo de compra. Geralmente usado em marketplace place para mostrar o melhor preço ou melhor vendedor, o buy box exibe informações como Nome do produto, preço, preço com desconto, valor do frete, avaliações, descrição e outras opções para o mesmo produto como cores e tamanhos.
- Criar um componente
<BuyBox />emsrc/components - Esse componente deve ser capaz de exibir informações sobre o produto por meio das propriedade e dos elementos filhos
- Propriedades do componente
namerecebe o Nome do produto e rederiza com uma fonte de 32px na cordark-grayreferencerecebe o código de referência do produto e renderiza com uma fonte de 12px na cordark-gray-3starsrecebe o total de estrelas que o produto recebeu e renderiza com uma fonte de 14px em um caixa com bordas arredondadas em 4px e preenchimento na corwarning. ao lado do número total de estrelas deve ser exibido um estrela que com um preenchimentowhite. O ícone de estrela pode ser encontrado o caminhosrc/assets/star-icon.svgratingrecebe o total de avaliações do produto e renderiza com uma fonte de 14px na corlight-graypricerecebe o preço original do produto (sem desconto) e renderiza com uma fonte de 32px na cordark-gray-2. Se tiver preço com desconto na propriedadepriceDiscounta renderização depricemuda para ser exibido com uma fonte de 16px na corlight-gray-2com um linha da mesma cor cortando o preço e posicionado ao lado dopriceDiscountpriceDiscountrecebe o preço com desconto e renderiza com uma fonte de 32px na cordark-gray-2ao lado dopricecortadodescriptionrecebe a descrição do produto e renderiza com uma fonte de 14px na cordark-gray-2
- Propriedade
childrenUm produto pode ter variações de cor e tamanho e nesse caso o ideal é passar um componente<ProductOptions />como filho. Outros componentes também podem ser informados como filhos. - Call to action
- No final do buy box deve ter um botão comprar com um preenchimento na cor
warningfonte na corwhitecom 16px
- No final do buy box deve ter um botão comprar com um preenchimento na cor
Para exibir os produtos recomendados vai ser preciso usar dois componentes já explicados anteriormente. e <ProductListing />
- Usar componente
<Section />com as seguintes propriedadestitleque recebe como valor "Produtos recomendados"titleAlignque recebe como valor "left"linkque recebe como valor{ "text": "Ver todos", "href": "/products" }
Dentro do componente <Section /> deve ser passado como filho o componente <ProductListing /> com as seguintes propriedades
productsque recebe como valor[ { name: "Nome do produto 1", image: "https://url.imagem/do/produto1.png", price: 200, priceDiscount: 149.9 }, { name: "Nome do produto 2", image: "https://url.imagem/do/produto2.png", price: 49.9 } ]












