diff --git a/README.md b/README.md
index cf0dce1..62a2c5f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-
+
Site HBO Max
Clone com modificações
@@ -7,20 +7,21 @@
O projeto é um clone do site HBO Max, com o intuito de reproduzir a interface, com algumas modificações, aplicando os temas abordados ao longo das aulas de CSS da plataforma da Digital Innovation One.
- O clone do site HBO Max serve como desafio para os alunos da plataforma testarem seus conhecimentos e colocarem em prática os recursos de HTML e CSS abordados nos cursos.
+ Eu utilizando como base o projeto da dio.me proposto pela Instrutora: Michele Ambrosio, implentei uma Single Page Aplication, utilizando-se de várias técnologias adicionais, como por exemplo a utilização de componentes nativos do JavaScript, também convenções de nomenclatura e estruturação.
-
-
+
+
## 📎 Sumário
- [✨ Features](#features)
- [📦 Temas abordados](#topics)
-- [🏆 Desafio](#challenges)
-- [🌈 Demonstração](#demo)
-- [💻 Autora](#author)
+- [❗ Mixin](#mixin)
+- [🔡 Router](#router)
+- [✅ Deploy](#demo)
+- [💻 Autor](#author)
✨ Features
@@ -50,97 +51,171 @@ Recursos CSS presentes no projeto:
- Transições e animações
- Tratamento de campos inválidos no formulário
-🏆 Desafio
-
-Como parte do desafio final da Trilha de CSS, o desenvolvedor deve reproduzir [esse projeto](https://micheleambrosio.github.io/hbomax/), sem realizar uma consulta do código final do site, presente na branch `master` deste repositório.
-
-Para auxiliar na reprodução, utilize a branch `template-desafio`. Faça um fork do projeto em sua conta do GitHub.
-
-Dentro da branch `template-desafio`, você encontrará na pasta `assets/images` todos os arquivos de imagens que você irá precisar para utilizar no projeto.
-
-Caso deseje, adicione as variáveis CSS abaixo, que contém todas as cores e gradientes utilizados no projeto:
-
-```css
- :root {
- --primary-color: #020228;
- --secondary-color: #ff00e5;
- --tertiary-color: #b535f6;
- --btn-bg-color-gradient: linear-gradient(
- 45deg,
- #9b34ef 0%,
- #490cb0 20%,
- transparent 50%
- );
- --btn-link-bg-color: #fff;
- --btn-link-color: #000;
- --card-bg-color: linear-gradient(0deg, transparent, #3b1e63);
- --divider-bg-color: linear-gradient(
- 90deg,
- #5516ba,
- rgba(255, 0, 229, 0.5) 80%
- );
- --nav-bg-color: rgba(0, 0, 0, 0.3);
- --text-color: #fff;
- --link-color: #9e86ff;
- --form-bg-color: rgba(211, 211, 211, 0.06);
- --form-field-bg-color: rgba(0, 0, 0, 0.2);
- --form-field-border: 1px solid rgba(255, 255, 255, 0.7);
- --form-field-placeholder: rgba(255, 255, 255, 0.7);
- --form-field-error: rgb(255, 76, 76);
-
- scroll-behavior: smooth;
- }
-```
+Melhorias na:
-*A propriedade `scroll-behavior: smooth` irá fazer com que os links que levam para uma outra sessão do site, da mesma página, faça uma transição suave ao realizar a rolagem.*
+- Responsividade
+- Estruturação
+- nomenclaturas
-Para implementar a barra de rolagem personalizada, como no exemplo, adicione na sua folha de estilos o seguinte trecho CSS:
+Implementações:
-```css
- /* Custom Scroll */
+- ViteJs
+- TypeScript
+- Web Components
+- SASS
+- SCSS
+- SPA
+- Página de não econtrada 404
- ::-webkit-scrollbar {
- width: 8px;
- }
+Convenções utilizadas:
- ::-webkit-scrollbar-thumb {
- background: var(--tertiary-color);
- border-radius: 10px;
- }
+- ITCSS
+- BEMIT
- ::-webkit-scrollbar-thumb:hover {
- background: var(--secondary-color);
- }
-```
+❗ Mixin utilizando SCSS
-O resultado final do projeto deve contemplar todas as [features](#features) presentes no resultado final.
+Cria uma lista de URL's, com o `@each` itera item por item, e por fim foi criadas seis classes, utilizando a variável counter para definir a posição específica de cada card.
-As fontes utilizadas no projeto foram:
+```scss
+$urls: (
+ '/images/hbo-hover_0.webp',
+ '/images/MAX-Hover.webp',
+ '/images/DC-Hover.webp',
+ '/images/WB-Hover.webp',
+ '/images/CN-Hover.png',
+ '/images/UCL-Hover.webp'
+);
-- [Raleway](https://fonts.google.com/specimen/Raleway)
-- [Quicksand](https://fonts.google.com/specimen/Quicksand?query=quicksand)
-
-```css
-@import url("https://fonts.googleapis.com/css2?family=Raleway:wght@300;400;500;600;700&display=swap");
-@import url("https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;700&display=swap");
+@mixin generate-hover-backgrounds($urls) {
+ $counter: 1;
+
+ @each $url in $urls {
+ .c-contents__card:nth-child(#{$counter}):hover {
+ cursor: pointer;
+ background-image: url(#{$url});
+ }
+
+ $counter: $counter + 1;
+ }
+}
```
-*Para melhor orientação, assista ao vídeo de instruções do desafio, que está disponibilizado no Módulo 3 da Trilha de CSS.*
+🔡 Router implementado
+
+Router desenvolvido utilizando recursos nativos do JavaScript e do navegador.
+
+```ts
+// Views
+import HomeView from './views/home.view';
+import NotFoundView from './views/not-found.view';
+import SignInView from "./views/signin.view";
+
+// Interfaces
+import IRoute from "./interfaces/IRoute.interface";
+import IPotentialMatch from "./interfaces/IPotentialMatch.interface";
+
+// Utils
+import getElement from './utils/get-element.util';
+import setClasses from './utils/set-classes.util';
+import sleep from './utils/sleep.util';
+
+// Base URL
+import viteConfig from '../vite.config'
+
+const navigateTo = (url: string): void => {
+ history.pushState(null, '', url);
+ router();
+};
+
+const router: () => Promise = async (): Promise => {
+ const routes: IRoute[] = [
+ { path: "/", view: HomeView },
+ { path: "/signin", view: SignInView },
+ { path: '/404', view: NotFoundView }
+ ];
+
+ // Test each route potential match
+ const potentialMatches: IPotentialMatch[] = routes.map((route: IRoute): IPotentialMatch => {
+ return {
+ route: route,
+ isMatch: location.pathname === `${viteConfig.base.substring(0, 7)}${route.path}`
+ }
+ });
+
+ let match: IPotentialMatch | undefined = potentialMatches
+ .find((potentialMatch: IPotentialMatch): boolean => potentialMatch.isMatch);
+
+ if (!match) {
+ match = {
+ route: routes[routes.length - 1],
+ isMatch: true
+ };
+ }
+
+ const root: HTMLElement = getElement('#root');
+ const view = new match.route.view();
+
+ const init: () => Promise = async (): Promise => {
+ root.innerHTML = await view.getHtml();
+ setClasses(['main'], true, 'is-rendered');
+
+ const isRendered: boolean
+ = getElement('main').classList.contains('is-rendered');
+
+ if (isRendered) {
+ getElement('#loader').classList.add('is-hidden');
+ setClasses(['max-navbar', 'max-footer'], true, 'is-visible');
+ await sleep(.3);
+ setClasses(['#root'], false, 'is-show');
+ }
+
+ const route: string = match.route.path;
+
+ if (route !== '/')
+ getElement('.ts-assign-link').setAttribute('data-link', '');
+ else
+ getElement('.ts-assign-link').removeAttribute('data-link');
+ }
+
+ init();
+};
+
+window.addEventListener('popstate', router);
+
+document.addEventListener('DOMContentLoaded', (): void => {
+ document.body.addEventListener('click', (e: MouseEvent): void => {
+ const target = e.target as HTMLElement;
+
+ if (target.matches('[data-link]')) {
+ e.preventDefault(); // Sempre prevenir o comportamento padrão
+ const currentUrl: string = window.location.href;
+ const linkUrl: string = (target as HTMLAnchorElement).href;
+
+ if (currentUrl !== linkUrl) {
+ navigateTo(linkUrl);
+ }
+ }
+ });
+
+ router();
+});
+```
+[🔡 Inspiração](https://youtu.be/6BozpmSjk-Y?si=MAOlHY-lut2FtDAE)
-🌈 Demonstração
+✅ Deploy
-Você pode acessar ao resultado final do projeto [clicando aqui](https://micheleambrosio.github.io/hbomax/).
+Você pode acessar ao resultado final do projeto [clicando aqui](https://josealvesdev.github.io/hbomax/).
-💻 Autora
+💻 Autor
-
-
   Michele Queiroz Ambrosio
-    Instagram | GitHub | LinkedIn | Twitch
+
+    Jose Alves
+    Instagram | GitHub | LinkedIn
---
-⌨️ com ❤️ por [Michele Ambrosio](https://github.com/micheleambrosio) 😊
+✔️ Por [Jose Alves](https://github.com/JoseAlvesdev) 🫡