---
# System prepended metadata

title: Design System

---

# Design System

## Objetivo
A implementação do Design System tem como objetivo tornar mais rápida e fácil a estilização de uma nova loja. 

O Design System traz uma padronização de estilos para que poucas alterações tragam grandes resultados. 

## Aplicação

Para a implementação, a estrutura da plataforma foi dividida em **default**, que são elementos comuns a todas as lojas, e **custom**, que são específicos para o projeto em questão. 

A estilização da loja é aplicada no modelo SASS. Atualmente os arquivos .scss estão subdivididos em default (shared) e custom (nome do projeto). 

Ao começar a estilização de um projeto, procure pelo arquivo designSystem.scss. É neste arquivo que as principais alterações serão feitas. 

A primeira parte define os padrões do projeto, como as cores, tamanhos de fonte, estilo da fonte, alturas e larguras, etc. Os elementos como cores são divididos em principais e auxiliares de forma a englobar o esquema de cores da identidade visual da loja. 

A definição das variáveis principais será feita no início do projeto para que sirva de base para as outras variáveis que serão utilizadas na estilização em outros arquivos do projeto.   

## Nomenclatura de variáveis 
Elas devem seguir o padrão, com prefixo referente a propriedade modificada seguido de uma definição clara do elemento a que esta variável se refere. 

**Exemplo:**
`$CF_HEADER_TOPO_OPCOES_NOME_USUARIO`
(cor de fonte de nome de usuário nas opções do header)

As variáveis serão utilizadas em todos os arquivos do projeto, por isso a importância da nomenclatura objetiva. Esta variável deve ser utilizada para o elemento destinado em todos os locais onde aparece.

O valor das variáveis globais são definidos por variáveis primárias, que são imutáveis, enquanto as globais são mais flexíveis para o projeto.

Continuando o exemplo:

`$CF_HEADER_TOPO_OPCOES_NOME_USUARIO:  $ds-inst-primary;`

No início do documento, a variável  `$ds-inst-primary` é definida como `inst-primary`, que é a cor `#25312A` segundo o design system. 

Logo, o nome do usuário terá a cor `#25312A`. 

A variável `$CF_HEADER_TOPO_OPCOES_NOME_USUARIO` será usada como valor da propriedade `color` no elemento de classe `.nome-usuario` (arquivo header.scss). 

A mesma variável pode ser reutilizada para o nome do usuário no header do mobile, por exemplo, assim quando a cor do nome de usuário precisar ser alterada em algum outro momento basta dar um novo valor a variável e o elemento sofrerá a alteração em todas as partes que ele se encontra. 

Agora utilizando o exemplo da classe `.nome-usuario`, veja as regras de css aplicadas a ela no arquivo específico do header em nosso projeto:
```

 .nome-usuario {
        display: inline-block;
        width: 100%;
        font-weight: 600;
        font-size: $FS_HEADER_TOPO_OPCOES_NOME_USUARIO;
        line-height: $LH_HEADER_TOPO_OPCOES_NOME_USUARIO;
        color: $CF_HEADER_TOPO_OPCOES_NOME_USUARIO;
        text-align: right;
        text-overflow: ellipsis;
        white-space: nowrap;
        border-right: 1px solid $BC_HEADER_TOPO_OPCOES_NOME_USUARIO;
        padding-right: 15px;
        padding-left: 5px;
}
```

As propriedades de `font-size`, `line-height`, `color` e `border color` já estão com as variáveis estabelecidas para o elemento. As propriedades de `padding-right` e `padding-left` ainda não possuem variáveis, mas seria interessante estabelecer as variáveis apropriadas em nosso design system. Já as propriedades `display, width, text-align, text-overflow` e `white-space` são definidas de forma independente para garantir a especificidade deste trecho. 

Para criar variáveis para `padding right` e `left`, iremos ao nosso designSystem.scss então localizamos as variáveis referentes à opção do header topo. 

Neste trecho, criaremos a variável `$PR_HEADER_TOPO_OPCOES_NOME_USUARIO` com o valor 15px para o `padding-right` e a variável `$PL_HEADER_TOPO_OPCOES_NOME_USUARIO` com valor 5px para o `padding-left`. 

Com as devidas variáveis criadas, o mesmo trecho de código fica assim:

 ```
.nome-usuario {
        display: inline-block;
        width: 100%;
        font-weight: 600;
        font-size: $FS_HEADER_TOPO_OPCOES_NOME_USUARIO;
        line-height: $LH_HEADER_TOPO_OPCOES_NOME_USUARIO;
        color: $CF_HEADER_TOPO_OPCOES_NOME_USUARIO;
        text-align: right;
        text-overflow: ellipsis;
        white-space: nowrap;
        border-right: 1px solid $BC_HEADER_TOPO_OPCOES_NOME_USUARIO;
        padding-right: $PR_HEADER_TOPO_OPCOES_NOME_USUARIO;
        padding-left: $PL_HEADER_TOPO_OPCOES_NOME_USUARIO;
}
```

Caso alguma dessas regras precise ser modificada, basta modificar a variável global. 

