Desafio Front-end da Amaro

Descrição

A empresa Amaro está em busca de um profissional Front-end, para isto ela criou o AMARO front-end challenge que pretente criar um catalogo de produtos para a loja baseado no arquivo products.json.

Para ajudar a inicialização do desafio foi definido uma proposta de layout estático disponível no arquivo code.zip e ilustrado na Figura 1.

Figura 1 - Layout da Página.

Layout da Página

A seguir será descrito alguns componentes para auxiliar a geração dinâmica da página usando as informações do arquivo JSON.

Componentes

COMPONENTE 1 - No arquivo JSON existe um Array de produtos que possui várias informação como nome, preço, valor do parcelamento e URL da imagem:

{
  "name": "VESTIDO TRANSPASSE BOW",
  "style": "20002605",
  "code_color": "20002605_613",
  "color_slug": "tapecaria",
  "color": "TAPEÇARIA",
  "on_sale": false,
  "regular_price": "R$ 199,90",
  "actual_price": "R$ 199,90",
  "discount_percentage": "",
  "installments": "3x R$ 66,63",
  "image": "https://d3l7rqep7l31az.cloudfront.net/images/products/20002605_615_catalog_1.jpg?1460136912",
  "sizes": [
    ...
  ]
}

Usando esses dados crie uma lista de produtos conforme ilustra à Figura 2.

Figura 2 - Lista de produtos.

Lista de produtos

Também considere que o HTML necessário para compor este grid de produtos deve ser este:

<li class="product-item">
  <div class="product-box-image">
    <img
      src="https://d3l7rqep7l31az.cloudfront.net/images/products/20002605_615_catalog_1.jpg?1460136912"
      class="product-image"
    />
  </div>
  <p class="product-name">VESTIDO TRANSPASSE BOW</p>
  <div class="product-price">
    <p class="product-cost">
      <span class="actual-price">R$ 199,90</span>
      <span class="installments">3x R$ 66,63</span>
    </p>
  </div>
</li>

Detalhe, quando a URL da imagem vier vazia use fallbackImage como alternativa.

const fallbackImage =
  'http://dummyimage.com/470x594/fff/000?text=imagem+indisponível';

COMPONENTE 2 - No Array de produto também existem detalhes sobre os seus tamanhos, por exemplo, no primeiro produto, o VESTIDO TRANSPASSE BOW, o JSON descreve:

{
  "name": "VESTIDO TRANSPASSE BOW",
  ...
  "sizes": [
    {
      "available": false,
      "size": "PP",
      "sku": "5807_343_0_PP"
    },
    {
      "available": true,
      "size": "P",
      "sku": "5807_343_0_P"
    },
    {
      "available": true,
      "size": "M",
      "sku": "5807_343_0_M"
    },
    {
      "available": true,
      "size": "G",
      "sku": "5807_343_0_G"
    },
    {
      "available": false,
      "size": "GG",
      "sku": "5807_343_0_GG"
    }
  ]
}

Usando esses dados crie cada produto com os seus tamanhos disponíveis, conforme ilustra à Figura 3, ou seja, do total de 5 tamanhos existentes apenas 3 estão disponíveis.

Figura 3 - Tamanho disponível dos produto.

Tamanho disponível dos produto

Também considere que o HTML necessário para compor cada produto deve conter a lista .product-sizes:

<li class="product-item">
  <div class="product-box-image">
    <img
      src="https://d3l7rqep7l31az.cloudfront.net/images/products/20002605_615_catalog_1.jpg?1460136912"
      class="product-image"
    />
  </div>
  <p class="product-name">VESTIDO TRANSPASSE BOW</p>
  <div class="product-price">
    <p class="product-cost">
      <span class="actual-price">R$ 199,90</span>
      <span class="installments">3x R$ 66,63</span>
    </p>
  </div>
  <ul class="product-sizes">
    <li>
      <a href="#" class="size available">P</a>
    </li>
    <li>
      <a href="#" class="size available">M</a>
    </li>
    <li>
      <a href="#" class="size available">G</a>
    </li>
  </ul>
</li>

COMPONENTE 3 - No JSON cada produto possui o campo on_sale que determina se o produto está em promoção ou não.

Quando o produto não está em promoção o valor total do desconto fica em branco, e o valor original possui o mesmo do final, como é possível ver no produto VESTIDO TRANSPASSE BOW:

{
  "name": "VESTIDO TRANSPASSE BOW",
  "style": "20002605",
  "code_color": "20002605_613",
  "color_slug": "tapecaria",
  "color": "TAPEÇARIA",
  "on_sale": false,
  "regular_price": "R$ 199,90",
  "actual_price": "R$ 199,90",
  "discount_percentage": "",
  "installments": "3x R$ 66,63",
  ...
}

Contudo, quando o produto está na promoção os dados são preenchido conforme o desconto, por exemplo, veja o produto BOLSA FLAP TRIANGLE:

{
  "name": "BOLSA FLAP TRIANGLE",
  "style": "20002945",
  "code_color": "20002945_027",
  "color_slug": "caramelo",
  "color": "CARAMELO",
  "on_sale": true,
  "regular_price": "R$ 199,90",
  "actual_price": "R$ 159,90",
  "discount_percentage": "25%",
  "installments": "3x R$ 53,30",
  ...
}

Então, usando esses dados adapte cada produto que esteja em promoção para que seja exibido conforme à Figura 4.

Figura 4 - Produto na promoção.

Produto na promoção

Considere que o HTML necessário para compor cada produto em promoção deve conter a seguinte estrutura:

<li class="product-item">
  <div class="product-box-image">
    <span class="stamp">25% OFF</span>
    <img
      src="https://d3l7rqep7l31az.cloudfront.net/images/products/20002945_027_catalog_1.jpg?1459540966"
      class="product-image"
    />
  </div>
  <p class="product-name">BOLSA FLAP TRIANGLE</p>
  <div class="product-price">
    <p class="product-cost">
      <span class="actual-price">R$ 159,90</span>
      <span class="installments">3x R$ 53,30</span>
    </p>
    <p class="product-sale">
      <del class="regular-price">R$ 199,90</del>
      <span class="stamp">(25% OFF)</span>
    </p>
  </div>
  <ul class="product-sizes">
    <li>
      <a href="#" class="size available">U</a>
    </li>
  </ul>
</li>

COMPONENTE 4 - Pensando em facilitar apenas a listagem dos produtos em promoção o layout propõe a criação de um botão PROMOÇÃO no topo da página, ao ativá-lo a ação do catálogo deve ser filtrar os produtos conforme ilusta a Figura 5. Perceba que na parte superior também existe uma indição do total de itens listados.

Figura 5 - Filtro de produtos.

Filtro de produtos

Códigos

Editar esta página