{"id":26931608,"url":"https://github.com/fernandozuchi/pratica2503","last_synced_at":"2026-01-16T01:48:55.346Z","repository":{"id":284400200,"uuid":"954823080","full_name":"FernandoZuchi/pratica2503","owner":"FernandoZuchi","description":"Repositório template para a aula prática do dia 23/03/2025 que ministrei para os alunos da turma da manhã (Fullstack) na escola Codi Academy","archived":false,"fork":false,"pushed_at":"2025-03-25T17:10:12.000Z","size":4,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-02T07:18:13.446Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FernandoZuchi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-25T17:07:51.000Z","updated_at":"2025-03-25T17:10:17.000Z","dependencies_parsed_at":"2025-03-25T18:25:25.172Z","dependency_job_id":"20de8c4d-5453-451a-92c2-01603418ce7f","html_url":"https://github.com/FernandoZuchi/pratica2503","commit_stats":null,"previous_names":["fernandozuchi/pratica2503"],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/FernandoZuchi/pratica2503","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FernandoZuchi%2Fpratica2503","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FernandoZuchi%2Fpratica2503/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FernandoZuchi%2Fpratica2503/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FernandoZuchi%2Fpratica2503/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FernandoZuchi","download_url":"https://codeload.github.com/FernandoZuchi/pratica2503/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FernandoZuchi%2Fpratica2503/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28474502,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T00:15:39.755Z","status":"ssl_error","status_checked_at":"2026-01-16T00:15:32.174Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-02T07:18:15.926Z","updated_at":"2026-01-16T01:48:55.331Z","avatar_url":"https://github.com/FernandoZuchi.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏋️ Aula Prática: Buscador de Endereço via CEP (Duração: 1h30)\n\n## ✨ Objetivo da Aula\nDesenvolver uma aplicação web simples que consome uma API externa para buscar dados de endereço a partir de um CEP informado pelo usuário. A aula abordará conceitos de HTML, CSS, JavaScript e consumo de APIs.\n\n---\n\n## ⌛ Roteiro da Aula (1h30)\n\n### ✅ 1. Apresentação do Projeto (10 min)\n\n- Mostrar o projeto final funcionando (demonstração rápida):\n  - Aluno digita o CEP, clica em \"Buscar\" e os dados aparecem.\n\n- Explicação do que é uma **API**:\n  - Interface de comunicação entre dois sistemas.\n  - Exemplo: BrasilAPI fornece dados de CEP de forma gratuita.\n\n---\n\n### 📁 2. Estrutura HTML (15 min)\n\n**Arquivo:** `index.html`\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"pt-br\"\u003e\n  \u003chead\u003e\n    \u003cmeta charset=\"UTF-8\" /\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /\u003e\n    \u003ctitle\u003eBuscador de Endereço\u003c/title\u003e\n    \u003clink rel=\"stylesheet\" href=\"./css/style.css\" /\u003e\n  \u003c/head\u003e\n  \u003cbody\u003e\n    \u003cdiv id=\"app\"\u003e\n      \u003cdiv class=\"container-form\"\u003e\n        \u003cdiv class=\"logo\"\u003e\n          \u003cimg src=\"./assets/map.svg\" alt=\"Ícone de mapa\" /\u003e\n          \u003ch1\u003eBuscar Endereço\u003c/h1\u003e\n        \u003c/div\u003e\n        \u003cinput type=\"text\" placeholder=\"Digite o cep\" /\u003e\n        \u003cbutton\u003eBuscar\u003c/button\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"result\"\u003e\u003c/div\u003e\n    \u003c/div\u003e\n    \u003cscript src=\"./scripts/main.js\"\u003e\u003c/script\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n\n**Explicação:**\n- `div#app`: estrutura principal.\n- `input` e `button`: para interação do usuário.\n- `div.result`: onde os dados aparecerão.\n- Script JS no final garante que o HTML já esteja carregado.\n\n---\n\n### 🎨 3. Estilo com CSS (20 min)\n\n**Arquivo:** `css/style.css`\n\n```css\n* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\nbody {\n  min-height: 100vh;\n  background-color: #232323;\n  color: #fff;\n}\n\n#app {\n  display: flex;\n  gap: 40px;\n  max-width: 900px;\n  width: 100%;\n  margin: 20px auto;\n}\n\nimg {\n  width: 64px;\n}\n\n.container-form {\n  background-color: #171717;\n  width: 50%;\n  border-radius: 20px;\n  padding: 32px;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\ninput {\n  padding: 12px;\n  border-radius: 8px;\n  background-color: #232323;\n  border: none;\n  outline: none;\n  color: #fff;\n}\n\nbutton {\n  padding: 12px;\n  border-radius: 8px;\n  background-color: #7fff00;\n  border: none;\n  color: #232233;\n  font-size: 20px;\n  font-weight: 700;\n  cursor: pointer;\n}\n\n.result {\n  flex: 1;\n  background-color: #171717;\n  padding: 20px;\n  border-radius: 20px;\n}\n\np {\n  font-size: 20px;\n  font-weight: 700;\n  margin-top: 16px;\n}\n```\n\n**Explicação:**\n- Reset com `*` para padronizar.\n- `Flexbox` para layout responsivo.\n- Estilo moderno, escuro, com destaque no botão.\n- Classes reutilizáveis.\n\n---\n\n### ⚖️ 4. Lógica com JavaScript (30 min)\n\n**Arquivo:** `scripts/main.js`\n\n```js\nconst input = document.querySelector('input')\nconst button = document.querySelector('button')\nconst result = document.querySelector('.result')\n\nbutton.addEventListener('click', async () =\u003e {\n  const cep = input.value.trim()\n\n  if (cep === '') {\n    alert('Digite um CEP válido.')\n    return\n  }\n\n  const url = `https://brasilapi.com.br/api/cep/v2/${cep}`\n\n  try {\n    const response = await fetch(url)\n\n    if (!response.ok) {\n      throw new Error('CEP não encontrado')\n    }\n\n    const data = await response.json()\n\n    result.innerHTML = `\n      \u003cp\u003eCEP: ${data.cep}\u003c/p\u003e\n      \u003cp\u003eRua: ${data.street}\u003c/p\u003e\n      \u003cp\u003eCidade: ${data.city}\u003c/p\u003e\n      \u003cp\u003eBairro: ${data.neighborhood}\u003c/p\u003e\n      \u003cp\u003eEstado: ${data.state}\u003c/p\u003e\n    `\n  } catch (error) {\n    result.innerHTML = `\u003cp style=\"color:red\"\u003eErro: ${error.message}\u003c/p\u003e`\n  }\n\n  input.value = ''\n  input.focus()\n})\n```\n\n**Explicação:**\n- Selecionamos elementos do DOM.\n- Criamos um evento de clique.\n- Usamos `fetch` + `async/await` para consumir a API.\n- Validamos CEP vazio e tratamos erros com `try...catch`.\n\n---\n\n### 📊 5. Testes e Melhorias (10 min)\n\n- Testar CEPs reais (ex: 01001000).\n- Testar CEPs errados para verificar o tratamento de erro.\n\n**Sugestões de melhorias:**\n- Adicionar loading (carregando...).\n- Bloquear caracteres não numéricos no input.\n- Criar mensagem \"Digite um CEP\" antes da busca.\n\n---\n\n## 🎓 Conteúdos Aprendidos\n- Estrutura HTML de uma aplicação web.\n- Estilização com CSS.\n- Manipulação de eventos e DOM com JS.\n- Consumo de APIs públicas com `fetch`.\n- Tratamento de erros com `try...catch`.\n- Experiência simulada de integração de dados externos.\n\n---\n\n## 💼 Valor de Mercado\n- Saber consumir APIs é essencial em sistemas modernos.\n- Trabalhar com JS assíncrono é prática comum em front-end.\n- APIs são a base da comunicação entre front-end e back-end.\n\n---\n\n## 📅 Tarefa para Casa (Extra e Opcional)\n- Adicionar barra de carregamento. (HTML + CSS)\n- Criar versão responsiva para celular. (HTML + CSS)\n- Validar CEP com Regex (ex: `/^\\d{8}$/`). (HTML + CSS + JS)\n\n---\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandozuchi%2Fpratica2503","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffernandozuchi%2Fpratica2503","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandozuchi%2Fpratica2503/lists"}