Este é um exemplo simples, no entanto, é possível perceber a praticidade quando é necessário alterar uma variável compartilhada por vários elementos. 

# Componetização 
Veja abaixo exemplos de componentes utilizados no projeto:
## Cores
Consulte designSystem.scss para saber a paleta de cores utilizadas no layout do projeto.

Para Mondelez, as principais cores são o roxo #4F2170, o laranja #E18719 e os tons auxiliares branco (#FFFFFF) e tons de cinza. 
## Tipografia
Uso de h1, h2, h3 e h4, de acordo com necessidade.

**Parágrafo:** Para textos corridos utilizar Montserrat. Nunca utilizar a Times New Roman para textos corridos.

O tamanho pode ser definido de acordo com o layout aplicado.

# Inputs
Utilize as classes conforme informado acima de cada input.

Para utilizar o componente, é necessário inicializar o mesmo no incío do template, assim não é necessário se preocupar com classes;

```
<?php
    $input = Component::getComponent('Input');
?>
```

e então é chamado desta forma:

```
<? $input->render(
        array(
            'id' => 'Input1',
            'type' => 'text',
            'value' => 'Exemplo de texto 1',
            'mainClass' => 'form-control',
            'invalid' => false,
            'attributes' => array(
                'maxlenght' => 60,
                'placeholder' => 'Exemplo de placeholder',
                'readonly' => 'readonly'
            )
        )
    );
?>
```

os seguintes parâmetros são suportados:

```
array(
    'attributes' => array( // array com atributos tipo disabled, readonly, maxlength, etc
            'class' => 'class'
            'data-value' => '5'
            'disabled' => 'disabled',
            'maxlength' => 20,
            'placeholder' => 'Exemplo de placeholder',
            'id' => 'Input1', // id único para o input
            'name' => 'Input1' // name para o input
            'value' => 'Exemplo de texto 1', // texto exibido no input
            'type' => 'text',  // tipo de input
            ... => ... , qualquer outro atributo....
        )
)
```
### Normal
Exemplo de texto 1 (imagem)

### Inválido
Exemplo de texto 2 (imagem)

### Bloqueado
Exemplo de texto 3 (imagem)

### Readonly
Exemplo de texto 4 (imagem)

### Botão lateral
Exemplo de texto 5 (imagem)

### Input Checkbox
Checkbox para ser utilizado em qualquer lugar

Para utilizar o componente, é necessário inicializar o mesmo no incío do template, assim não é necessário se preocupar com classes;
```
<?php
    $input = Component::getComponent('Input');
?>
```
        
```
<?php
    $input->RenderCheckbox(
        array(

            'label' => 'Rótulo'                   // NÃO OBRIGATÓRIO
            'attributes' => array(                // Atributos do input
                'id' => 'politica-trocas',        // NÃO OBRIGATÓRIO
                'checked' => 'checked',           // NÃO OBRIGATÓRIO
                'disabled' => 'disabled',         // NÃO OBRIGATÓRIO
                ... // qualquer outro atributo
            ),
            'attributesLink' => array (            // NÃO OBRIGATÓRIO  - quando necessário link na label do checkbox
                'id' => 'linkTrocasCancelamentos', // NÃO OBRIGATÓRIO
                'class' => 'link link--no-style',  // NÃO OBRIGATÓRIO
                'href' => '#',                     // NÃO OBRIGATÓRIO
            ),
            'attributesLabel' => array (           // Atributos para label
                'class' => 'ckt__checkbox-termo',  // NÃO OBRIGATÓRIO
                'for' => 'politica-trocas',        // NÃO OBRIGATÓRIO
            ),
        )
    );
?>
```
        
Normal e hover
Selecionado
Bloqueado e Selecionado
Bloqueado
(imagem com os tipos de select)



# Buttons
Utilize as classes conforme informado acima de cada botão;
Todos utilizam como base a classe .btn + as classes de customização. Desta forma, pode ser aplicado a qualquer elemento.

Para utilizar o componente, é necessário inicializar o mesmo no incío do template, assim não é necessário se preocupar com classes;
```
<?php
    $button = Component::getComponent('Button');
?>
```
e então é chamado desta forma:

`<? $button->render(array('label'=> 'button small','sizeDefault' => false,'disabled' => false));?>`

os seguintes parâmetros são suportados:
```
array(
    'attributes' => array(
            'id' => 'btn01', // id único para o botão
            'label' => 'button small', // texto exibido no botão,
            'class' => 'class',
            ... => ... // qualquer outro atributo
            ),
    'fawesome' => array( // quando o botao deve mostrar um icone de font awesome
        'pos' => 'L', // Left ou Right
        'icone' => 'fa fa-search' // a classe de fawesome
        )
)
```

(imagens de todos esses tipos de botões)
.btn .btn-primary 
.btn .btn-secondary 
.btn .btn-small .btn-primary
.btn .btn-small .btn-secondary
.btn .btn-small .btn-primary com icone alinhado a direita
.btn .btn-small .btn-secondary com icone alinhado a esquerda
.btn .btn-primary com icone a direita 
.btn .btn-secondary com icone a esquerda 


# Barra de pesquisa
A busca principal depende dos componentes de input e button.

Para utilizar o componente, é necessário chamá-lo no incío do template;

```
<?php
    $search = Component::getComponent('Search');
?>
```

Então é chamado da seguinte forma:

```
<?php
    $search->render(
        array(
            'action' => '/busca', // URL de destino. Vai para /Busca/Resultado por padrão
            'method' => 'post', // Método usado. Usa GET por padrão
            'class' => 'form-main-search', // classe do formulário
            'placeholder' => 'O que você procura?', // Padrão: Buscar
            'suggestions' => array(
                'title' => 'Produtos sugeridos', // Título apresentado nas sugestões
            ),
        )
    );
?>
```
O que você procura?(imagem da barra de busca)


# Imagens
Para utilizar o componente, é necessário inicializar o mesmo no incío do template.

```
<?php
    $image = Component::getComponent('Image');
?>
```
e então é chamado desta forma:

```
<? $image->render(array('src' => 'path','alt' => 'alt text', 'title' => 'title text'));?>
//os seguintes parâmetros são suportados:
array(
    'otherClass' => 'pera uva', // demais classes que se fazem necessário. Utilize sempre separada por espaço em branco.
    'attributes' => array (
        'id' => 'btn01', // id único para o botão.
        'src' => 'path', // caminho para imagem.
        'alt' => 'image teste', // alt para imagem.
        'title' => 'image teste', // title para imagem.
        'data-fornecedor' => 1,  //
        'data-value' => '2.50'   //
        ... => ... // qualquer outro atributo
    ),
)
```
image teste
image teste
(imagens teste)

# Carousel
```
<?php
    $carousel->RenderCarousel(
        array(
            'otherClass' => 'banner',
            'items' => $data->items,
            'render' => array (
                'component' => $image,
                'method' => 'RenderBanner',
                'params' => array(),
            ),
            'loop' => 'true',
            'nav'  => 'false',
            'dots' => 'true',
            'qtyItems' => '1',
        )
    );?>
```
                    
### Picking
(imagem picking)

### Picking Carousel
(imagem picking carrossel)

# Seleção de Quantidade
Para utilizar o componente, é necessário inicializar o mesmo no incío do template/componente.

```
<?php
    $input = Component::getComponent('Input');
?>
```

e então é chamado desta forma:

`<? $input->RenderSelectQuantity(array('id' => 'xpto','name' => 'xpto'));?>`

os seguintes parâmetros são suportados:

```
array(
    'disabled' => true // desabilita os seletores
    'id' => 'inputXpto', // id único para o input.
    'name' => 'nameInput', // name único para o input
    'otherClass' => 'pera uva', // demais classes que se fazem necessário. Utilize sempre separada por espaço em branco.
    'dataAttribute' => array( //quando necessário criar atributos data para capturar com js. Sempre utilizando chave X valor.
        'fornecedor' => 1,  // ficará assim: data-fornecedor = '1'
        'value' => '2.50'   // ficará assim: data-value = '2.50'
    ),
                
```

(imagem do seletor de quantidades)

# Cards
Card de produto para vitrine ou onde for necessário

Para utilizar o componente, é necessário chamá-lo no incío do template;
```
<?php
    $card = Component::getComponent('Card');
?>
```

Então é chamado da seguinte forma:

```
<?php
    $card->render(
        array(
            'item' => $produto, // OBRIGRATÓRIO  | objeto com o produto completo, contendo todas as suas propriedades.
            'direction' => '' // NÃO OBIRGATÓRIO | pode informar 'row' para altera a disposição e ele ocupar a linha inteira.
            'blockCard' => 'true' // NÃO OBIRGATÓRIO | true ou false, ele irá gerar uma div que bloqueia o card inteiro. Default false quando não informado.
        )
    );
?>
```

(imagens)
Sem estoque/indisponível
BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

(imagens)
Desconto
10%OFF
PROMO
BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

(imagens)
Selos
LíderIndicado-verdeBORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

Além de poder receber a direção via parametro, é possivel utilizar também a classe '.card-row' no início do compomente. Terá o mesmo efeito.

(imagens)
Sem estoque/indisponível
BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

(imagens)
Desconto
10%OFF
PROMO
BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

(imagens)
Selos
LíderIndicado-verdeBORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

# Showcase(Vitrine)
Monta a vitrine

Para utilizar o componente, é necessário chamá-lo no incío do template;

`$showcase = Component::getComponent('Showcase');`

Chama assim:
```
$showcase->Render(
    array(
        'item' => $vitrine, // OBRIGADTÓRIO | item da vitrine
        'otherClass' => 'xuxa', // NÃO OBRIGATÓRIO
        'img'=> array(
            'position'=>'l', //NÃO OBRIGATÓRIO | posição da imagem para banner, l = esquerda, r = direita;
        ),
    )
);
```

(imagens)                
Material escolar
LIDER
BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

10% OFF
BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA

BORRACHA PARA GRAFITES C/ CINTA PLASTICA
BORRACHA PARA GRAFITES C/ CINTA PLASTICA