<?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: Alisson Ramon</title>
    <description>The latest articles on DEV Community by Alisson Ramon (@ramonprog).</description>
    <link>https://dev.to/ramonprog</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%2F1343394%2Fdd57195d-b58a-4eb7-a27b-613d24a92166.jpeg</url>
      <title>DEV Community: Alisson Ramon</title>
      <link>https://dev.to/ramonprog</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramonprog"/>
    <language>en</language>
    <item>
      <title>Criando PDFs com React-PDF</title>
      <dc:creator>Alisson Ramon</dc:creator>
      <pubDate>Sun, 21 Apr 2024 20:24:13 +0000</pubDate>
      <link>https://dev.to/ramonprog/criando-pdfs-com-react-pdf-1chb</link>
      <guid>https://dev.to/ramonprog/criando-pdfs-com-react-pdf-1chb</guid>
      <description>&lt;p&gt;Há um tempo atrás, uma task caiu no meu colo: criar um relatório dinâmico em PDF. Nunca havia feito algo do tipo antes e, na verdade, naquele momento, eu sequer sabia que era possível realizar essa tarefa com programação. Foi um desafio e tanto! Pesquisei bastante, li diversas documentações, mas consegui concluir minha task com êxito. Agora, trago este guia prático para você, para que também possa criar seus próprios PDFs dinâmicos de forma eficiente e com sucesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 1: Configuração do Projeto:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de começar, certifique-se de ter um projeto React configurado. Se você ainda não tem um projeto React, pode criar um novo utilizando o Vite.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm create vite@latest meu-projeto&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, instale a biblioteca React-PDF (já tem suporte para TS):&lt;br&gt;
&lt;code&gt;npm install @react-pdf/renderer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 2: Estrutura do PDF:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O React-PDF utiliza a mesma sintaxe do React para criar elementos PDF, porém ele conta com elementos da própria biblioteca para a montagem do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import { Document, Page, Text } from '@react-pdf/renderer';

const MyDocument = () =&amp;gt; (
  &amp;lt;Document&amp;gt;
    &amp;lt;Page size={'A4'}&amp;gt;
      &amp;lt;Text&amp;gt;Olá, Mundo!&amp;lt;/Text&amp;gt;
    &amp;lt;/Page&amp;gt;
  &amp;lt;/Document&amp;gt;
);

export default MyDocument;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Passo 3: Estilo e Personalização:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assim como no React, você pode estilizar seus elementos PDF com CSS. O React-PDF traz também o seu próprio StyleSheet, que facilita a organização e aplicação de estilos aos elementos do PDF.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { StyleSheet } from '@react-pdf/renderer';

