1
resposta

Variaveis css

Olá, gostaria de saber se declarar variáveis css no GlobalStyle elas estariam acessiveis para meus componentes estilizados, por exemplo no caso de fonts como no exemplo abaixo, usando uma combinação de variaveis JS e CSS, e se der certo, gostaria tb de saber se essa é uma boa abordagem:

import {createGlobalStyle} from "styled-components"; import {header_height, body_color, text_color, title_color} from "./UI/variables"

export const GlobalStyle = createGlobalStyle`

:root {

/========== Font and typography ==========/ --body-font: 'Poppins', sans-serif; --biggest-font-size: 2rem; --h2-font-size: 1.25rem; --h3-font-size: 1.125rem; --normal-font-size: .938rem; --small-font-size: .813rem;

/========== Font weight ==========/ --font-semi-bold: 600; --font-bold: 700;

}

@media screen and (min-width: 968px){ :root{ --biggest-font-size: 3rem; --h2-font-size: 1.75rem; --h3-font-size: 1.25rem; --normal-font-size: 1rem; --small-font-size: .875rem; } }

body{ margin: ${header_height}; font-family: var(--body-font); font-size: var(--normal-font-size); background-color: ${body_color}; color: ${text_color}; line-height: 1.6; }

h1,h2,h3,ul,p{ margin: 0; }

h1,h2,h3{ font-weight: var(--font-semi-bold); color: ${title_color}; }

ul{ padding: 0; list-style: none; }

a{ text-decoration: none; }

img{ max-width: 100%; height: auto; } `

1 resposta

Fala Delano, tudo bem?

Sim, é possivel criar uma váriavel css nos estilos globais e utilizar durante o projeto, porém para esses casos que você for utilizar váriaveis no styled component, eu recomendo utilizar o Theme do styled components, que fica responsável por fornecer valores para o seus estilos, então usaremos ele para fornecer esses valores que nessa caso pode ser as nossas variáveis, para utilizar o Theme é necessário importar um componente próprio do styled components chamado ThemeProvider que será o provedor dos valores para qualquer componente filho (recomendo importar no maior nivel da sua aplicação, como por exemplo o App.js, para que possa fornecer esses valores para qualquer componente):

import  { ThemeProvider  } from 'styled-components';

function App() {
        return (
                <ThemeProvider>

                </ThemeProvider>
        )
}

E esse componente, espera receber um atributo chamado theme que será os valores que serão fornecidos aos nossos componentes, e como valor desse atributo passamos o que queremos que os nossos componentes do styled components tenha acesso:

import  { ThemeProvider  } from 'styled-components';

function App() {
        return (
                <ThemeProvider theme={primaryColor = '#fff'}>

                </ThemeProvider>
        )
}

Nesse caso passamos como valor desse theme, um valor chamado primaryColor que é uma váriavel com o valor #fff, esse é um exemplo do que podemos passar, mas normalmente criamos um objeto que contenha todas as nossas "variáveis", veja um exemplo:


import  { ThemeProvider  } from 'styled-components';

function App() {

        const tema = {
                colors: {
                        primaryColor: '#fff',
                        contrastColor: '#000'
                } 
        } //Aqui criamos um objeto com nome qualquer que possui as nossas cores que poderiamos usar durante toda nossa aplicação

        return (
                <ThemeProvider theme={tema}> //Aqui eu passo esse objeto como valor para o nosso ThemeProvider

                </ThemeProvider>
        )
}

Certo, agora temos o nosso objeto com as nossas cores, mas como poder utilizar isso nos nossos componentes do styled components? Simples, nos nossos componentes do styled components nós podemos utilizar funções JavaScript utilizando ${} e dentro dessas chaves inserindo a nossa função ou qualquer coisa de JavaScript, então, quando utilizamos uma função desse modo no nosso styled components, ela automáticamente recebe algumas props, e nessas props, além das props que podemos passar diretamente para o componente, nós recebemos uma prop chamada theme que adivinha? É aonde fica os valores que passamos para o nosso ThemeProvider, assim podemos utilizar da forma que preferirmos, veja um exemplo:

import styled from 'styled-components';

const Titulo = styled.h1`
        font-size: 32px;
        color: ${function (props) {  return props.theme.colors.primaryColor } };  // **
`;

export default Titulo;

Na linha acima marcado com asterisco, nós criamos uma função que recebe essas nossas props, e acessamos nessas props o theme que recebemos do ThemeProvider, então agora como criamos um objeto, estou acessando normalmente as propriedades que criei no objeto tema, e retornando a cor primaria que definimos no objeto

Obs: Para que seja possivel ter acesso aos valores que passamos para o theme do ThemeProvider, é necessário que aquele componente seja filho do ThemeProvider e seja um componente criado através do styled component.

Viu como é simples? E essa é uma maneira escalável, você pode difinir o que quiser para utilizar nos seus estilos, seja tamanho de fonte, cor, tipografia, etc... Clicando aqui você tem acesso a documentação do styled components explicando sobre essa funcionalidade.

Espero ter ajudado, bons estudos :D