{"id":149,"date":"2024-07-20T17:23:39","date_gmt":"2024-07-20T20:23:39","guid":{"rendered":"https:\/\/alice.com.br\/tech\/sem-categoria\/qual-a-melhor-forma-de-escrever-css-no-vue\/"},"modified":"2026-01-22T10:46:54","modified_gmt":"2026-01-22T13:46:54","slug":"qual-a-melhor-forma-de-escrever-css-no-vue","status":"publish","type":"post","link":"https:\/\/alice.com.br\/tech\/qual-a-melhor-forma-de-escrever-css-no-vue\/","title":{"rendered":"Melhor forma de escrever CSS no Vue"},"content":{"rendered":"<p>Vamos l\u00e1, CSS n\u00e3o \u00e9 a coisa mais f\u00e1cil do mundo. Existem diversas formas de resolver o mesmo problema, os browsers nem sempre possuem o mesmo comportamento, j\u00e1 chegamos num n\u00edvel onde \u00e9 imposs\u00edvel saber todas as regras que existem, etc. Na expectativa de ajudar o desenvolvimento, temos pr\u00e9-processadores, p\u00f3s-processadores, vari\u00e1veis e metodologias para organiza\u00e7\u00e3o das classes, para citar alguns exemplos das ferramentas que temos para facilitar o uso do\u00a0CSS.<\/p>\n<p>Mas \u00e9 claro, como quase tudo no mundo do frontend, as op\u00e7\u00f5es n\u00e3o param por ai. Dependendo do framework que voc\u00ea usa, tamb\u00e9m existem algumas alternativas diferentes para escrever CSS <em>{como se j\u00e1 n\u00e3o fosse complexo o suficiente haha, mas vamos falar disso\u00a0depois}<\/em>.<\/p>\n<p>Aqui na Alice, <a href=\"https:\/\/medium.com\/alice-tech\/h%C3%A1-1-ano-escolhemos-o-vue-js-419cf6c82c1d\">n\u00f3s usamos o Vue<\/a> e durante algumas semanas no nosso chapter de frontend, discutimos qual seria o padr\u00e3o que ir\u00edamos adotar. Antes de tomar uma decis\u00e3o, n\u00f3s testamos as op\u00e7\u00f5es mais comuns e algumas obscuras que a comunidade ainda n\u00e3o est\u00e1 usando tanto. Como o nosso chapter de frontends n\u00e3o \u00e9 muito grande, \u00e9 importante para n\u00f3s termos um padr\u00e3o bem definido <em>{j\u00e1 que cada pessoa est\u00e1 em um time diferente}<\/em> e que seja f\u00e1cil para quem n\u00e3o trabalha com frontend <em>{j\u00e1 que nem todo time tem algu\u00e9m com esse\u00a0foco}<\/em>.<\/p>\n<p>No decorrer desse artigo, junto com os pontos que levantamos, tem algumas implementa\u00e7\u00f5es b\u00e1sicas de um componente de bot\u00e3o <em>{que chamei ele de base-button}<\/em> que tem algumas propriedades: <em>tamanho<\/em>, <em>\u00edcone<\/em> e <em>loading <\/em>que s\u00e3o as respons\u00e1veis por mudar o comportamento\/CSS.<\/p>\n<p>Ent\u00e3o aperte o cinto que vamos seguir numa jornada do que n\u00f3s encontramos em cada uma das possibilidades \u2728<\/p>\n<h2>Mas antes, uma leve introdu\u00e7\u00e3o ao vue\u00a0file<\/h2>\n<p>Para quem nunca trabalhou com o Vue antes, \u00e9 poss\u00edvel criar componentes usando arquivos\u00a0<em>.vue<\/em>, que possuem o HTML dentro do &lt;template&gt;, o JS dentro de &lt;script&gt; e o CSS dentro de\u00a0&lt;style&gt;.<\/p>\n<p>Focando no assunto desse post, na parte de CSS n\u00f3s temos algumas alternativas: escrever o CSS puro <em>{assim como vemos da linha 16 a 18}<\/em>, ou escrever com algum pr\u00e9-processador.<\/p>\n<p>Escolhendo a segunda o op\u00e7\u00e3o, tudo que n\u00f3s precisamos fazer \u00e9 adicionar um atributo <em>lang<\/em> na linha 15 com o nome da <em>&#8220;linguagem&#8221;<\/em> que queremos <em>{Aqui na Alice n\u00f3s usamos o <\/em><a href=\"https:\/\/sass-lang.com\/\"><em>SASS<\/em><\/a><em> com a sintaxe scss, ent\u00e3o a maioria dos exemplos daqui pra frente ter\u00e3o o CSS escrito dessa\u00a0forma}<\/em>.<\/p>\n<p>Sabendo disso vamos come\u00e7ar falando de uma das nossas op\u00e7\u00f5es de escrever CSS, que n\u00e3o depende de estar usando ou n\u00e3o um pr\u00e9-processador:<\/p>\n<h3>BEM<\/h3>\n<p>Acredito que essa seja uma das formas mais comum de escrever CSS. Por ser uma metodologia, n\u00e3o tem grandes segredos, mas n\u00e3o significa que seja f\u00e1cil. Pensar no nome das coisas provavelmente \u00e9 a parte mais dif\u00edcil do desenvolvimento de software <em>{risos}<\/em>, e com o <a href=\"http:\/\/getbem.com\/introduction\/\">BEM<\/a> \u00e9 preciso pensar com carinho no nome das classes para que a estrutura fa\u00e7a\u00a0sentido.<\/p>\n<p>Para quem nunca trabalhou com a metodologia antes, vamos a uma explica\u00e7\u00e3o r\u00e1pida:<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/670\/1*2obrsDtnpAfExJALr3ROpQ.png\" alt=\"\" \/><figcaption><a href=\"https:\/\/keepinguptodate.com\/pages\/2020\/05\/bem-visually-explained\/\">BEM Visually Explained<\/a>\u200a\u2014\u200aBy Jon\u00a0Keeping<\/figcaption><\/figure>\n<p>N\u00f3s basicamente dividimos uma classe em tr\u00eas\u00a0peda\u00e7os:<\/p>\n<ul>\n<li>O <em>Block<\/em> representa o bloco que vai ser estilizado <em>{normalmente algum elemento que esteja envolvendo outros elementos\/outras tags}.<\/em><\/li>\n<li>O <em>Element<\/em> \u00e9 algum elemento ou tag que esteja dentro desse bloco, e para identificarmos ele facilmente, \u00e9 separado por dois <em>underscores<\/em>.<\/li>\n<li>O <em>Modifier<\/em> significa que o estado daquele elemento mudou, o que significa que o nosso layout vai mudar gra\u00e7as; a separa\u00e7\u00e3o dele \u00e9 por dois\u00a0<em>dashes<\/em>.<\/li>\n<\/ul>\n<p>Isso significa que em uma classe eu posso ter dois <em>elements<\/em>? Ou dois <em>modifiers<\/em>? N\u00e3o. A estrutura do BEM espera que voc\u00ea tenha um de cada, por isso para pessoas que n\u00e3o est\u00e3o familiarizadas com a metologia, pode ser bem confuso como criar uma classe nova. <em>{<\/em><a href=\"https:\/\/keepinguptodate.com\/pages\/2020\/05\/bem-visually-explained\/\"><em>Nesse artigo<\/em><\/a><em> tem uma explica\u00e7\u00e3o detalhada do uso do BEM e erros comuns, vale a leitura!}<\/em><\/p>\n<p>De qualquer forma, se usado corretamente v\u00e1rios problemas de CSS s\u00e3o resolvidos, al\u00e9m de termos uma boa organiza\u00e7\u00e3o.<\/p>\n\n<p>Agora vamos para a aplica\u00e7\u00e3o dessa metologia no\u00a0Vue.<\/p>\n<p>Come\u00e7ando pelas linhas 4, 5, 6, 7\u200a\u2014\u200aaqui n\u00f3s temos classes condicionais baseadas em alguns atributos <em>{que no nosso exemplo s\u00e3o props declaradas nas linhas 28 e 29}<\/em>, uma coisa que podemos ver \u00e9 que por serem condicionais, usamos o <em>modifier<\/em> para alterar visualmente o layout de cada uma delas <em>{j\u00e1 que elas representam um estado do nosso\u00a0bot\u00e3o}<\/em>.<\/p>\n<p>Na linha 12, temos uma classe com um <em>element<\/em>, pois esse componente de icone representa um elemento no nosso bloco <em>{que nesse exemplo \u00e9 o\u00a0bot\u00e3o}<\/em>.<\/p>\n<p>Por fim, na linha 34 temos a declara\u00e7\u00e3o da lang, que como \u00e9 importante dizer que s\u00f3 vai funcionar se o projeto est\u00e1 preparado para o pr\u00e9-processador declarado. Se voc\u00ea come\u00e7ar um projeto usando o <a href=\"https:\/\/cli.vuejs.org\/\">Vue CLI<\/a> \u00e9 uma das coisas que voc\u00ea pode ou n\u00e3o escolher. Se voc\u00ea quiser mudar o lang, na <a href=\"https:\/\/vue-loader.vuejs.org\/guide\/pre-processors.html\">documenta\u00e7\u00e3o do Vue<\/a> tem um passo-a-passo.<\/p>\n<h3>Scoped CSS<\/h3>\n<p>Voc\u00ea pode se perguntar: por qu\u00ea exatamente eu preciso do BEM? N\u00e3o \u00e9 s\u00f3 sair espalhando minhas classes por ai e tudo\u00a0bem?<\/p>\n<p>Conforme voc\u00ea vai escrevendo o seu CSS, no final das contas o Vue vai pegar o CSS de todos os componentes sendo usados naquela p\u00e1gina e jogar ele no &lt;head&gt;. O que significa que qualquer componente vai ser afetado por qualquer regra definida em um componente. O BEM tenta resolver isso tendo classes especificas que n\u00e3o v\u00e3o afetar outro componente t\u00e3o facilmente.<\/p>\n<p>\u00c9 ai que entra o <a href=\"https:\/\/vue-loader.vuejs.org\/guide\/scoped-css.html\">scoped CSS<\/a>. Ele nos ajuda a resolver esse problema de escopo adicionando um atributo a mais nas nossas tags HTML para deixar as classes espec\u00edficas para aquele componente.<\/p>\n<p>Tudo o que precisamos para isso funcione \u00e9 adicionar o atributo <em>scoped<\/em> \u00e0 declara\u00e7\u00e3o de &lt;style&gt;, assim como na linha 34 do\u00a0exemplo.<\/p>\n<p><iframe loading=\"lazy\" src=\"\" width=\"0\" height=\"0\" frameborder=\"0\" scrolling=\"no\"><a href=\"https:\/\/medium.com\/media\/4c1cc874afea1ff0fbbb82cd2134220d\/href\">https:\/\/medium.com\/media\/4c1cc874afea1ff0fbbb82cd2134220d\/href<\/a><\/iframe><\/p>\n<p>Para entender melhor vamos pegar a classe na linha\u00a05.<\/p>\n<p>O Vue vai transformar ela em algo como:\u00a0.<em>loading[data-v-763db97b]<\/em>. Esse atributo novo sempre vai come\u00e7ar com <em>data-v <\/em>e vai terminar com uma <em>hash <\/em>aleat\u00f3ria, o que ajuda caso tenhamos classes iguais <em>{elas n\u00e3o v\u00e3o colidir gra\u00e7as ao hash} <\/em>e impede que um componente distante seja\u00a0afetado.<\/p>\n<p>O problema dessa solu\u00e7\u00e3o \u00e9 que mesmo com esse atributo a mais na tag HTML, as regras afetam os componentes filhos. Olhando no exemplo ao lado, se o &lt;base-icon&gt; tivesse a classe<em> &#8220;icon&#8221;<\/em> e remov\u00eassemos a linha 12, as regras de CSS dessa classe afetariam o componente filho mesmo\u00a0assim.<\/p>\n<p>Podemos resolver isso facilmente evitando seletores iguais <em>{at\u00e9 mesmo usando uma metologia como o BEM que vimos anteriomente}<\/em>, para n\u00e3o correr o risco de herdar regras que n\u00e3o gostar\u00edamos.<\/p>\n<h3>CSS Modules<\/h3>\n<p>Assim como a solu\u00e7\u00e3o anterior, o <a href=\"https:\/\/vue-loader.vuejs.org\/guide\/css-modules.html#usage\">CSS Modules<\/a> tenta nos ajudar com esse problema de conflitar regras de CSS ou herdar regras que n\u00e3o gostariamos.<\/p>\n<p>A diferen\u00e7a dele para o <em>scoped<\/em>, \u00e9 que n\u00e3o teremos um atributo novo no HTML e sim uma classe gerada pelo Vue, composta pelo nome do componente + o nome da classe que n\u00f3s colocamos no CSS + uma hash aleat\u00f3ria.<\/p>\n<p>Para que essa solu\u00e7\u00e3o funcione, precisamos adicionar o atributo <em>module<\/em> \u00e0 declara\u00e7\u00e3o de &lt;style&gt;, assim como na linha 35 do\u00a0exemplo.<\/p>\n<p><iframe loading=\"lazy\" src=\"\" width=\"0\" height=\"0\" frameborder=\"0\" scrolling=\"no\"><a href=\"https:\/\/medium.com\/media\/835a20022087c3a3aa6756877efde63d\/href\">https:\/\/medium.com\/media\/835a20022087c3a3aa6756877efde63d\/href<\/a><\/iframe><\/p>\n<p>Uma das coisas mais importantes aqui \u00e9 que a sintaxe de declarar uma classe sempre vai ser\u00a0<em>:class=&#8221;$style.xpto&#8221; <\/em>e com o nome da classe sempre em <em>camelCase<\/em>. E no caso de classes condicionais como na linha 5, 6 e 7, precisamos usar a classe dentro de colchetes.<\/p>\n<p>Para entender melhor, vamos pegar a linha 5 de exemplo. No fim das contas o Vue vai gerar uma classe parecida com <em>BaseButton_loading_1VuSe<\/em>. Isso vai resolver o nosso problema de conflito de regras e n\u00e3o \u00e9 algo que interfere nos\u00a0filhos.<\/p>\n<p>Mas <em>e se<\/em> voc\u00ea quisesse que isso acontecesse? At\u00e9 agora pontuei que um componente filho herdar as regras do pai era uma coisa ruim, mas dependendo da situa\u00e7\u00e3o \u00e9 exatamente isso que n\u00f3s queremos para n\u00e3o repetir\u00a0c\u00f3digo.<\/p>\n<p>Nesse caso, voc\u00ea pode passar as classes como <em>prop<\/em> para o componente filho, ou usar <a href=\"https:\/\/sass-lang.com\/documentation\/at-rules\/mixin\">mixins<\/a> de um pr\u00e9-processador e importar nos dois componentes.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/0*zmhmFWohYMyOXc0X\" alt=\"\" \/><figcaption>Photo by <a href=\"https:\/\/unsplash.com\/@alistairmacrobert?utm_source=medium&amp;utm_medium=referral\">Alistair MacRobert<\/a> on\u00a0<a href=\"https:\/\/unsplash.com?utm_source=medium&amp;utm_medium=referral\">Unsplash<\/a><\/figcaption><\/figure>\n<h3>Achou que tinha\u00a0acabado?<\/h3>\n<p>Achou errado!<\/p>\n<p>As tr\u00eas solu\u00e7\u00f5es que vimos at\u00e9 agora, s\u00e3o as formas oficiais do Vue de definir CSS, mas a partir daqui vamos entrar no mundo obscuro das formas alternativas.<\/p>\n<p>N\u00f3s separamos duas para testar e ambas s\u00e3o frameworks <a href=\"https:\/\/cssinjs.org\/?v=v10.5.1\">CSS-in-JS<\/a>, o que significa que n\u00f3s escrevemos o CSS no JS e n\u00e3o precisamos mais da tag &lt;style&gt; nos nossos componentes.<\/p>\n<h3>Aphrodite<\/h3>\n<p>Come\u00e7ando pelo <a href=\"https:\/\/github.com\/Khan\/aphrodite\">Aphrodite<\/a> <em>{que n\u00e3o tem muita coisa sobre o uso dele com o Vue na internet e eu usei <\/em><a href=\"https:\/\/medium.com\/@nicholasbaroni\/styling-vue-components-with-aphrodite-dd53bc2fa9d8\"><em>esse artigo<\/em><\/a><em> como refer\u00eancia para a minha implementa\u00e7\u00e3o}<\/em>.<\/p>\n<p><iframe loading=\"lazy\" src=\"\" width=\"0\" height=\"0\" frameborder=\"0\" scrolling=\"no\"><a href=\"https:\/\/medium.com\/media\/15e50f0ad53bdfef0f348b7478f076a7\/href\">https:\/\/medium.com\/media\/15e50f0ad53bdfef0f348b7478f076a7\/href<\/a><\/iframe><\/p>\n<p>Inicialmente, n\u00f3s precisamos importar duas coisas do framework: o <em>StyleSheet<\/em> e o <em>css {como vemos na linha\u00a08}<\/em>.<\/p>\n<p>O <em>StyleSheet <\/em>vai ser o respons\u00e1vel por gerar as nossas regras de CSS baseado na estrutura de objeto com o nome da classe sendo a chave, e o valor sendo os atributos de CSS <em>{linha 10 \u00e0\u00a019}<\/em>.<\/p>\n<p>E para que n\u00f3s possamos usar essas classes no HTML, primeiro precisamos expor elas no JS <em>{como vemos da linha 22 \u00e0 24} <\/em>e usamos o <em>css <\/em>na linha 2 <em>{separando os nomes das classes por v\u00edrgula se necess\u00e1rio}<\/em>.<\/p>\n<p>Agora vamos voltar o mesmo componente de bot\u00e3o dos exemplos anteriores, mas dessa vez usando Aphrodite:<\/p>\n<p><iframe loading=\"lazy\" src=\"\" width=\"0\" height=\"0\" frameborder=\"0\" scrolling=\"no\"><a href=\"https:\/\/medium.com\/media\/c19aebfbe771d7f29025293b5708c073\/href\">https:\/\/medium.com\/media\/c19aebfbe771d7f29025293b5708c073\/href<\/a><\/iframe><\/p>\n<p>Temos algumas limita\u00e7\u00f5es com essa solu\u00e7\u00e3o, e de cara o que mais me incomodou foi que por padr\u00e3o todas as regras s\u00e3o geradas com<em>\u00a0!important<\/em>. A linha 18 poderia estar importando s\u00f3 de <em>&#8216;aphoridite&#8217;<\/em>, mas para n\u00e3o ter o comportamento de\u00a0<em>!important<\/em>, eu acabei importando as depend\u00eancias necess\u00e1rias de outro\u00a0pacote.<\/p>\n<p>Tamb\u00e9m n\u00e3o existe um jeito oficial de definir classes aninhados <em>{ou seja, uma classe dentro de outra classe}<\/em>, com isso precisamos ter classes diferentes para um estado espec\u00edfico de um elemento, como por exemplo na linha 27 e 28, onde o componente de \u00edcone que nos exemplos anteriores s\u00f3 tinha uma classe, aqui n\u00f3s precisamos de\u00a0duas.<\/p>\n<p>Com essa implementa\u00e7\u00e3o, as classes geradas s\u00e3o completamente aleat\u00f3rias <em>{algo parecido com _w3twfb}<\/em>, o que dificulta um pouco encontrar onde que essas regras foram definidas, mas tem a vantagem de serem nomes\u00a0curtos.<\/p>\n<p>Por fim, a implementa\u00e7\u00e3o de exemplo n\u00e3o \u00e9 a mais otimizada poss\u00edvel, d\u00e1 para criar um plugin que importe o Aphrodite em todos os nossos componentes.<\/p>\n<h3>Styled Components<\/h3>\n<p>Por fim chegamos na \u00faltima op\u00e7\u00e3o da nossa lista, o <a href=\"https:\/\/github.com\/styled-components\/vue-styled-components\">Styled Components<\/a>, que nos permite criar componentes estilizados.<\/p>\n<p><iframe loading=\"lazy\" src=\"\" width=\"0\" height=\"0\" frameborder=\"0\" scrolling=\"no\"><a href=\"https:\/\/medium.com\/media\/ec9dd6c8f4bca0bdc59cb46af4576e02\/href\">https:\/\/medium.com\/media\/ec9dd6c8f4bca0bdc59cb46af4576e02\/href<\/a><\/iframe><\/p>\n<p>Na linha 22 e 33 temos dois componentes sendo definidos usando o <em>styled<\/em> importado do framework. O primeiro par\u00e2metro \u00e9 a tag HTML que vai ser renderizada, o segundo s\u00e3o as <em>props<\/em> daquele componente. A partir dai \u00e9 poss\u00edvel retornar todas as regras de CSS necess\u00e1rias<em> {e condicionar elas dependendo de uma propriedade, o que nos d\u00e1 muita liberdade}<\/em>.<\/p>\n<p>Por mais diferente que essa implementa\u00e7\u00e3o seja, esses dois componentes s\u00e3o iguais a qualquer outro definido por um arquivo vue <em>{claro, com as suas limita\u00e7\u00f5es, ele \u00e9 um componente puramente visual, ent\u00e3o n\u00e3o vamos ter m\u00e9todos ou outros tipos de atributos nele} <\/em>e precisa ser declarado como na linha 42 para ser usado pelo\u00a0HTML.<\/p>\n<p>Eles tamb\u00e9m n\u00e3o precisavam estar dentro do <em>vue file<\/em> <em>{s\u00f3 coloquei aqui para facilitar o exemplo rs}.<\/em> Por serem componentes normais, poderiam estar em arquivos separados para serem importados pelo base-button.<\/p>\n<p>\u00c9 uma solu\u00e7\u00e3o simples para componentes b\u00e1sicos.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/0*U_Hpbae9C1fL-0mi\" alt=\"\" \/><figcaption>Photo by <a href=\"https:\/\/unsplash.com\/@sagarapher?utm_source=medium&amp;utm_medium=referral\">Sagar Rana<\/a> on\u00a0<a href=\"https:\/\/unsplash.com?utm_source=medium&amp;utm_medium=referral\">Unsplash<\/a><\/figcaption><\/figure>\n<h2>Conclus\u00e3o<\/h2>\n<p>Depois de muita discuss\u00e3o e uni-duni-t\u00ea, n\u00f3s escolhemos usar o <strong>CSS Modules<\/strong> como padr\u00e3o aqui na Alice <em>{pessoalmente, eu ainda prefiro usar o BEM, mas vamos manter isso entre eu e vc, blz?\u00a0haha}<\/em>.<\/p>\n<p>Pelas nossas conversas, foi a op\u00e7\u00e3o que mais fez sentido para o nosso momento e para os nossos produtos, onde muitas pessoas precisam mexer. Mesmo sendo uma sintaxe <em>diferente do normal<\/em>, \u00e9 algo r\u00e1pido de aprender\/entender e ganhamos uma certa liberdade com qual nome de classes vamos colocar <em>{al\u00e9m de impedir certos problemas de herdar regras desnecess\u00e1rias\/ter seletores de tag\u00a0HTML}<\/em>.<\/p>\n<p>Mas por que fizemos essa escolha? As outras op\u00e7\u00f5es s\u00e3o\u00a0ruins?<\/p>\n<p>Particularmente as solu\u00e7\u00f5es n\u00e3o oficiais n\u00e3o me agradam, pois \u00e9 uma depend\u00eancia a mais que precisamos colocar no projeto, temos uma curva de aprendizado para escrever o CSS dentro do JS, e do meu ponto de vista n\u00e3o \u00e9 mais vantajoso do que usar uma solu\u00e7\u00e3o oficial do\u00a0Vue.<\/p>\n<p>Por\u00e9m, n\u00e3o existe solu\u00e7\u00e3o perfeita, n\u00e3o tem uma forma melhor do que a outra, no fim das contas \u00e9 necess\u00e1rio considerar o que mais faz sentido para o projeto e para as pessoas que v\u00e3o dar manuten\u00e7\u00e3o no\u00a0c\u00f3digo.<\/p>\n<p>Hoje o <em>CSS Modules<\/em> faz sentido pra gente, mas quem sabe daqui um tempo n\u00e3o fa\u00e7a mais. \u00c9 importante ter a mente aberta para qualquer solu\u00e7\u00e3o, e do meu ponto de vista, manter o mais simples poss\u00edvel.\u00a0\ud83d\ude42<\/p>\n<h3>Que tal fazer parte desse\u00a0time?<\/h3>\n<p>Estamos buscando pessoas que topem o desafio de transformar a sa\u00fade no Brasil atrav\u00e9s da tecnologia. <a href=\"https:\/\/www.alice.com.br\/carreiras\">Clica aqui<\/a> para saber mais das vagas que temos em aberto!\u00a0\ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"Vamos l\u00e1, CSS n\u00e3o \u00e9 a coisa mais f\u00e1cil do mundo.","protected":false},"author":3,"featured_media":170,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-149","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software"],"acf":[],"_links":{"self":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/comments?post=149"}],"version-history":[{"count":5,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/149\/revisions"}],"predecessor-version":[{"id":263,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/149\/revisions\/263"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/media\/170"}],"wp:attachment":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/media?parent=149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/categories?post=149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/tags?post=149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}