[
  {
    "path": ".github/ISSUE_TEMPLATE/discussion.md",
    "content": "---\nname: Issue de discussão\nabout: Sugestões, alterações, correções, etc.\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n## O que?\n\n<!--\n  Detalhe qual o assunto da issue, o contexto da mesma e qual o problema à ser resolvido.\n  Exemplo: \"Precisamos adicionar uma sessão sobre...\"\n-->\n\n(Escreva aqui.)\n\n## Por quê?\n\n<!--\n  Escreva quais são as motivações da issue.\n  Exemplo: \"Atualmente, não temos uma sessão sobre... e essa sessão é muito importante pois...\n-->\n\n(Escreva aqui.)\n\n## Referências\n\n<!--\n  Adicione às referências à issue (PR's, documentações, outras issues, etc.)\n-->\n\n(Escreva aqui.)\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Descrição\n\n<!--\n  Detalhe qual o objetivo desse PR, qual a finalidade do mesmo.\n  Exemplo: \"Adicionada sessão de ...\"\n-->\n\n(Escreva aqui.)\n\n## O que foi feito nesse PR?\n\n- [x] Tarefa já realizada\n- [ ] Tarefa à ser feita\n\n## Dependência de outras Issues\n\n> Exemplo: #1\n> \n"
  },
  {
    "path": ".gitignore",
    "content": "./node_modules\nnode_modules\nnode_modules/*\n./.next\n.next"
  },
  {
    "path": "README.md",
    "content": "# guiareact.org \nSite em Português com tradução do Original reactpatterns.com de Michael Chan - [@chantastic](https://github.com/chantastic)\n\nhttps://guiareact.org\n\n\n## CONTRIBUA\n\n - Clone o projeto em sua máquina\n - Edite ou Crie os arquivos MD na pasta **documentation**\n - Abra uma [Issue](https://github.com/rubenmarcus/guiareact.org/issues/new).\n - Crie um [P/R](https://github.com/rubenmarcus/guiareact.org/compare) e adicione o link na sua issue.\n\n\n## ROADMAP\n\n- TROCAR TODOS EXEMPLOS DE CLASSE PARA EXEMPLOS COM COMPONENTES FUNCIONAIS\n- ADICIONAR GUIA DE HOOKS\n- ADICIONAR MAIS EXEMPLOS\n- ADICIONAR GUIA DE NEXT.JS\n- ADICIONAR GUIA DE CSS IN JS\n- ADICIONAR GUIA DE REDUX\n- ADICIONAR GUIA DE CONTEXT API"
  },
  {
    "path": "components/header.js",
    "content": "export default function AppHeader(props){\n\n    return(\n        <header>\n            <h1>{props.title}</h1>\n            <nav>\n              <ul>\n                <li>\n                  <a\n                    className=\"github-button\"\n                    href=\"https://github.com/rubenmarcus/guiareact.org\"\n                    data-color-scheme=\"no-preference: light; light: light; dark: dark;\"\n                    data-size=\"large\"\n                    data-show-count=\"true\"\n                    aria-label=\"Star rubenmarcus/guiareact.org on GitHub\"\n                  >\n                    Star\n                  </a>\n                </li>\n              </ul>\n            </nav>\n          </header>\n    )\n}"
  },
  {
    "path": "components/mdcontainer.js",
    "content": "import ReactMarkdown from \"react-markdown\";\nimport remarkSlug from \"remark-slug\";\nimport remarkLinks from \"remark-external-links\";\nimport remarkHljs from \"remark-highlight.js\";\nimport remarkToc from \"remark-toc\";\n\nexport default function MdContainer({ markdown }) {\n  const remarkPluginSet = [remarkSlug, remarkLinks, remarkHljs, remarkToc];\n\n  return <ReactMarkdown children={markdown} remarkPlugins={remarkPluginSet} />;\n}\n"
  },
  {
    "path": "components/pagehead.js",
    "content": "export default function PageHead(props) {\n  const GA_TRACKING_ID = \"G-TQFVHD7RW1\";\n\n  return (\n    <>\n      <title key=\"title\">{props.title? props.title : 'Guia de Padrões React'}</title>\n      <meta\n        name=\"viewport\"\n        content=\"initial-scale=1.0, width=device-width\"\n        key=\"viewport\"\n      />\n      <meta\n        key=\"description\"\n        name=\"description\"\n        content=\"Guia de Padrões React.Com exemplos e padrões básicos a avançados.\"\n      />\n      <link\n        href=\"https://fonts.googleapis.com/css?family=Merriweather:300,300i&display=swap\"\n        rel=\"stylesheet\"\n      />\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n      <meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n      <link rel=\"apple-touch-icon\" href=\"/logo-180x180.png\" />\n      <link rel=\"shortcut icon\" href=\"/favicon.ico\" type=\"image/x-icon\" />\n      <meta name=\"apple-mobile-web-app-title\" content=\"Guia de Padrões React\" />\n      <script\n        async\n        src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}\n      ></script>\n      <script async defer src=\"https://buttons.github.io/buttons.js\"></script>\n      <script\n        dangerouslySetInnerHTML={{\n            __html: `\n    window.dataLayer = window.dataLayer || [];\n    function gtag(){dataLayer.push(arguments);}\n    gtag('js', new Date());\n    gtag('config', '${GA_TRACKING_ID}');\n    `,\n        }}\n      />\n    </>\n  );\n}"
  },
  {
    "path": "config/md-loader.js",
    "content": "import Hooks from \"../documentation/DOC-HOOKS.md\";\nimport Contribua from \"../documentation/DOC-CONTRIBUA.md\";\nimport Links from \"../documentation/DOC-LINKS.md\";\n\nconst MdLoader = {\n  hooks: Hooks,\n  contribua: Contribua,\n  links: Links,\n};\n\nexport default MdLoader;\n"
  },
  {
    "path": "config/static-paths.js",
    "content": "const ROUTES = [\n  { params: { slug: \"hooks\", title: \"Guia de Hooks\" } },\n  { params: { slug: \"contribua\", title: \"Guia de Padrões React\" } },\n  { params: { slug: \"links\", title: \"Guia de Padrões React\" } },\n];\n\nexport const STATIC_PATHS = { paths: ROUTES, fallback: false };\n\nexport const PATH_PROPS = (slug) =>\n  STATIC_PATHS.paths.filter(({ params }) => params.slug === slug)[0].params;"
  },
  {
    "path": "documentation/DOC-HOME.md",
    "content": "# Guia de Padrões React\n\nUm guia de padrões React em Português.\n\nBaseado no [Original](https://reactpatterns.com) por Michael Chan [@chantastic](https://github.com/chantastic)\n\nTraduzido para Português e revisado por [@rubenmarcus](https://github.com/rubenmarcus)\n\ncom contribuição de [@LhuizF](https://github.com/LhuizF), [@matheusinfo](https://github.com/matheusinfo), [@luizwbr](https://github.com/luizwbr), [@arimariojesus](https://github.com/arimariojesus), [@gabepinheiro](https://github.com/gabepinheiro), [@GusttavoCastilho](https://github.com/GusttavoCastilho) e [@azraelgarden](https://github.com/azraelgarden).\n\n## Conteúdo\n\n- [Traduções](#traduções)\n- [Elementos](#elementos)\n- [Componentes](#componentes)\n- [Fragmentos](#fragmentos)\n  - [Sintaxe curta](#sintaxe-curta)\n  - [Exemplo com lista de componentes](#exemplo-com-lista-de-componentes)\n- [Expressões](#expressões)\n- [Props (Propriedades)](#props-propriedades)\n- [defaultProps (Propriedades Padrão)](#defaultprops-propriedades-padrão)\n- [Desestruturando props](#desestruturando-props)\n- [Atributos de spread JSX](#atributos-de-spread-jsx)\n- [Mergeando props desestruturadas com outros valores](#mergeando-props-desestruturadas-com-outros-valores)\n- [Renderização Condicional](#renderização-condicional)\n  - [`if`](#if)\n  - [`unless` (ao menos que)](#unless-ao-menos-que)\n  - [`if-else` (Operador Ternário)](#if-else-operador-ternário)\n- [Tipos de filhos (Children Types)](#tipos-de-filhos-children-types)\n  - [`String`](#string)\n  - [`Array`](#array)\n- [Array como filho (Array as children)](#array-como-filho-array-as-children)\n- [Função como filha (Function as children)](#função-como-filha-function-as-children)\n- [Render prop](#render-prop)\n- [Passando um Filho (Children)](#passando-um-filho-children)\n- [Componente Proxy](#componente-proxy)\n- [Estilizando componentes](#estilizando-componentes)\n- [Switch de Eventos](#switch-de-eventos)\n- [Componente de Layout](#componente-de-layout)\n- [Container Components](#container-components)\n- [Higher-order components](#higher-order-components)\n- [Elevando o state (state hoisting)](#elevando-o-state-state-hoisting)\n- [Inputs Controlados](#inputs-controlados)\n\n## Traduções\n\nTraduções não verificadas, e links não significam que são aprovadas.\n\n[Chinese](https://reactpatterns.cn)\n\n## Elementos\n\n[Elementos](https://pt-br.reactjs.org/docs/glossary.html#elements) são tudo que está envolvido por <>.\n\n```jsx\n<div></div>\n<MeuComponente />\n```\n\n[Componentes](#componentes) retornam Elementos.\n\n## Componentes\n\nUm [Componente](https://pt-br.reactjs.org/docs/glossary.html#components) é definido por uma função que declarada retorna um [Elemento](#elementos) React.\n\n```jsx\nfunction MeuComponente() {\n  return <div>Olá Mundo</div>;\n}\n```\n\n## Fragmentos\n\nUm [Fragmento](https://pt-br.reactjs.org/docs/fragments.html) permite agrupar uma lista de filhos sem adicionar nós extras ao DOM.\n\n```jsx\nfunction MeuComponente() {\n  return (\n    <React.Fragment>\n      <div>Olá</div>\n      <div>Mundo</div>\n    </React.Fragment>\n  );\n}\n```\n\nIsto renderizará no DOM apenas os seguintes elementos:\n\n```html\n<body>\n  <div>Olá</div>\n  <div>Mundo</div>\n</body>\n```\n\n### Sintaxe Curta\n\nExiste uma sintaxe nova e mais curta que você pode utilizar para declarar fragmentos. São as tags vazias:\n\n```jsx\nfunction MeuComponente() {\n  return (\n    <>\n      <div>Olá</div>\n      <div>Mundo</div>\n    </>\n  );\n}\n```\n\n## Expressões\n\nUse chaves para [Incorporar expressões](https://pt-br.reactjs.org/docs/introducing-jsx.html#embedding-expressions-in-jsx) no [JSX](https://pt-br.reactjs.org/docs/glossary.html#jsx).\n\n```jsx\nfunction OlaUsuario() {\n  const nome = \"Ruben\";\n\n  return <div>Olá {nome}!</div>;\n}\n```\n\n## Props (Propriedades)\n\nEntenda como `props` como um argumento externo para possibilitar customizações para seu componente.\n\n```jsx\nfunction DigaOla(props) {\n  return <div>Olá {props.nome}!</div>;\n}\n```\n\n## defaultProps (Propriedades Padrão)\n\nEspecificar valores padrão de `props` com `defaultProps`.\n\n```jsx\nfunction OlaUsuario(props) {\n  return <div>Olá {props.nome}!</div>;\n}\nOlaUsuario.defaultProps = {\n  nome: \"Visitante\",\n};\n```\n\n## Default function parameters (parâmetros predefinidos de uma função)\n\nEspecificar valores padrão de `props` com `default function parameters`.\nOs parâmetros predefinidos de uma função permitem que parâmetros regulares sejam inicializados com valores iniciais caso `undefined` ou nenhum valor seja passado.\n\n```jsx\n// Utilizamos aqui uma desestruturação no objeto `props` para pegarmos a prop `nome`\nfunction OlaUsuario({ nome = \"Visitante\" }) {\n  return <div>Olá {nome}!</div>;\n}\n```\n\n---\n\n## Desestruturando props\n\n[Atribuição via desestruturação](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) é um recurso do Javascript moderno.\n\nFoi adicionado a linguagem no ES2015.\n\n```js\nconst usuario = { nome: \"Ruben\" };\nconst { nome } = usuario;\n```\n\nFunciona com Array também.\n\n```js\nconst numeros = [\"um\", \"dois\"];\nconst [um, dois] = numeros;\n```\n\nAtribuição via desestruturação (Destructuring assignment) é usado muito em [componentes funcionais](#function-component).\nEssas declarações de componente são equivalentes.\n\n```jsx\nconst Ola = (props) => <div>Olá {props.name}!</div>;\n\nconst Ola = ({ name }) => <div>Olá {name}!</div>;\n```\n\nExiste uma sintaxe para atribuir as `props` restantes em um objeto.\nSe chama [Parâmetros](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Functions/rest_parameters) e parece assim:\n\n```jsx\nconst Ola = ({ name, ...restProps }) => <div>Olá {name}!</div>;\n```\n\nEsses três pontos (`...`) pegam todas a props que faltam e atribuem ao parâmetro `restProps`.\n\nEntão o que fazer com `restProps` quando você o tem?\n\nContinue lendo...\n\n---\n\n## Atributos de spread JSX\n\nAtributos de Spread é uma feature do [JSX](https://pt-br.reactjs.org/docs/introducing-jsx.html).\nÉ uma sintaxe para fornecer as propriedades de um objeto como atributos JSX.\n\nSeguindo o exemplo de [Destructuring props](#desestruturando-props),\nPodemos fazer **spread** com `restProps` em nossa `<div>`.\n\n```jsx\nconst Ola = ({ name, ...restProps }) => {\n  return <div {...restProps}>Hi {name}!</div>;\n};\n```\n\nIsso torna a função `Ola` super flexível.\nPodemos passar atributos DOM para `Ola` e que eles vão ser passados a nossa `div`.\n\n```jsx\n<Ola name=\"Fancy pants\" className=\"fancy-greeting\" id=\"user-greeting\" />\n```\n\nAtribuição via desestruturação é popular porque fornece uma maneira de separar props específicas de componentes, de atributos específicos de plataforma / DOM.\n\n```jsx\nfunction Greeting({ name, ...platformProps }) {\n  return <div {...platformProps}>Hi {name}!</div>;\n}\n```\n\n---\n\n## Mergeando props desestruturadas com outros valores\n\nComponentes são abstrações.\nBoas abstrações permitem extensão.\n\nConsidere esse componente que usa um atributo `class` para estilizar um `button`.\n\n```jsx\nfunction MyButton(props) {\n  return <button className=\"btn\" {...props} />;\n}\n```\n\nIsso funciona muito bem até tentarmos estendê-lo com outra classe.\n\n```jsx\n<MyButton className=\"delete-btn\">Delete...</MyButton>\n```\n\nNesse caso, `delete-btn` substitui `btn`.\n\nA ordem importa para [Atributos de spread JSX](#atributos-de-spread-jsx).\nO `props.className` sendo passado, substitui o `className` do nosso componente.\n\nPodemos mudar a ordem, mas agora o `className` **nunca** vai ser nada além de `btn`.\n\n```jsx\nfunction MyButton(props) {\n  return <button {...props} className=\"btn\" />;\n}\n```\n\nPrecisamos usar a atribuição via desestruturação para obter o `className` e mergear com o `className` base.\nPodemos fazer isso simplesmente adicionando todos os valores a uma array e juntando-os com um espaço..\n\n```jsx\nfunction MyButton({ className, ...props }) {\n  const classNames = [\"btn\", className].join(\" \");\n\n  return <button className={classNames} {...props} />;\n}\n```\n\nPara não ter problemas com `undefined` aparecendo no seu `className`, você pode atualizar sua lógica para pegar valores booleanos `falso`:\n\n```jsx\nfunction MyButton({ className, ...props }) {\n  const classNames = [\"btn\", className].filter(Boolean).join(\" \").trim();\n\n  return <button className={classNames} {...props} />;\n}\n```\n\nPorém, lembre-se de que, se um objeto vazio for passado, ele também será incluído na classe, resultando em: `btn [object Object]`.\n\nA melhor abordagem é fazer uso de packages disponíveis, como [classnames](https://www.npmjs.com/package/classnames) ou [clsx](https://www.npmjs.com/package/clsx),que poderia ser usado para unir nomes de classe, evitando que você tenha que lidar com isso manualmente.\n\n## Renderização Condicional\n\nVocê não consegue usar if else em suas declarações de componente..\nEntão vocês pode usar o operador ternário [conditional (ternary) operator](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) ou [short-circuit](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Short-circuit_evaluation) tranquilamente.\n\n### `if`\n\n```jsx\n{\n  !!condition && <span>Irá renderizar quando for `verdadeiro`</span>;\n}\n```\n\nDica não utilize if dessa maneira:\n\n```jsx\n{\n  condition && <span>Renderiza quando `verdadeiro`</span>;\n}\n```\n\nO React pode imprimir um `0` no seu componente. Quando vem `0` nos seus dados, ele não considera sua variável como falsa, utilizando o !! , ele converte 0 para falso\n\n### `unless` (ao menos que)\n\n```jsx\n{\n  condition || <span>Renderizado quando `falso`</span>;\n}\n```\n\n### `if-else` (Operador Ternário)\n\n```jsx\n{\n  condition ? (\n    <span>Renderizado quando for `verdadeiro`</span>\n  ) : (\n    <span>Renderizado quando for `falso`</span>\n  );\n}\n```\n\n## Tipos de filhos (Children Types)\n\nO React consegue renderizar `children` da maioria dos tipos.\nNa maioria dos casos é um `array` ou uma `string`.\n\n### `String`\n\n```jsx\n<div>Olá Mundo!</div>\n```\n\n### `Array`\n\n```jsx\n<div>{[\"Olá \", <span>Mundo</span>, \"!\"]}</div>\n```\n\n## Array como filho (Array as children)\n\nProver um array como `children` é muito comum.\nÉ como as listas são renderizadas no React.\n\nUsamos o método `map()` para criar um array de elementos React para cada valor da array.\n\n```jsx\n<ul>\n  {[\"primeiro\", \"segundo\"].map((item) => (\n    <li>{item}</li>\n  ))}\n</ul>\n```\n\nEsse é o equivalente a renderizar um `array` literal.\n\n```jsx\n<ul>{[<li>primeiro</li>, <li>segundo</li>]}</ul>\n```\n\nEste padrão pode ser combinado com desestruturação, Atributos de Spread JSX e outros componentes, para alguma coesão mais séria.\n\n```jsx\n<ul>\n  {arrayOfMessageObjects.map(({ id, ...message }) => (\n    <Message key={id} {...message} />\n  ))}\n</ul>\n```\n\n## Função como filha (Function as children)\n\nComponentes React não suportam funções como `children`.\nPorém com o padrão, [render props](#render-prop) conseguimos criar componentes que tomam funções como `children` filhas.\n\n## Render prop\n\nAqui um componente que utiliza `render callback`.\nNão é útil, mas é um exemplo fácil para começar.\n\n```jsx\nconst Width = ({ children }) => children(500);\n```\n\nEsse componente chama `children` como função, com alguns argumentos, nesse caso o número `500`.\n\nPara usar esse componente estamos utilizando uma [Função como filha (Function as children)](#função-como-filha-function-as-children).\n\n```jsx\n<Width>{(width) => <div>window é {width}</div>}</Width>\n```\n\nRecebemos esse output.\n\n```jsx\n<div>window é 500</div>\n```\n\nCom esta configuração, podemos usar essa prop `width` para fazer decisões de renderização.\n\n```jsx\n<Width>\n  {(width) =>\n    width > 600 ? <div>condição de largura mínima atingida!</div> : null\n  }\n</Width>\n```\n\nSe planejamos usar muito essa condição, podemos definir outros componentes para encapsular a lógica reutilizada.\n\n```jsx\nconst MinWidth = ({ width: minWidth, children }) => (\n  <Width>{(width) => (width > minWidth ? children : null)}</Width>\n);\n```\n\nClaro que um componente `Width` estático não é útil, mas aquele que observa o window do navegador é. Aqui está um exemplo de implementação.\n\n```jsx\nfunction WindowWidth({ children }) {\n  const [width, setWidth] = useState(0);\n\n  useEffect(() => {\n    setWidth(window.innerWidth);\n    window.addEventListener(\"resize\", ({ target }) =>\n      setWidth(target.innerWidth)\n    );\n  }, []);\n\n  return children(width);\n}\n```\n\nMuitos desenvolvedores preferem [Higher Order Components](#higher-order-components) para este tipo de funcionalidade. É uma questão de preferência.\n\n## Passando um Filho (Children)\n\nVocê pode criar um componente projetado para usar `context` e renderizar `children`.\n\n```jsx\nclass SomeContextProvider extends React.Component {\n  getChildContext() {\n    return { some: \"context\" };\n  }\n\n  render() {\n    // como retornamos children?\n  }\n}\n```\n\nVocê está diante de uma decisão. Envolver os `filhos` em uma `<div />` estranha que retorne o `children` diretamente. As primeiras opções adicionam marcação extra (que pode quebrar alguns css). O segundo resultará em erros inúteis.\n\n```jsx\n// option 1: extra div\nreturn <div>{children}</div>;\n\n// option 2: erros inúteis\nreturn children;\n```\n\nÉ melhor tratar `children` como um tipo de dados opaco. O React fornece `React.Children` para lidar com `children` apropriadamente.\n\n```jsx\nreturn React.Children.only(this.props.children);\n```\n\n## Componente Proxy\n\n_(Não tenho certeza se esse nome faz sentido)_\n\nOs botões estão em todos os lugares nos aplicativos da web. E cada um deles deve ter o atributo `type` definido como `button` .\n\n```jsx\n<button type=\"button\">\n```\n\nEscrever este atributo centenas de vezes pode trazer muitos erros.\nPodemos escrever um High Level Component para passar `props` para um componente de `button` de nível inferior.\n\n```jsx\nconst Button = props =>\n  <button type=\"button\" {...props}>\n```\n\nPodemos usar `Button` no lugar `button` e garantir que o atributo `type` vai ser sempre aplicado.\n\n```jsx\n<Button />\n// <button type=\"button\"><button>\n\n<Button className=\"CTA\">Enviar Dinheiro</Button>\n// <button type=\"button\" class=\"CTA\">Enviar Dinheiro</button>\n```\n\n## Estilizando componentes\n\nEsse é um [Proxy component](#proxy-component) aplicado às práticas de estilo.\n\nEntão temos um botão. Ele usa classes para serem estilizadas como um botão \"principal\".\n\n```jsx\n<button type=\"button\" className=\"btn btn-primary\">\n```\n\nPodemos gerar esse resultado usando alguns componentes de propósito único.\n\n```jsx\nimport classnames from \"classnames\";\n\nconst PrimaryBtn = (props) => <Btn {...props} primary />;\n\nconst Btn = ({ className, primary, ...props }) => (\n  <button\n    type=\"button\"\n    className={classnames(\"btn\", primary && \"btn-primary\", className)}\n    {...props}\n  />\n);\n```\n\nPode ajudar a visualizar isso.\n\n```jsx\nPrimaryBtn()\n  ↳ Btn({primary: true})\n    ↳ Button({className: \"btn btn-primary\"}, type: \"button\"})\n      ↳ '<button type=\"button\" class=\"btn btn-primary\"></button>'\n```\n\nUsando esses componentes, todos eles resultam no mesmo resultado.\n\n```jsx\n<PrimaryBtn />\n<Btn primary />\n<button type=\"button\" className=\"btn btn-primary\" />\n```\n\nIsso pode ser uma grande vantagem para a manutenção do estilo. Ele isola todas as preocupações de estilo em um único componente.\n\n## Switch de Eventos\n\nQuando criamos Event Handlers (Controladores de Eventos) é comum nomeá-los assim:`handle{eventName}`.\n\n```jsx\nhandleClick(e) { /* do something */ }\n```\n\nPara componentes que controlam vários tipos de eventos, essas funções podem ser tornar repetitivas.\nos nomes podem não trazer muito valor, pois na verdade são proxy de outras ações/funções.\n\n```jsx\nhandleClick() { require(\"./actions/doStuff\")(/* action stuff */) }\nhandleMouseEnter() { this.setState({ hovered: true }) }\nhandleMouseLeave() { this.setState({ hovered: false }) }\n```\n\nConsidere escrever um unico Controlador de eventos e fazer o switch com o `event.type`.\n\n```jsx\nhandleEvent({type}) {\n  switch(type) {\n    case \"click\":\n      return require(\"./actions/doStuff\")(/* action dates */)\n    case \"mouseenter\":\n      return this.setState({ hovered: true })\n    case \"mouseleave\":\n      return this.setState({ hovered: false })\n    default:\n      return console.warn(`No case for event type \"${type}\"`)\n  }\n}\n```\n\nPara componentes simples você pode chamar funções importadas de componentes direto, usando arrow functions.\n\n```jsx\n<div onClick={() => someImportedAction({ action: \"DO_STUFF\" })}\n```\n\n## Componente de Layout\n\nOs componentes de layout resultam em alguma forma de elemento DOM estático. Pode não ser necessário atualizar com frequência, ou nunca.\n\nConsidere um componente que renderize dois `children` lado a lado\n\n```jsx\n<HorizontalSplit\n  startSide={<SomeSmartComponent />}\n  endSide={<AnotherSmartComponent />}\n/>\n```\n\nPodemos otimizar agressivamente esse componente.\n\nEmbora `HorizontalSplit` seja `pai` para ambos os componentes, nunca será seu `dono`. Podemos dizer para ele nunca atualizar, sem interromper o `lifecycle` dos componentes internos.\n\n```jsx\nconst HorizontalSplit = ({ startSide, endSide }) => {\n  return (\n    <FlexContainer>\n      <div>{startSide}</div>\n      <div>{endSide}</div>\n    </FlexContainer>\n  );\n}\n\nexport default memo(HorizontalSplit);\n```\n\n## Container Components\n\n\"Um container faz a busca de dados e, em seguida, renderiza seu subcomponente correspondente. É isso.\" - [Jason Bonta](https://twitter.com/jasonbonta)\n\nOlhando esse componente `CommentList`.\n\n```jsx\nconst CommentList = ({ comments }) => (\n  <ul>\n    {comments.map((comment) => (\n      <li>\n        {comment.body}-{comment.author}\n      </li>\n    ))}\n  </ul>\n);\n```\n\nPodemos criar um novo componente responsável por buscar dados e renderizar o componente `CommentList`\n\n```jsx\nconst CommentListContainer = () => {\n  const [comments, setComments] = useState([])\n\n  useEffect(() => {\n    const fetchComments = async () => {\n       try {\n          const response = await fetch(\"/my-comments.json\");\n          const data = await response.json();\n          setComments(data);\n\n       } catch (error) {\n          console.log(\"error: \", error);\n       }\n\n    fetchComments();\n  }, [])\n\n  return <CommentList comments={comments} />\n}\n```\n\nPodemos escrever diferentes containers para diferentes contextos de aplicação.\n\n## Higher-order components\n\nUma [higher-order function](https://pt-br.reactjs.org/docs/higher-order-components.html) é uma função que recebe e / ou retorna uma função. Não é mais complicado do que isso. Então, o que é um High Order Component?\n\nSe você já estiver usando [componentes container](#container-component), esses são apenas containers genéricos, envolvidos em uma função.\n\nVamos começar com nosso componente `Ola` .\n\n```jsx\nconst Ola = ({ name }) => {\n  if (!name) {\n    return <div>Conectando...</div>;\n  }\n\n  return <div>Olá {name}!</div>;\n};\n```\n\nSe obtiver `props.name`, ele renderizará esses dados. Caso contrário, irá renderizar \"Conectando ...\".\n\nAgora, para o dado de ordem superior.\n\n```jsx\nconst Connect = (ComposedComponent) => {\n  const [name, setName] = useState(\"\");\n\n  useEffect(() => {\n    // Isso seria um \"fetch\" ou uma conexão com a \"store\"\n    setName(\"Michael\");\n  }, []);\n\n  return <ComposedComponent {...props} name={name} />;\n};\n```\n\nEsta é apenas uma função que retorna o componente que renderiza o componente que passamos como um argumento.\n\nÚltima etapa, precisamos envolver nosso componente `Ola` em `Connect`.\n\n```jsx\nconst ConnectedMyComponent = Connect(Ola);\n```\n\nEste é um padrão poderoso para fazer requisições ( fetch ) e fornecer dados para qualquer número de componentes funcionais.\n\n## Elevando o state (state hoisting)\n\nAqui temos um componente contador, que vai passar seu state para o componente pai\n\n```jsx\nimport React, { useState } from \"react\";\n\nfunction Counter(props) {\n  const {\n    count: [count, setCount],\n  } = {\n    count: useState(0),\n    ...(props.state || {}),\n  };\n\n  return (\n    <div>\n      <h3>{count}</h3>\n      <button onClick={() => setCount(count - 1)}>Decrement</button>\n      <button onClick={() => setCount(count + 1)}>Increment</button>\n    </div>\n  );\n}\n```\n\nna nossa função App, escutamos o state através da props state do componente `Counter`\n\n```jsx\nfunction App() {\n  const [count, setCount] = useState(0);\n\n  return (\n    <div className=\"App\">\n      <h2>Estado</h2>\n      <Counter state={{ count: [count, setCount] }} />\n    </div>\n  );\n}\n```\n\nna teoria poderiamos passar esse estado do componente filho, para qualquer outro componente irmão dele.\n\n## Inputs Controlados\n\nÉ difícil falar sobre inputs controlados em abstrato.\nVamos começar com um input não controlado (normal) e partir daí.\n\n```jsx\n<input type=\"text\" />\n```\n\nQuando você mexe com esse input no navegador, você vê suas alterações.\n\nIsto é o normal.\n\nUm input controlado desabilita as mutações do DOM que tornam isso possível.\nVocê seta o `value` do input no escopo do componente e ele não altera no escopo do DOM.\n\n```jsx\n<input type=\"text\" value=\"Isso não será alterado. Tente.\" />\n```\n\nObviamente, os inputs estáticos não são muito úteis para seus usuários.\nEntão derivamos o `value` do state.\n\n```jsx\n\nfunction ControlledNameInput () {\n\n  const [name, setName] = useState(\"\");\n\n  return <input type=\"text\" value={name} />;\n}\n```\n\nEntão, mudar o input é uma questão de mudar o estado do componente.\n\n```jsx\nreturn (\n  <input type=\"text\" value={name} onChange={(e) => setName(e.target.value)} />\n);\n```\n\nEste é um input controlado.\nEle apenas atualiza o DOM quando o estado é alterado em nosso componente.\nIsso é inestimável ao criar interfaces de usuário consistentes.\n\n_Se está usando componentes funcionais para elementos de form,\nleia sobre [state hoisting](#state-hoisting) para mover o state do componente acima no tree._\n"
  },
  {
    "path": "next.config.js",
    "content": "module.exports = {\n  webpack: (config) => {\n    config.module.rules.push({\n      test: /\\.md$/,\n      use: 'raw-loader',\n    });\n    return config;\n  },\n};"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"guiareact.org\",\n  \"version\": \"0.0.1\",\n  \"description\": \"Guia de Padrões React em Português.Baseado no React Patterns de Michael Chan.\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"dev\": \"next\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"export\": \"npm run build && next export\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+ssh://git@github.com/rubenmarcus/guiareact.org.git\"\n  },\n  \"author\": \"Michael Chan <mijoch@gmail.com>, Ruben Marcus<ruben@rubenmarcus.dev>\",\n  \"license\": \"BY-NC-SA\",\n  \"bugs\": {\n    \"url\": \"https://github.com/rubenmarcus/guiareact.org/issues\"\n  },\n  \"homepage\": \"https://github.com/readme/guiareact.org#readme\",\n  \"dependencies\": {\n    \"highlight.js\": \"^11.0.1\",\n    \"next\": \"^10.2.3\",\n    \"react\": \"^16.8.6\",\n    \"react-dom\": \"^16.8.6\",\n    \"react-markdown\": \"^6.0.2\",\n    \"remark-external-links\": \"^4.0.0\",\n    \"remark-highlight.js\": \"^5.1.0\",\n    \"remark-slug\": \"^5.1.1\",\n    \"remark-toc\": \"^5.1.1\"\n  },\n  \"devDependencies\": {\n    \"file-loader\": \"^1.1.11\",\n    \"postcss\": \"^8.3.5\",\n    \"raw-loader\": \"^4.0.2\"\n  }\n}\n"
  },
  {
    "path": "pages/_app.js",
    "content": "import React from \"react\";\nimport \"highlight.js/styles/atom-one-dark-reasonable.css\";\nimport \"../styles/style.css\";\n\nfunction GuiaReactApp({ Component, pageProps }) {\n  return <Component {...pageProps} />\n}\n\nexport default GuiaReactApp"
  },
  {
    "path": "pages/_document.js",
    "content": "import Document, { Html, Head, Main, NextScript } from \"next/document\";\nimport PageHead from \"../components/pagehead\";\nimport AppHeader from \"../components/header\";\n\nclass MyDocument extends Document {\n  static async getInitialProps(ctx) {\n    let pageProps = null;\n\n    const originalRenderPage = ctx.renderPage;\n    ctx.renderPage = () =>\n      originalRenderPage({\n        enhanceApp: (App) => (props) => {\n          pageProps = props.pageProps;\n          return <App {...props} />;\n        },\n        enhanceComponent: (Component) => Component,\n      });\n\n    const initialProps = await Document.getInitialProps(ctx);\n    return { ...initialProps, pageProps };\n  }\n\n  render() {\n    const { pageProps } = this.props;\n    return (\n      <Html>\n        <Head>\n          <PageHead title={pageProps.title} />\n        </Head>\n        <body className={`guiaPadroes ${pageProps.cssClass}`}>\n          <AppHeader title={pageProps.title} />\n          <main>\n            <Main />\n          </main>\n\n          <NextScript />\n        </body>\n      </Html>\n    );\n  }\n}\n\nexport default MyDocument;\n"
  },
  {
    "path": "pages/index.js",
    "content": "import Markdown from \"../documentation/DOC-HOME.md\"\nimport MdContainer from \"../components/mdcontainer\"\n\n\nexport default function Page(){\n return (<MdContainer markdown={Markdown} /> )\n}\n\nexport async function getStaticProps(context) {\n  return {\n    props: {\n      cssClass: 'home',\n      title: 'Guia de Padrões React'\n    }, \n  }\n}"
  },
  {
    "path": "styles/style.css",
    "content": "@import url(\"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap\");\n\nhtml {\n  box-sizing: border-box;\n}\n*,\n:after,\n:before {\n  box-sizing: inherit;\n}\nhtml {\n  -webkit-font-smoothing: antialiased;\n}\n::marker {\n  font-size: 12px;\n}\nheader {\n  background: #20232a;\n  top: 0px;\n  width: 100%;\n  padding: 12px 85px;\n  align-items: center;\n  height: 70px;\n  font-weight: 600;\n  color: #61dafb;\n  display: flex;\n}\nheader h1 {\n  color: #61dafb;\n}\nheader ul {\n  display: flex;\n  flex-wrap: nowrap;\n}\nheader li {\n  list-style: none;\n  margin-right: 41px;\n  line-height: 15px;\n  line-height: 22px;\n}\nheader a {\n  color: #fff;\n  background: transparent;\n  font-weight: 400;\n}\nheader a:hover {\n  color: #61dafb;\n}\n.guiaPadroes div h1:first-child {\n  background: #20232a;\n  top: 0px;\n  width: 100%;\n  padding: 12px 85px;\n  margin: 0px;\n  left: 0px;\n  font-weight: 600;\n}\n.guiaPadroes div p:nth-child(3),\n.guiaPadroes div p:nth-child(4),.guiaPadroes div p:nth-child(5) {\n  background: #fff;\n  font-weight: 400;\n  font-size: 16px;\n  width: 100%;\n  padding-left: 85px;\n}\n\nh2#conteúdo {\n  margin-top: 3vw;\n}\n\n.guiaPadroes div p:nth-child(5) {\n  margin-top: 0px;\n  padding-bottom: 20px;\n}\n.guiaPadroes div p:nth-child(4) {\n  margin: 0;\n  padding-bottom: 30px;\n}\n\ncode {\n  background: rgba(255, 229, 100, 0.2);\n  padding: 0.25em 0.25em;\n  margin: -0.25em 0;\n}\n\n.guiaPadroes div h1:first-child + p {\n  background: #fff;\n  top: 38px;\n  left: 0px;\n  width: 100%;\n  padding: 25px 85px;\n  margin: 0;\n}\n.guiaPadroes div h1:first-child {\n  color: #61dafb;\n}\n.guiaPadroes p,\n.guiaPadroes h2,\n.guiaPadroes ul,\n.guiaPadroes pre,\n.guiaPadroes h3 {\n  padding-left: 85px;\n  padding-right: 35px;\n}\n.guiaPadroes ul p {\n  padding-left: 0px;\n}\n.guiaPadroes ul li ul {\n  padding-left: 20px;\n}\n.guiaPadroes div h1:first-child a {\n  position: absolute;\n  right: 30px;\n  top: 18px;\n  background: #000;\n  color: #fff;\n}\na {\n  background-color: rgba(187, 239, 253, 0.3);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  color: #1a1a1a;\n  display: inline-block;\n  font-size: 16px;\n  text-decoration: none;\n}\np,\npre {\n  padding: 5px;\n}\n\nbody {\n  font-size: 16px;\n  margin: 0;\n  color: #111;\n  background: #f4f4f4;\n  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,\n    Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n  line-height: 1.4;\n}\n\nh1,\nh2 {\n  color: #282c34;\n  font-weight: 500;\n}\n@media (min-width: 0) {\n  body {\n    font-size: 16px;\n  }\n}\n@media (min-width: 480px) {\n  body {\n    font-size: 18px;\n  }\n}\n@media (min-width: 720px) {\n  body {\n    font-size: 20px;\n  }\n}\n@media (min-width: 960px) {\n  body {\n    font-size: 22px;\n  }\n}\n@media (min-width: 1200px) {\n  body {\n    font-size: 24px;\n  }\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-size: 1em;\n}\nh2 {\n  margin-top: 6vw;\n}\np {\n  /* font-family: Athelas, Georgia, serif; */\n  font-size: 0.9em;\n  line-height: 1.3em;\n  /* max-width: 32em; */\n}\npre,\ncode {\n  display: table;\n  font-family: source-code-pro, Menlo, Monaco, Consolas, Courier New, monospace;\n}\ncode,\npre {\n  font-size: 22px;\n  border-radius: 6px;\n  margin: 19px;\n}\ncode,\n.highlight pre {\n  font-size: 0.9em;\n}\n#contents + ul {\n  text-decoration: none;\n  padding-left: 20px;\n}\n.black-link,\n#contents + ul li a {\n  color: #000;\n  text-decoration: none;\n}\n.black-link,\n#contents + ul li a:hover {\n  text-decoration: underline;\n}\n.highlight {\n  margin: 1rem 0;\n}\n.hljs {\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  padding: 1em;\n  margin-top: 1em;\n  margin-right: 0;\n  margin-bottom: 1em;\n  margin-left: -1em;\n  font-size: 0.85em;\n  /* max-width: 32em; */\n}\ncode {\n  display: inline-block;\n  margin: 0;\n}\nhr {\n  margin-top: 2em;\n  border-color: rgba(0, 0, 0, 0.4);\n  border-width: 0;\n  border-bottom-width: 1px;\n  max-width: 16em;\n}\n.guiaPadroes ul {\n  padding-left: 119px;\n}\n.guiaPadroes div p:nth-child(3) {\n  margin: 0;\n}\n\n#guia-de-padrões-react {\n  display: none;\n}\n\n.guiaPadroes main > div > h1 {\n  display: none;\n}\n\n@media only screen and (max-width: 780px) {\n  code {\n    max-width: 68vw;\n    font-size: 0.6em !important;\n  }\n\n  header {\n    width: 100vw;\n    padding: 12px 5vw;\n  }\n\n  header nav {\n    position: absolute;\n    right: 0px;\n  }\n\n  .guiaPadroes div h1:first-child + p {\n    padding: 25px 5vw;\n  }\n  .guiaPadroes div p:nth-child(3),\n  .guiaPadroes div p:nth-child(4) {\n    padding-left: 5vw;\n  }\n  .guiaPadroes p,\n  .guiaPadroes h2,\n  .guiaPadroes ul,\n  .guiaPadroes pre,\n  .guiaPadroes h3 {\n    padding-left: 5vw;\n  }\n\n  .guiaPadroes ul {\n    padding-left: 15vw;\n  }\n}\n"
  }
]