const styles = StyleSheet.create({
    page: {
      backgroundColor: '#fff',
      padding: 20,
      fontSize: 12,
    },
    header: {
      padding: 10,
      display: 'flex',
      flexDirection: 'row',
      justifyContent: 'center',
      gap: 20,
      marginBottom: 20
    },
    image: {
      width: 50,
      height: 50
    }
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Passo 4: Renderização do PDF:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora que você tem a estrutura do PDF, é hora de renderizá-lo. Você pode fazer isso criando um modal e utilizar o PDFViewer fornecido pelo React-PDF, neste exemplo usei o Material-ui para me ajudar com o modal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as React from 'react';
import Box from '@mui/material/Box';
import Button from '@mui/material/Button';
import Modal from '@mui/material/Modal';
import { PdfTemplate } from '../PdfTemplate';
import { PDFViewer } from '@react-pdf/renderer';
import { useMarketList } from '../../hooks/useMarketList';

const style = {
  position: 'absolute',
  top: '50%',
  left: '50%',
  transform: 'translate(-50%, -50%)',
  width: '80%',
  height: '90%',
  boxShadow: 24,

};

export function ModalPdf() {
  const [open, setOpen] = React.useState(false);

  const handleOpen = () =&amp;gt; setOpen(true);

  const handleClose = () =&amp;gt; setOpen(false);

  const { items } = useMarketList()

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;Button onClick={handleOpen}&amp;gt;Gerar lista&amp;lt;/Button&amp;gt;
      &amp;lt;Modal
        open={open}
        onClose={handleClose}
      &amp;gt;
        &amp;lt;Box sx={style}&amp;gt;
          &amp;lt;PDFViewer width={'100%'} height={'100%'} &amp;gt;
            &amp;lt;PdfTemplate items={items} /&amp;gt;
          &amp;lt;/PDFViewer&amp;gt;
        &amp;lt;/Box&amp;gt;
      &amp;lt;/Modal&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com esses passos simples, você poderá criar seus próprios PDFs dinâmicos diretamente do seu aplicativo React, assim como eu fiz após enfrentar esse desafio. &lt;/p&gt;

&lt;p&gt;Caso tenha interesse, vou disponibilizar o link do projeto que fiz para embasar esse texto.&lt;br&gt;
&lt;a href="https://github.com/Ramonprog/react-pdf"&gt;Repositório no GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/ramon-dev/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dicas Práticas de Acessibilidade com React JS</title>
      <dc:creator>Alisson Ramon</dc:creator>
      <pubDate>Sun, 10 Mar 2024 16:48:39 +0000</pubDate>
      <link>https://dev.to/ramonprog/dicas-praticas-de-acessibilidade-com-react-js-1lhi</link>
      <guid>https://dev.to/ramonprog/dicas-praticas-de-acessibilidade-com-react-js-1lhi</guid>
      <description>&lt;p&gt;&lt;strong&gt;Primeiro, oque é acessibilidade web?&lt;/strong&gt; &lt;br&gt;
A acessibilidade na web se refere à prática de garantir que os sites e aplicativos da web sejam acessíveis e utilizáveis por todas as pessoas, independentemente de suas capacidades físicas ou cognitivas. Isso inclui tornar o conteúdo acessível para pessoas com deficiências visuais, auditivas, motoras, cognitivas ou outras. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estrutura seântica:&lt;/strong&gt;&lt;br&gt;
Consiste na organização semântica. Com o advento do HTML 5, a web deixou de ser um amontoado de containers &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; genéricos e passou a atribuir sentido com o auxílio de tags como &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;,&lt;/code&gt; entre outras. Esses elementos não apenas contribuem para a acessibilidade, mas também facilitam a indexação pelos mecanismos de busca.&lt;/p&gt;

&lt;p&gt;Aqui estão alguns desses elementos e seus propósitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;: agrupa elementos no topo da página;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;: define a área de navegação;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;: delimita uma seção genérica da página;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;: apresenta conteúdo complementar;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;: fornece informações de rodapé.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, &lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt; e &lt;code&gt;&amp;lt;em&amp;gt;&lt;/code&gt; são usados para dar ênfase ao conteúdo, ao contrário dos elementos &lt;code&gt;&amp;lt;b&amp;gt;&lt;/code&gt; e &lt;code&gt;&amp;lt;i&amp;gt;&lt;/code&gt;, que não possuem peso semântico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Botões semânticos: &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É comum encontrarmos aplicações que utilizam elementos genéricos para se comportarem como botões, como no exemplo a seguir:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;span onClick={handleSubmit} className='btn'&amp;gt;Enviar respostas&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Existem alguns motivos para essa prática, como a facilidade na estilização, evitando a necessidade de zerar bordas e paddings que já são aplicados automaticamente à tag button. No entanto, essa abordagem cria uma barreira de acessibilidade significativa, já que os usuários não conseguem acessar o elemento pelo teclado, e ele só se comporta como um botão quando clicado.&lt;/p&gt;

&lt;p&gt;Aqui estão algumas dicas para contornar essa situação:&lt;br&gt;
1- Para zerar todas as estilizações do &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; e manter a acessibilidade via teclado, podemos usar a propriedade all: unset;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.btn {
  all: unset;
  cursor: pointer;
  padding: 8px 16px;
  background-color: #6ede45;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2- Se, por algum motivo, ainda quisermos utilizar um &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; ou &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; como um botão, podemos usar o atributo role para mudar sua semântica e fazê-lo se comportar como um botão&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;span role='button' className='btn'&amp;gt;Enviar respostas&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Essas práticas ajudam a garantir que os botões sejam acessíveis e utilizáveis por todos os usuários, incluindo aqueles que dependem da navegação pelo teclado.&lt;/p&gt;

&lt;p&gt;Outra barreira de acesso é limitar que o botão seja ativo apenas ao clicar. Isso pode ser problemático para pessoas com limitações motoras que têm dificuldades no manuseio do mouse ou que navegam apenas pelo teclado. Esses usuários podem enfrentar dificuldades para interagir com o botão e realizar ações importantes em seu aplicativo ou site.&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;button
      onClick={handleClick}
      onKeyPress={handleKeyPress}
    &amp;gt;
      Avançar
    &amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cores: &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As cores desempenham um papel fundamental na construção de uma página web, mas devem ser usadas com cuidado. Pessoas com baixa visão ou daltonismo podem ter dificuldades em distinguir certas cores ou identificar um contraste inadequado.&lt;/p&gt;

&lt;p&gt;É importante garantir um bom contraste entre o texto e o fundo, e para isso podemos usar ferramentas como contrast checker. Um site muito útil que frequentemente é utilizado para avaliar o contraste é o Coolors Contrast Checker (&lt;a href="https://coolors.co/contrast-checker"&gt;https://coolors.co/contrast-checker&lt;/a&gt;). Com essa ferramenta, é possível parametrizar o quão bom está o contraste em sua página da web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mo35rx614jdupcc42cc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mo35rx614jdupcc42cc.png" alt="Image description" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro ponto importante sobre o uso de cores é nunca usar somente cores para transmitir uma informação. Por exemplo, se um usuário deixar campos obrigatórios sem responder, é comum que o input automaticamente fique vermelho para indicar um erro. No entanto, para uma pessoa com limitações visuais, isso pode não ser útil.&lt;/p&gt;

&lt;p&gt;Portanto, é fundamental incluir informações adicionais, como textos descritivos ou mensagens de erro, para indicar claramente ao usuário o motivo pelo qual algo está errado. Em vez de depender apenas da cor vermelha para indicar um erro, é importante fornecer uma mensagem explicativa que indique o problema e forneça orientações sobre como corrigi-lo.&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;form onSubmit={handleSubmit}&amp;gt;
      &amp;lt;label htmlFor="email"&amp;gt;Email:&amp;lt;/label&amp;gt;
      &amp;lt;input
        type="email"
        id="email"
        name="email"
        value={email}
        onChange={handleInputChange}
        required
      /&amp;gt;
      {emailError &amp;amp;&amp;amp; 
        &amp;lt;span style={{ color: 'red' }}&amp;gt;
          Por favor, preencha um email válido.
        &amp;lt;/span&amp;gt;
      }
      &amp;lt;button type="submit"&amp;gt;Enviar&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Redimensionar Textos: &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O design responsivo tem uma relação forte com a acessibilidade. Usuários com baixa visão frequentemente precisam navegar com configurações de fontes maiores que o padrão do dispositivo. Portanto, devemos fazer uso de unidades de medidas relativas, em vez de unidades fixas como 'px'.&lt;/p&gt;

&lt;p&gt;Ao utilizar unidades relativas, como 'em', 'rem' ou porcentagens, permitimos que os usuários redimensionem o texto conforme necessário, garantindo uma experiência de leitura confortável para todos os usuários, independentemente de suas configurações de acessibilidade.&lt;/p&gt;

&lt;p&gt;Para converter um valor em pixels (px) para rem, você divide o valor em pixels pelo tamanho da fonte do elemento pai, que é definido em rem. Isso permite que o valor seja escalonado de acordo com a configuração de tamanho de fonte do usuário.&lt;/p&gt;

&lt;p&gt;Se o tamanho da fonte do elemento pai estiver definido em rem, você pode fazer a conversão diretamente, por exemplo, se o tamanho da fonte do elemento pai for 16px, você dividirá o valor em pixels pelo tamanho da fonte base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.example {
  font-size: 0.5625rem; /* 9px dividido por 16px (tamanho da fonte base) = 0.5625rem */
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas para você não precisar fazer esse tipo de conta a todo momento, vou indicar uma extensão do vs code que uso, px to rem &amp;amp; rpx &amp;amp; vw (cssrem)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwdcu11kviomjfnfch3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwdcu11kviomjfnfch3g.png" alt="Image description" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando digitamos, a extensão já oferece a substituição de px por rem, ou basta usar 'Ctrl + Espaço' para que a sugestão apareça automaticamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3rzmqdjon7295gv2eee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3rzmqdjon7295gv2eee.png" alt="Image description" width="786" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Neste artigo, destacamos dicas simples para melhorar a acessibilidade de projetos web com React JS. Abordamos a importância da estrutura semântica em HTML, botões acessíveis, bom contraste de cores e mensagens de erro claras.&lt;/p&gt;

&lt;p&gt;Ao implementar essas práticas, podemos criar uma web mais inclusiva para todos os usuários.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bibliografia: &lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ferraz, Reinaldo. Acessibilidade na Web. Editora Casa do Código, 16 de julho de 2020.&lt;br&gt;
World Wide Web Consortium (W3C). Web Content Accessibility Guidelines (WCAG). Disponível em: &lt;a href="https://www.w3.org/WAI/WCAG21/quickref/"&gt;https://www.w3.org/WAI/WCAG21/quickref/&lt;/a&gt;. Acesso em: 10/03/2024.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
  </channel>
</rss>
