diff --git a/README.md b/README.md index c58dcb5d..f0f21e99 100644 --- a/README.md +++ b/README.md @@ -1,616 +1,122 @@ -# Data Lovers - -## Índice - -- [1. Preâmbulo](#1-preâmbulo) -- [2. Resumo do projeto](#2-resumo-do-projeto) -- [3. Objetivos de aprendizagem](#3-objetivos-de-aprendizagem) -- [4. Considerações gerais](#4-considerações-gerais) -- [5. Critérios mínimos de aceitação do - projeto](#5-critérios-mínimos-de-aceitação-do-projeto) -- [6. Hacker edition](#6-hacker-edition) -- [7. Considerações técnicas](#7-considerações-técnicas) -- [8. Pistas, dicas e leituras - complementares](#8-pistas-dicas-e-leituras-complementares) -- [9. Checklist](#9-checklist) - ---- - -## 1. Preâmbulo - -Segundo a -[Forbes](https://www.forbes.com/sites/bernardmarr/2018/05/21/how-much-data-do-we-create-every-day-the-mind-blowing-stats-everyone-should-read) -90% dos dados que existem hoje foram gerados durante os últimos dois anos. A -cada dia geramos 2.5 milhões de terabytes de dados, uma cifra sem precedentes. - -Apesar disso, os dados por si só são de pouca utilidade. Para que essas grandes -quantidades de dados se convertam em **informação** compreensível para os -usuários, precisamos entender e processar estes dados. Uma forma simples de -fazer isso é criando _interfaces_ e _visualizações_. - -Na imagem seguinte, você pode ver como os dados que estão na parte esquerda -podem ser usados para construir a interface amigável e compreensível que está na -parte direita. - -![json-interface](https://lh4.googleusercontent.com/Tn-RPXS26pVvOTdUzRT1KVaJ-_QbFs9SpcGLxSPE43fgbHaXtFgMUInuDt7kV41DkT1j8Tt29V0LxQW7SMtC6digOIhfTXSBKdwI08wUwhD3RAqlwy0hjfmhZ2BFe91mtmCSEqysfgk) -## 2. Resumo do projeto - -Neste projeto você **construirá uma _página web_ para visualizar um _conjunto -(set) de dados_** que se adeque às necessidades de seu usuário. - -Como entregável final terá uma página web que permita **visualizar dados, -filtrá-los, ordená-los e fazer algum cálculo agregado**. Por cálculo agregado -nos referimos aos diversos cálculos que podem ser feitos com os dados para -mostrar a informação mais relevante para os usuários (médias, valores máximos e -mínimos, etc). +# Data Lovers -Para este projeto trazemos uma série de dados de _temáticas diferentes_ para que -você explore e decida com qual delas deseja trabalhar. Escolhemos -especificamente estes conjuntos de dados porque cremos que se adequem bem a esta -etapa de sua aprendizagem. -Uma vez que você defina sua área de interesse, busque entender quem é seu -usuário e o que exatamente ele necessita saber ou ver, para que assim possa -construir a interface que o ajude a interagir e entender melhor os dados. -Este são os dados que propomos: +## Índice -- [Pokémon](src/data/pokemon/pokemon.json): Neste conjunto você encontrará uma - lista com os 151 Pokémon da região de Kanto, com suas respectivas estatísticas - utilizadas no jogo [Pokémon GO](http://pokemongolive.com). +- [1. Sobre o projeto/produto](#1-Sobre-o-projeto) +- [2. História de usuário](#2-História-de-usuário) +- [3. Objetivos de aprendizagem](#3-Objetivos-de-aprendizagem) +- [4. Protótipos e design](#4-Protótipos-e-design) +- [5. Ferramentas usadas](#5-Ferramentas-usadas) +- [6. Desenvolvedoras](#6-Desenvolvedoras) +--- - - [Pesquisa com jogadores de Pokémon Go](src/data/pokemon/README.pt-BR.md) -- [League of Legends - Challenger leaderboard](src/data/lol/lol.json): Este - conjunto mostra a lista de jogadores de uma liga do jogo League of Legends - (LoL). +# Rick And Morty WIKI - - [Pesquisa com jogadores de LoL](src/data/lol/README.pt-BR.md) -- [Rick and Morty](src/data/rickandmorty/rickandmorty.json). Lista de - personagens da série Rick & Morty. Você pode revisar a documentação da API - neste [link](https://rickandmortyapi.com). +## 1. Sobre o projeto - - [Pesquisa com seguidores de Rick and Morty](src/data/rickandmorty/README.pt-BR.md) +O projeto Rick And Morty WIKI tem como objetivo final, oferecer todas as informações que um Super Fã da série americana Rick And Morty gostaria de saber. +Informações importantes como: +- Nome dos personagens +- Status de vida +- Gênero +- Localização dos personagens +- Episódios em que os personagens aparecem -- [Jogos Olímpicos do Rio de Janeiro](src/data/athletes/athletes.json). - Este conjunto nos fornece a lista de atletas que conquistaram medalhas nas - Olimpíadas do Rio de Janeiro. +E oferecer ao usuário/visitante/fã uma experiência alucinante, divertida e com muitas informações. - - [Pesquisa com stakeholders dos Jogos Olímpicos do Rio de Janeiro](src/data/athletes/README.pt-BR.md) -- [Studio Ghibli](src/data/ghibli/ghibli.json). - Lista de animações e personagens do [Studio Ghibli](https://ghiblicollection.com/). - - [Pesquisa com seguidores de Studio Ghibli](src/data/ghibli/README.pt-BR.md) -O objetivo principal deste projeto é que aprenda a desenhar e construir uma -interface web onde se possa visualizar e manipular dados, entendendo o que o -usuário necessita. +## 2. História de usuário +Elaboramos as histórias de usuário, pensando em primeiro lugar, em qual seria o interesse do usuário no nosso site, e como ele iria usar nosso produto e se locomover na página Rick and Morty WIKI e resolver seus interesses. ## 3. Objetivos de aprendizagem - -Reflita e depois enumere os objetivos que quer alcançar e aplique no seu projeto. Pense nisso para decidir sua estratégia de trabalho. - ### HTML - -- [ ] **Uso de HTML semântico** - -
Links

- - - [HTML semántico](https://curriculum.laboratoria.la/pt/topics/html/02-html5/02-semantic-html) - - [Semantics in HTML - MDN](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML) -

- +- [x] **Uso de HTML semântico** ### CSS +- [x] **Uso de seletores de CSS** -- [ ] **Uso de seletores de CSS** - -
Links

- - - [Intro a CSS](https://curriculum.laboratoria.la/pt/topics/css/01-css/01-intro-css) - - [CSS Selectors - MDN](https://developer.mozilla.org/es/docs/Web/CSS/CSS_Selectors) -

- -- [ ] **Empregar o modelo de caixa (box model): borda, margem, preenchimento** - -
Links

- - - [Modelo de Caixa e Display](https://curriculum.laboratoria.la/pt/topics/css/01-css/02-boxmodel-and-display) - - [The box model - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model) - - [Introduction to the CSS box model - MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Introduction_to_the_CSS_box_model) - - [CSS display - MDN](https://developer.mozilla.org/pt-BR/docs/Web/CSS/display) - - [display - CSS Tricks](https://css-tricks.com/almanac/properties/d/display/) -

- -- [ ] **Uso de flexbox en CSS** - -
Links

- - - [A Complete Guide to Flexbox - CSS Tricks](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) - - [Flexbox Froggy](https://flexboxfroggy.com/#pt-br) - - [Flexbox - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox) -

+- [x] **Empregar o modelo de caixa (box model): borda, margem, preenchimento** +- [x] **Uso de flexbox en CSS** ### Web APIs +- [x] **Uso de seletores de DOM** -- [ ] **Uso de seletores de DOM** - -
Links

- - - [Modificando o DOM](https://curriculum.laboratoria.la/pt/topics/browser/02-dom/03-1-dom-methods-selection) - - [Introdução ao DOM - MDN](https://developer.mozilla.org/pt-BR/docs/Web/API/Document_Object_Model/Introduction) - - [Locating DOM elements using selectors - MDN](https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors) -

- -- [ ] **Gerenciamento de eventos de DOM** - -
Links

- - - [Introdução a eventos - MDN](https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Building_blocks/Events) - - [EventTarget.addEventListener() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/API/EventTarget/addEventListener) - - [EventTarget.removeEventListener() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/API/EventTarget/removeEventListener) - - [El objeto Event](https://developer.mozilla.org/pt-BR/docs/Web/API/Event) -

- -- [ ] **Manipulação dinâmica de DOM** - -
Links

- - - [Introdução ao DOM](https://developer.mozilla.org/pt-BR/docs/DOM/Referencia_do_DOM/Introdu%C3%A7%C3%A3o) - - [Node.appendChild() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/API/Node/appendChild) - - [Document.createElement() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/API/Document/createElement) - - [Document.createTextNode()](https://developer.mozilla.org/pt-BR/docs/Web/API/Document/createTextNode) - - [Element.innerHTML - MDN](https://developer.mozilla.org/pt-BR/docs/Web/API/Element/innerHTML) - - [Node.textContent - MDN](https://developer.mozilla.org/pt-BR/docs/Web/API/Node/textContent) -

+- [x] **Gerenciamento de eventos de DOM** +- [x] **Manipulação dinâmica de DOM** ### JavaScript +- [x] **Diferenciar entre tipos de dados primitivos e não primitivos** -- [ ] **Diferenciar entre tipos de dados primitivos e não primitivos** - -- [ ] **Manipular arrays (filter, map, sort, reduce)** - -
Links

- - - [Arrays](https://curriculum.laboratoria.la/pt/topics/javascript/04-arrays) - - [Array.prototype.sort() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) - - [Array.prototype.forEach() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) - - [Array.prototype.map() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - - [Array.prototype.filter() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) - - [Array.prototype.reduce() - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) -

- -- [ ] **Manipular objects (key | value)** - -
Links

+- [x] **Manipular arrays (filter, map, sort, reduce)** - - [Objetos em JavaScript](https://curriculum.laboratoria.la/pt/topics/javascript/05-objects/01-objects) -

+- [x] **Manipular objects (key | value)** -- [ ] **Variáveis (declaração, atribuição, escopo)** +- [x] **Variáveis (declaração, atribuição, escopo)** -
Links

+- [x] **Uso de condicionais (if-else, switch, operador ternário)** - - [Valores, tipos de dados e operadores](https://curriculum.laboratoria.la/pt/topics/javascript/01-basics/01-values-variables-and-types) - - [Variáveis](https://curriculum.laboratoria.la/pt/topics/javascript/01-basics/02-variables) -

+- [x] **Uso de laços (for, for..of, while)** -- [ ] **Uso de condicionais (if-else, switch, operador ternário)** +- [x] **Uso de funções (parâmetros, argumentos, valor de retorno)** -
Links

+- [x] **Testes unitários** - - [Estruturas condicionais e repetitivas](https://curriculum.laboratoria.la/pt/topics/javascript/02-flow-control/01-conditionals-and-loops) - - [Tomando decisões no seu código — condicionais - MDN](https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Building_blocks/conditionals) -

- -- [ ] **Uso de laços (for, for..of, while)** - -
Links

- - - [Laços (Loops)](https://curriculum.laboratoria.la/pt/topics/javascript/02-flow-control/02-loops) - - [Laços e iterações - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Loops_and_iteration) -

- -- [ ] **Uso de funções (parâmetros, argumentos, valor de retorno)** - -
Links

- - - [Funções (controle de fluxo)](https://curriculum.laboratoria.la/pt/topics/javascript/02-flow-control/03-functions) - - [Funções clásicas](https://curriculum.laboratoria.la/pt/topics/javascript/03-functions/01-classic) - - [Arrow Functions](https://curriculum.laboratoria.la/pt/topics/javascript/03-functions/02-arrow) - - [Funções — blocos reutilizáveis de código - MDN](https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Building_blocks/Functions) -

- -- [ ] **Testes unitários** - -
Links

- - - [Introdução ao Jest - Documentação oficial](https://jestjs.io/docs/pt-BR/getting-started) -

- -- [ ] **Uso ES modules** - -
Links

- - - [import - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/import) - - [export - MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/export) -

+- [x] **Uso ES modules** - [ ] **Uso de linter (ESLINT)** -- [ ] **Uso de identificadores descritivos (Nomenclatura | Semântica)** +- [x] **Uso de identificadores descritivos (Nomenclatura | Semântica)** - [ ] **Diferença entre expression e statements** - ### Git e GitHub +- [x] **Git: Instalação e configuração** -- [ ] **Git: Instalação e configuração** - -- [ ] **Git: Controle de versão com git (init, clone, add, commit, status, push, pull, remote)** - -- [ ] **Git: Integração de mudanças entre ramos (branch, checkout, fetch, merge, reset, rebase, tag)** - -- [ ] **GitHub: Criação de contas e repositórios, configuração de chave SSH** +- [x] **Git: Controle de versão com git (init, clone, add, commit, status, push, pull, remote)** -- [ ] **GitHub: Implantação com GitHub Pages** +- [x] **Git: Integração de mudanças entre ramos (branch, checkout, fetch, merge, reset, rebase, tag)** -
Links

+- [x] **GitHub: Criação de contas e repositórios, configuração de chave SSH** - - [Site oficial do GitHub Pages](https://pages.github.com/) -

- -- [ ] **GitHub: Colaboração pelo Github (branches | forks | pull requests | code review | tags)** +- [x] **GitHub: Implantação com GitHub Pages** +- [x] **GitHub: Colaboração pelo Github (branches | forks | pull requests | code review | tags)** ### user-centricity - -- [ ] **Desenhar a aplicação pensando e entendendo a usuária** - +- [x] **Desenhar a aplicação pensando e entendendo a usuária** ### product-design +- [x] **Criar protótipos para obter feedback e iterar** -- [ ] **Criar protótipos para obter feedback e iterar** - -- [ ] **Aplicar os princípios de desenho visual (contraste, alinhamento, hierarquia)** +- [x] **Aplicar os princípios de desenho visual (contraste, alinhamento, hierarquia)** ### research +- [x] **Planejar e executar testes de usabilidade** -- [ ] **Planejar e executar testes de usabilidade** - -## 4. Considerações gerais -- Este projeto será executado em duplas. -- Este projeto será entregue através do GitHub e a interface deve ser publicada - no [GitHub Pages](https://pages.github.com/). -- Tempo para completá-lo: Tome como referencia 4 semanas. -## 5. Critérios mínimos de aceitação do projeto +## 4. Protótipos e design -Os critérios considerados para que tenha terminado este projeto são: +Nós iniciamos trazendo nossas ideias de layout e design da página para o papel + -### Definição de produto +Entramos em acordo sobre as paletas de cores, sem sair do tom das paletas de cores exibida na seriado. + -Documente brevemente seu trabalho no arquivo `README.md` de seu repositório, -contando como foi o processo de desenho e como você acredita que o produto possa -resolver o problema (ou problemas) de seu usuário. +após a escolha das cores, iniciamos a montagem do layout pelo figma + -### Histórias de usuário -Uma vez que entenda a necessidade dos usuários, escreva as [Historias de -Usuario](https://pt.wikipedia.org/wiki/Hist%C3%B3ria_de_usu%C3%A1rio) que -representem tudo que o usuário precisa fazer/ver. As **histórias de usuário** -devem ser o resultado de seu processo de investigação/pesquisa de seus usuários. +## 5. Ferramentas usadas +- JavaScript +- Html5 +- Css3 +- Figma +- Git -Não esqueça de incluir a definição de pronto (_definition of done_) e os -critérios de aceitação para cada uma. - -Na medida do possível, termine uma história de usuário antes de passar para a -seguinte (cumpra com as definições de pronto + critérios de aceitação). - -### Desenho de interface do usuário - -#### Protótipo de baixa fidelidade - -Durante seu trabalho você deverá fazer e iterar rascunhos de sua solução usando -lápis e papel. Recomendamos que fotografe todas as iterações que fizer, suba -para seu repositório e as mencione no `README.md`. - -#### Protótipo de alta fidelidade - -O passo seguinte é desenhar sua Interface de Usuário (UI - _User Interface_). -Para isso você deverá aprender a usar alguma ferramenta de _visual design_. Nós -recomendamos [Figma](https://www.figma.com/) que é uma ferramenta que funciona -no navegador e no qual é possível criar uma conta gratuita. Mas você é livre -para usar outros editores gráficos como Illustrator, Photoshop, PowerPoint, -Keynote, etc. Lembre-se de usar a identidade gráfica correspondente ao arquivo -de dados que escolher. - -O protótipo deve apresentar o que seria _ideal_ em sua solução. Digamos que é o -que desejaria implementar se tivesse tempo ilimitado para hackear. Não se -esqueça de incluir em seu protótipo os fundamentos de _visual design_. - -#### Testes de usabilidade - -Durante o desafio você deverá fazer testes de usabilidade com usuários -diferentes, e com base nos resultados desses testes, iterar seus desenhos de -interface. Conte-nos quais problemas de usabilidade você detectou através dos -testes e como os resolveu na proposta final. - -### Implementação da interface de usuário (HTML/CSS/JS) - -Após desenhar sua interface de usuário, deverá trabalhar na sua implementação. -**Não** é necessário que construa a interface exatamente da mesma forma que -desenhou. Terá um tempo limitado para trabalhar no projeto, então você deve -priorizar as tarefas. - -No mínimo, sua implementação deverá: - -1. Mostrar os dados em uma interface: pode ser em cards, tabelas, listas, etc. -2. Permitir ao usuário interagir com a interface para obter as informações que - necessita; -3. Ser _responsiva_, ou seja, deve ser visualizada sem problemas a partir de - diversos tamanhos de tela: celulares, tablets, notebooks, etc. -4. Que a interface siga os fundamentos de _visual design_. - -### Testes unitários - -O _boilerplate_ do projeto não inclui testes unitários. Assim, você terá que -escrever seus próprios testes para as funções encarregadas de _processar_, -_filtrar_ e _ordenar_ os dados, assim como _calcular_ estatísticas. - -Seus testes unitários devem ter cobertura mínima de 70% de _statements_ -(_sentenças_), _functions_ (_funções_), _lines_ (_linhas_), e _branches_ -(_ramos_) do arquivo `src/data.js`, que irá conter suas funções e que está -detalhado na seção de [Considerações técnicas](#srcdatajs). - -## 6. Hacker edition - -As seções chamadas _Hacker Edition_ são **opcionais**. Se já tiver terminado -todos os requisitos anteriores e tiver tempo, pode tentar completá-las. Dessa -forma, você pode aprofundar e/ou exercitar mais os objetivos de aprendizagem -deste projeto. - -Features/características extra sugeridas: - -- Ao invés de consumir dados estáticos do repositório, pode fazer isso de forma - dinâmica, carregando um arquivo JSON com `fetch`. A pasta `src/data` contém - uma versão `.js` e uma `.json` de cada conjunto de dados. -- Adicione à sua interface visualização de dados em forma de gráficos. Para - isso, recomendamos explorar bibliotecas de gráficos como - [Chart.js](https://www.chartjs.org/) ou [Google - Charts](https://developers.google.com/chart/). -- 100% de cobertura nos testes. - -## 7. Considerações técnicas - -A lógica do projeto deve estar implementada somente em JavaScript (ES6), HTML e -CSS. Neste projeto não está permitido o uso de bibliotecas e frameworks, apenas -[vanilla -JavaScript](https://medium.com/laboratoria-how-to/vanillajs-vs-jquery-31e623bbd46e), -com exceção das bibliotecas para gráficos (ver [_Parte -opcional_](#6-hacker-edition) acima). - -O _boilerplate_ contém uma estrutura de arquivos como ponto de partida, assim -como toda a configuração de dependências: - -```text -. -├── EXTRA.md -├── README.md -├── package.json -├── src -| ├── data (de acordo com o data que forem trabalhar) -| | ├── lol -| | | ├── lol.js -| | | ├── lol.json -| | | └── README.md -| | ├── pokemon -| | | ├── pokemon.js -| | | ├── pokemon.json -| | | └── README.md -| | └── rickandmorty -| | | ├── rickandmorty.js -| | | ├── rickandmorty.json -| | | └── README.md -| | └── athletes -| | | ├── athletes.js -| | | ├── athletes.json -| | | └── README.md -| | └── ghibli -| | | ├── ghibli.js -| | | ├── ghibli.json -| | | └── README.md -| ├── data.js -| ├── index.html -| ├── main.js -| └── style.css -└── test - └── data.spec.js - -directory: 7 file: 20 -``` - -### `src/index.html` - -Como no projeto anterior, existe um arquivo `index.html`. Como já sabe, aqui -entra a página que vai ser exibida ao usuário. Também serve para indicar quais -scripts serão utilizados e juntar tudo o que foi feito. - -### `src/main.js` - -Recomendamos que utilize `src/main.js` para todos os códigos que tenham a ver -com a exibição dos dados na tela. Com isto nos referimos basicamente à interação -com o DOM. Operações como criação de nós, registro de manejadores de eventos -(_event listeners_ ou _event handlers_) e etc. - -Esta não é a única forma de dividir seu código. Pode utilizar mais arquivos e -pastas, sempre e quando a estrutura estiver clara para suas colegas. - -Neste arquivo você encontrará uma série de _imports comentados_. Para carregar -diferentes fontes de dados, você deverá "descomentar" esses _imports_. Cada um -destes _imports_ criará uma variável `data` com os dados correspondentes à fonte -escolhida. - -Por exemplo, se "descomentamos" a seguinte linha: - -```js -// import data from './data/pokemon/pokemon.js'; -``` - -A linha ficaria assim: - -```js -import data from "./data/pokemon/pokemon.js"; -``` - -E agora teríamos a variável `data` disponível em `src/main.js`. - -### `src/data.js` - -O coração deste projeto é a manipulação de dados através de arrays e objetos. - -Recomendamos que este arquivo contenha toda a funcionalidade que corresponda a -obter, processar e manipular dados (suas funções): - -- `filterData(data, condition)`: esta função receberia os dados e nos retornaria - os que cumprem com a condição. - -- `sortData(data, sortBy, sortOrder)`: esta função recebe três parâmetros. O - primeiro, `data`, nos entrega os dados. O segundo, `sortBy`, diz respeito a - qual das informações quer usar para ordenar. O terceiro, `sortOrder`, indica - se quer ordenar de maneira crescente ou decrescente. - -- `computeStats(data)`: essa função nos permite fazer cálculos estatísticos - básicos para serem exibidos de acordo com o que os dados permitem. - -Estes nomes de funções e parâmetros são somente referência, o que vocês decidirem -utilizar vai depender da sua implementação. - -Estas funções devem ser -[_puras_](https://imasters.com.br/desenvolvimento/serie-js-e-vida-pure-functions-funcoes-puras) -e independentes do DOM. Estas funções serão depois usadas a partir do arquivo -`src/main.js`, ao carregar a página e a cada vez que o usuário interagir com a -interface (cliques, seleções, filtros, ordenação, etc). - -### `src/data` - -Nesta pasta estão os dados de diferentes fontes. Você vai encontrar uma pasta -para cada fonte, e dentro de cada pasta estão dois arquivos: um com a extensão -`.js` e outro `.json`. Ambos os arquivos contém os mesmos dados; a diferença é -que podemos usar o `.js` com uma tag ` diff --git a/src/indexpag2.html b/src/indexpag2.html index 6bdcb0d0..cf266723 100644 --- a/src/indexpag2.html +++ b/src/indexpag2.html @@ -5,36 +5,49 @@ RICK AND MORTY WIKI + + +
- cabeçalho -

RICK AND MORTY WIKI

- + cabeçalho + RICK AND MORTY WIKI
+
-

RICK AND MORTY WIKI

-

Seu portal para uma viagem ALUCINANTE !

-

SOBRE A SERIE: Rick Sanchez é um cientista genial e alcoólatra que foi morar com a família de sua filha Beth, - uma cirurgiã cardíaca de equinos. Ele divide seu tempo entre desenvolver projetos altamente - tecnológicos em seu laboratório (garagem da casa de Beth) e levar seu neto de 14 anos Morty em - aventuras perigosas e surreais pelo Multiverso. Combinados com tensões preexistentes dentro da - família, esses eventos causam ao sensível Morty muito angústia em casa e na escola.

+
+
+ RICK AND MORTY WIKI +

Seu portal para uma viagem ALUCINANTE !

+

SOBRE A SERIE: Rick Sanchez é um cientista genial e alcoólatra que foi morar com a família de sua + filha Beth, + uma cirurgiã cardíaca de equinos. Ele divide seu tempo entre desenvolver projetos altamente + tecnológicos em seu laboratório (garagem da casa de Beth) e levar seu neto de 14 anos Morty em + aventuras perigosas e surreais pelo Multiverso. Combinados com tensões preexistentes dentro da + família, esses eventos causam ao sensível Morty muito angústia em casa e na escola.

-

Saiba mais, vamos nessa! Porque você não aperta numa tecla desse teclado e manda uma batida ?

+

Saiba mais, vamos nessa! Porque você não aperta numa tecla desse teclado e manda uma batida ?

+
-
+
- + diff --git a/src/main.js b/src/main.js index f768e49d..9fc322ad 100644 --- a/src/main.js +++ b/src/main.js @@ -1,19 +1,18 @@ -import { ordemNameAA, ordemNameBB } from './data.js'; -import data from './data/rickandmorty/rickandmorty.js'; +import { orderAZ, orderZA, filterStatus, filtroespecie, filterGender, calculo, filteredItem } from "./data.js"; +import data from "./data/rickandmorty/rickandmorty.js"; -const showPersonagens = document.getElementById("card") -const arrayRickAndMorty = data.results -let cardsAtuais = arrayRickAndMorty +export const showCharacters = document.getElementById("card") +const characters = data.results -function showInfos(arrayRickAndMorty) { - showPersonagens.innerHTML = arrayRickAndMorty.map(item => +function showInfos(characters) { + showCharacters.innerHTML = characters.map(item => `

${item.name}

- +

Status: ${item.status}

@@ -26,84 +25,123 @@ function showInfos(arrayRickAndMorty) {

${item.name}

- +
- Origem: ${item.origin.url} - Localização:${item.location.url}

-

Epsódios que aparece: ${item.episode.lenght}

+

Origem: ${item.origin.name}

+ Localização:${item.location.name}

+

Faz parte de: ${item.episode.length} Epsódios

` - ).join('') - + ).join("") } -showInfos(cardsAtuais) -//filtros status +showInfos(characters) + +const showStats = document.getElementById("statistics") +const selectGender = document.getElementById("selectFilterGender") const selectStatus = document.getElementById("selectFilterLife") +const selectSpecies = document.getElementById("selectFilterSpecies") selectStatus.addEventListener("change", (event) => { - cardsAtuais = cardsAtuais.filter((item) => { - return item.status === event.target.value - }) - - showInfos(cardsAtuais) + let newArrayStatus = filterStatus(characters, event.target.value) + if (selectGender.value) { + newArrayStatus = newArrayStatus.filter((item) => { + return item.gender === selectGender.value + }) + } + if (selectSpecies.value) { + newArrayStatus = newArrayStatus.filter((item) => { + return item.species === selectSpecies.value + }) + } + let result = calculo(newArrayStatus.length, characters.length) + showStats.innerHTML = result + showInfos(newArrayStatus) }) -//filtroespecie -const selectSpecies = document.getElementById("selectFilterSpecies") - selectSpecies.addEventListener("change", (event) => { - cardsAtuais = cardsAtuais.filter((item) => { - return item.species === event.target.value - }) - showInfos(cardsAtuais) + let newArraySpecies = filtroespecie(characters, event.target.value) + if (selectGender.value) { + newArraySpecies = newArraySpecies.filter((item) => { + return item.gender === selectGender.value + }) + } + if (selectStatus.value) { + newArraySpecies = newArraySpecies.filter((item) => { + return item.status === selectStatus.value + }) + } + let result = calculo(newArraySpecies.length, characters.length) + showStats.innerHTML = result + showInfos(newArraySpecies) + }) -//filtroGenero -const selectGender = document.getElementById("selectFilterGender") selectGender.addEventListener("change", (event) => { - cardsAtuais = cardsAtuais.filter((item) => { - return item.gender === event.target.value - }) - showInfos(cardsAtuais) + let newArrayGender = filterGender(characters, + event.target.value) + if (selectStatus.value) { + newArrayGender = newArrayGender.filter((item) => { + return item.status === selectStatus.value + }) + } + if (selectSpecies.value) { + newArrayGender = newArrayGender.filter((item) => { + return item.species === selectSpecies.value + }) + } + + let result = calculo(newArrayGender.length, characters.length) + showStats.innerHTML = result + showInfos(newArrayGender) + }) -//função ordenar A a Z -function ordemNameA(event) { - event.preventDefault() - return showInfos(ordemNameAA(cardsAtuais)); + +function orderaz(e) { + e.preventDefault() + return showInfos(orderAZ(characters)); } +if (selectStatus.value) { + characters = characters.filter((item) => { + return item.status === selectStatus.value + }) +} +if (selectSpecies.value) { + characters = characters.filter((item) => { + return item.species === selectSpecies.value + }) +} +if (selectGender.value) { + characters = characters.filter((item) => { + return item.gender === selectGender.value + }) +} +document.getElementById("btn-ordemA").addEventListener("click", orderaz); -document.getElementById("btn-ordemA").addEventListener("click", ordemNameA); -//função ordenar Z a A -function ordemNameB(event) { - event.preventDefault() - return showInfos(ordemNameBB(cardsAtuais)); +function orderza(e) { + e.preventDefault() + return showInfos(orderZA(characters)); } -document.getElementById("btn-ordemZ").addEventListener("click", ordemNameB); -//função limpar +document.getElementById("btn-ordemZ").addEventListener("click", orderza); + + const clearFilters = document.getElementById("btn-limpar"); -function clearAll() { +function clearAll(e) { + e.preventDefault() window.location.reload(); } clearFilters.addEventListener("click", clearAll); -//pesquisar por nome - -const searchBar = document.getElementById('searchBar'); - -searchBar.addEventListener('keyup', (e) => { - const searchString = e.target.value; - cardsAtuais = cardsAtuais.filter(item => { - return item.name.includes(searchString) || - item.status.includes(searchString) || - item.species.includes(searchString) || - item.gender.includes(searchString) - }); - showInfos(cardsAtuais) -}); - -//const calculoStatus = document.getElementById("calculoAgreStatus"); -//calculoStatus.innerHTML = ${item.status.reduce((acc,curr) => acc+curr} 0) -// return acc + curr. -// return calculoStatus/cardsAtuais.length -//${item.status.reduce((acc,curr) => acc+curr, 0)}

A média de personagens é: ${item.status.reduce((acc,curr) => acc+curr, 0)/cardsAtuais.length}` + +const searchBar = document.getElementById("searchBar"); +searchBar.addEventListener("keyup", (e) => { + let searchString = filteredItem(e.target.value.toLowerCase()) + showInfos(searchString); +}) + +const btnBackTop = document.querySelector("#voltarAoTopo"); +btn.addEventListener("click", function () { + window.scrollTo(0, 0); + +}) + diff --git a/src/style.css b/src/style.css index 3bd15a52..a4812d77 100644 --- a/src/style.css +++ b/src/style.css @@ -1,5 +1,9 @@ body { + margin: 0px; + padding: 0px; background-color: #0C0F14; + color:#BFBFBF; + font-size: 1em; } header{ @@ -9,35 +13,189 @@ justify-content: space-around; background-color: #1C1F24; padding: 1%; - } + width: 98%; + border-bottom:#C8D258 solid 2px; + } - h1 { + .titlesite { color: #12B0C9; + font-size: 28px; } nav { display: flex; flex-direction: row; align-items: center; - gap: 10%; + gap: 8%; background-color: #0C0F14; + width:350px; + height: 20px; + } - } - .filterspersonagens{ + .filtersCharacters { display: flex; flex-direction: row; align-items: center; justify-content: space-around; color: #C8D258; - font-size: 14px; + font-size: 18px; + } + + .filter { + font: normal 18px serif; + color:#BFBFBF; + background-color: #0C0F14; + border-color: #C8D258 solid 2px; + border-radius: 5%; + text-align: center; + cursor: pointer; + } + + .btn-Ordem { + font: normal 20px serif; + background-color:#1C1F24; + color: #C8D258; + border-style: none; + border-bottom-left-radius: 15%; + border-top-left-radius: 15%; + border-top-right-radius: 15%; + border-bottom-right-radius: 15%; + cursor: pointer; + } + .btn-Ordem:hover { + opacity: 0.6;; + } + + .pesquisa { + background-color: #0C0F14; + color: #BFBFBF; + border-style: solid; + border-color: #C8D258; + height:30px; + } + + .btnMenu { + background-image: url(../imagens/button.png); + } + + a, link { + color: #BFBFBF; + text-decoration: none; + } + + a:hover { + opacity: 0.7;; + + } + b, strong { + color: #C8D258; + } + + .voltarAoTopo {background-image: linear-gradient(to right, #00c3ff 0%, #ffff1c 51%, #00c3ff 100%)} + .voltarAoTopo { + position: fixed; + right: 10%; + bottom: 3.5rem; + padding: 0.5rem; + text-align: center; + text-transform: uppercase; + transition: 0.5s; + background-size: 200% auto; + color: #1C1F24; + border-radius: 10px; + display: block; + cursor: pointer; +} + + .voltarAoTopo:hover { + background-position: right center; + color: #fff; + text-decoration: none; + } + +.calculoAGregado { + font-family: serif 10%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-around; + background-color: #1C1F24; + padding: 1%; + width: 98%; +} +footer { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-around; + background-color: #1C1F24; + margin-top: #C8D258 solid 2px; +} +@media (max-width: 600px) { + .titlesite { + font-size: 75%; } - #voltarAoTopo { - position: fixed; - bottom: 50px; - right: 50px; + .btnhome { + display: flex; + justify-content: space-around; + align-items: center; + width: 100%; + } + .infos { + font-size: 75%; + } + + nav { + display: flex; + flex-direction: column; + font-size: 80%; + } + + .filterspersonagens { + display: flex; + flex-direction:row; + gap: 10px; + flex-wrap: wrap; + font-size: 80%; + margin: 25px; + } + + .imgfiltros { + display: none; + } + + .voltarAoTopo { + font-size: 70%; + width: 20%; + right: 4px; + padding: 1rem; + + } + .card { + width: 70%; + } + .name-title { + width: 100%; } +} - b, strong {color:#C8D258;} - a, link {color: #BFBFBF; +@media (min-width: 600px) { + .voltarAoTopo { + right: 2%; + } + +} + +@media (max-width: 809px) { + + nav { + display: flex; + flex-direction: column; + font-size: 80%; + width: 150px; + height:100px; + font-size: 113% +} +} diff --git a/src/stylecard.css b/src/stylecard.css index 71c9482e..707fed03 100644 --- a/src/stylecard.css +++ b/src/stylecard.css @@ -3,11 +3,10 @@ display: flex; flex-direction: column; align-items: center; - width: 300px; - height: 400px; - margin: 16px; - margin-left: 5px; - margin-right: 5px; + height: 22em; + width: 12.5em; + border-radius: 0.313em; + margin: 0.313em 0.625em 1.25em 1.188em; color: #BFBFBF; position: relative; transition: transform 0.8s; @@ -21,6 +20,7 @@ backface-visibility: hidden; text-align: center; } + .back { position: absolute; width: 100%; @@ -28,11 +28,15 @@ backface-visibility: hidden; text-align: center; transform: rotateY(180deg); + background-color: #1C1F24; + border-radius: 0.313em; } + .card:hover { transform: rotateY(180deg); box-shadow: inset 0 0 1em #12B0C9; } + .cards-container { display: flex; flex-wrap: wrap; @@ -42,23 +46,23 @@ .imgcard { position: center; - width: 174px; - height: 170px; - border-radius: 5%; + width: 10.5em; + height: 9.5em; + border-radius: 0.313em; } .imgfiltros { border-bottom: #C8D258 solid 2px; } -.name-title { +.nameTitle { align-items: center; - height: 35px; - width: 300px; + height: 8%; + width: 100%; margin-bottom: 5px; - background-color: #C8D258; + background-color: #12B0C9; text-align: center; border-radius: 5%; - font-size: 14px; + font-size: 20px; color: #0C0F14; } diff --git a/src/stylepag1.css b/src/stylepag1.css new file mode 100644 index 00000000..833fc8dd --- /dev/null +++ b/src/stylepag1.css @@ -0,0 +1,52 @@ +body { + margin: 0; + padding: 0; + +} + +main { + display: flex; + flex-direction: column; + align-items: center; +} + +.mainpag1 { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-around; + } + .btn-grad {background-image: linear-gradient(to right, #00c3ff 0%, #ffff1c 51%, #00c3ff 100%)} + .btn-grad { + margin: 10px; + padding: 10px 30px; + text-align: center; + text-transform: uppercase; + transition: 0.5s; + background-size: 200% auto; + color: #1C1F24; + border-radius: 10px; + display: block; + } + + .btn-grad:hover { + background-position: right center; + color: #fff; + text-decoration: none; + } + +.btnhome { +display: flex; +flex-direction: row; +align-items: center; +justify-content: space-around; +width: 45%; +} + +@media (max-width: 600px) { +.mainpag1 { + display: flex; + flex-direction: column; + align-items: center; +} +} diff --git a/test/data.spec.js b/test/data.spec.js index 09b1f23f..0b324799 100644 --- a/test/data.spec.js +++ b/test/data.spec.js @@ -1,23 +1,136 @@ -import { example, anotherExample } from '../src/data.js'; +import { describe, it } from 'eslint/lib/rule-tester/rule-tester'; +import { ordemNameAA, ordemNameBB, filterStatus, filtroespecie, filterGender, calculo } from '../src/data.js'; +const personagensteste = [ + { + name: "Abradolf Lincler", + status: "unknown", + species: "Human", + gender: "Male", + }, + { + name: "Adjudicator Rick", + status: "Dead", + species: "Human", + gender: "Male", + }, + { + name: "Bootleg Portal Chemist Rick", + status: "Dead", + species: "Human", + gender:"Male", + }, + { + name: "Summer Smith", + status: "Alive", + species: "Human", + gender: "Female", + } +] + + +describe("filterStatus", () => { + it("filterStatus filtrar vivos" ,() => { + const expected = filterStatus(personagensteste, "Alive"); + expect(expected).toEqual([ + { + name: "Summer Smith", + status: "Alive", + species: "Human", + gender: "Female", + }, + ]); + +describe('functon ordernar a a z', () => { + it('ordenar de A a Z', () => { + expect(typeof ordemNameAA).toBe('function'); -describe('example', () => { - it('is a function', () => { - expect(typeof example).toBe('function'); }); - it('returns `example`', () => { - expect(example()).toBe('example'); + describe("filtroespecie", () => { + it("filtroespecie filtrar humanos", () => { + const expected = filtroespecie(personagensteste, "Human"); + expect(expected).toEqual([ + { + name: "Abradolf Lincler", + status: "unknown", + species: "Human", + gender: "Male", + }, + { + name: "Adjudicator Rick", + status: "Dead", + species: "Human", + gender: "Male", + }, + { + name: "Bootleg Portal Chemist Rick", + status: "Dead", + species: "Human", + gender:"Male", + }, + { + name: "Summer Smith", + status: "Alive", + species: "Human", + gender: "Female", + }, + ]); + }); }); -}); + describe("filterGender", () => { + it("filterGender filtrar mulheres", () => { + const expected = filterGender(personagensteste, "Female"); + expect(expected).toEqual([ + { + name: "Summer Smith", + status: "Alive", + species: "Human", + gender: "Female", + }, + ]); + }); + }); -describe('anotherExample', () => { - it('is a function', () => { - expect(typeof anotherExample).toBe('function'); + describe('ordemNameAA', () => { + it("ordemNameAA deve ordenar de A a Z", () => { + const naoordenado = [ + { name: "Rick Sanchez" }, + { name: "Jerry Smith" }, + { name: "Antenna Morty" } + ] + const ordenado = ordemNameAA(naoordenado) + expect(ordenado).toEqual([ + { name: "Antenna Morty" }, + { name: "Jerry Smith" }, + { name: "Rick Sanchez" } + ]) + }) }); - it('returns `anotherExample`', () => { - expect(anotherExample()).toBe('OMG'); + describe('ordemNameBB', () => { + it("ordemNameBB deve ordenar de Z a A", () => { + const naoordenado = [ + { name: "Rick Sanchez" }, + { name: "Jerry Smith" }, + { name: "Antenna Morty" } + ] + const ordenado = ordemNameBB(naoordenado) + expect(ordenado).toEqual([ + { name: "Rick Sanchez" }, + { name: "Jerry Smith" }, + { name: "Antenna Morty" } + ]) + }) }); -}); +}) + +describe('calculo', () => { + it("retorna 75% dos personagens machos", () => { + const calculoPorce = calculo(personagensteste.length, 3); + expect(calculoPorce).toEqual(75); + }) +}) + }) +}) diff --git a/usuario.jpg b/usuario.jpg new file mode 100644 index 00000000..a1938e0c Binary files /dev/null and b/usuario.jpg differ