[
  {
    "path": ".gitignore",
    "content": ".DS_Store\ndesktop.ini\nicon\n\nnpm-debug.log\nnode_modules/\ndist/\n\nyarn-error.log\n.out/\n"
  },
  {
    "path": "CNAME",
    "content": "contrata-se.dev"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "﻿# Contribuição\n\n1. Fork o projeto!\n2. Crie sua feature branch: `git checkout -b my-new-feature`\n3. Commit suas alterações: `git commit -m 'Add some feature'`\n4. Suba sua branch: `git push origin my-new-feature`\n5. Envie um pull request\n\n**Depois que seu pull requeste for mergeado**\n\nDepois que seu pull request for mergeado você pode deletar sua branch.\n\n## Atenção:\nÉ importante tentar manter o padrão de desenvolvimento que está sendo seguido no projeto e sempre tentar fazer o seu código de uma maneira que seja escalável e manutenível.\n\n### [<-- Voltar](https://github.com/LarissaAbreu/contrata-se-dev)\n"
  },
  {
    "path": "LICENSE.md",
    "content": "﻿Copyright (c) 2019 Larissa Abreu, [afonsopacifer.com](http://afonsopacifer.com/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "﻿# Contrata-se.dev\n\n> Agregador de vagas para pessoas desenvolvedoras :)\n\n## Rodando o projeto localmente\n\n**1 -** Clone o projeto e instale as dependêcias:\n\n```sh\n$ git clone https://github.com/LarissaAbreu/contrata-se-dev.git\n$ cd contrata-se-dev\n$ yarn\n```\n\n**3 -** Rode o servidor estático com livereload:\n\n```sh\n$ yarn start\n```\n\n## Versionamento\n\nPara manter uma melhor organização, seguiremos as diretrizes do [Versionamento Semântico 2.0.0](http://semver.org/).\n\n## Contribuição\n\nVeja no [guia](https://github.com/LarissaAbreu/contrata-se-dev/issues) os próximos passos do projeto ;)\n<br>\nQuer contrinuir? [Siga essas recomendações](https://github.com/LarissaAbreu/contrata-se-dev/blob/master/CONTRIBUTING.md).\n\n## Licença\n\n[Licença MIT](https://github.com/LarissaAbreu/contrata-se-dev/blob/master/LICENSE.md) © [Larissa Abreu](http://larissaabreu.github.io/), [Afonso Pacifer](https://afonsopacifer.github.io/)\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"contrata-se-dev\",\n  \"version\": \"0.1.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"start\": \"./node_modules/.bin/webpack-dev-server\",\n    \"build\": \"./node_modules/.bin/webpack\",\n    \"deploy\": \"gh-pages-deploy\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/LarissaAbreu/contrata-se-dev.git\"\n  },\n  \"author\": \"Larissa Abreu, Afonso Pacifer\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/LarissaAbreu/contrata-se-dev/issues\"\n  },\n  \"homepage\": \"https://github.com/LarissaAbreu/contrata-se-dev#readme\",\n  \"dependencies\": {\n    \"react\": \"^16.8.1\",\n    \"react-dom\": \"^16.8.1\",\n    \"react-select\": \"^3.1.1\",\n    \"tinycolor2\": \"^1.4.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.2.2\",\n    \"@babel/preset-env\": \"^7.3.1\",\n    \"@babel/preset-react\": \"^7.0.0\",\n    \"babel-loader\": \"^8.0.5\",\n    \"copy-webpack-plugin\": \"^4.6.0\",\n    \"css-loader\": \"^2.1.0\",\n    \"style-loader\": \"^0.23.1\",\n    \"svg-react-loader\": \"^0.4.6\",\n    \"webpack\": \"^4.29.3\",\n    \"webpack-cli\": \"^3.2.3\",\n    \"webpack-dev-server\": \"^3.1.14\"\n  },\n  \"gh-pages-deploy\": {\n    \"staticpath\": \"dist\",\n    \"cname\": \"contrata-se.dev\"\n  }\n}\n"
  },
  {
    "path": "src/assets/scripts/App.js",
    "content": "﻿import React, { useState, useEffect } from 'react';\nimport '../styles/style.css';\n\nimport Card from './components/Card';\nimport Label from './components/Label';\nimport SelectLabel from './components/SelectLabel';\n\nconst App = () => {\n  const [issues, setIssues] = useState([]);\n  const [pages, setPages] = useState(1);\n  const [filteredLabels, setFilteredLabels] = useState([]);\n\n  useEffect(() => {\n    fetch(`https://api.github.com/repos/frontendbr/vagas/issues?state=open&page=1&labels=${_formateLabelsQuery(filteredLabels)}`)\n      .then((res) => res.json())\n      .then((json) => setIssues(json));\n  }, [filteredLabels]);\n\n  const formateDate = (date) => {\n    const dateSplit = date.split('T');\n    const ymd = dateSplit[0].split('-');\n\n    return `${ymd[2]}/${ymd[1]}/${ymd[0]}`;\n  };\n\n  const _formateLabelsQuery = (labels) => {\n    const valueLabel = (Array.isArray(labels) ? labels : []).map((label) => label.value);\n    return valueLabel.join(',');\n  };\n\n  const _showMore = () => {\n    fetch(`https://api.github.com/repos/frontendbr/vagas/issues?state=open&page=${pages + 1}&labels=${_formateLabelsQuery(filteredLabels)}`)\n      .then((res) => res.json())\n      .then((json) => {\n        setIssues([...issues, ...json]);\n        setPages(pages + 1);\n      });\n  };\n\n  const $issues = issues.map((issue, i) => {\n    if (!issue.pull_request) {\n      const date = formateDate(issue.created_at);\n\n      const $labels = issue.labels.map((label, i) => {\n        return (\n          <Label\n            key={i}\n            name={label.name}\n            color={label.color}/>\n        );\n      });\n\n      return (\n        <Card \n          key={i}\n          url={issue.html_url}\n          title={issue.title}\n          labels={$labels}\n          date={date} />\n      );\n    };\n  });\n\n  return (\n    <div>\n      <div className=\"topo\">\n        <h1 className=\"topo__titulo\">Contrata-se.dev</h1>\n        <p className=\"topo__texto\">Agregador de vagas para pessoas desenvolvedoras :)</p>\n        <div className=\"social\">\n          <a href=\"https://github.com/frontendbr/vagas/issues/new?template=adicionar-nova-vaga.md&title=%5BCidade%5D+Front-end+Developer+na+Nome+da+Empresa\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"nova-vaga\">Postar uma nova vaga</a>\n          <iframe title=\"Star on github\" src=\"https://ghbtns.com/github-btn.html?user=LarissaAbreu&repo=contrata-se-dev&type=star&size=large\" frameborder=\"0\" scrolling=\"0\" width=\"75.43px\" height=\"30px\"></iframe>\n        </div>\n      </div>\n      <div className=\"main\">\n        <div className=\"filter-container\">\n          <SelectLabel setFilteredLabels={(filteredLabels) => setFilteredLabels(filteredLabels)}/>\n        </div>\n        <div className=\"lista-vagas\">{$issues}</div>\n        <button className=\"mais\" onClick={() => _showMore()}>Mostrar mais</button>\n      </div>\n      <div className=\"rodape\">\n        <span>Feito com</span><span className=\"rodape__heart\"></span>\n      </div>\n    </div>\n  );\n};\n\nexport default App;\n"
  },
  {
    "path": "src/assets/scripts/components/Card.js",
    "content": "﻿import React from 'react';\n\nconst Card = ({url, title, labels, date}) => {\n  return (\n    <div className=\"card-vaga\">\n      <a href={url} target=\"_blank\">\n        <h2 className=\"titulo\">{title}</h2>\n        <ul className=\"lista-labels\">{labels}</ul>\n        <span className=\"data\">Publicada em: {date}</span>\n      </a>\n    </div>\n  )\n}\n\nexport default Card;\n"
  },
  {
    "path": "src/assets/scripts/components/Label.js",
    "content": "﻿import React from 'react';\nimport tinyColor from 'tinycolor2';\n\nconst Label = ({color, name}) => {\n\n  const resolveColor = hex => {\n    const color = tinyColor(hex);\n\n    return color.isLight() ? '000' : 'fff';\n  };\n\n  return (\n    <li\n      className=\"label\"\n      style={{\"--background-label\": \"#\" + color, \"--color-label\": \"#\" + resolveColor(color)}}\n    >\n      {name}\n    </li>\n  );\n};\n\nexport default Label;\n"
  },
  {
    "path": "src/assets/scripts/components/SelectLabel.js",
    "content": "import React, { useState, useEffect } from 'react';\nimport Select from 'react-select';\n\nconst SelectLabel = ({ setFilteredLabels }) => {\n\n  const [labels, setLabels] = useState([]);\n\n  useEffect(() => {\n    fetch('https://api.github.com/repos/frontendbr/vagas/labels?per_page=100')\n      .then((res) => res.json())\n      .then((json) => setLabels(json));\n  }, []);\n\n  const options = labels.map((label) => {\n    return {\n      value: label.name,\n      label: label.name,\n    };\n  });\n\n  return (\n    <Select placeholder=\"Filtrar por labels\" options={options} isMulti onChange={(option) => setFilteredLabels(option)} />\n  );\n};\n\nexport default SelectLabel;\n"
  },
  {
    "path": "src/assets/scripts/index.js",
    "content": "import React from 'react';\nimport ReactDom from 'react-dom';\nimport App from './App.js';\n\nconst app = document.getElementById('app');\n\nReactDom.render(\n  <App />,\n  app\n);\n"
  },
  {
    "path": "src/assets/styles/style.css",
    "content": "﻿* {\n  font-family: 'Muli', sans-serif;\n}\n\n.topo {\n  box-sizing: border-box;\n  width: 100%;\n  background: rgb(24, 132, 132);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 64px;\n}\n\n.topo__titulo {\n  color: #fff;\n  font-size: 60px;\n  padding: 0;\n  margin: 0;\n  font-family: 'Fugaz One', cursive;\n  letter-spacing: 5px;\n}\n\n@media (max-width: 600px) {\n  .topo__titulo {\n    font-size: 40px;\n  }\n}\n\n.topo__texto {\n  color: #b5d4b5;\n  font-size: 24px;\n  width: 100%;\n  max-width: 500px;\n  box-sizing: border-box;\n  text-align: center;\n  margin: 0;\n  padding: 32px 0;\n}\n\n.social {\n  display: flex;\n  align-items: center;\n}\n\n.nova-vaga {\n  box-sizing: border-box;\n  background-color: #21e0a0;\n  color: #00333a;\n  padding: 0 10px;\n  display: flex;\n  align-items: center;\n  height: 30px;\n  font-size: 14px;\n  text-decoration: none;\n  border-radius: 3px;\n  transition: opacity .2s;\n  margin-right: 8px;\n}\n\n.nova-vaga:hover {\n  opacity: .8;\n}\n\n.main {\n  box-sizing: border-box;\n  padding: 32px;\n  background-color: #efefef;\n}\n\n.filter-container {\n  box-sizing: border-box;\n  margin: 16px auto;\n  margin-top: 0;\n  max-width: 1200px;\n  padding: 0 8px;\n}\n\n.lista-vagas {\n  box-sizing: border-box;\n  display: flex;\n  flex-wrap: wrap;\n  margin: 16px auto;\n  max-width: 1200px;\n}\n\n.card-vaga {\n  box-sizing: border-box;\n  width: 100%;\n  --cols: 3;\n  max-width: calc(100% / var(--cols) - 20px);\n  margin: 0 10px;\n  margin-bottom: 16px;\n  padding: 16px;\n  background-color: #fbfffc;\n  border-radius: 5px;\n  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n              0 1px 5px 0 rgba(0, 0, 0, 0.12),\n              0 3px 1px -2px rgba(0, 0, 0, 0.2);\n}\n\n@media (max-width: 900px) {\n  .card-vaga {\n    --cols: 2;\n  }\n}\n\n@media (max-width: 600px) {\n  .card-vaga {\n    --cols: 1;\n  }\n}\n\n.card-vaga a {\n  text-decoration: none;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  height: 100%;\n}\n\n.titulo {\n  color: #4e7355;\n  margin: 0;\n  font-size: 18px;\n}\n\n.lista-labels {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin: 10px 0;\n}\n\n.label {\n  color: var(--color-label, #fff);\n  background-color: var(--background-label, #374047);\n  border-radius: 3px;\n  padding: 5px;\n  font-size: 14px;\n  margin-bottom: 3px;\n}\n\n.label:not(:last-child) {\n  margin-right: 3px;\n}\n\n.data {\n  color: #4e7355;\n}\n\n.mais {\n  box-sizing: border-box;\n  padding: 10px 16px;\n  color: #ffffff;\n  background-color: #3c8585;\n  margin: 0 auto;\n  display: block;\n  border-radius: 3px;\n  transition: opacity .2s;\n  box-shadow: none;\n  border: none;\n}\n\n.mais:hover {\n  cursor: pointer;\n  opacity: .8;\n}\n\n.rodape {\n  box-sizing: border-box;\n  width: 100%;\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: 50px;\n  background: rgb(24, 132, 132);\n  color: #b5d4b5;\n}\n\n.rodape__heart {\n  animation: pulse .5s infinite alternate ease-in;\n  background-color: #b5d4b5;\n  display: inline-block;\n  height: 10px;\n  margin: 0 15px;\n  position: relative;\n  width: 10px;\n}\n\n.rodape__heart:before {\n  background-color: #b5d4b5;\n  border-radius: 50%;\n  content: \"\";\n  height: 10px;\n  left: 50%;\n  position: absolute;\n  top: 0;\n  width: 10px;\n}\n\n.rodape__heart:after {\n  background-color: #b5d4b5;\n  border-radius: 50%;\n  content: \"\";\n  height: 10px;\n  left: 0;\n  position: absolute;\n  top: 50%;\n  width: 10px;\n}\n\n@keyframes pulse {\n  from {\n    transform: rotate(-135deg) scale(1);\n  }\n  to {\n    transform: rotate(-135deg) scale(1.2);\n  }\n}\n"
  },
  {
    "path": "src/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n  <title>Contrata-se dev</title>\n\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <meta name=\"description\" content=\"Agregador de vagas para pessoas desenvolvedoras.\">\n\n  <link rel=\"icon\" href=\"favicon.png\">\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css\">\n  <link href=\"https://fonts.googleapis.com/css?family=Muli\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css?family=Fugaz+One\" rel=\"stylesheet\">\n\n  <meta property=\"og:type\" content=\"website\">\n  <meta property=\"og:title\" content=\"Contrata-se.dev\">\n  <meta property=\"og:description\" content=\"Agregador de vagas para pessoas desenvolvedoras.\">\n  <meta property=\"og:url\" content=\"https://contrata-se.dev\">\n  <meta property=\"og:image\" content=\"https://contrata-se.dev/assets/icons/open-graph.png\">\n\n  <meta name=\"twitter:card\" content=\"sumary_large_image\">\n  <meta name=\"twitter:title\" content=\"Contrata-se.dev\">\n  <meta name=\"twitter:description\" content=\"Agregador de vagas para pessoas desenvolvedoras.\">\n  <meta name=\"twitter:url\" content=\"https://contrata-se.dev\">\n  <meta name=\"twitter:image\" content=\"https://contrata-se.dev/assets/icons/open-graph.png\">\n</head>\n<body>\n    <a href=\"https://github.com/LarissaAbreu/contrata-se-dev\" class=\"github-corner\" aria-label=\"Veja o código desse site no Github\"><svg width=\"80\" height=\"80\" viewBox=\"0 0 250 250\" style=\"fill:#21e0a0; color:rgb(24, 132, 132); position: absolute; top: 0; border: 0; right: 0;\" aria-hidden=\"true\"><path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path><path d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\" fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"></path><path d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\" fill=\"currentColor\" class=\"octo-body\"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>\n  <div id=\"app\"></div>\n  <script src=\"bundle.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "webpack.config.js",
    "content": "﻿const webpack = require('webpack');\nconst path = require('path');\nconst copyWebpackPlugin = require('copy-webpack-plugin');\n\nmodule.exports = {\n  entry: './src/assets/scripts/index.js',\n  module: {\n    rules: [{\n      test: /\\.js$/,\n      exclude: /(node_modules)/,\n      use: {\n        loader: 'babel-loader',\n        options: {\n          presets: ['@babel/preset-env', '@babel/preset-react']\n        }\n      }\n    },\n    {\n      test: /\\.css$/,\n      use: ['style-loader', 'css-loader']\n    },\n    {\n      test: /\\.svg$/,\n      exclude: /node_modules/,\n      loader: ['svg-react-loader']\n    }]\n  },\n  plugins: [\n    new copyWebpackPlugin([\n      {from: './src/index.html', to: './'},\n      {from: './src/favicon.png', to: './'},\n      {from: './src/assets/icons/open-graph.png', to: './assets/icons/'},\n      {from: './CNAME', to: './'}\n    ]),\n    new webpack.HotModuleReplacementPlugin(),\n  ],\n  mode: 'development',\n  devServer: {\n    contentBase: './dist/',\n    port: '8000',\n    historyApiFallback: true,\n    hot: true,\n    open: true\n  },\n  watch: true,\n  output: {\n    path: path.resolve(__dirname, './dist/'),\n    filename: 'bundle.js'\n  }\n}\n"
  }
]