Olá! Sou o Pedro, instrutor da Alura. Boas-vindas a mais um curso de React!
Audiodescrição: Pedro é uma pessoa com cabelos e barba castanho-escuro. Usa piercing no nariz, um colar e camiseta preta. Ao fundo, uma iluminação degradê do roxo ao azul e quadros pendurados das paredes. Na direita, uma prateleira com objetos de decoração e mais mais à frente instrumentos de corda enfileirados.
Estamos ansiosos para colocar a mão na massa e aprender sobre temas em Design System. No Storybook do nosso projeto, onde o Alfabit, esse Design System, já possui alguns componentes e tokens de cores desenvolvidos, além de alguns projetos de demonstração, como o nosso Storybook e o Alfabit Demo. Dentro desses projetos, podemos experimentar a troca de tema.
Por enquanto, nossa aplicação está com o tema claro sendo exibido. Ao clicar no botão, ela troca para o tema escuro, e também há um botão para uma troca de tema customizado que desenvolveremos juntos neste curso, voltado para a parte de temas com Design System.
Além disso, faremos a integração do GitHub Actions para realizar tanto o build quanto a release dos pacotes que temos dentro do monorepositório do Design System e componentes Alfabit. Vamos explorar na prática como criar, seguir o passo a passo e configurar nossas secrets, tanto do npmjs para fazer a publicação quanto do lado do GitHub.
Este curso é bastante abrangente, nos divertiremos muito explorando a parte de temas.
Para acompanhar o curso, é necessário um bom conhecimento em React, pois vamos pular alguns conceitos mais básicos e partir para um desenvolvimento mais avançado. Utilizaremos hooks como useContext
e useState
, que serão bastante necessários, além de manusear arquivos TypeScript para criar tipagens específicas e trabalhar com notação de objeto e propriedades dentro do TypeScript.
Vamos explorar tudo isso juntos. Pegue sua água para se hidratar e vamos embarcar nesta jornada aprendendo mais sobre temas em Design System. Vamos lá!
Quando começamos a discutir a escalabilidade do nosso Design System, encontramos alguns desafios. Vamos explorar mais esse tema.
Para ilustrar, estamos utilizando um editor de código aberto dentro do monorepositório do Alphabit, que é o nosso Design System. Acessamos a pasta "Packages > alphabit-tokens > src". No arquivo colors.ts
, todas as cores utilizadas pelo nosso Design System já estão implementadas. Para utilizá-las, basta exportar o token, que é um objeto. Ao exportar o objeto background.light
, temos acesso ao token que contém a hash FFFFFF
, que representa a cor branca. Da mesma forma, ao acessar a cor dark
, utilizamos background.dark
, que retorna a hash hexadecimal correspondente.
No entanto, como os componentes são implementados no Design System não permite flexibilidade na alteração de cores. Por exemplo, ao acessar o Alphabit Button
, na estrutura de "packages" no monorepositório, percebemos que no arquivo button.styles.ts
, na linha 19, a cor primária azul será sempre a definida no token. Isso significa que, ao utilizar esse componente em qualquer lugar, ele terá a mesma cor. Surge, então, a necessidade de oferecer uma alternativa para a pessoa desenvolvedora poder adaptar a hash dessa cor primária, permitindo que, independentemente do local de uso, dentro de um tema, ela possa definir sua própria hash de cor azul primária e implementá-la no botão.
Vamos começar a discutir como criar temas e flexibilizar sua utilização para as pessoas desenvolvedoras que utilizam o Design System. Para isso, voltamos na pasta "alphabet-tokens > src". Em "src", clicamos com o botão direito e depois em "New file". O nomeamos de themes.ts
.
Consultando a documentação do Material UI, por exemplo, observamos uma forma de criar temas para serem implementados. Vamos criar nosso próprio "gerador de temas" para fornecer aos componentes e aplicações que utilizam nossos componentes. Teremos sempre um tema padrão (default). Existe um conceito de esquemas dentro dos temas, que se popularizou entre 2017 e 2018, especialmente com a alternância entre temas claros e escuros em sites, como blogs desenvolvidos com Next.js, Gatsby, ou outros frameworks de páginas estáticas. Isso permite alterar toda uma paleta de cores, espaçamento e até fontes, se desejado.
No arquivo themes.ts
, iniciaremos criando export const light theme = {}
. Pulamos duas linhas e criamos o export const darkTheme = {}
, ambos inicialmente como objetos vazios. Ao investigar como nosso Design System e tokens estão estruturados, percebemos que são objetos que acessamos para obter as informações desejadas. Essa é uma forma funcional de implementar tokens, que funciona bem com TypeScript, pois oferece documentação quase em tempo real do que está contido no objeto.
export const lightTheme = {};
export const darkTheme = {};
Já temos dois esquemas para trabalhar: light theme
e dark theme
. Um deles será o tema padrão, garantindo que, caso a pessoa desenvolvedora não escolha um tema, ainda haverá uma cor padrão. Trabalhar com temas é opcional e depende do projeto. Temas são muito utilizados no contexto de escalabilidade, resolvendo problemas relacionados. No entanto, precisamos aprofundar a utilização de temas, pois podemos customizar cores e criar temas personalizados, assunto que discutiremos mais adiante.
Vamos começar a implementar, passando os tokens desejados para o tema claro e, em seguida, para o tema escuro. Continuaremos essa implementação na sequência.
Vamos criar os temas que teremos dentro do Design System. Já temos o lightTheme
e o darkTheme
criados dentro do themes.ts
. Agora, precisamos passar os tokens para dentro desses objetos. Fazemos isso para não precisar, toda vez que trabalharmos com temas, visitar outro arquivo, como o colors.ts
, para verificar qual cor corresponde ao tema claro, por exemplo. Assim, deixamos tudo pronto para facilitar na criação da nossa função de tema.
Dentro do themes.ts
, no lightTheme
, criaremos um objeto chamado colors
. Vamos separar dessa forma porque, neste curso, abordaremos a customização de cores, mas um tema não se limita a isso. Podemos ter, por exemplo, customização de espaçamento, fonte, entre outros objetos customizáveis dentro de um tema. Para facilitar a visualização rápida e fácil da atualização de temas no navegador, utilizaremos as cores, que são mudanças visuais drásticas quando alteramos o tema. Dentro do objeto colors
, criaremos um chamado background
.
export const lightTheme = {
colors: {
}
}
export const darkTheme = {};
No colors.ts
, já temos uma diferenciação de background
, light
e dark
. Utilizaremos o background.light
, lembrando de fazer a importação na linha 1. Também teremos uma cor específica para textos, que pode ser o gray primary, que é um #181818 e fazemos também a importação.
Teremos agora um token específico para a cor primary
, que nos temas claro e escuro normalmente segue um padrão de azul ou violeta. Nesse caso, o primary
refletirá o blue.primary
do colors.ts
, nossa cor primária. Para a cor secundária, queremos fugir um pouco do azul. Vamos testar o #5C5C5C, que pode ser uma boa cor para o tema claro. No tema escuro, valorizaremos cores que se destacam em fundos escuros. Utilizaremos o gray.secondary
como cor secundária.
O padrão de temas ao trabalhar com cores é ter sempre um background
, uma cor de texto, uma cor primária, uma cor secundária, uma cor de sucesso, uma cor de aviso e uma cor de erro. A psicologia das cores sugere que, para sucesso utilizamos verde, para aviso amarelo e para erro o vermelho. Os temas são customizáveis conforme desejarmos.
Abaixo do secondary
, criaremos uma cor de sucesso. Como não temos um token verde implementado, criaremos um export const green
no colors.ts
, definindo um verde primário, #28A745, para sucesso. Aproveitaremos para criar um vermelho, red.primary
, #DC3545, e um amarelo, yellow.primary
, #FFC107. Assim, criamos três tokens: verde, vermelho e amarelo.
colors.ts
//Código omitido
export const green = {
primary: '#28a745',
};
export const red = {
primary: '#dc3545',
};
export const yellow = {
primary: '#ffc107',
};
Salvamos o arquivo e voltamos ao themes.ts
. No success
, linha 9, adicionamos o green.primary
, na linha 10, o error: red.primary
e na linha 11 warning: yellow.primary
. Dessa forma, temos tokens para o tema claro.
Existem outras duas cores, black: #000000
e white; FFFFFF
, que são importantes. Podemos criar uma const
chamada commonColors
e adicionar essas cores para tornar o código mais legível. Utilizamos o spread operator para adicionar black
e white
ao objeto colors
, sem replicar linhas, pois podem surgir mais cores comuns entre os dois temas.
themes.ts
import { background, blue, gray, green, red, yellow } from './colors';
const commonColors = {
black: '#000000',
white: '#FFFFFF',
};
export const lightTheme = {
colors: {
...commonColors,
background: background.light,
text: gray.primary,
primary: blue.primary,
secondary: gray.secondary,
success: green.primary,
error: red.primary,
warning: yellow.primary,
},
};
export const darkTheme = {};
Trabalhamos com o tema claro e, na sequência, trabalharemos com o tema escuro. Nos encontramos na próxima etapa!
O curso React: integrando temas com styled-components possui 124 minutos de vídeos, em um total de 48 atividades. Gostou? Conheça nossos outros cursos de React em Front-end, ou leia nossos artigos de Front-end.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.