Introducing Cell Atoms & Molecules

Cell é uma biblioteca que desenvolvi para ajudar na criação de componentes UI usando Sass. Este artigo será uma pequena introdução a alguns conceitos que (se você está familiarizado com Sass) deve se sentir familiarizado. Estes conceitos são chamados Cell Atoms e Cell Molecules.

A Cell Atom é uma propriedade CSS única que produz dois valores diferentes que serão aplicados a um elemento com base em algum contexto passado. Neste caso, contexto pode significar coisas como a presença de certos modificadores/seudo-estados, ou se o elemento/algum elemento pai está ou não pairando, etc. Isto é mais útil quando se alterna propriedades com base em algum evento ou interação.

Um exemplo pode ser usar a propriedade display para esconder/mostrar um elemento. Se o valor da propriedade display é ou não none ou algo como block dependerá do contexto ou condição em questão. No Sass simples, isto pode parecer algo como:

…que mostraria o elemento quando ele tem a classe active. Se quiséssemos mostrar o elemento quando um pai específico tivesse a classe active, isto poderia parecer algo como:

Podemos representar este exemplo usando algum CSS-in-JS API, que poderia parecer algo como:

API retirado da biblioteca Lucid

…aqui podemos ver como no exemplo JavaScript apenas definimos uma display propriedade, com o valor sendo dinâmico. Este valor seria reavaliado toda vez que o objeto context mudasse, com o elemento sendo repintado de acordo.

No exemplo Sass, dada a natureza em cascata do CSS (e a falta de dinamismo), definimos múltiplas propriedades display em cascata, e deixamos a batalha da especificidade determinar o resto. Como Sass tem funções, poderíamos pensar em contornar isso criando um costume context função para imitar o comportamento do CSS em SSS, algo como:

No entanto, isso nunca poderia funcionar – isso só poderia compilar para uma única regra do CSS (usando qualquer valor avaliado em tempo de compilação). Sass poderia avaliar context('.someParent.active', block, none) apenas uma vez antes de ser enviado para o cliente, e assim criar apenas uma única regra CSS; enquanto JavaScript poderia avaliar context.someParent.active ? 'block' : 'none' na hora.

O melhor que poderíamos fazer seria ter Mixins separados para cada propriedade de interesse. Este Mixin seria conhecido como um Átomo Celular. Se usando Cell e o display Atom, o exemplo acima poderia ser reduzido para:

…que como você pode ver é agora muito semelhante à versão CSS-in-JS, deixando-nos com menos código que é igualmente legível. Isto poderia agora, por baixo do título, produzir quantas propriedades CSS em quantas regras quisermos. O código acima seria açúcar sintáctico para:

…e de facto, cada instância de um Átomo de Célula seria representada por debaixo do capô de forma semelhante à acima (com o contexto que é passado para o Átomo sendo encaminhado para a context Mixin).

Este conceito é útil para certos casos onde contextos específicos requerem apenas uma única propriedade CSS a ser modificada, sendo o hide/show exemplo o caso de uso mais comum que eu poderia pensar. Se você precisasse aplicar múltiplas propriedades CSS a um elemento baseado em algum contexto/condição passada, você deveria usar o context Mixin.

Obviamente, você pode estar pensando que ter Mixins separados para cada propriedade é exagero, e você estaria certo, já que existem, o quê, como 800 propriedades CSS? No entanto a maioria das propriedades CSS não devem ser usadas desta forma – apenas propriedades que afetam o layout/funcionalidade (e mesmo assim, apenas quando a propriedade única controla um único comportamento, como hide/show). Como tal, Cell atualmente só vem com Atoms para display, position e visibility propriedades.

Cell Molecules

A Cell Molecule é essencialmente apenas uma Sass Mixin regular que produz uma ou mais regras CSS baseadas em algum contexto/condição passada para alcançar um único resultado específico. O objetivo é abstrair padrões recorrentes em Mixins componíveis, melhorando a clareza e a manutenção da sua base de códigos Sass. Nenhuma propriedade ou valor CSS é passada ao usar (chamando) Cell Molecules, ao contrário de Cell Atoms.

Esta é bastante similar em princípio à biblioteca Bourbon Sass (a diferença é que uma Cell Molecule pega uma entrada de contexto e irá emitir múltiplas regras orientadas a contexto). Tomando o exemplo anterior hide/show, isto poderia ser abstraído em uma Cell Molecule e usado assim:

…essencialmente dizendo à Cell “Hide this element unless the passed condition is met, in which case show it”. A funcionalidade requerida (isto é, aplicando none ou block valores) ele manipularia sob a condição passada pelo hipotético show Mixin. O acima seria açúcar sintático para:

…equivalente (em princípio) a este exemplo anterior de baunilha Sass que vimos:

Não há uma maneira realmente difícil de qualificar algum conjunto CSS como uma Molécula Celular; pode ser qualquer padrão abstrato e recorrente que requer um estado padrão que muda com base em algum contexto.

Cell Molecules são apenas uma filosofia/conceito; não há atualmente nenhuma biblioteca de Moléculas Celulares ou qualquer outra coisa

Visitar a Wiki Celular para mais informações sobre a biblioteca de células

Conclusão

Alguns Átomos Celulares e Moléculas servem diferentes propósitos, o objetivo final de ambos é manter os estilos mais componíveis. Ao usar Cell e identificar os Atoms e Molecules dentro da sua base de código (ou prever/anticipar deles se criar um novo projeto/featureza) você pode garantir que sua base de código é mais concisa e semântica, e menos repleta de várias propriedades CSS que sem dúvida serão colocadas em nenhuma ordem real.

Dando uma olhada nos vários exemplos deste artigo lado a lado podemos ter uma melhor compreensão das motivações por trás destes conceitos (lembre-se que todos estes exemplos atingem a mesma coisa):

Em muitos casos você precisaria considerar se há necessidade de criar uma Molecule para algo – no exemplo acima onde a Molecule afeta apenas uma única propriedade CSS pode ser mais pragmático ficar usando a display Atom.

Deixe uma resposta

O seu endereço de email não será publicado.