<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aline Bezzoco</title>
    <description>The latest articles on DEV Community by Aline Bezzoco (@alinebezzoco).</description>
    <link>https://dev.to/alinebezzoco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F233372%2F11156aec-16ec-4e95-879a-32709062fe6d.jpg</url>
      <title>DEV Community: Aline Bezzoco</title>
      <link>https://dev.to/alinebezzoco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alinebezzoco"/>
    <language>en</language>
    <item>
      <title>Um breve comentário sobre layer() e camadas em cascata</title>
      <dc:creator>Aline Bezzoco</dc:creator>
      <pubDate>Wed, 26 Jan 2022 15:19:37 +0000</pubDate>
      <link>https://dev.to/alinebezzoco/um-breve-comentario-sobre-layer-e-camadas-em-cascata-cen</link>
      <guid>https://dev.to/alinebezzoco/um-breve-comentario-sobre-layer-e-camadas-em-cascata-cen</guid>
      <description>&lt;p&gt;&lt;em&gt;O C do CSS começando a ter um novo sentido&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Desde o ano passado foi comentado sobre a nova propriedade do CSS, o &lt;code&gt;layer()&lt;/code&gt; que tem como objetivo de trabalhar melhor a especificidade e a ordem dos seletores e regras nas folhas de estilo. Para quem não sabe o CSS é procedural, ou seja, ele vai executar as coisas exatamente na ordem em que você vai escrever. Mas o &lt;code&gt;layer()&lt;/code&gt;, até então, pretende mudar um pouco essa dinâmica. &lt;/p&gt;

&lt;p&gt;Mas como? &lt;/p&gt;

&lt;p&gt;Com ele podemos controlar melhor as camadas de estilo e a ordem de importância, então sabe aquele &lt;code&gt;!important&lt;/code&gt; que você joga como última saída pra sobrepor uma customização que tem um seletor muito mais acima do seu? Um outro exemplo de uso/solução seria para os casos em que usávamos o &lt;code&gt;z-index&lt;/code&gt; para reordenar blocos (sobrepor um ao outro). Com o &lt;code&gt;layer()&lt;/code&gt; conseguiríamos redefinir melhor quem vai ter alta, média e baixa prioridade. Isso vai ser bom para quando trabalharmos com bibliotecas de terceiros, por exemplo. &lt;/p&gt;

&lt;p&gt;A proposta dessa propriedade é interessante e vale ficarmos de olho. No momento só funciona apenas para as versões 99-100 do Chrome e muito em breve no Firefox. De qualquer forma isso vai nos trazer mais facilidade, controle e organização na construção das nossas folhas de estilo. &lt;/p&gt;

&lt;p&gt;Vou deixar abaixo uns links bem interessantes e mais completos sobre o assunto (em inglês): &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caniuse.com/css-cascade-layers"&gt;https://caniuse.com/css-cascade-layers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@layer#browser_compatibility"&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/@layer#browser_compatibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2022/01/introduction-css-cascade-layers/"&gt;https://www.smashingmagazine.com/2022/01/introduction-css-cascade-layers/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>css</category>
      <category>programming</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como resolver problemas de versionamento dos pacotes no Lerna</title>
      <dc:creator>Aline Bezzoco</dc:creator>
      <pubDate>Thu, 21 Oct 2021 16:23:06 +0000</pubDate>
      <link>https://dev.to/alinebezzoco/como-resolver-problemas-de-versionamento-dos-pacotes-no-lerna-5g1e</link>
      <guid>https://dev.to/alinebezzoco/como-resolver-problemas-de-versionamento-dos-pacotes-no-lerna-5g1e</guid>
      <description>&lt;p&gt;Um problema que pode se tornar muito comum é conflitos de versionamento do Lerna. Vamos a um exemplo: &lt;/p&gt;

&lt;p&gt;Você tem uma lib (biblioteca) onde duas pessoas desenvolvedoras fazem a manutenção do mesmo, porém numa última atualização aconteceu de um dev sem querer rodar o &lt;code&gt;lerna publish&lt;/code&gt; direto de uma branch local e não na &lt;code&gt;main&lt;/code&gt; (branch principal) como é mais comum. Acontece é que um tempo depois você também precisa atualizar o pacote e quando tenta na branch principal (que seria o correto), dá um erro informando que a versão a ser atualizada é bem diferente da atual. Mas por que isso acontece? Porque a última branch que foi feita a atualização lançou uma versão X enquanto a outra está com uma versão totalmente defasada (quando atualizamos o pacote com o lerna o mesmo atualiza os &lt;code&gt;package.json&lt;/code&gt; e o &lt;code&gt;lerna.json&lt;/code&gt;. A "solução" seria fazer um novo merge com as infos do pacote atualizadas para a última versão, porém muitas das vezes acontece da branch ser deletada minutos depois que é feito o merge na branch principal (eu particularmente não gosto de fazer dessa forma).  &lt;/p&gt;

&lt;p&gt;A vantagem é que o Lerna possui uma opção chamada "Custom Version", ou seja, você mesmo pode atribuir a versão que quer para o seu pacote (use com sabedoria). Uma forma mais rápida e segura de resolver os problemas de versionamento que podem ocorrer. &lt;/p&gt;

&lt;p&gt;Quando você rodar o &lt;code&gt;lerna publish&lt;/code&gt; no terminal irá aparecer essas seguintes opções: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9kcFdJ1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k243st02h6a82ew9b1zx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9kcFdJ1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k243st02h6a82ew9b1zx.png" alt="Print da tela de um terminal com as opções de versão do pacote com a opção do custom version" width="565" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basta selecionar o "Custom Version" e e aí é só digitar a tag a versão que você quer. Depois disso é seguir o restante do procedimento padrão de publicação de pacotes do Lerna :)  &lt;/p&gt;




&lt;p&gt;Para finalizar, uma observação: claro que o cenário ideal seria a automação do publish através do CI e afins, mas existe também um outro cenário da atualização dos pacotes de forma manual. Então a solução seria para esses casos, beleza? &lt;/p&gt;

&lt;p&gt;Então é isso. Até a próxima! &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>monorepo</category>
      <category>architecture</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Drops: Vue 2.x e o Typescript (e como solucionar os erros de retorno)</title>
      <dc:creator>Aline Bezzoco</dc:creator>
      <pubDate>Thu, 21 Oct 2021 15:42:27 +0000</pubDate>
      <link>https://dev.to/alinebezzoco/drops-vue-2x-e-o-typescript-e-como-solucionar-os-erros-de-retorno-i5m</link>
      <guid>https://dev.to/alinebezzoco/drops-vue-2x-e-o-typescript-e-como-solucionar-os-erros-de-retorno-i5m</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: sim, o Vue 3 é uma realidade, mas ainda existem muitos projetos com o Vue 2 e que precisam de manutenção. O artigo é sobre a relação da versão anterior do Vue com o Typescript e como contornar alguns problemas de escopo da melhor forma o possível baseado nas minhas experiências&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Acho que alguns de vocês tem reparado em alguns erros de TS que podem vir a acontecer nas versões 2.x no Vue. Mas por que  acontece?&lt;/p&gt;

&lt;p&gt;O Vue 2.x tem um escopo que dependendo da forma que utilizar o TS dentro do projeto o próprio Typescript (que é um superset de Javascipt) tem dificuldade de interpretar/fazer leitura dessas props dentro das funções. Esse cenário ocorre bastante quando usamos alguma prop como retorno dentro do &lt;code&gt;mounted()&lt;/code&gt; ou &lt;code&gt;computed()&lt;/code&gt;, por exemplo. &lt;br&gt;
Para solucionar problemas desse tipo temos duas soluções: ou fazer a tipagem desses retornos dentro da função ou declarar a função como uma prop do tipo Function. Não entendeu? Então vamos a um exemplo para facilitar o entendimento. &lt;/p&gt;

&lt;p&gt;Suponhamos que você tenha uma função que retorne uma mensagem ou qualquer outra informação após realizar uma ação (inserir um texto dentro campo input, por exemplo). Ao rodar o projeto você receberá um erro no terminal parecido com esse: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Property 'xxxxxxx' does not exist on type 'CombinedVueInstance&amp;lt;Vue, unknown, unknown, unknown, Readonly&amp;lt;{ type: string; xxxxx: string; xxxxx: string; xxxx: string; target: string; xxxx: boolean; xxxx: boolean; }&amp;gt;&amp;gt;'.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para solucionar esse problema você precisa fazer o que chamamos de anotação de retorno, ou seja, declarar esse tipo na função. Algo mais ou menos assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;greeting(): string {
  return this.greet() + '!'
} 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas caso você não queira fazer essa anotação no retorno direto na função você pode fazer dentro da prop mesmo. Assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;props: { 
  greeting: { 
   type: Function as PropType&amp;lt;() =&amp;gt; void&amp;gt;
  } 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembrando que esses casos costumam acontecer quando fazemos a extensão do nosso componente Vue para Typescript (o famoso &lt;code&gt;Vue.extend()&lt;/code&gt;). Uma alternativa mais viável também seria escrevê-lo em Class-Based Component (bem parecido com o do Angular, pra quem tá familiarizado com a sintaxe).&lt;/p&gt;

&lt;p&gt;No Vue 3.x esse problema é solucionado porque o framework é escrito em Typescript e acaba tendo ele por "debaixo dos panos", digamos assim rs &lt;/p&gt;

&lt;p&gt;Se quiser saber mais sobre o que foi escrito nesse artigo deixo dois links da própria documentação do Vue sobre o assunto: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://vuejs.org/v2/guide/typescript.html"&gt;TypeScript Support - Vue 2.x&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/guide/typescript-support.html"&gt;TypeScript Support - Vue 3.x&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>vue</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Object-fit: o que é, pra que serve, como usar</title>
      <dc:creator>Aline Bezzoco</dc:creator>
      <pubDate>Sat, 02 Jan 2021 18:25:13 +0000</pubDate>
      <link>https://dev.to/alinebezzoco/object-fit-o-que-e-pra-que-serve-como-usar-5g2a</link>
      <guid>https://dev.to/alinebezzoco/object-fit-o-que-e-pra-que-serve-como-usar-5g2a</guid>
      <description>&lt;p&gt;&lt;em&gt;Créditos da imagem de capa: Just about Photography&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Você já ouviu falar da propriedade object-fit do CSS3? Se não, vale a pena ler este artigo, pois ela é bem interessante de se conhecer. &lt;/p&gt;

&lt;p&gt;O object-fit é uma propriedade que permite que faça ajustes no redimensionamento da imagem dentro de um container, o que significa que você pode escalar imagens, ocupar todo o container e resolver aquele famoso problema daquelas imagens bastante desproporcionais e que você precisa redimensiona-las dentro de um quadrado ou círculo, por exemplo.&lt;/p&gt;

&lt;p&gt;Os principais valores dessa propriedade são: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fill&lt;/li&gt;
&lt;li&gt;cover &lt;/li&gt;
&lt;li&gt;none &lt;/li&gt;
&lt;li&gt;scale-down&lt;/li&gt;
&lt;li&gt;contain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;strong&gt;fill&lt;/strong&gt; é o padrão. Ele dimensiona o conteúdo dentro do container ocupando todo o espaço e não necessariamente irá deixar a imagem proporcional. Para isso é necessário utilizar o valor &lt;strong&gt;cover&lt;/strong&gt; (que é o mais utilizado). Ele irá dimensionar o conteúdo proporcionalmente no container, porém o mesmo acaba "cortando" alguns trechos da imagem. Se você quer manter a imagem proporcional, mas dentro do elemento sem mantê-lo esticado ou cortando algum pedaço dela o &lt;strong&gt;contain&lt;/strong&gt; é a melhor solução, mas vale ressaltar que ele não irá ocupar todo o espaço como é o cover. O &lt;strong&gt;scale-down&lt;/strong&gt; é bem parecido com o contain, porém diminui a escala. Por fim temos o &lt;strong&gt;none&lt;/strong&gt; que não redimensiona a imagem. &lt;/p&gt;

&lt;p&gt;O exemplo abaixo mostra bem o que foi escrito acima:  &lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/bezzocoaline/embed/MWjQzWv?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;Para saber mais (incluindo compatibilidade com os navegadores) vocês podem acessar o &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/object-fit"&gt;Mozilla em português&lt;/a&gt;  para mais informações. &lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>css</category>
    </item>
    <item>
      <title>Trabalhando com datas e substituindo o Moment.JS</title>
      <dc:creator>Aline Bezzoco</dc:creator>
      <pubDate>Thu, 31 Dec 2020 12:54:24 +0000</pubDate>
      <link>https://dev.to/alinebezzoco/trabalhando-com-datas-e-substituindo-o-moment-js-blb</link>
      <guid>https://dev.to/alinebezzoco/trabalhando-com-datas-e-substituindo-o-moment-js-blb</guid>
      <description>&lt;p&gt;&lt;em&gt;Créditos da imagem de capa: Calendly&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para quem não sabe em meados de 2020 as pessoas desenvolvedoras da biblioteca Moment.JS resolveram descontinuar os updates do mesmo devido as constantes mudanças das tecnologias com o passar os anos, especialmente do Javascript pós-ES6. Hoje em dia a linguagem nos permite trabalhar com datas de forma mais completa e não precisando tanto de bibliotecas para solucionar alguns dos problemas que antes era complicado de se resolver ou demandavam maior tempo. &lt;/p&gt;

&lt;p&gt;O fato é que o Moment.JS foi muito útil nesses anos todos e nos ajudou a otimizar bastante o nosso tempo de desenvolvimento se tratando em lidar com datas no Javascript.   Mas beleza, não vamos ter atualizações dessa lib e com o tempo precisamos atualizar os projetos que utilizam ele. E como substituir então o Moment.JS para o &lt;code&gt;Date()&lt;/code&gt;, &lt;code&gt;Intl&lt;/code&gt; e outras propriedades de data do Vanilla JS? Logo abaixo cito algumas propriedades da lib e como convertê-las :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. subtract()&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com o Moment fazíamos muitas coisas, entre elas o &lt;code&gt;subtract()&lt;/code&gt; que é subtrair as datas para tirar a diferença entre elas. Com o JS podemos substituir da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function subtractDay() { 
 const day = new Date(); 
 day.setDate(day.getDate() - 10); 
 return day; 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função acima permite que a gente subtraia os dias em 10. Então o que ele faz é pegar a data atual, subtrair com o valor indicado e retornar a diferença. Então se hoje é dia 31/12 ele vai pegar e voltar 10 dias o que retornará o dia 21/12. &lt;/p&gt;

&lt;p&gt;Dica: Uma boa forma de vê-lo funcionando é copiando e colando esse código no console do seu browser e dar enter para ver o resultado :)   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. fromNow()&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa propriedade permitia que a gente trabalhe com o tempo relativo (1 dia atrás, 3 meses atrás e por aí vai) e com o JS podemos utilizar o &lt;code&gt;Intl.RelativeTimeFormat()&lt;/code&gt;. Assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function relativeDay() { 
 const rtf = new Intl.RelativeTimeFormat('br');
 const day = rtf.format(-1, 'day'); 
 return day; 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função acima determina que a const &lt;code&gt;day&lt;/code&gt; retorne o resultado "1 dia atrás" (repare na const &lt;code&gt;rtf&lt;/code&gt; que adicionei um atributo de tradução "br" (Português Brasil). Caso queira mudar o idioma pasta colocar a sigla desejada :) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. format()&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Aqui você tem várias formas de substituir dependendo da sua necessidade. Usamos o &lt;code&gt;to..&lt;/code&gt; para determinar o tipo de formatação. São elas: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;toString&lt;/strong&gt; retorna &lt;code&gt;Wed Dec 30 2020 23:39:35 GMT-0300 (Horário Padrão de Brasília)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;toDateString&lt;/strong&gt; retorna &lt;code&gt;Wed Dec 30 2020&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;toLocaleString&lt;/strong&gt; retorna &lt;code&gt;30/12/2020 23:39:35&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;toLocaleDateString&lt;/strong&gt; retorna &lt;code&gt;30/12/2020&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;toGMTString&lt;/strong&gt; retorna &lt;code&gt;Thu, 31 Dec 2020 02:39:35 GMT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;toUTCString&lt;/strong&gt; retorna &lt;code&gt;Thu, 31 Dec 2020 02:39:35 GMT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;toISOString&lt;/strong&gt; retorna &lt;code&gt;2020-12-31T02:39:35.351Z&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de como utilizar uma dessas propriedades (vamos usar o &lt;code&gt;toLocaleString()&lt;/code&gt;) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function formatDate() { 
 const date = new Date(); 
 const formatDate = date.toLocaleString(); 
 return formatDate; 
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função acima retorna a data formatada &lt;code&gt;dd/mm/aaaa hh:mm:ss&lt;/code&gt; e você pode formatar e customizar de acordo com o timezone ou idioma. Assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function formatDate() { 
 const date = new Date(); 
 const formatDate = date.toLocaleString('en', { timeZone: 'UTC' }); 
 return formatDate; 
} 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora estamos determinando que a nossa função &lt;code&gt;formatDate()&lt;/code&gt; retorne uma data formatada em inglês (AM/PM) e em UTC. &lt;/p&gt;

&lt;p&gt;Esses foram alguns exemplos de como trabalhar com datas no Javascript para substituir algumas propriedades do Moment.JS. Caso você ainda prefira trabalhar com libs uma outra alternativa seria utilizar o &lt;a href="https://date-fns.org/"&gt;date-fns&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Até a próxima! &lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>Criando um accordion com HTML5 e CSS3</title>
      <dc:creator>Aline Bezzoco</dc:creator>
      <pubDate>Thu, 31 Dec 2020 00:35:22 +0000</pubDate>
      <link>https://dev.to/alinebezzoco/criando-um-accordion-com-html5-e-css3-1078</link>
      <guid>https://dev.to/alinebezzoco/criando-um-accordion-com-html5-e-css3-1078</guid>
      <description>&lt;p&gt;&lt;em&gt;Créditos da imagem de capa: Colorib&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eu lembro que há um bom tempo atrás quando precisava implementar aquelas páginas de FAQ (perguntas e respostas) sempre tinha que criar um accordion (ou collapsible, o que preferir). E quando eu fazia o código já tinha até o script pronto em jQuery, algo mais ou menos assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$('.title').click(function(){
 $(this).parent().find('.description').slideToggle();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o código acima eu praticamente tinha o funcionamento padrão do meu accordion. A questão é que com o tempo as coisas foram mudando e o jQuery foi entrando em desuso por boa parte das pessoas desenvolvedoras para realizar as coisas tudo de forma mais nativa com o Javascript ou Vanilla JS. Não só isso, mas com a vinda do HTML5 e CSS3 muitos dos widgets que antes fazíamos com JS ou jQuery (quem lembra do jQuery UI?) agora daria para fazer apenas com as duas linguagens acima e um dos que hoje em dia conseguimos fazer sem JS é o nosso accordion. Mas como? &lt;/p&gt;

&lt;p&gt;O HTML5 possui duas tags chamadas &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; e &lt;code&gt;summary&lt;/code&gt;. O primeiro serve para encapsular o &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; e também para criarmos o widget. Já o segundo serve para definirmos o título clicável do accordion (que abre e fecha). E como fazemos isso? É o que vou mostrar agora no exemplo abaixo :) &lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/bezzocoaline/embed/QWKQMyV?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;Se você reparar no código acima para cada título/descrição eu adicionei um novo &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; e &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; para que cada um possa funcionar corretamente. Assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;details&amp;gt;
 &amp;lt;summary&amp;gt;Título&amp;lt;/summary&amp;gt; 
 &amp;lt;p&amp;gt;Descrição&amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt; 

&amp;lt;details&amp;gt;
 &amp;lt;summary&amp;gt;Título&amp;lt;/summary&amp;gt; 
 &amp;lt;p&amp;gt;Descrição&amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão o &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; exibe um caractere especial diferente do exemplo acima. Para customizar precisei desabilitá-lo utilizando a pseudo-classe &lt;code&gt;::-webkit-details-marker&lt;/code&gt; e adicionando um &lt;code&gt;display: none&lt;/code&gt; para que o mesmo desapareça. &lt;/p&gt;

&lt;p&gt;E para adicionar um novo caractere especial de +/- quando abre e fecha (respectivamente) utilizei a pseudo-classe &lt;code&gt;:before&lt;/code&gt; (porque eu quero que o sinal apareça antes do meu texto) e a variante &lt;code&gt;[open]&lt;/code&gt; que é utilizada junto com o &lt;code&gt;details&lt;/code&gt; que permite que a gente faça uma customização do accordion quando o mesmo tiver aberto. &lt;/p&gt;

&lt;p&gt;Como vocês podem ver com apenas HTML5 e CSS3 conseguimos criar um accordion funcional e com poucas linhas de código.  &lt;/p&gt;

&lt;p&gt;Por hoje é só, pessoal :) Espero que tenham gostado do artigo. Até a próxima!  &lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Primeira Oficina de Lógica de Programação WoMakersCode no Rio de Janeiro</title>
      <dc:creator>Aline Bezzoco</dc:creator>
      <pubDate>Sun, 02 Feb 2020 22:16:34 +0000</pubDate>
      <link>https://dev.to/womakerscode/primeira-oficina-de-logica-de-programacao-womakerscode-no-rio-de-janeiro-2de2</link>
      <guid>https://dev.to/womakerscode/primeira-oficina-de-logica-de-programacao-womakerscode-no-rio-de-janeiro-2de2</guid>
      <description>&lt;p&gt;&lt;em&gt;Créditos da foto de capa: Érika Alves&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No dia 01/02 aconteceu a nossa primeira oficina de lógica de programação da comunidade WoMakersCode RJ. O evento gratuito ocorreu no Sesc Tijuca e contou com o apoio da DigitalOcean e a Alura.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--peVxUk_K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/vXEGC8t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--peVxUk_K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/vXEGC8t.jpg" alt="Adesivos da WoMakersCode e DigitalOcean" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A oficina foi bastante especial para nós. Por conta das vagas limitadas precisávamos selecionar apenas 25 mulheres, mas recebemos no total &lt;strong&gt;156 inscrições&lt;/strong&gt; o que para nós foi uma grande - e feliz! - supresa. A escolha das participantes não foi fácil, pois a nossa vontade era de escolher todas! Ouvimos histórias incríveis de mulheres de advogadas, arquitetas a jornalistas, vendedoras e estudantes que estavam em busca de um novo aprendizado, mudança de carreira ou simplesmente complementando os seus estudos. Conhecimento nunca é demais!&lt;/p&gt;

&lt;p&gt;Muita coisas legais aconteceram durante o dia e tivemos alguns destaques: duas mulheres que vieram de São Paulo para participar do evento - e que no final descobrimos que uma era da Colômbia e outra do Peru! Além disso, tivemos uma participante de 15 anos que nos contou que quer estudar programação e seguir por essa área quando terminar o ensino médio. Sua irmã veio apenas para acompanhar, mas no fim acabou sentando em um dos computadores e participou também. Por fim, uma das mulheres selecionadas veio do Acre, mas por sorte o evento aconteceu bem no período que a mesma estava de férias e simplesmente uniu o útil ao agradável :)  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_4PeG4fy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/P7JMKMn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_4PeG4fy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/P7JMKMn.jpg" alt="Luanda apresentando sobre a comunidade WoMakersCode" width="800" height="336"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;Foto: Amanda Azevedo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O evento começou às 9h30 com a apresentação da nossa voluntária Luanda Pereira sobre a comunidade e realizando uma pequena dinâmica entre as participantes  e depois apresentando o time de voluntárias que estariam atuando naquele dia: Gabrielly de Andrade, Daiane Alves, Adrielle Ribeiro, Mariana Coelho, Hillary Sousa e Aline Bezzoco. &lt;/p&gt;

&lt;p&gt;Depois da apresentação inicial tivemos um bate-papo com as voluntárias Gabrielly, Adriele e Hillary sobre as diversas vertentes da área de tecnologia. Em seguida, Daiane e Adriele apresentaram sobre o que é lógica de programação, sua importância na área de tecnologia e além de apresentar a pseudo-linguagem a ser utilizada na oficina, o Portugol, utilizando da IDE Portugol Studio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KZ1AbXKj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/vphqsHF.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KZ1AbXKj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/vphqsHF.jpg" alt="Gabrielly falando sobre a área de tecnologia e suas vertentes" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f_Dw4dKL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/7WohA2W.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f_Dw4dKL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/7WohA2W.jpg" alt="Adriele ensinando sobre como criar funções em Portugol" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nisso, alguns exercícios foram sendo passados e as mentoras foram ajudando as participantes, tirando dúvidas e auxiliando-as em todos os momentos. No Dojo, a nossa voluntária Gabrielly conduziu o desafio com as participantes em desenvolver um programa chamado Megasena.&lt;br&gt;&lt;br&gt;
Vimos as participantes ajudando umas as outras algo que para nós mulheres é gratificante, já que prezamos pela união e protagonismo feminino na área de tecnologia. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D8pk7wpf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/10E3flG.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D8pk7wpf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/10E3flG.jpg" alt="Mentoras auxiliando as participantes" width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X-RTgAm---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/DX5B9TU.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X-RTgAm---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/DX5B9TU.jpg" alt="Mentoras auxiliando as participantes" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Foto: Mariana Coelho&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--riJFep8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/LlgiHYQ.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--riJFep8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/LlgiHYQ.jpg" alt="Duas participantes no momento do Dojo" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, tivemos a hora do sorteio! Sorteamos algumas camisetas cedidas pela DigitalOcean, dois cursos da Alura e um ingresso para o PHPWomen. &lt;/p&gt;

&lt;p&gt;Agradecemos a todas as voluntárias que se disponibilizaram a organizar mais um evento da comunidade! Desde a parte da organização até conteúdo e mentorias! Vocês foram incríveis! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsPcHhkt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/AqmI3XX.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsPcHhkt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/AqmI3XX.jpg" alt="Voluntárias da Oficina" width="800" height="600"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Por trás de todo código existem pessoas e essas tem suas histórias para contar. Esperamos que a WoMakersCode tenha sido um capítulo feliz na vida delas e as que se apaixonaram e escolheram a programação como forma de aprendizado possa continuar estudando e conseguir trabalhar como uma pessoa desenvolvedora. &lt;/p&gt;

&lt;p&gt;Esperamos todas vocês novamente nos nossos próximos eventos!  &lt;/p&gt;

&lt;p&gt;Para quem não conseguiu participar desta primeira edição: fiquem atentas, pois estamos considerando fazer mais uma edição ainda este ano :) Acompanhe as novidades nas nossas &lt;a href="https://linktr.ee/womakerscode"&gt;redes sociais&lt;/a&gt; para ficar por dentro de tudo o acontece na comunidade!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sobre a WoMakersCode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A WoMakersCode é uma iniciativa sem fins lucrativos, que busca o protagonismo feminino na tecnologia, através do desenvolvimento profissional e econômico. Acreditamos que empoderar é incentivar a participação, o aprendizado colaborativo e, acima de tudo, dar voz às mulheres.&lt;/p&gt;

&lt;p&gt;Oferecemos para a comunidade workshops, eventos e debates com foco no mercado de tecnologia, orientados para capacitação técnica e fortalecimento de habilidades pessoais. Nós trabalhamos para prepará-las e incentivá-las a investir em suas carreiras e em realizar seus sonhos.&lt;/p&gt;

</description>
      <category>womenintech</category>
      <category>wecoded</category>
      <category>womakerscode</category>
    </item>
  </channel>
</rss>
