# 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