๐จ ๋ผ์ดํธ ๋ชจ๋, ๋คํฌ ๋ชจ๋, ํ ๋ง ์ปค์คํฐ๋ง์ด์ฆ, Styled-components, NextJS, Typescript.
22464 ๋จ์ด reactdesignnextjstypescript
๊ธฐ์ ๋ก ์๊ฐ
NextJS
์คํ์ผ ๊ตฌ์ฑ ์์
๊ฐ์ฌํฉ๋๋ค!
Criando a plicaรงรฃo
yarn create next-app <nome do projeto>
, apรณs executar esse comando ele irรก comeรงar a criar o seu projeto NextJs (pode demorar um pouquinho). ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ํ๊ฐ
src
e colocando as minhas ํ์คํ e arquivos lรก, apenas deixando a ํ์คํpublic
de fora, mas isso vai de acordo com o seu gosto! ๊ตฌ์ฑ ๋๋ Typescript
yarn add typescript -D
tsconfig.json
, ๋
ธ์คํฐ๋ฏธ๋ ์์คํฌ๋ ๋ฐ touch tsconfig.json
src/pages
ํ์ฅ ์ ๊ฑฐ.js
๋ฐ ์ถ๊ฐ.tsx
yarn dev
no nosso terminal e abrira a pรกgina do NextJS na porta :3000
๊ตฌ์ฑ ์์ ์คํ์ผ ๊ตฌ์ฑ ์์
yarn add styled-components
Iremos criar um arquivo chamado
_document.tsx
dentro de src/pages
, nele haverรก o seguinte conteรบdo. Isso รฉ para as injeรงรตes de estilo no server side rendering.import Document, { DocumentContext } from 'next/document';
import { ServerStyleSheet } from 'styled-components';
export default class MyDocument extends Document {
static async getInitialProps(ctx: DocumentContext) {
const sheet = new ServerStyleSheet();
const originalRenderPage = ctx.renderPage;
try {
ctx.renderPage = () =>
originalRenderPage({
enhanceApp: App => props => sheet.collectStyles(<App {...props} />),
});
const initialProps = await Document.getInitialProps(ctx);
return {
...initialProps,
styles: (
<>
{initialProps.styles}
{sheet.getStyleElement()}
</>
),
};
} finally {
sheet.seal();
}
}
}
Dentro da nossa ํ์คํ
src/styles
vamos criar o arquivostyled.d.ts
para sobrescrevermos os tipos do styled-components.import 'styled-components';
declare module 'styled-components' {
export interface DefaultTheme {
title: string;
colors: {
primary: string;
secundary: string;
background: string;
text: string;
};
fontSizes: {
small: string;
medium: string;
large: string;
};
}
export interface CustomTheme {
title: string;
colors: {
primary: string;
secundary: string;
background: string;
text: string;
};
}
}
Dentro no nosso arquivo tsconfig.json vamos adicionar o seguinte atributo.
....
"files": [
"src/styles/styled.d.ts"
]
Vamos rapidinho criar um estilo global para a aplicaรงรฃo, crie o arquivo global.ts dentro de
src/styles
import { createGlobalStyle } from 'styled-components';
export default createGlobalStyle`
* {
margin: 0;
padding: 0;
box-sizing: border-box;
outline: 0;
}
body {
background: #fff;
color: black;
}
h1, h2, h3, h4, h5, h6, strong {
font-weight: 700;
}
button {
cursor: pointer;
}
`;
Agora vamos importรก-lo no arquivo
index.tsx
, ์ญ์ os arquivos de estilo.css
do projeto tambรฉm!import GlobalStyles from '../styles/global';
export default function Home() {
return (
<>
<GlobalStyles />
</>
);
}
ํฌ๋ฆฌ์๋ ์ค์ค ํ ๋ง์ค
src/styles
vamos criar uma ํ์คํthemes
e nela um arquivo dark.ts(para o dark mode) o arquivo light.ts para o(light mode jura?) e um arquivo index.ts. O arquivo
dark.ts
terรก as seguintes cores (isso vocรช ๊ฒฐ์ de acordo com o seu design)export default {
title: 'dark',
colors: {
primary: '#161616',
secundary: '#555',
background: '#333',
text: '#fff',
},
};
O arquivo
light.ts
terรก as seguintes coresexport default {
title: 'light',
colors: {
primary: '#666',
secundary: '#777',
background: '#fff',
text: '#333',
},
};
Arquivo
index.ts
serรก responsรกvel por misturar as cores de cada tema com o que seria comum entre os dois, ์: tamanho de fonte.import { DefaultTheme, CustomTheme } from 'styled-components';
import dark from './dark';
import light from './light';
const defaultTheme = {
fontSizes: {
small: '16px',
medium: '18px',
large: '20px',
},
};
function combineTheme(theme: CustomTheme): DefaultTheme {
return { ...defaultTheme, ...theme };
}
export { combineTheme, dark, light };
Aplicando os temas!
Agora que jรก criamos nossos temas vamos importรก-los e fazer as trocas dinรขmicas de temas, em
src/pages
vamos fazer algumas alteraรงรตes no nosso index.tsx
, mas antes vamos adicionar um componente de switch para ficar mais estiloso jรก que estamos falando de temas , portanto, escreve yarn add react-switch
๋
ธ์คํฐ๋ฏธ๋import React, { useState } from 'react';
import { DefaultTheme, ThemeProvider } from 'styled-components';
import Switch from 'react-switch';
import { combineTheme, dark, light } from '../styles/themes';
import GlobalStyles from '../styles/global';
const Home: React.FC = () => {
const [theme, setTheme] = useState<DefaultTheme>(combineTheme(light));
const toggleTheme = () => {
setTheme(theme.title === 'light' ? combineTheme(dark) : combineTheme(light));
};
return (
<ThemeProvider theme={theme}>
<GlobalStyles />
<Switch checked={theme.title === 'dark'} onChange={toggleTheme} />
</ThemeProvider>
);
};
export default Home;
Agora vamos em
src/styles
no nosso arquivo global.ts
e vamos fazer as seguintes alteraรงรตes!import { createGlobalStyle } from 'styled-components';
export default createGlobalStyle`
* {
margin: 0;
padding: 0;
box-sizing: border-box;
outline: 0;
}
body {
background: ${props => props.theme.colors.background};
color: ${props => props.theme.colors.text};
font-size: ${props => props.theme.fontSizes.small}
}
h1, h2, h3, h4, h5, h6, strong {
font-weight: 700;
}
button {
cursor: pointer;
}
`;
Projeto no Github
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐จ ๋ผ์ดํธ ๋ชจ๋, ๋คํฌ ๋ชจ๋, ํ ๋ง ์ปค์คํฐ๋ง์ด์ฆ, Styled-components, NextJS, Typescript.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/jjairojr/light-mode-e-dark-mode-e-temas-customizados-com-styled-components-e-nextjs-com-typescript-1pmhํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค