main 0847c1943681 cached
114 files
318.1 KB
84.5k tokens
121 symbols
1 requests
Download .txt
Showing preview only (349K chars total). Download the full file or copy to clipboard to get everything.
Repository: IvinRodrigues/AngularOfLegends
Branch: main
Commit: 0847c1943681
Files: 114
Total size: 318.1 KB

Directory structure:
gitextract_svczxah5/

├── .browserslistrc
├── .editorconfig
├── .gitignore
├── README.md
├── angular.json
├── e2e/
│   ├── protractor.conf.js
│   ├── src/
│   │   ├── app.e2e-spec.ts
│   │   └── app.po.ts
│   └── tsconfig.json
├── karma.conf.js
├── package.json
├── src/
│   ├── app/
│   │   ├── app-routing.module.ts
│   │   ├── app.component.html
│   │   ├── app.component.scss
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   ├── app.module.ts
│   │   ├── layout/
│   │   │   └── main-client-layout/
│   │   │       ├── main-client-layout.component.html
│   │   │       ├── main-client-layout.component.scss
│   │   │       ├── main-client-layout.component.spec.ts
│   │   │       └── main-client-layout.component.ts
│   │   └── modules/
│   │       ├── auth/
│   │       │   ├── auth-routing.module.ts
│   │       │   ├── auth.module.ts
│   │       │   └── login/
│   │       │       ├── login.component.html
│   │       │       ├── login.component.scss
│   │       │       ├── login.component.spec.ts
│   │       │       └── login.component.ts
│   │       └── client/
│   │           ├── background.service.ts
│   │           ├── chat/
│   │           │   ├── chat.component.html
│   │           │   ├── chat.component.scss
│   │           │   ├── chat.component.spec.ts
│   │           │   └── chat.component.ts
│   │           ├── client-routing.module.ts
│   │           ├── client.module.ts
│   │           ├── game/
│   │           │   ├── champion-select/
│   │           │   │   ├── champion-select.component.html
│   │           │   │   ├── champion-select.component.scss
│   │           │   │   ├── champion-select.component.spec.ts
│   │           │   │   └── champion-select.component.ts
│   │           │   ├── game-routing.module.ts
│   │           │   ├── game.module.ts
│   │           │   └── loading/
│   │           │       ├── loading.component.html
│   │           │       ├── loading.component.scss
│   │           │       ├── loading.component.spec.ts
│   │           │       └── loading.component.ts
│   │           ├── home/
│   │           │   ├── home/
│   │           │   │   ├── home.component.html
│   │           │   │   ├── home.component.scss
│   │           │   │   ├── home.component.spec.ts
│   │           │   │   └── home.component.ts
│   │           │   ├── home-routing.module.ts
│   │           │   ├── home.module.ts
│   │           │   ├── overview/
│   │           │   │   ├── overview.component.html
│   │           │   │   ├── overview.component.scss
│   │           │   │   ├── overview.component.spec.ts
│   │           │   │   └── overview.component.ts
│   │           │   └── patch-notes/
│   │           │       ├── patch-notes.component.html
│   │           │       ├── patch-notes.component.scss
│   │           │       ├── patch-notes.component.spec.ts
│   │           │       └── patch-notes.component.ts
│   │           ├── play/
│   │           │   ├── lobby/
│   │           │   │   ├── lobby.component.html
│   │           │   │   ├── lobby.component.scss
│   │           │   │   ├── lobby.component.spec.ts
│   │           │   │   └── lobby.component.ts
│   │           │   ├── play-menu/
│   │           │   │   ├── play-menu.component.html
│   │           │   │   ├── play-menu.component.scss
│   │           │   │   ├── play-menu.component.spec.ts
│   │           │   │   └── play-menu.component.ts
│   │           │   ├── play-routing.module.ts
│   │           │   ├── play.module.ts
│   │           │   └── pvp/
│   │           │       ├── pvp.component.html
│   │           │       ├── pvp.component.scss
│   │           │       ├── pvp.component.spec.ts
│   │           │       └── pvp.component.ts
│   │           ├── play.service.ts
│   │           ├── profile/
│   │           │   ├── match-history/
│   │           │   │   ├── match-history.component.html
│   │           │   │   ├── match-history.component.scss
│   │           │   │   ├── match-history.component.spec.ts
│   │           │   │   └── match-history.component.ts
│   │           │   ├── overview/
│   │           │   │   ├── overview.component.html
│   │           │   │   ├── overview.component.scss
│   │           │   │   ├── overview.component.spec.ts
│   │           │   │   └── overview.component.ts
│   │           │   ├── profile/
│   │           │   │   ├── profile.component.html
│   │           │   │   ├── profile.component.scss
│   │           │   │   ├── profile.component.spec.ts
│   │           │   │   └── profile.component.ts
│   │           │   ├── profile-routing.module.ts
│   │           │   └── profile.module.ts
│   │           └── sound.service.ts
│   ├── assets/
│   │   ├── .gitkeep
│   │   ├── scss/
│   │   │   ├── animations.scss
│   │   │   ├── buttons.scss
│   │   │   └── menu-component.scss
│   │   └── sounds/
│   │       ├── khazix.ogg
│   │       ├── khazix.ogg.sfk
│   │       ├── tf.ogg
│   │       ├── tf.ogg.sfk
│   │       ├── zed.ogg
│   │       └── zed.ogg.sfk
│   ├── data/
│   │   ├── champions.ts
│   │   ├── friends.ts
│   │   ├── items.ts
│   │   ├── player.ts
│   │   └── spells.ts
│   ├── environments/
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.scss
│   └── test.ts
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.spec.json
└── tslint.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .browserslistrc
================================================
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries

# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support

# You can see what browsers were selected by your queries by running:
#   npx browserslist

last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line.
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.


================================================
FILE: .editorconfig
================================================
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false


================================================
FILE: .gitignore
================================================
# See http://help.github.com/ignore-files/ for more about ignoring files.

# compiled output
/dist
/tmp
/out-tsc
# Only exists if Bazel was run
/bazel-out

# dependencies
/node_modules

# profiling files
chrome-profiler-events*.json
speed-measure-plugin*.json

# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*

# misc
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
npm-debug.log
yarn-error.log
testem.log
/typings

# System Files
.DS_Store
Thumbs.db


================================================
FILE: README.md
================================================
![Preview](https://angularoflegends.ivinrodrigues.com/assets/images/preview.png)

# AngularOfLegends

Welcome to the Angular of Legends repository a league of legends client clone made entirely in Angular. Feel free to view or contribute to the project :D

[Live demo](https://angularoflegends.ivinrodrigues.com/) 

## Settings

[Angular CLI](https://github.com/angular/angular-cli) version 10.2.0.


================================================
FILE: angular.json
================================================
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "AngularOfLegends": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/AngularOfLegends",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "aot": true,
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": [
            ]
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "22mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "22kb"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "AngularOfLegends:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "AngularOfLegends:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "AngularOfLegends:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": []
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "tsconfig.app.json",
              "tsconfig.spec.json",
              "e2e/tsconfig.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        },
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "AngularOfLegends:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "AngularOfLegends:serve:production"
            }
          }
        }
      }
    }},
  "defaultProject": "AngularOfLegends"
}


================================================
FILE: e2e/protractor.conf.js
================================================
// @ts-check
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts

const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter');

/**
 * @type { import("protractor").Config }
 */
exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './src/**/*.e2e-spec.ts'
  ],
  capabilities: {
    browserName: 'chrome'
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  onPrepare() {
    require('ts-node').register({
      project: require('path').join(__dirname, './tsconfig.json')
    });
    jasmine.getEnv().addReporter(new SpecReporter({
      spec: {
        displayStacktrace: StacktraceOption.PRETTY
      }
    }));
  }
};

================================================
FILE: e2e/src/app.e2e-spec.ts
================================================
import { AppPage } from './app.po';
import { browser, logging } from 'protractor';

describe('workspace-project App', () => {
  let page: AppPage;

  beforeEach(() => {
    page = new AppPage();
  });

  it('should display welcome message', () => {
    page.navigateTo();
    expect(page.getTitleText()).toEqual('AngularOfLegends app is running!');
  });

  afterEach(async () => {
    // Assert that there are no errors emitted from the browser
    const logs = await browser.manage().logs().get(logging.Type.BROWSER);
    expect(logs).not.toContain(jasmine.objectContaining({
      level: logging.Level.SEVERE,
    } as logging.Entry));
  });
});


================================================
FILE: e2e/src/app.po.ts
================================================
import { browser, by, element } from 'protractor';

export class AppPage {
  navigateTo(): Promise<unknown> {
    return browser.get(browser.baseUrl) as Promise<unknown>;
  }

  getTitleText(): Promise<string> {
    return element(by.css('app-root .content span')).getText() as Promise<string>;
  }
}


================================================
FILE: e2e/tsconfig.json
================================================
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/e2e",
    "module": "commonjs",
    "target": "es2018",
    "types": [
      "jasmine",
      "jasminewd2",
      "node"
    ]
  }
}


================================================
FILE: karma.conf.js
================================================
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, './coverage/AngularOfLegends'),
      reports: ['html', 'lcovonly', 'text-summary'],
      fixWebpackSourcePaths: true
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false,
    restartOnFileChange: true
  });
};


================================================
FILE: package.json
================================================
{
  "name": "angular-of-legends",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~10.2.0",
    "@angular/common": "~10.2.0",
    "@angular/compiler": "~10.2.0",
    "@angular/core": "~10.2.0",
    "@angular/forms": "~10.2.0",
    "@angular/localize": "~10.2.0",
    "@angular/platform-browser": "~10.2.0",
    "@angular/platform-browser-dynamic": "~10.2.0",
    "@angular/router": "~10.2.0",
    "bootstrap": "^4.5.0",
    "rxjs": "~6.6.0",
    "tslib": "^2.0.0",
    "zone.js": "~0.10.2"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1002.0",
    "@angular/cli": "~10.2.0",
    "@angular/compiler-cli": "~10.2.0",
    "@types/node": "^12.11.1",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^6.0.0",
    "jasmine-core": "~3.6.0",
    "jasmine-spec-reporter": "~5.0.0",
    "karma": "~5.0.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~4.0.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "protractor": "~7.0.0",
    "ts-node": "~8.3.0",
    "tslint": "~6.1.0",
    "typescript": "~4.0.2"
  }
}


================================================
FILE: src/app/app-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [

  { path: '', loadChildren: () => import('./modules/auth/auth.module').then(m => m.AuthModule)},
  { path: 'client', loadChildren: () => import('./modules/client/client.module').then(m => m.ClientModule) }

];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }


================================================
FILE: src/app/app.component.html
================================================
<div class="warning">

    <img src="https://vignette.wikia.nocookie.net/leagueoflegends/images/e/e3/Despair_Emote.png/revision/latest?cb=20171120231702">

    <h1>Sorry</h1>

    <p>Angular of Legends doesn't work very well at resolutions smaller than 1.000px.<br>
        I'm working to resolve this as soon as possible :D</p>

</div>

<router-outlet></router-outlet>

================================================
FILE: src/app/app.component.scss
================================================
.warning {

    background-color: black;
    width: 100vw;
    height: 100vh;
    position: fixed;
    top: 0;
    left: 0;
    display: none;
    z-index: 50;
    justify-content: center;
    align-items: center;
    color: white;

    h1 {

        color: white;
        font-size: 2rem;
        text-transform: uppercase;
        font-weight: bold;
        margin-top: 2rem;

    }

    p {

        font-family: 'Roboto', sans-serif;
        color: white;
        font-size: 1rem;
        margin-top: 1rem;
        text-align: center;

    }

}

@media only screen and (max-width: 1000px) {

    .warning {

        display: flex;
        flex-direction: column;
        overflow: auto;

    }

}

================================================
FILE: src/app/app.component.spec.ts
================================================
import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';

describe('AppComponent', () => {
  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ],
      declarations: [
        AppComponent
      ],
    }).compileComponents();
  });

  it('should create the app', () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.componentInstance;
    expect(app).toBeTruthy();
  });

  it(`should have as title 'AngularOfLegends'`, () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.componentInstance;
    expect(app.title).toEqual('AngularOfLegends');
  });

  it('should render title', () => {
    const fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    const compiled = fixture.nativeElement;
    expect(compiled.querySelector('.content span').textContent).toContain('AngularOfLegends app is running!');
  });
});


================================================
FILE: src/app/app.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'AngularOfLegends';
}


================================================
FILE: src/app/app.module.ts
================================================
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }


================================================
FILE: src/app/layout/main-client-layout/main-client-layout.component.html
================================================
<div [ngClass]="{'background-client-queue': inQueue}" id="backgroundClient"></div>

<video [ngClass]="{'video-background-visible': inQueue}" class="video-background" autoplay loop muted>
    <source src="./../../../assets/videos/lobby/particles.mp4" type="video/mp4">
</video>

<div id="matchFound" [ngClass]="{'match-accepted': matchAccepted}" class="match-found">
    
    <div class="external-circle">
        <div class="internal-circle">
            <div class="progress-circle">
                <div class="match-informations">
                    <img src="./assets/images/play-icons/sr-enabled.png">
                    <span *ngIf="!matchAccepted && !matchDeclined" class="match-announcement">Match found</span>
                    <span *ngIf="!matchAccepted && !matchDeclined" class="match-description">Summoner's Rift - Featured - 5v5</span>
                    <span *ngIf="matchAccepted" class="match-announcement">Match accepted</span>
                    <span *ngIf="matchAccepted" class="match-description">Waiting other players</span>
                </div>
            </div>
            <span id="progressBar" class="bar"></span>
        </div>
        <span (click)="acceptMatch()" class="accept-button">
            <span>Accept!</span>
            <img src="./assets/images/match-found/accept-button.png">
        </span>
        <button (click)="cancelMatch()" class="decline-button">Decline</button>
    </div>

</div>

<span class="main-layout-horizontal-line"></span>

<header class="main-header">

    <nav>

        <ul>

            <li class="button-play-wrapper" (mouseenter)="playSound('playButtonHover')" (click)="playSound('playButtonClick')" routerLink="play" > 
                
                <img class="play-button-shape" src="../../assets/images/play-button/play-button-shape.png">
                <img class="play-button-click-area" src="../../assets/images/play-button/play-button-click-area.png">
                <span class="play-button-text">Play</span>
            
            </li>
            <li routerLink="home" routerLinkActive="item-background-active" class="item-background-hover"> <a (click)="playSound('menuClick')" class="item-link-formated">Home</a> </li>
            <li class="item-background-hover"> <a class="item-link-formated item-desabled">Tft</a> </li>
            <li class="item-background-hover"> <a class="item-link-formated item-desabled">Clash</a> </li>


        </ul>

        <ul class="right-list">

            <li class="item-background-hover" routerLink="profile" routerLinkActive="item-background-active">  <a> <img (click)="playSound('menuClick')" src="../../assets/images/header-icons/profile.png"> </a> </li>
            <li class="item-background-hover"> <a class="item-desabled"> <img src="../../assets/images/header-icons/collection.png"> </a> </li>
            <li class="item-background-hover"> <a class="item-desabled"> <img src="../../assets/images/header-icons/booty.png"> </a> </li>
            <li class="item-background-hover"> <a class="item-desabled"> <img src="../../assets/images/header-icons/shop.png"> </a> </li>
            <li> <img class="divider" src="../../assets/images/header-icons/divider.png"> </li>
            <li class="money">
            
               <div class="riot-points">

                <img src="../../assets/images/header-icons/riot-points.png">
                <span>88</span>

               </div> 
            
               <div class="blue-essence">

                <img src="../../assets/images/header-icons/blue-essence.png">
                <span>2528</span>

               </div> 

            </li>

        </ul>

    </nav>

</header>

<aside class="main-aside">

    <div class="user-information">

        <img src="../../assets/images/aside-icons/avatar-wrapper.png">
        <img class="profile-image" src="{{ player.picture }}">
        <span class="user-level">287</span>

        <div class="user-wrapper">

            <span class="user-nickname truncate">{{ player.name }}</span>

            <div class="user-status">

                <span class="user-status-circle" [ngClass]="{'user-status-circle-afk': onlineStatus == false}" (click)="changeOnlineStatus()"></span>
                <span class="user-status-message truncate" [ngClass]="{'user-status-message-afk': onlineStatus == false}">"status"</span>

            </div>

        </div>

    </div>

    <div id="playInformations" class="play-informations">

        <div id="lobbyPreview" class="lobby">

            <header>
                <img class="friend-icon" src="./assets/images/lobby/friend-icon.png">
                <span class="party-status">Closed party</span>
            </header>

            <img class="mini-sr" src="./assets/images/lobby/mini-sr.png">

            <div class="players">
                <img class="active" src="./assets/images/lobby/single-friend-icon.png">
                <img src="./assets/images/lobby/single-friend-icon.png">
            </div>

            <span class="queue-type">Ranked Solo/Duo</span>

        </div>

        <div id="queuePreview" class="queue">

            <header>
                <span (click)="cancelQueue()" class="close">x</span>
                <span class="queue-message">Finding match</span>
            </header>

            <img class="mini-sr" src="./assets/images/lobby/mini-sr.png">

            <div class="time">{{queueTimeMinutes}}:0{{queueTimeSeconds}}</div>

            <span class="queue-type">Estimated 1:20</span>

        </div>

    </div>

    <div id="menuAside" class="menu-aside">

        <span>Social</span>
        <div class="menu-aside-icons-wrapper">

            <img src="../../assets/images/aside-icons/add-friend.png">
            <img src="../../assets/images/aside-icons/add-folder.png">
            <img src="../../assets/images/aside-icons/options.png">
            <img src="../../assets/images/aside-icons/search.png">

        </div>
    
    </div>

    <div class="friend-list">

        <div (scroll)="ajustPopoversPosition()" id="scrollableArea" [ngClass]="{'scrollable-area-lobby': inLobby}" class="scrollable-area">

            <div class="group-area">

                <ul>

                    <li> 
                    
                        <img src="../../assets/images/aside-icons/main-group-flag.png">
                        <div class="group-information-wrapper">
                            <span class="group-abreviation">XXXX</span>
                            <span class="group-name truncate">Group Name</span>
                        </div>
                    
                    </li>

                    <li> 
                    
                        <img src="../../assets/images/aside-icons/group-flag.png">
                        <div class="group-information-wrapper">
                            <span class="group-abreviation">XXXX</span>
                            <span class="group-name truncate">Group Name</span>
                        </div>
                    
                    </li>

                    <li> 
                    
                        <img src="../../assets/images/aside-icons/group-flag.png">
                        <div class="group-information-wrapper">
                            <span class="group-abreviation">XXXX</span>
                            <span class="group-name truncate">Group Name</span>
                        </div>
                    
                    </li>

                </ul>

            </div>

            <div class="friends-agroupment">

                <ul>

                    <div *ngFor="let friend of friends" id="popover{{friend.id}}" class="friend-popover" style="background-image: url({{friend.profileBackground}})">

                        <div  class="popover-information">

                            <div class="popover-profile-image-wrapper">
                                <img src="./../../../assets/images/aside-icons/platina.png" class="popover-rank-image">
                                <img src="{{ friend.profilePicture }}" class="popover-profile-image">
                                <span [ngClass]="{'one': friend.rankTier == 'I', 'two': friend.rankTier == 'II', 'three': friend.rankTier == 'III', 'four': friend.rankTier == 'IV' }" class="tier">{{ friend.rankTier }}</span>
                            </div>

                            <div class="popover-friend-informations">

                                <span class="popover-friend-name">{{ friend.name }}</span>
                                <span class="popover-friend-group-abreviation">Group</span>

                                <span class="popover-friend-server-information">{{ friend.name }} #BR1</span>

                                <span class="popover-friend-rank">{{ friend.rank }}{{ friend.rankTier }} (Solo/Duo)</span>

                            </div>

                            <div class="popover-status">

                                <span>

                                    <div class="friend-status-circle friend-status-circle-queue"></div>

                                    <p>( Ranked )</p>

                                    <p class="time">20:00</p>

                                </span>
                                <span>

                                    <img src="./../../../assets/images/aside-icons/status-message.png">

                                    <p>"Status message"</p>

                                </span>

                            </div>

                        </div>

                    </div>

                    <li (click)="changeGeralVisibility()">General (9/{{allFriends}})</li>
                    <ul [ngClass]="{'friends-sublist-open': geral == true}" class="friends-sublist">

                        <li *ngFor="let friend of friends; let i = index" id='friend{{friend.id}}'  (click)="changeChatVisibility(friend)" (mouseenter)="showPopover(friend.id)" (mouseleave)="hidePopover(friend.id)" >

                            <span *ngIf="i == friends.length - 1">{{ ajustPopoversPosition() }}</span>

                            <div class="friend-profile-image-border">
                                <img src="{{friend.profilePicture}}" class="friend-profile-image">
                            </div>
                            <div [ngClass]="{'friend-status-circle-offline': friend.status == 1, 'friend-status-circle-queue': friend.status == 2,  'friend-status-circle-afk': friend.status == 3}" class="friend-status-circle"></div>

                            <div class="friend-informations">

                                <span class="friend-name truncate">{{ friend.name }}</span>
                                <span [ngClass]="{'friend-status-offline': friend.status == 1, 'friend-status-queue': friend.status == 2,  'friend-status-afk': friend.status == 3}" class="friend-status truncate">
                                    {{ friend.statusMessage }}
                                </span>

                            </div>

                        </li>

                    </ul>

                </ul>

            </div>

        </div>

        <footer>

            <img (click)="changeChatVisibility()" src="../../assets/images/aside-icons/chat.png">
            <img src="../../assets/images/aside-icons/missions.png">
            <img src="../../assets/images/aside-icons/voice.png">
            <span class="client-version">V 1.0</span>
            <img (click)="changeBugModalVisibility()" class="bug" src="../../assets/images/aside-icons/bug.png">

        </footer>

    </div>

</aside>

<main id="main-content" class="main-content">

    <router-outlet></router-outlet>

</main>

<app-chat [ngClass]="{'chat-open': chat}" [currentChat]="currentChat"></app-chat>

<div [ngClass]="{'modal-visible': bugModal}" class="modal">

    <div class="image-wrapper">
        <img class="khazix" src="https://external-preview.redd.it/wriDatZOwSGRrWQs0c0qQpF1-FdPVZvLKtf6L5OIBGQ.png?auto=webp&s=05ee4c1c9520b4650aeea95151a6fd4a660485ac">
        <img class="slipper" src="./../../../assets//images/aside-icons/slipper.png">
    </div>

    <h1>Found a <b>Kha'Zix?</b></h1>
    <h2><a href="https://www.linkedin.com/in/ivin-rodrigues-a49113187/" target="_blank">Contact me </a>  or  <a href="https://github.com/IvinRodrigues/AngularOfLegends" target="_blank">create a pull request</a></h2>

    <button (click)="changeBugModalVisibility()">Close</button>

</div>

================================================
FILE: src/app/layout/main-client-layout/main-client-layout.component.scss
================================================
#backgroundClient {

    background-repeat: no-repeat;
    background-size: cover;
    background-position: top;
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    z-index: 0;
    transition-duration: .5s;
    opacity: .6;

}

.background-client-queue {

    opacity: .2 !important;

}

.video-background {

    position: fixed;
    height: 100vh;
    width: 100vw;
    object-fit: cover;
    opacity: 0;
    transition-duration: .5s;

}

.video-background-visible {

    opacity: .05;

}



.scrollable-area-lobby {

    height: calc(100vh - 315px) !important;

}

.match-found-visible {

    opacity: 1 !important;
    z-index: 6 !important;
    transform: scale(1) !important;

    .progress-circle {

        animation: Shine 2s infinite;

        @keyframes Shine {
        
            0% {
    
                filter: brightness(100%);
    
            }
            50% {
    
                filter: brightness(120%);
    
            }
            100% {
    
                filter: brightness(100%);
    
            }
    
        }

    }

}

.match-accepted {

    .bar {

        transform: translateY(-680px) scale(1.2);

    }

    .external-circle {

        animation-name: AcceptAnimation;
        animation-duration: .5s;

    }

    .progress-circle {

        filter: brightness(200%);
        animation-name: None !important;

    }

    .accept-button {

        img {

            filter: grayscale(100%) !important;
            cursor: default !important;

            &:hover {

                transform: scale(1) !important;

            }

        }

    }

    .decline-button {

        cursor: default !important;

    }

    @keyframes AcceptAnimation {
        
        0% {

            transform: scale(1)

        }
        50% {

            transform: scale(1.2)

        }
        100% {

            transform: scale(1)

        }

    }

}

.match-found {

    width: 100vw;
    height: 100vh;
    background-color: rgba(0, 0, 0, 0.39);
    backdrop-filter: blur(12px);
    position: fixed;
    top: 0;
    left: 0;
    z-index: 10;
    align-items: center;
    justify-content: center;
    display: flex;
    transition-duration: .2s;
    transform: scale(3) rotate(-30deg);
    z-index: -1;
    opacity: 0;

    .external-circle {

        width: 780px;
        height: 780px;
        background-color: transparent;
        border: 3px solid #71582a;
        border-radius: 50%;
        position: relative;

        .internal-circle {
    
            width: 640px;
            height: 640px;
            margin: calc(50% - 320px) auto;
            border: 3px solid #71582a;
            border-radius: 50%;
            overflow: hidden;

            .bar {

                width: 100%;
                height: 100%;
                background: #4cd7eb;
                background: linear-gradient(0deg, #4cd7eb 80%, transparent 100%);
                display: block;
                animation-duration: 20s;
                transition-duration: 1s;
                position: relative;
                z-index: 2;

            }

            @keyframes ProgressBar {
                
                0% {

                    transform: translateY(-670px);

                }
                100% {

                    transform: translateY(0);

                }

            }

            .progress-circle {
  
                width: 580px;
                height: 580px;
                margin: calc(50% - 292px) auto;
                background-color: transparent;
                background-image: url('https://images2.alphacoders.com/913/thumb-1920-913622.jpg');
                background-size: cover;
                background-position: center;
                border: 3px solid #71582a;
                border-radius: 50%;
                position: relative;
                z-index: 3;
                overflow: hidden;

                .match-informations {

                    width: 580px;
                    height: 580px;
                    background-color: #00000085;
                    text-align: center;

                    img {

                        margin-top: 160px;

                    }

                    .match-announcement {

                        color: #f0e6d2;
                        font-size: 2rem;
                        text-transform: uppercase;
                        font-weight: bold;
                        background: transparent;
                        padding-top: 1rem;
                        letter-spacing: 2px;
                        display: block;

                    }

                    .match-description {

                        font-family: 'Roboto', sans-serif;
                        color: #918874;
                        padding-top: 12px;
                        letter-spacing: 1px;
                        display: block;

                    }

                }

            }
    
        }

        .accept-button {

            display: flex;
            justify-content: center;
            position: absolute;
            top: 650px;
            left: calc(50% - 138px);
            z-index: 6;
            transition-duration: .2s;
            cursor: pointer;

            img {
                
                transition-duration: .2s;

            }

            span {

                color: #f0e6d2;
                font-size: 1.4rem;
                text-transform: uppercase;
                font-weight: bold;
                background: transparent;
                letter-spacing: 2px;
                position: absolute;
                top: 28px;
                z-index: 7;

            }

            &:hover {

                transform: scale(1.05);

                img {

                    filter: brightness(150%);

                }

            }
    
        }

        .decline-button {

            font-family: FrizQuadrata;
            color: #f0e6d2;
            font-size: 1.2rem;
            text-transform: uppercase;
            font-weight: bold;
            background: transparent;
            letter-spacing: 1px;
            padding: 0.6rem 3rem;
            border: 2px solid #c8aa6d;
            background-color: #1e2328;
            position: absolute;
            top: 750px;
            left: calc(50% - 93.5px);
            z-index: 6;
            cursor: pointer;
    
        }

    }

}

.main-layout-horizontal-line {

    display: block;
    width: 100%;
    height: 1px;
    background-color: #ffffff54;
    position: absolute;
    top: 104px;
    z-index: 5;

}

.main-header {

    width: calc(100% - 280px);
    height: 100px;
    background-color: transparent;
    z-index: 4;
    position: fixed;

    nav {

        background-color: #010a13bb;

        ul {

            display: inline-block;

            .button-play-wrapper:hover {

                cursor: pointer;

                .play-button-click-area {

                    filter: brightness(150%);
                    transition-duration: .2s;

                }

            }

            li {

                display: inline-block;
                position: relative;

                .play-button-shape {

                    margin: 0 2.2rem;
                    position: relative;
                    top: 20px;

                }

                .play-button-click-area {
                
                    position: absolute;
                    top: 26px;
                    left: 78px;
                    transition-duration: .2s;


                }

                .play-button-text {

                    text-transform: uppercase;
                    color: #f0e6d2;
                    font-weight: bold;
                    letter-spacing: 1px;
                    position: absolute;
                    left: 130px;
                    top: 38px;
                    cursor: pointer;

                }

                .item-link-formated {

                    color: #beb088;
                    text-transform: uppercase;
                    font-weight: bold;
                    background: transparent;
                    letter-spacing: 1px;
                    padding: 44.5px 1.5rem;
                    display: block;
                    transition-duration: .2s;

                    &:hover {

                        color: #f0e6d2;
                        transition-duration: .2s;

                    }

                }

            }

        }

        .right-list {

            text-align: right;
            position: absolute;
            right: 0;

            .item-background-hover {

                img {

                    padding: 38px 1.5rem;
                    transition-duration: .2s;

                    &:hover {

                        filter: brightness(150%);

                    }

                }

            }

            .money {

                color: #f0e6d2;
                letter-spacing: 2px;
                font-weight: bold;
                position: relative;
                top: -28px;
                text-align: left;
                margin-right: 3rem;

                .blue-essence {

                    padding: .5rem 0;

                }

                img {

                    display: inline-block;
                    margin-right: 6px;
                    transform: translateY(2px);

                }
                
            }

            .divider {

                display: block;
                width: 2px;
                height: 60px;
                margin: 0 2.2rem 1.1rem 1rem;

            }

        }

    }

}

.main-aside {

    width: 280px;
    background-color: #010a13bb;
    position: fixed;
    right: 0;
    top: 0;
    z-index: 2;

    .user-information {

        color: #f0e6d2;
        position: relative;

        img { 

            margin: .6rem .5rem;
            display: inline-block;
            cursor: pointer;
            transition-duration: .2s;
            position: relative;
            z-index: 2;

            &:hover {

                filter: brightness(125%);
                transition-duration: .2s;

            }

        }

        .profile-image {

            width: 76px;
            position: absolute;
            left: 0;
            border-radius: 50%;
            z-index: 1;

        }

        .user-level {

            color: #a09b8c;
            font-size: 14px;
            position: absolute;
            left: 33.5px;
            top: 74px;
            z-index: 3;

        }

        .user-nickname {

            display: block;
            font-size: 18px;
            letter-spacing: 1px;
            padding: 2rem 0 0 .2rem;

        }

        .user-wrapper {

            width: 173px;
            display: inline-block;
            height: 105px;
            vertical-align: bottom;
            margin-left: .2rem;

        }

        .user-status { 
            
            font-family: 'Roboto', sans-serif;
            display: block;
            margin-top: .5rem;

        }

        .user-status-message {

            width: calc(100% - 20px);
            display: inline-block;
            color: #09a646;
            vertical-align: middle;
            padding-left: 6px;

        }

        .user-status-message-afk {

            color: #beb088;

        }

        .user-status-circle {

            display: inline-block;
            width: 10px;
            height: 10px;
            border: solid 2px;
            border-color: #66f8a0;
            background-color: #09a646;
            border-radius: 300px;
            vertical-align: middle;
            cursor: pointer;

        }

        .user-status-circle-afk {

            border-color: #9c3213;
            background-color: transparent;

        }

    }

    .play-informations {

        position: absolute;
        width: 280px;
        right: -280px;
        z-index: 2;
        transition-duration: .2s;
        background: linear-gradient(216deg, #113351, #174670, #126aae);
        background-size: 600% 600%;
        overflow: hidden;
                
        -webkit-animation: BackgroundAnimation 5s ease infinite;
        -moz-animation: BackgroundAnimation 5s ease infinite;
        -o-animation: BackgroundAnimation 5s ease infinite;
        animation: BackgroundAnimation 5s ease infinite;
    
        @-webkit-keyframes BackgroundAnimation {
            0%{background-position:78% 0%}
            50%{background-position:23% 100%}
            100%{background-position:78% 0%}
        }
        @-moz-keyframes BackgroundAnimation {
            0%{background-position:78% 0%}
            50%{background-position:23% 100%}
            100%{background-position:78% 0%}
        }
        @-o-keyframes BackgroundAnimation {
            0%{background-position:78% 0%}
            50%{background-position:23% 100%}
            100%{background-position:78% 0%}
        }
        @keyframes BackgroundAnimation {
            0%{background-position:78% 0%}
            50%{background-position:23% 100%}
            100%{background-position:78% 0%}
        }

        .lobby {

            width: 248px;
            padding: 1rem 1rem 1.4rem 1rem;
            position: relative;
            transition-duration: .2s;

            header {

                display: block;

            }

            .friend-icon {

                transform: translateY(2px);

            }

            .party-status {

                color: #a39e8f;
                text-transform: uppercase;
                font-weight: bold;
                font-size: 14px;
                letter-spacing: 2px;
                margin-left: 6px;

            }

            .mini-sr {

                padding-top: 14px;
                padding-right: 12px;
                display: inline-block;

            }

            .players {

                padding: 1rem 0;
                display: inline-block;
                position: absolute;
                top: 32px;

                .active {
    
                    opacity: 1;
    
                }

                img {

                    width: 16px;
                    margin: 0 4px;
                    opacity: .6;

                }

            }

            .queue-type {

                font-family: 'Roboto', sans-serif;
                color: #beb088;
                display: block;
                padding-left: 42px;
                position: absolute;
                top: 78px;
                left: 30px;

            }

        }

        .queue {

            width: 248px;
            padding: 1rem 1rem 1.4rem 1rem;
            position: absolute;
            top: 0;
            right: -284px;
            transition-duration: .2s;

            header {

                display: block;

                .close {

                    color: #beb088;
                    font-size: 26px;
                    float: right;
                    transition-duration: .2s;
                    cursor: pointer;

                    &:hover {

                        color: #e4dbc8;

                    }

                }

            }

            .queue-message {

                color: #a39e8f;
                text-transform: uppercase;
                font-weight: bold;
                font-size: 14px;
                letter-spacing: 2px;
                margin-left: 6px;

            }

            .mini-sr {

                padding-top: 14px;
                padding-right: 12px;
                display: inline-block;

            }

            .time {

                font-family: 'Roboto', sans-serif;
                font-size: 40px;
                font-weight: bold;
                color: #e4dbc8;
                padding: 1rem 0;
                display: inline-block;
                position: absolute;
                top: 22px;
            }

            .queue-type {

                font-family: 'Roboto', sans-serif;
                color: #0ac5e1;
                display: block;
                padding-left: 42px;
                position: absolute;
                top: 80px;
                left: 30px;

            }

        }

    }

    .menu-aside {

        text-transform: uppercase;
        color: #e4dbc8;
        padding: .6rem;
        font-weight: bold;
        letter-spacing: 2px;
        transition-duration: .2s;

        span {

            width: 69px;
            display: inline-block;
            vertical-align: middle;

        }

        .menu-aside-icons-wrapper {
            
            display: inline-block;
            width: calc(100% - 69px);
            text-align: right;

            img {

                padding-left: .8rem;
                transition-duration: .2s;
                cursor: pointer;

                &:hover {

                    filter: brightness(150%);
                    transition-duration: .2s;

                }

            }

        }

    }

    .scrollable-area {

        overflow: auto;
        height: calc(100vh - 200px);
        padding-bottom: 8px;
        transition-duration: .2s;

        .group-area {

            ul {

                li {

                    padding: .8rem 0 .8rem .6rem;
                    transition-duration: .2s;
                    cursor: pointer;

                    &:hover {

                        background-color: #192026;
                        transition-duration: .2s;

                    }

                    img { display: inline-block;
                        vertical-align: middle; }

                    .group-information-wrapper {
                        
                        display: inline-block;

                        .group-abreviation {

                            color: #aa9261;
                            padding-left: .8rem;
                            height: 46px;
                            vertical-align: middle;

                        }

                        .group-name {

                            padding-left: .4rem;
                            color: #e4dbc8;
                            height: 46px;
                            vertical-align: middle;

                        }
                        
                    }

                }

            }

        }

        .friends-agroupment {

            .friend-popover {
    
                background-repeat: no-repeat;
                background-position: center;
                background-size: cover;
                width: 480px;
                height: 260px;
                position: absolute;
                left: -508px;
                transition-duration: .2s;
                display: none;

                &::after {

                    content: '';
                    background-image: url(./../../../assets/images/aside-icons/popover-wrapper.png);
                    background-repeat: no-repeat;
                    background-size: cover;
                    width: 494px;
                    height: 285px;
                    display: block;
                    position: absolute;
                    right: -14px;
                    top: 0;
                    z-index: 2;

                }

                .popover-information {

                    background-color: #010a13;
                    width: 100%;
                    height: 162px;
                    margin-top: 120px;

                    .popover-profile-image-wrapper {

                        display: inline-block;

                        .popover-rank-image {

                            position: absolute;
                            top: 48px;
                            left: 20px;
                            z-index: 2;

                        }

                        .popover-profile-image {

                            width: 90px;
                            border-radius: 300px;
                            position: relative;
                            top: -20px;
                            margin-left: 3.7rem;
                            z-index: 1;

                        }

                        .tier {

                            color: white;
                            text-align: center;
                            position: absolute;
                            bottom: 55px;
                            z-index: 2;

                        }

                        .one {

                            left: 101px !important;

                        }

                        .two {

                            left: 99px;

                        }

                        .three {

                            left: 97px;

                        }

                        .four {

                            left: 96px;

                        }

                    }

                    .popover-friend-informations {

                        font-family: 'Roboto', sans-serif;
                        display: inline-block;
                        padding: 1rem;
                        position: relative;
                        top: -20px;
                        left: 50px;

                        .popover-friend-name {

                            display: inline-block;
                            color: white;
                            font-weight: bold;
                            font-size: 20px;
                            letter-spacing: 1.5px;

                        }

                        .popover-friend-group-abreviation {

                            font-family: 'Roboto', sans-serif;
                            display: inline-block;
                            color: #c8aa6e;
                            font-size: 14px;
                            text-transform: uppercase;
                            margin-left: 4px;

                        }

                    }

                    .popover-friend-server-information {

                        font-family: 'Roboto', sans-serif;
                        display: block;
                        color: #ffffff2e;
                        font-size: 14px;
                        letter-spacing: 1px;
                        margin-top: 7px;
                        

                    }

                    .popover-friend-rank {

                        font-family: 'Roboto', sans-serif;
                        display: block;
                        color: #ffffff9f;
                        font-weight: bold;
                        font-size: 12px;
                        letter-spacing: 1.5px;
                        margin-top: 6px;

                    }

                    .popover-status {

                        font-family: 'Roboto', sans-serif;
                        border-top: 1px solid #ffffff3d;

                        span {

                            font-family: 'Roboto', sans-serif;
                            display: block;
                            padding: 9px 24px 0 32px;
                            color: #0ac5e1;
                            font-size: 14px;

                            .friend-status-circle {

                                position: absolute;
                                left: 1rem;

                            }

                            span, p {

                                display: inline-block;

                            }

                            p {

                                margin-left: 8px;

                            }

                            .time {

                                float: right;

                            }

                        }

                        span:nth-child(2) {

                            padding-left: 16px !important;
                            color: #a09b8c;

                        }

                    }

                }

            }

            ul {

                li {

                    color: #e4dbc8;
                    text-transform: uppercase;
                    letter-spacing: 2px;
                    font-size: 14px;
                    font-weight: bold;
                    padding: .6rem;
                    transition-duration: .2s;
                    cursor: pointer;

                    &:hover {

                        background-color: #192026;
                        transition-duration: .2s;

                    }

                }

                .friends-sublist {

                    display: none;
                    position: relative;

                    .friend-status-circle {

                        position: absolute;
                        transform: translate(28px, -15px);

                    }

                    .friend-profile-image-border {

                        width: 42px;
                        height: 42px;
                        background: rgb(106,80,40);
                        background: -moz-linear-gradient(0deg, rgba(106,80,40,1) 0%, rgba(190,156,87,1) 100%);
                        background: -webkit-linear-gradient(0deg, rgba(106,80,40,1) 0%, rgba(190,156,87,1) 100%);
                        background: linear-gradient(0deg, rgba(106,80,40,1) 0%, rgba(190,156,87,1) 100%);
                        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#6a5028",endColorstr="#be9c57",GradientType=1);
                        border-radius: 300px;
                        display: inline-block;
                        margin-right: .8rem;
                        vertical-align: middle;
                        position: relative;

                        .friend-profile-image {

                            position: absolute;
                            width: 38px;
                            height: 38px;
                            border-radius: 300px;
                            left: 2px;
                            top: 2px;

                        }

                    }

                    .friend-informations {

                        display: inline-block;
                        width: calc(100% - 56px);
                        height: 42px;
                        vertical-align: middle;

                        .friend-name, .friend-status {

                            font-weight: normal;
                            display: block;
                            text-transform: initial;
                            letter-spacing: 0px;

                        }

                        .friend-name {

                            font-size: 18px;
                            color: #e4dbc883;

                        }

                        .friend-status {

                            margin-top: .5rem;
                            color: #09a646;

                        }

                        .friend-status-queue {

                            color: #0ac5e1 !important;

                        }

                        .friend-status-afk {

                            color: #e4dbc883 !important;

                        }

                        .friend-status-offline {

                            color: #e4dbc883 !important;

                        }

                        &:hover {

                            .friend-name {

                                color: #e4dbc8 !important;

                            }

                        }

                    }

                }

                .friends-sublist-open {

                    display: initial;

                }

            }

        }

    }

    footer {

        height: 47px;
        width: 99%;
        border: solid 1px #1e282d;

        img {

            width: 20px;
            padding: .8rem;
            background-color: #1e2328;
            transition-duration: .2s;
            border: solid 1px #c8a96b;
            cursor: pointer;

            &:hover {

                filter: brightness(150%);
                transition-duration: .2s;

            }

        }

        .bug {

            float: right;

        }

        .client-version {

            width: 86px;
            height: 50px;
            font-size: 14px;
            color: #34353b;
            vertical-align: middle;
            display: inline-block;
            font-weight: bold;
            text-align: center;

        }

    }

}

.truncate {

    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;

}

.item-background-active {

    background: rgb(235,235,244);
    background: -moz-linear-gradient(0deg, rgba(235,235,244,0.13489145658263302) 0%, rgba(255,255,255,0) 70%);
    background: -webkit-linear-gradient(0deg, rgba(235,235,244,0.13489145658263302) 0%, rgba(255,255,255,0) 70%);
    background: linear-gradient(0deg, rgba(235,235,244,0.13489145658263302) 0%, rgba(255,255,255,0) 70%);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ebebf4",endColorstr="#ffffff",GradientType=1);
    cursor: pointer;
    transition-duration: .2s;

    a {

        color: #f0e6d2 !important;

    }

}

.item-background-hover:hover {

    background: rgb(235,235,244);
    background: -moz-linear-gradient(0deg, rgba(235,235,244,0.13489145658263302) 0%, rgba(255,255,255,0) 70%);
    background: -webkit-linear-gradient(0deg, rgba(235,235,244,0.13489145658263302) 0%, rgba(255,255,255,0) 70%);
    background: linear-gradient(0deg, rgba(235,235,244,0.13489145658263302) 0%, rgba(255,255,255,0) 70%);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ebebf4",endColorstr="#ffffff",GradientType=1);
    cursor: pointer;
    transition-duration: .2s;
    
}

.friend-status-circle {

    width: 6px;
    height: 6px;
    border-color: #66f8a0;
    background-color: #09a646;
    border: solid 4px;
    border-radius: 300px;

}

.friend-status-circle-queue {

    border-color: #0ac5e1 !important;
    background-color: #005176 !important;

}

.friend-status-circle-afk {

    border-color: #9c3213;
    background-color: #010a13 !important;

}

.friend-status-circle-offline {

    border-color: #4f514f !important;
    background-color: #010a13 !important;

}

.main-content {

    height: 100vh;
    width: calc(100% - 344px);
    overflow-x: auto;
    background-repeat: no-repeat;
    background-size: cover;
    background-blend-mode: color;
    padding: 0 2rem;
    position: relative;
    z-index: 0;

}

app-chat {

    position: fixed;
    bottom: -600px;
    right: 280px;
    z-index: 2;
    transition-duration: .2s;

}

.chat-open {

    bottom: 0;

}

.item-desabled {

    cursor: not-allowed;
    filter: grayscale(100%);
    opacity: .4;

}


.modal-visible {

    opacity: 1 !important;
    z-index: 12 !important;

}


.modal {

    color: white;
    background-color: #030619d4;
    width: 60%;
    height: 60%;
    position: fixed;
    top: 20%;
    left: 20%;
    z-index: 10;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    border: 2px solid #c7974a80;
    border-radius: 16px;
    box-sizing: border-box;
    backdrop-filter: blur(12px);
    opacity: 0;
    z-index: -2;
    transition-duration: .5s;
    overflow: auto;

    .image-wrapper {

        position: relative;

        .slipper {

            position: absolute;
            width: 85px;
            animation: Slap 2s infinite;

            @keyframes Slap {
                0% {

                    left: 16px;
                    top: 56px;
                    transform: scale(.9) rotate(0deg);
                    filter: blur(0);

                }
                83% {

                    filter: blur(0);

                }
                84% {

                    filter: blur(4px);

                }
                85% {

                    top: -24px;
                    left: -24px;
                    transform: scale(1.4) rotate(-45deg);

                }
                98% {

                    filter: blur(4px);

                }
                100% {

                    left: 16px;
                    top: 56px;
                    transform: scale(.9) rotate(0deg);
                    filter: blur(0);

                }
            }

        }

        .khazix {

            width: 140px;
            margin-top: 20px !important;
            margin-bottom: 2rem;
            animation: DieCockroach 2s infinite;

            @keyframes DieCockroach {
                0% {

                    transform: scale(1) translate(0);

                }
                94% {

                    transform: scale(1) translate(0);

                }
                95% {

                    transform: scale(1) translate(4px, -4px);
                    -webkit-filter: none;
                    filter: none;

                }
                94% {

                    transform: scale(1.1) translate(-4px, 4px);

                }
                95% {

                    transform: scale(1) translate(-4px, 4px);

                }
                96% {

                    transform: scale(.9) translate(-4px, 8px);

                }
                97% {

                    transform: scale(1) translate(8px, -4px);

                }
                98% {

                    transform: scale(1.1) translate(-4px, 4px);

                }
                99% {

                    transform: scale(1) translate(0);
                    -webkit-filter: invert(40%) grayscale(100%) brightness(100%) sepia(100%) hue-rotate(-50deg) saturate(400%) contrast(2);
                    filter: grayscale(100%) brightness(100%) sepia(100%) hue-rotate(-50deg) saturate(600%) contrast(0.8);

                }
                100% {

                    transform: scale(1) translate(0);

                }
            }

        }

    }

    h1 {

        color: white;
        font-size: 2rem;
        text-transform: uppercase;
        font-weight: bold;

        b {

            color: #fd0352;

        }

    }

    h2 {

        font-size: 1.2rem;
        margin: 1rem 0;

        a {

            color: #0acbe6;
            text-decoration: none;

        }

    }

    p {

        font-family: 'Roboto', sans-serif;
        font-size: 1.2rem;
        line-height: 1.8rem;
        width: 500px;
        margin-top: 2rem;
        text-align: justify;

        b {

            color: #fd0352;
            font-weight: bold;

        }

    }

    button {

        color: #ffffff80;
        background-color: #fd035207;
        font-size: 1.2rem;
        text-transform: uppercase;
        font-weight: bold;
        letter-spacing: 2px;
        border: 2px solid #fd03521c;
        margin-top: 10px;
        padding: 1rem 4rem;
        border-radius: 16px;
        transition-duration: .2s;
        margin-bottom: 20px;
        cursor: pointer;
        
        &:hover {
            
            color: #ffffff;
            background-color: #fd0352;
            box-shadow: 0 0 20px #fd03527c;
            transform: scale(1.1);

        }

    }

}

================================================
FILE: src/app/layout/main-client-layout/main-client-layout.component.spec.ts
================================================
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { MainClientLayoutComponent } from './main-client-layout.component';

describe('MainClientLayoutComponent', () => {
  let component: MainClientLayoutComponent;
  let fixture: ComponentFixture<MainClientLayoutComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ MainClientLayoutComponent ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(MainClientLayoutComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: src/app/layout/main-client-layout/main-client-layout.component.ts
================================================
import { AfterViewInit, Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { BackgroundService } from 'src/app/modules/client/background.service';
import { PlayService } from 'src/app/modules/client/play.service';
import { SoundService } from 'src/app/modules/client/sound.service';
import { Friends } from 'src/data/friends'
import { Player } from 'src/data/player';

@Component({
  selector: 'app-main-client-layout',
  templateUrl: './main-client-layout.component.html',
  styleUrls: ['./main-client-layout.component.scss']
})
export class MainClientLayoutComponent implements OnInit, AfterViewInit {

  player = Player
  onlineStatus: boolean = true
  geral: boolean = true
  chat: boolean = false
  currentChat: any = {}
  friends: any = Friends
  allFriends: number = this.friends.length
  inQueue: boolean = false
  inLobby: boolean = false
  queueTimeMinutes: number = 0
  queueTimeSeconds: any = 0
  matchAccepted: boolean = false
  matchDeclined: boolean = false
  bugModal: boolean = false

  constructor(private backgroundService: BackgroundService,
              private playService: PlayService,
              private soundService: SoundService,
              private router: Router) {

    this.backgroundService.getBackgroundObservable().subscribe(

      response => {

        document.getElementById('backgroundClient').style.backgroundImage = `url('${response.backgroundUrl}')`
        document.getElementById('backgroundClient').style.backgroundSize = response.backgroundSize
        document.getElementById('backgroundClient').style.backgroundPosition = response.backgroundPosition

      }

    )

    this.playService.getLobbyObservable().subscribe(

      response => {

        if(response == true) {

          this.inLobby = true
          // document.getElementById('scrollableArea').style.height = 'calc(100vh - 314px)'
          document.getElementById('menuAside').style.marginTop = '115px'
          document.getElementById('playInformations').style.right = '0'

        } else {

          this.inLobby = false
          document.getElementById('playInformations').style.right = '-280px'
          setTimeout( () => {

            // document.getElementById('scrollableArea').style.height = 'calc(100vh - 200px)'
            document.getElementById('menuAside').style.marginTop = '0'

          }, 100)

        }

      }

    )

    this.playService.getQueueObservable().subscribe(

      response => {

        if(response == true) {

          document.getElementById('lobbyPreview').style.transform = 'translateX(-280px)'
          document.getElementById('queuePreview').style.right = '0'
          this.inQueue = true
          setTimeout( () => { this.queueTime() }, 1000 )

        } else {

          document.getElementById('lobbyPreview').style.transform = 'translateX(0)'
          document.getElementById('queuePreview').style.right = '-280px'
          document.getElementById('matchFound').classList.remove('match-found-visible')
          this.inQueue = false
          this.queueTimeMinutes = 0
          this.queueTimeSeconds = 0

        }

      }

    )

  }



  ngOnInit(): void {
  }



  playSound(sound) {

    this.soundService.playSound(sound)

  }



  pauseSound(sound) {

    this.soundService.pauseSound(sound)

  }



  ngAfterViewInit(): void {

  }



  changeOnlineStatus() {

    this.onlineStatus = !this.onlineStatus

  }



  changeGeralVisibility() {

    this.geral = !this.geral

  }



  ajustPopoversPosition() {

    for(let friend of this.friends) {

      var friendContainer = document.getElementById(`friend${friend.id}`)
      var popover = document.getElementById(`popover${friend.id}`)
  
      var bodyRect = document.body.getBoundingClientRect(),
      elemRect = friendContainer.getBoundingClientRect(),
      offset   = (elemRect.top - bodyRect.top) - 110
  
      popover.style.top = `${offset}px`

    }

  }



  showPopover(id) {

    document.getElementById(`popover${id}`).style.display = 'block'

  }



  hidePopover(id) {

    document.getElementById(`popover${id}`).style.display = 'none'

  }



  changeChatVisibility(friend?) {

    this.chat = !this.chat
    this.currentChat = friend

  }



  queueTime() {

    if(this.queueTimeSeconds < 60) {

      this.queueTimeSeconds = this.queueTimeSeconds + 1
      
    } else {

      this.queueTimeMinutes = this.queueTimeMinutes + 1
      this.queueTimeSeconds = 0

    }

    if(this.queueTimeSeconds == 5) {

      document.getElementById('matchFound').classList.add('match-found-visible')
      document.getElementById('progressBar').style.animationName = 'ProgressBar'
      this.inQueue = false
      this.playSound('matchFound')

      setTimeout( () => { 

        if(this.matchAccepted == false && this.inQueue == false) {

          this.playService.changeQueueState(false)
          document.getElementById('matchFound').classList.remove('match-found-visible')
          document.getElementById('progressBar').style.animationName = ''

        }

       }, 14000)

    }

    if(this.inQueue == true) {

      setTimeout( () => { this.queueTime() }, 1000 )

    }
    

  }



  cancelQueue() {

    this.playService.changeQueueState(false)

  }



  acceptMatch() {
    
    this.playSound('matchFoundAcceptButtonClick')
    this.matchAccepted = true
    this.matchDeclined = false
    document.getElementById('progressBar').style.animationName = ''
    setTimeout( () => {
      this.router.navigateByUrl('/client/game/champion-select')
    }, 2000 )

  }



  cancelMatch() {

    if(this.matchAccepted == false) {

      this.pauseSound('matchFound')
      this.playSound('matchFoundDeclineButtonClick')
      this.matchAccepted = false
      this.matchDeclined = true
      this.playService.changeQueueState(false)
      document.getElementById('progressBar').style.animationName = ''
      setTimeout( () => { this.matchDeclined = false }, 1000 )
      this.playService.changeQueueState(false)

    }

  }



  changeBugModalVisibility() {

    this.bugModal = !this.bugModal

    if(this.bugModal == true) {
      
      this.playSound('khazix')

    }

  }

}


================================================
FILE: src/app/modules/auth/auth-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login/login.component';

const routes: Routes = [

  { path: '', component: LoginComponent }

];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class AuthRoutingModule { }


================================================
FILE: src/app/modules/auth/auth.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { AuthRoutingModule } from './auth-routing.module';
import { LoginComponent } from './login/login.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';


@NgModule({
  declarations: [LoginComponent],
  imports: [
    CommonModule,
    AuthRoutingModule,
    FormsModule,
    ReactiveFormsModule
  ]
})
export class AuthModule { }


================================================
FILE: src/app/modules/auth/login/login.component.html
================================================
<div class="container">
    
    <aside>

        <img class="logo" src="/assets/images/auth/minimalist-logo.png">

        <span>Sign in</span>

        <form [formGroup]="loginForm" (ngSubmit)="makeLogin()">

            <input formControlName="username" id="username" (keyup)="usernameIdentify()" type="text">
            <label [ngClass]="{'label-top': haveCharacters}" for="username">Username</label>
            <small>Enter a fictitious username!<br>This application is not connected with Riot Games' APIS because of its usage policy.</small>

            <button [ngClass]="{'button-enabled': haveCharacters}" type="submit">
                <img src="/assets/images/auth/arrow-right.png">
            </button>

        </form>

    </aside>

</div>

<div [ngClass]="{'modal-close': !modal}" class="modal">

    <img src="https://i.redd.it/r6ysbhckzd811.png">

    <h2>Hey Summoner, welcome to</h2>
    <h1><b>Angular</b> of Legends</h1>
    <p>This is a project for <b>educational purposes only</b>.<br>
    League of Legends is a registered trademark of Riot Games, inc. I am in no way affiliated with, associated with or endorsed by Riot Games, inc. 
    All copyrights, image marks and service marks belong to their respective owners (Don't file a lawsuit against me please, I need to feed my cats).<br>
    In no way do I intend to monetize this project. <b>It was created just to test my Front-End and Angular skills :)</b>.
    </p>

    <button (click)="closeModal()">Close</button>

</div>

<div [ngClass]="{'warning-visible': !modal}" class="warning">
    <img src="./../../../../assets/images/auth/twistedfate.png">
    <div class="text-wrapper">
        <h1>Stop right there cowboy!</h1>
        <h2>This is a Twisted Fate alert</h2>
        <p>For a better experience please activate the sound :D<br><b>(please i did all the sound part too)</b></p>
    </div>
</div>

================================================
FILE: src/app/modules/auth/login/login.component.scss
================================================
.container {

    background-image: url('https://images.contentstack.io/v3/assets/blt731acb42bb3d1659/blt7225731dfb1a126a/60249b80f4a7946af0338313/LoL-Patch-Notes-11-4-Article-Banner.jpg');
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
    width: 100vw;
    height: 100vh;

    .video-background {
        
        position: fixed;
        width: 100vw;
        height: 100vh;
        top: 0;
        left: 0;
        object-fit: cover;

    }

    aside {

        background-color: #ffffffea;
        border-right: 2px solid #ffffff44;
        width: 400px;
        height: 100vh;
        text-align: center;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        opacity: 0;
        animation: FadeInLeft 1s forwards;

        @keyframes FadeInLeft {
            
            0%{

                transform: translateX(-400px);

            }
            100% {

                opacity: 1;
                transform: translateX(0);

            }

        }

        .logo {

            display: block;
            margin-bottom: 4rem;

        }

        span {

            font-family: 'Roboto', sans-serif;
            font-size: 24px;
            font-weight: bold;
            margin-bottom: 2rem;

        }

        form {

            position: relative;
            margin: 0;

            input {

                width: 100%;
                height: 58px;
                font-family: 'Roboto', sans-serif;
                font-size: 16px;
                font-weight: 900;
                letter-spacing: 1px;
                background-color: #ededed;
                border: 2px solid #ededed;
                border-radius: 8px;
                padding: 14px 16px 4px;
                box-sizing: border-box;

                &:focus {

                    border: 2px solid black;
                    background-color: transparent;

                }

                &:focus + label {

                    transform: scale(.6);
                    top: 7px;
                    left: -10px;
    
                }
    
            }

            .label-top {

                transform: scale(.6);
                top: 7px;
                left: -10px;

            }
    
            label {
    
                font-family: 'Roboto', sans-serif;
                font-size: 16px;
                font-weight: 900;
                text-transform: uppercase;
                letter-spacing: 1px;
                position: absolute;
                top: 22px;
                left: 16px;
                transition-duration: .2s;
                opacity: .6;
    
            }

            small {
                
                font-family: 'Roboto', sans-serif;
                color: #fd0352;
                margin-bottom: 8rem;
                font-size: 14px;
                width: 300px;
                display: block;
                margin-top: 14px;
                text-align: center;

            }

            button {

                width: 80px;
                height: 80px;
                border: 2px solid #f2f2f2;
                border-radius: 16px;
                background-color: #ededed;
                transition-duration: .2s;
                cursor: not-allowed;

            }

            .button-enabled {

                background-color: #d13639;
                border-color: #d13639;

                &:hover {

                    cursor: pointer;
                    transform: scale(1.1);
                    filter: brightness(150%);

                }

            }

        }

    }

}

.modal-close {

    opacity: 0 !important;
    transform: scale(.5) !important;

}

.modal {

    color: white;
    background-color: #030619d4;
    width: 80%;
    height: 80%;
    position: fixed;
    top: 10%;
    left: 10%;
    z-index: 10;
    display: flex;
    flex-direction: column;
    align-items: center;
    border: 2px solid #c7974a80;
    border-radius: 16px;
    box-sizing: border-box;
    backdrop-filter: blur(12px);
    opacity: 0;
    transition-duration: .5s;
    animation: FadeIn .5s forwards;
    overflow: auto;

    @keyframes FadeIn {
        
        0% {

            transform: scale(.5);

        }
        100% {

            opacity: 1;
            transform: scale(1);

        }

    }

    img {

        padding-top: 20px;
        width: 200px;
        animation: OwwntZed 2s infinite;

        @keyframes OwwntZed {
            
            0% {

                transform: scale(.95);

            }
            50% {

                transform: scale(1);
                filter: brightness(120%);

            }
            100% {

                transform: scale(.95);

            }

        }

    }

    h1 {

        color: #c7984a;
        font-size: 2rem;
        text-transform: uppercase;
        font-weight: bold;

        b {

            color: #fd0352;

        }

    }

    h2 {

        font-size: 1.2rem;
        margin: 1rem 0;

    }

    p {

        font-family: 'Roboto', sans-serif;
        font-size: 1.2rem;
        line-height: 1.8rem;
        width: 500px;
        margin-top: 2rem;
        text-align: justify;

        b {

            color: #fd0352;
            font-weight: bold;

        }

    }

    button {

        color: #ffffff80;
        background-color: #fd035207;
        font-size: 1.2rem;
        text-transform: uppercase;
        font-weight: bold;
        letter-spacing: 2px;
        border: 2px solid #fd03521c;
        margin-top: 4rem;
        padding: 1rem 4rem;
        border-radius: 16px;
        transition-duration: .2s;
        margin-bottom: 20px;
        cursor: pointer;
        
        &:hover {
            
            color: #ffffff;
            background-color: #fd0352;
            box-shadow: 0 0 20px #fd03527c;
            transform: scale(1.1);

        }

    }

}

.warning-visible {

    top: 2rem !important;
    opacity: 1 !important;

}

.warning {

    position: fixed;
    top: -14rem;
    left: calc(50% - 311px);
    z-index: 2;
    background-color: #c7bf4a58;
    backdrop-filter: blur(12px);
    display: flex;
    align-items: center;
    padding: 2rem 2rem;
    border-radius: 16px;
    border: solid 2px #fd03521c;
    transition-duration: .5s;
    opacity: 0;

    img {
        
        width: 150px;
        display: inline-block;
        animation: TwistedFateHeadBanger 2s infinite;

        @keyframes TwistedFateHeadBanger {
            
            0% {

                transform: rotate(6deg);

            }
            50% {

                transform: rotate(-6deg);
                filter: brightness(120%);

            }
            100% {

                transform: rotate(6deg);

            }

        }
    
    }

    .text-wrapper {

        display: inline-block;
        text-align: center;

        h1 {

            color: #e2db71;
            font-size: 1.8rem;
            text-transform: uppercase;
            font-weight: bold;
            padding-bottom: 1rem;
            display: block;

        }

        h2 {

            color: #c7bf4a;
            font-size: 1.2rem;
            text-transform: uppercase;
            font-weight: bold;
            padding-bottom: 1rem;
            display: block;

        }

        p {

            color: white;
            font-family: "Roboto", sans-serif;
            font-size: 1.2rem;
            line-height: 1.8rem;
            margin-left: 2rem;

            b {

                color: #00000052;
                font-weight: bold;

            }

        }

    }

}

================================================
FILE: src/app/modules/auth/login/login.component.spec.ts
================================================
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { LoginComponent } from './login.component';

describe('LoginComponent', () => {
  let component: LoginComponent;
  let fixture: ComponentFixture<LoginComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ LoginComponent ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(LoginComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: src/app/modules/auth/login/login.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { Router } from '@angular/router';
import { SoundService } from '../../client/sound.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {

  modal: boolean = true
  loginForm: FormGroup
  haveCharacters: boolean = false

  constructor( private route: Router,
               private soundService: SoundService ) {

    this.loginForm = new FormGroup({

      username: new FormControl()

    })

  }



  ngOnInit(): void {

    this.soundService.playSound('zed')

  }



  makeLogin() {

    if(this.haveCharacters == true) {

      localStorage.setItem('username', this.loginForm.value.username)
      this.route.navigateByUrl('client')
      
    }

  }



  usernameIdentify() {

    if(this.loginForm.value.username !== null && this.loginForm.value.username?.length > 0) {

      this.haveCharacters = true

    } else {

      this.haveCharacters = false

    }

  }



  closeModal() {

    this.soundService.playSound('tf')
    this.modal = false

  }

}


================================================
FILE: src/app/modules/client/background.service.ts
================================================
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class BackgroundService {

  private background = new Subject<object>()

  changeBackground(url) {

    this.background.next(url)
  
  }



  getBackgroundObservable(): Observable<any> {

    return this.background.asObservable()

  }

}


================================================
FILE: src/app/modules/client/chat/chat.component.html
================================================
<div class="chat-container">

    <ul class="chat-list">

        <li *ngFor="let friend of friends" (click)="selectChat(friend)" class="friend">
            <img src="{{ friend.profilePicture }}">
            <span>{{ friend.name }}</span>
        </li>

    </ul>

    <div class="current-chat">

        <header>

            <div *ngIf="currentChat.profilePicture" class="friend-profile-image-border">
                <img src="{{ currentChat.profilePicture }}" class="friend-profile-image">
            </div>
            <div class="friend-status-circle"></div>

            <div class="friend-informations">

                <span class="friend-name truncate">{{ currentChat.name }}</span>

            </div>

        </header>

        <main>

            <div *ngFor="let message of currentChat.messages" [ngClass]="{'friend-message': message.type == 'friend'}" class="message">{{ message.text }}</div>

        </main>

        <form [formGroup]="messageForm" (ngSubmit)="sendMessage()">
            <input formControlName="message" placeholder="Type here..." type="text">
        </form>

    </div>

</div>

================================================
FILE: src/app/modules/client/chat/chat.component.scss
================================================
.chat-container {

    width: 600px;
    height: 500px;
    background-color: #010911b4;
    backdrop-filter: blur(12px);
    border: 1px solid #ffffff38;

    .chat-list {

        height: 580px;
        width: 200px;
        display: inline-block;
        overflow: auto;

        .friend {

            display: flex;
            align-items: center;
            padding: .5rem;
            transition-duration: .2s;
            cursor: pointer;

            img {

                width: 50px;
                border: 2px solid #8e7341;
                box-sizing: border-box;
                border-radius: 50%;
                margin-right: .5rem;

            }

            span {

                font-size: 18px;
                color: #e4dbc8;
                font-family: "Roboto", sans-serif;

            }

            &:hover {

                background-color: #ffffff23;

            }

        }

    }

    .current-chat {

        width: 400px;
        height: 100%;
        display: inline-block;
        border-left: 1px solid #ffffff1a;
        box-sizing: border-box;
        position: relative;

        header {

            width: 383px;
            height: 42px;
            position: absolute;
            top: 0;
            left: 0;
            padding: .5rem;
            border-bottom: 1px solid #8e7341;
            backdrop-filter: blur(12px);

        }

        main {

            width: 335px;
            height: 456px;
            overflow: auto;
            padding: 6rem 2rem 2rem 2rem;

            .message {

                background-color: #8e734157;
                color: white;
                font-family: 'Roboto', sans-serif;
                line-height: 26px;
                text-rendering:optimizeLegibility;
                width: 70%;
                border-radius: 14px;
                display: block;
                padding: .5rem 1rem;
                margin: .5rem 0;
                float: right;
                transition-duration: .2s;
                overflow-wrap: break-word;

            }
            
            .friend-message {

                background-color: #37373757;
                float: left;


            }

        }

        input {

            color: white;
            font-size: 1.4;
            background-color: transparent;
            width: 100%;
            height: 44px;
            position: absolute;
            bottom: 0;
            left: 0;
            padding: 0 1rem;
            border-left: 1px solid #ffffff1a;
            border-bottom: none;
            border-left: none;
            border-right: none;
            box-sizing: border-box;

        }

    }

}

.friend-status-circle {

    position: absolute;
    transform: translate(28px, -15px);

}

.friend-profile-image-border {

    width: 42px;
    height: 42px;
    background: rgb(106,80,40);
    background: -moz-linear-gradient(0deg, rgba(106,80,40,1) 0%, rgba(190,156,87,1) 100%);
    background: -webkit-linear-gradient(0deg, rgba(106,80,40,1) 0%, rgba(190,156,87,1) 100%);
    background: linear-gradient(0deg, rgba(106,80,40,1) 0%, rgba(190,156,87,1) 100%);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#6a5028",endColorstr="#be9c57",GradientType=1);
    border-radius: 300px;
    display: inline-block;
    margin-right: .8rem;

    .friend-profile-image {

        position: absolute;
        width: 38px;
        height: 38px;
        border-radius: 300px;
        left: 10px;
        top: 10px;

    }

}

.friend-informations {

    display: inline-block;
    width: calc(100% - 56px);
    height: 20px;
    position: relative;
    top: -14px;

    .friend-name, .friend-status {

        font-weight: normal;
        display: block;
        text-transform: initial;
        letter-spacing: 0px;

    }

    .friend-name {

        font-size: 18px;
        color: #e4dbc8;
        font-family: 'Roboto', sans-serif;

    }

}

================================================
FILE: src/app/modules/client/chat/chat.component.spec.ts
================================================
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { ChatComponent } from './chat.component';

describe('ChatComponent', () => {
  let component: ChatComponent;
  let fixture: ComponentFixture<ChatComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ ChatComponent ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(ChatComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: src/app/modules/client/chat/chat.component.ts
================================================
import { Component, Input, OnInit } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { Friends } from 'src/data/friends'

@Component({
  selector: 'app-chat',
  templateUrl: './chat.component.html',
  styleUrls: ['./chat.component.scss']
})
export class ChatComponent implements OnInit {

  messageForm: FormGroup

  @Input() currentChat: any = {}
  friends: any

  constructor() {

    this.messageForm = new FormGroup({

      message: new FormControl()

    })

  }

  ngOnInit(): void {

    this.friends = Friends

  }



  selectChat(friend) {

    this.currentChat = friend

  }



  sendMessage() {

    if(this.messageForm.value.message !== null) {

      Friends[this.currentChat.id - 1].messages.push({ text: this.messageForm.value.message, type: 'user' })
      this.messageForm.reset()

    }

  }

}


================================================
FILE: src/app/modules/client/client-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MainClientLayoutComponent } from 'src/app/layout/main-client-layout/main-client-layout.component';

const routes: Routes = [

  { path: '', component: MainClientLayoutComponent, children: [
    
    { path: '', redirectTo: 'home', pathMatch: 'full' },
    { path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },
    { path: 'play', loadChildren: () => import('./play/play.module').then(m => m.PlayModule) },
    { path: 'profile', loadChildren: () => import('./profile/profile.module').then(m => m.ProfileModule) }

  ]},
  { path: 'game', loadChildren: () => import('./game/game.module').then(m => m.GameModule) }

];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class ClientRoutingModule { }


================================================
FILE: src/app/modules/client/client.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { ClientRoutingModule } from './client-routing.module';
import { MainClientLayoutComponent } from 'src/app/layout/main-client-layout/main-client-layout.component';
import { ChatComponent } from './chat/chat.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';


@NgModule({
  declarations: [
    MainClientLayoutComponent,
    ChatComponent
  ],
  imports: [
    CommonModule,
    ClientRoutingModule,
    FormsModule,
    ReactiveFormsModule
  ]
})
export class ClientModule { }


================================================
FILE: src/app/modules/client/game/champion-select/champion-select.component.html
================================================
<div class="background"></div>

<video class="video-background" autoplay muted>
    <source src="./assets/images/champion-select/mid.mp4" type="video/mp4">
</video>

<div *ngIf="pickPeriod && currentChampionSelected !== null|| loadOutPeriod && currentChampionSelected !== null" style="background-image: url('{{ currentChampionSelected.coverPicture }}')" class="champion-background"></div>

<div id="assigned" class="assigned-container">
    <span class="assigned">You were assigned</span>
    <span class="role">Middle</span>
</div>

<div id="overlayBackground" class="overlay-background"></div>

<aside class="ally-team">

    <ul class="ally-bans">
        <li>
            <img src="./assets/images/champion-select/ban-icon.png">
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ allyBans[0].picture }}">
        </li>
        <li>
            <img src="./assets/images/champion-select/ban-icon.png">
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ allyBans[1].picture }}">
        </li>
        <li>
            <img src="./assets/images/champion-select/ban-icon.png">
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ allyBans[2].picture }}">
        </li>
        <li>
            <img *ngIf="currentChampionBanSelected == null" src="./assets/images/champion-select/ban-icon.png">
            <img *ngIf="currentChampionBanSelected !== null" src="{{ currentChampionBanSelected.picture }}">
        </li>
        <li>
            <img src="./assets/images/champion-select/ban-icon.png">
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ allyBans[3].picture }}">
        </li>
    </ul>

    <ul class="ally-team-champs">

        <li id="player1" class="ally-team-champs-intro-animation">
            <div class="spells">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerDot.png">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerFlash.png">
            </div>
            <img *ngIf="!pickPeriod && !loadOutPeriod" id="champPreview1" class="champion-preview delay1" src="./assets/images/champion-select/roles/adc.png">
            <img *ngIf="pickPeriod || loadOutPeriod" class="champion-preview delay1" src="{{ allyPicks[0].picture }}">
            <div id="playerInfo1" class="informations delay1">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="champion-name">{{ allyPicks[0].name }}</span>
                <span class="role">Bottom</span>
                <span class="user-name">Jhon</span>
            </div>
        </li>
        <li id="player2" class="ally-team-champs-intro-animation">
            <div class="spells">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerDot.png">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerFlash.png">
            </div>
            <img *ngIf="!pickPeriod && !loadOutPeriod" id="champPreview2" class="champion-preview delay2" src="./assets/images/champion-select/roles/jg.png">
            <img *ngIf="pickPeriod || loadOutPeriod" class="champion-preview delay1" src="{{ allyPicks[1].picture }}">
            <div id="playerInfo2" class="informations delay2">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="champion-name">{{ allyPicks[1].name }}</span>
                <span class="role">Jungle</span>
                <span class="user-name">Mark</span>
            </div>
        </li>
        <li id="player3" class="ally-team-champs-intro-animation">
            <div class="spells">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerDot.png">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerFlash.png">
            </div>
            <img *ngIf="!pickPeriod && !loadOutPeriod" id="champPreview3" class="champion-preview delay3" src="./assets/images/champion-select/roles/top.png">
            <img *ngIf="pickPeriod || loadOutPeriod" class="champion-preview delay1" src="{{ allyPicks[2].picture }}">
            <div id="playerInfo3" class="informations delay3">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="champion-name">{{ allyPicks[2].name }}</span>
                <span class="role">Top</span>
                <span class="user-name">Fabriccio</span>
            </div>
        </li>
        <li id="player4" class="ally-team-champs-intro-animation">
            <div class="spells">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerDot.png">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerFlash.png">
            </div>
            <img *ngIf="currentChampionSelected == null"  id="champPreview4" class="champion-preview delay4" src="./assets/images/champion-select/roles/mid.png">
            <img *ngIf="currentChampionSelected !== null" class="champion-preview" src="{{ currentChampionSelected.picture }}">
            <div id="playerInfo4" class="informations delay4">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="currentChampionSelected !== null" class="champion-name">{{ currentChampionSelected.name }}</span>
                <span class="role">Middle</span>
                <span class="user-name">{{ player.name }}</span>
            </div>
        </li>
        <li id="player5" class="ally-team-champs-intro-animation delay4">
            <div class="spells">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerDot.png">
                <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerFlash.png">
            </div>
            <img *ngIf="!pickPeriod && !loadOutPeriod" id="champPreview5" class="champion-preview delay5" src="./assets/images/champion-select/roles/sup.png">
            <img *ngIf="pickPeriod || loadOutPeriod" class="champion-preview delay1" src="{{ allyPicks[3].picture }}">
            <div id="playerInfo5" class="informations delay5">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="champion-name">{{ allyPicks[3].name }}</span>
                <span class="role">Support</span>
                <span class="user-name">Mary</span>
            </div>
        </li>

    </ul>

</aside>

<main id="mainContent">

    <span *ngIf="pickPeriod" class="announcement">Choose your champion!</span>
    <span *ngIf="declarePeriod" class="announcement">Declare your champion!</span>
    <span *ngIf="banPeriod" class="announcement">Ban a champion!</span>
    <span *ngIf="loadOutPeriod" class="announcement">Choose your loadout!</span>
    <span *ngIf="!banReviewPeriod" class="announcement-timer">{{ timerNumber }}</span>

    <div id="allyBarWrapper" class="ally-progress-bar">
        <span id="allyBar" class="bar"></span>
    </div>
    <div id="enemyBarWrapper" class="enemy-progress-bar">
        <span id="enemyBar" class="bar"></span>
    </div>

    <ul class="filters" [ngClass]="{'hidde-filters': loadOutPeriod || banReviewPeriod}">
        <li [ngClass]="{'lane-active': filter == 'top'}" class="lane">
            <img (click)="changeFilter('top')" src="./assets/images/lobby/roles/top.png">
        </li>
        <li [ngClass]="{'lane-active': filter == 'jg'}" class="lane">
            <img (click)="changeFilter('jg')" src="./assets/images/lobby/roles/jg.png">
        </li>
        <li [ngClass]="{'lane-active': filter == 'mid'}" class="lane">
            <img (click)="changeFilter('mid')" src="./assets/images/lobby/roles/mid.png">
        </li>
        <li [ngClass]="{'lane-active': filter == 'adc'}" class="lane">
            <img (click)="changeFilter('adc')" src="./assets/images/lobby/roles/adc.png">
        </li>
        <li [ngClass]="{'lane-active': filter == 'sup'}" class="lane sup">
            <img (click)="changeFilter('sup')" src="./assets/images/lobby/roles/sup.png">
        </li>
    </ul>

    <div *ngIf="banReviewPeriod" id="bans" class="bans">

        <div class="ally-bans">

            <span class="announcement">Your team's bans</span>

            <ul>
                
                <li class="ban">
                    <img src="{{ allyBans[0].picture }}">
                    <img *ngIf="allyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ allyBans[0].name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ allyBans[1].picture }}">
                    <img *ngIf="allyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ allyBans[1].name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ allyBans[2].picture }}">
                    <img *ngIf="allyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ allyBans[2].name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ currentChampionBanSelected.picture }}">
                    <span>{{ currentChampionBanSelected.name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ allyBans[3].picture }}">
                    <img *ngIf="allyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ allyBans[3].name }}</span>
                </li>

            </ul>

        </div>

        <span class="announcement bans-announcement">Bans locked in</span>

        <div class="enemy-bans">

            <ul>
                
                <li class="ban">
                    <img src="{{ enemyBans[0].picture }}">
                    <img *ngIf="enemyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ enemyBans[0].name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ enemyBans[1].picture }}">
                    <img *ngIf="enemyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ enemyBans[1].name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ enemyBans[2].picture }}">
                    <img *ngIf="enemyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ enemyBans[2].name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ enemyBans[3].picture }}">
                    <img *ngIf="enemyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ enemyBans[3].name }}</span>
                </li>
                <li class="ban">
                    <img src="{{ enemyBans[4].picture }}">
                    <img *ngIf="enemyBans == null" src="https://ddragon.leagueoflegends.com/cdn/10.18.1/img/profileicon/29.png">
                    <span>{{ enemyBans[4].name }}</span>
                </li>

            </ul>

            <span class="announcement">Enemy team's bans</span>

        </div>

    </div>

    <ul id="chamiponList" class="champion-list">
        <li *ngFor="let champion of champions; let championIndex = index" (mouseenter)="playSound('championSelectChampionHover')" [ngClass]="{'champion-desable': champion.selectable == false, 'champion-visible': champion.role == filter || filter == 'all'}" (click)="selectChampion(champion, championIndex); playSound('championSelectChampionClick')" class="champion">
            <img src="{{ champion.picture }}" class="champion-picture">
            <span class="champion-name">{{ champion.name }}</span>
            <span *ngIf="currentChampionSelected == champion" class="champion-select-frame">
                <span class="circle"></span>
            </span>
            <span *ngIf="currentChampionBanSelected == champion" class="champion-ban-frame">
                <span class="circle">
                    <span class="line"></span>
                </span>
            </span>
        </li>
    </ul>

    <div class="lined-circle-wrapper">
        <img class="lined-circle" src="./assets/images/champion-select/lined-circle.png">
        <div *ngIf="loadOutPeriod && currentChampionSelected !== null" [ngClass]="adjustChampion(currentChampionSelected.name)" style="background-image: url('{{ currentChampionSelected.coverPicture }}')" class="current-champion-selected"></div>
    </div>

    <div *ngIf="loadOutPeriod && currentChampionSelected !== null" class="champion-finalization">
        <span class="champion-name">{{ currentChampionSelected.name }}</span>
        <div class="skins">
            <div class="skin">
                <img src="{{ currentChampionSelected.coverPicture }}">
            </div>
        </div>
    </div>

    <img *ngIf="!declarePeriod && !banReviewPeriod && !loadOutPeriod" class="button-detail button-detail-left" src="./assets/images/champion-select/accept-button-detail.png">
    <img *ngIf="!declarePeriod && !banReviewPeriod && !loadOutPeriod" class="button-detail button-detail-right" src="./assets/images/champion-select/accept-button-detail.png">
    
    <span *ngIf="pickPeriod" (mouseover)="playSound('confirmButtonHover')" [ngClass]="{'accept-button-desabled ': !currentChampionSelected}" (click)="pickChampion()" class="accept-button">
        <span>Lock in</span>
        <img src="./assets/images/champion-select/accept-button.png">
    </span>
    
    <span *ngIf="banPeriod" (mouseover)="playSound('changeGameModeButtonHover')" [ngClass]="{'accept-button-desabled ': !currentChampionBanSelected}" (click)="banChampion()" class="accept-button">
        <span>Ban</span>
        <img src="./assets/images/champion-select/ban-button.png">
    </span>

</main>

<footer>

    <button class="edit-rune">
        <img src="./assets/images/champion-select/rune-edit.png">
    </button>

    <select>
        <option value="">First rune</option>
    </select>

    <div class="summoners-spells">
        <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerDot.png">
        <img src="https://ddragon.leagueoflegends.com/cdn/11.3.1/img/spell/SummonerFlash.png">
    </div>

</footer>

<aside class="enemy-team">

    <ul class="enemy-bans">
        <li>
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ enemyBans[0].picture }}">
            <img src="./assets/images/champion-select/ban-icon.png">
        </li>
        <li>
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ enemyBans[1].picture }}">
            <img src="./assets/images/champion-select/ban-icon.png">
        </li>
        <li>
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ enemyBans[2].picture }}">
            <img src="./assets/images/champion-select/ban-icon.png">
        </li>
        <li>
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ enemyBans[3].picture }}">
            <img src="./assets/images/champion-select/ban-icon.png">
        </li>
        <li>
            <img *ngIf="banReviewPeriod || pickPeriod || loadOutPeriod" class="champion-picture" src="{{ enemyBans[4].picture }}">
            <img src="./assets/images/champion-select/ban-icon.png">
        </li>
    </ul>

    <ul id="enemyTeamChamps" class="enemy-team-champs">

        <li>
            <div class="informations">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="role">{{ enemyPicks[0].name }}</span>
                <span class="user-name">Summoner 1</span>
            </div>
            <div class="champion-preview">
                <img *ngIf="pickPeriod || loadOutPeriod"  width="100%" src="{{ enemyPicks[0].picture }}">
            </div>
        </li>
        <li>
            <div class="informations">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="role">{{ enemyPicks[1].name }}</span>
                <span class="user-name">Summoner 2</span>
            </div>
            <div class="champion-preview">
                <img *ngIf="pickPeriod || loadOutPeriod"  width="100%" src="{{ enemyPicks[1].picture }}">
            </div>
        </li>
        <li>
            <div class="informations">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="role">{{ enemyPicks[2].name }}</span>
                <span class="user-name">Summoner 3</span>
            </div>
            <div class="champion-preview">
                <img *ngIf="pickPeriod || loadOutPeriod"  width="100%" src="{{ enemyPicks[2].picture }}">
            </div>
        </li>
        <li>
            <div class="informations">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="role">{{ enemyPicks[3].name }}</span>
                <span class="user-name">Summoner 4</span>
            </div>
            <div class="champion-preview">
                <img *ngIf="pickPeriod || loadOutPeriod"  width="100%" src="{{ enemyPicks[3].picture }}">
            </div>
        </li>
        <li>
            <div class="informations">
                <!-- <span class="picking">Picking...</span> -->
                <span *ngIf="pickPeriod || loadOutPeriod" class="role">{{ enemyPicks[4].name }}</span>
                <span class="user-name">Summoner 5</span>
            </div>
            <div class="champion-preview">
                <img *ngIf="pickPeriod || loadOutPeriod" width="100%" src="{{ enemyPicks[4].picture }}">
            </div>
        </li>

    </ul>

</aside>

================================================
FILE: src/app/modules/client/game/champion-select/champion-select.component.scss
================================================


.delay1 {

    animation-delay: 700ms !important;

}

.delay2 {

    animation-delay: 1400ms !important;

}

.delay3 {

    animation-delay: 2000ms !important;

}

.delay4 {

    animation-delay: 2800ms !important;

}

.delay5 {

    animation-delay: 3500ms !important;

}

.background {

    width: 100vw;
    height: 100vh;
    background-color: #010614;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 0;

}

.assigned-container {

    color: white;
    position: fixed;
    left: 0;
    right: 0;
    top: 70%;
    text-align: center;
    font-weight: bold;
    opacity: 0;
    transition-duration: .2s;

    .assigned {

        font-size: 1.5rem;
        letter-spacing: 2px;
        font-style: italic;

    }

    .role {

        font-size: 4rem;
        display: block;
        margin-top: 12px;
        text-transform: uppercase;

    }

}

.overlay-background {

    width: 100vw;
    height: 100vh;
    background-color: #000000cb;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 0;
    opacity: 0;
    transition-duration: .2s;

}

.overlay-background-ban {

    background-color: rgb(255,0,36) !important;
    background: radial-gradient(circle, rgba(255, 0, 34, 0.500) 0%, rgba(62, 0, 25, 0.500) 100%) !important;

}

.video-background {
    
    position: fixed;
    width: 900px;
    top: calc(50% - 250px);
    left: calc(50% - 450px);
    transform: scale(1.8);

}

.champion-background {

    position: fixed;
    width: 100vw;
    height: 100vh;
    background-image: url('https://images.wallpapersden.com/image/download/psyops-zed-league-of-legends_bGhtaG6UmZqaraWkpJRmbmdlrWZlbWU.jpg');
    background-repeat: no-repeat;
    background-position: center;
    background-size: cover;
    animation: FadeIn .2s forwards;

    @keyframes FadeIn {
        0% {

            opacity: 0;
            transform: scale(2);

        }
        100% {

            opacity: 1;
            transform: scale(1);

        }
    }

}

.ally-team {

    width: 20%;
    position: absolute;
    left: 0;
    top: 0;

    .ally-bans {

        li {

            display: inline-block;
            padding: 2.8rem .5rem 4rem;
            position: relative;

            .champion-picture {

                opacity: 0;
                position: absolute;
                left: 8px;
                animation: Entrance 1s forwards;

                @keyframes Entrance {
                    
                    0% {

                        transform: scale(2);

                    }
                    100% {

                        opacity: 1;
                        transform: scale(1);

                    }

                }

            }


            img {

                width: 35px;
                border: 1px solid rgba(255, 255, 255, 0.103);

            }

        }

    }

    .ally-team-champs-border {
    
        border-top: 1px solid #785b2881 !important;
        border-bottom: 1px solid #785b2881 !important;

    }

    .ally-team-champs {

        position: fixed;
        top: calc(50vh - 255px);
        width: calc(50vw - 450px);

        li {

            display: flex;
            align-items: center;
            justify-items: center;
            justify-content: left;
            padding: 12px 6px;
            border-top: 1px solid transparent;
            border-bottom: 1px solid transparent;
            box-sizing: border-box;
            transition-duration: .2s;

            .spells {

                display: none;

                img {

                    width: 35px;
                    display: block;
                    margin: .5rem;

                }

            }

            .champion-preview {

                width: 70px;
                border: 3px solid #a07c30;
                border-radius: 50%;
                margin: 0 16px 0 10px;

            }

            .informations {

                span {

                    color: #f0e6d2;
                    display: block;
                    font-weight: bold;

                }

                .champion-name {

                    font-size: .8rem;
                    color: #908769;
                    font-family: 'Roboto', sans-serif;

                }

                .picking {

                    color: #f7bc0a;
                    font-family: 'Roboto', sans-serif;

                }

                .role {

                    text-transform: uppercase;
                    font-size: 1.3rem;
                    padding: 4px 0;

                }

                .user-name {

                    font-family: 'Roboto', sans-serif;
                    font-size: .9rem;
                    letter-spacing: 2px;
                    opacity: .8;

                }

            }

        }

    }

    .ally-team-champs-intro-animation {

        .spells {

            display: block;

        }

        .champion-preview {

            animation: PreviewIntro 1s;
            opacity: 0;

            @keyframes PreviewIntro {
                
                0% {

                }
                50% {

                    transform: scale(1.2);
                    opacity: 1;
                    box-shadow: 0 0 20px #a07c30;

                }
                100% {

                    transform: scale(1);
                    opacity: 1;

                }

            }

        }

        .informations {

            animation: InfroIntro 1s;
            opacity: 0;

            @keyframes InfroIntro {
                
                0% {

                    transform: translateX(-20px);
                    opacity: 1;

                }
                100% {

                    opacity: 1;

                }

            }

        }

    }

}

.enemy-team {

    width: 20%;
    position: absolute;
    right: 0;
    top: 0;

    .enemy-bans {

        display: flex;
        justify-content: flex-end;

        li {

            display: inline-block;
            padding: 2.8rem .5rem 4rem;
            position: relative;

            .champion-picture {

                opacity: 0;
                position: absolute;
                animation: Entrance 1s forwards;

                @keyframes Entrance {
                    
                    0% {

                        transform: scale(2);

                    }
                    100% {

                        opacity: 1;
                        transform: scale(1);

                    }

                }

            }

            img {

                width: 35px;
                border: 1px solid rgba(255, 255, 255, 0.103);

            }

        }

    }

    .enemy-team-champs-visible {

        position: fixed;
        top: calc(50vh - 255px);
        right: 0;
        width: calc(50vw - 450px);

        li {

            animation: FadeInLeft 1s;
            animation-fill-mode: forwards;

            @keyframes FadeInLeft {
                0% {

                    opacity: 0;
                    transform: translateX(-50px);

                }
                100% {

                    opacity: 1;
                    transform: translateX(0);

                }
            }

        }

    }

    .enemy-team-champs {

        li {

            display: flex;
            align-items: center;
            justify-items: center;
            justify-content: flex-end;
            padding: 3px 6px;
            border-top: 1px solid #785b2881 !important;
            border-bottom: 1px solid #785b2881 !important;
            box-sizing: border-box;
            text-align: right;
            opacity: 0;

            .spells {

                img {

                    width: 35px;
                    display: block;
                    margin: .5rem;

                }

            }

            .champion-preview {

                width: 70px;
                height: 70px;
                background-color: #00040f;
                border: 3px solid #560d0d;
                border-radius: 50%;
                margin: 9px 10px 9px 16px;
                overflow: hidden;

            }

            .informations {

                span {

                    color: #f0e6d2;
                    display: block;
                    font-weight: bold;

                }

                .champion-name {

                    font-size: .8rem;
                    color: #908769;
                    font-family: 'Roboto', sans-serif;

                }

                .picking {

                    color: #f7bc0a;
                    font-family: 'Roboto', sans-serif;

                }

                .role {

                    text-transform: uppercase;
                    font-size: 1.3rem;
                    padding: 4px 0;

                }

                .user-name {

                    font-family: 'Roboto', sans-serif;
                    font-size: .9rem;
                    letter-spacing: 2px;
                    opacity: .8;

                }

            }

            &:nth-child(2) {

                animation-delay: .2s;
                
            }

            &:nth-child(3) {

                animation-delay: .4s;
                
            }

            &:nth-child(4) {

                animation-delay: .6s;
                
            }

            &:nth-child(5) {

                animation-delay: .8s;
                
            }

        }

    } 

}

main {

    display: inline-block;
    position: absolute;
    top: 0;
    left: calc(50% - 400px);
    opacity: 0;
    z-index: -1;
    transition-duration: .2s;

    .announcement, .announcement-timer {
        
        color: white;
        text-transform: uppercase;
        font-weight: bold;
        letter-spacing: 1px;
        display: block;
        text-align: center;

    }
        
    .announcement {

        font-size: 2.4rem;
        text-align: center;
        padding-top: 1rem;

    }

    .announcement-timer {

        font-size: 3.5rem;

    }

    .ally-progress-bar {

        width: 338px;
        height: 6px;
        margin: 10px;
        position: absolute;
        top: 80.5px;
        left: -3px;

        .bar {

            width: 100%;
            height: 6px;
            display: block;
            float: right;

        }

    }

    .enemy-progress-bar {

        width: 338px;
        height: 6px;
        margin: 10px;
        position: absolute;
        top: 80.5px;
        right: -3px;

        .bar {

            width: 100%;
            height: 6px;
            display: block;
            transform: scaleX(-1);

        }

    }

    .blue-bar {

        background-color: #67c9d479;

        .bar {

            background: rgb(112,206,218);
            background: linear-gradient(100deg, #70ceda 0%, #005f86 100%);

        }

    }

    .red-bar {

        background-color: #250e16b7;

        .bar {

            background: rgb(104,13,26);
            background: linear-gradient(100deg, #680d1a 0%, #d66f4e 100%);

        }

    }

    .hidde-filters {

        opacity: 0;
        z-index: -2;

    }

    .filters {

        width: 100%;
        padding: .5rem;
        border-bottom: 1px solid #785b2873;
        margin-bottom: 12px;
        position: relative;
        z-index: 2;

        .lane {

            display: inline-block;
            margin: 0 1rem;

            img {

                width: 25px;
                opacity: .6;
                transition-duration: .2s;
                cursor: pointer;
                filter: grayscale(100%);

            }

            &:hover {
    
                img {
    
                    opacity: 1;
    
                }
    
            }

        }

        .lane-active {

            img {

                opacity: 1;
                filter: grayscale(100%) brightness(120%);

            }

        }

        .sup {

            img {

                width: 30px;
            }

        }

    }

    .bans {

        text-align: center;
        width: 800px;
        height: calc(100vh - 345px);
        position: fixed;
        top: 35%;
        z-index: 2;
        animation: AjustTop .4s;
        animation-delay: 4s;
        animation-fill-mode: forwards;

        @keyframes AjustTop {
            0% {

                top: 35%;

            }
            100% {

                top: 18%;

            }
        }

        .announcement {

            font-size: 1.2rem;
            padding: 2rem 0;

        }

        .bans-announcement {

            color: #f0e6d2;
            font-size: 2rem;
            padding: 4rem 0;
            position: relative;
            opacity: 0;
            animation: Entrance .2s;
            animation-delay: 4s;
            animation-fill-mode: forwards;

            @keyframes Entrance {
                0% {

                    opacity: 0;
                    transform: scale(2);

                }
                100% {

                    opacity: 1;
                    transform: scale(1);

                }
            }

            &::before, &::after {

                content: '';
                width: 28%;
                height: 2px;
                background-color: #f0e6d2;
                position: absolute;
                top: calc(50% - 2px);

            }

            &::before {

                left: 0;

            }

            &::after {

                right: 0;

            }

        }

        .ally-bans {

            .announcement {

                color: #217b86;
                animation: Entrance .2s;
                animation-fill-mode: forwards;

                @keyframes Entrance {
                    0% {

                        opacity: 0;
                        transform: scale(2);
                        color: white;

                    }
                    100% {

                        opacity: 1;
                        transform: scale(1);
                        color: #217b86;

                    }
                }

            }

        }

        .enemy-bans {
            
            animation: Entrance .2s;
            opacity: 0;
            animation-delay: 4.2s;
            animation-fill-mode: forwards;

            @keyframes Entrance {
                0% {

                    opacity: 0;

                }
                100% {

                    opacity: 1;

                }
            }

            .announcement {

                color: #8d4c56;

            }

            
            .ban {

                animation-delay: 5s;

            }

        }

        ul {

            display: flex;
            flex-wrap: nowrap;
            justify-content: space-between;

            .ban {

                animation: Entrance .4s;
                animation-fill-mode: forwards;
                opacity: 0;

                @keyframes Entrance {
                    0% {

                        opacity: 0;
                        transform: scale(1.2);

                    }
                    100% {

                        opacity: 1;
                        transform: scale(1);
                    }
                }

                img { 
                    
                    width: 85px;
                    display: block;
                    border: 1px solid rgba(255, 255, 255, 0.103);
                    box-sizing: border-box;
                
                }

                span {

                    font-family: 'Roboto', sans-serif;
                    font-size: 16px;
                    color: #918874;
                    padding-top: 8px;
                    display: block;

                }

                &:nth-child(1), &:nth-child(5), &:nth-child(6), &:nth-child(10) {

                    animation-delay: .4s;

                }

                &:nth-child(2), &:nth-child(4), &:nth-child(7), &:nth-child(9) {

                    animation-delay: .5s;

                }

                &:nth-child(3), &:nth-child(8) {

                    animation-delay: .6s;

                }

            }

        }

    }


    .champion-list {

        width: 800px;
        height: calc(100vh - 345px);
        display: flex;
        flex-wrap: wrap;
        justify-content: space-between;
        padding-bottom: 12px;
        overflow: auto;
        position: relative;
        z-index: 2;
        opacity: 1;
        transition-duration: .2s;

        .champion-desable {

            filter: grayscale(100%);
            cursor: default !important;

            &:hover {

                filter: brightness(100%) !important;
                transform: scale(1) !important;

            }

        }

        .champion-visible {

            opacity: 1 !important;
            position: relative !important;
            z-index: 2 !important;
            transition-duration: .2s;

        }

        .champion {

            display: inline-block;
            text-align: center ;
            margin: 1rem;
            position: absolute;
            top: 0;
            opacity: 0;
            z-index: -2;

            .champion-select-frame {

                width: 85px;
                height: 85px;
                border: 4px solid #e7ddcad8;
                position: absolute;
                top: 0;
                left: 0;
                box-sizing: border-box;
                box-shadow: 0 0 10px #e7ddca77;

                .circle {

                    width: 69px;
                    height: 69px;
                    border: 4px solid #e7ddcad8;
                    border-radius: 50%;
                    position: absolute;
                    top: 0;
                    left: 0;
                    box-shadow: 0 0 10px #e7ddca6e;

                }

            }

            .champion-ban-frame {

                width: 85px;
                height: 85px;
                border: 4px solid #da3e48;
                position: absolute;
                top: 0;
                left: 0;
                box-sizing: border-box;
                box-shadow: 0 0 10px #da3e48;

                .circle {

                    width: 69px;
                    height: 69px;
                    border: 4px solid #da3e48;
                    border-radius: 50%;
                    position: absolute;
                    top: 0;
                    left: 0;
                    box-shadow: 0 0 10px #da3e48;

                    .line {

                        width: 71px;
                        height: 8px;
                        background-color: #da3e48;
                        position: absolute;
                        top: calc(50% - 2px);
                        left: 0;
                        transform: rotate(320deg);
                        box-shadow: 0 0 10px #da3e48;

                    }

                }

            }

            .champion-picture {
    
                width: 85px;
                height: 85px;
                display: block;
                cursor: pointer;
                border: 2px solid #ffffff70;
                box-sizing: border-box;

            }

            .champion-name {

                font-family: 'Roboto', sans-serif;
                font-size: 16px;
                color: #918874;
                padding-top: 8px;
                display: block;

            }

            &:hover {

                filter: brightness(110%);
                transform: scale(1.01);

            }

        }

    }

    .button-detail {

        position: absolute;
        opacity: .6;

    }

    .button-detail-left {

        width: 300px;

    }

    .button-detail-right {

        right: 0;
        transform: scaleX(-1);
        width: 300px;

    }

    .accept-button-desabled {

        cursor: default !important;

        img { filter: grayscale(100%); }

        &:hover {

            transform: scale(1) !important;

            img {

                filter: brightness(100%) !important;
                filter: grayscale(100%) !important;

            }

        }

    }

    .accept-button {

        display: flex;
        width: 213px;
        margin: 0 auto;
        justify-content: center;
        z-index: 1;
        position: relative;
        transition-duration: 0.2s;
        margin-top: 12px;
        cursor: pointer;

        img {
            
            transition-duration: .2s;

        }

        span {

            color: #f0e6d2;
            font-size: 1.2rem;
            text-transform: uppercase;
            font-weight: bold;
            background: transparent;
            letter-spacing: 2px;
            position: absolute;
            top: 15px;
            z-index: 2;

        }

        &:hover {

            transform: scale(1.05);

            img {

                filter: brightness(150%);

            }

        }

    }

    .lined-circle-wrapper {

        height: calc(100vh - 321px);
        position: fixed;
        top: 158px;
        left: calc(50% - 450px);
        z-index: 1;
        overflow: hidden;

        .current-champion-selected {

            background-size: cover;
            background-repeat: no-repeat;
            background-position: center;
            width: 900px;
            height: 900px;
            z-index: 1;
            position: absolute;
            top: calc(50% - 450px);
            border-radius: 50%;
            filter: brightness(120%);

        }

        .lined-circle {

            width: 900px;
            animation: Rotate 60s infinite linear;
            position: relative;
            top: calc(50% - 450px);
            z-index: 2;

            @keyframes Rotate {
                
                0% {

                    transform: rotate(0deg);

                }
                100% {

                    transform: rotate(180deg);

                }

            }


        }

    }

    .champion-finalization {

        width: 100%;
        text-align: center;
        position: absolute;
        bottom: 2rem;
        z-index: 2;

        .champion-name {

            color: white;
            font-size: 1.5rem;
            font-style: italic;
            font-family: 'Roboto';

        }

        .skins {

            padding-top: 1rem;

            .skin {

                width: 145px;
                height: 85px;
                border: 2px solid #9a8048;
                margin: 0 auto;
                overflow: hidden;

                img {

                    width: 120%;

                }

            }

        }

    }

    &::after {

        content: '';
        width: 425px;
        height: 43px;
        position: absolute;
        top: 57px;
        left: -100px;
        transform: scale(1.1);
        background-image: url('/assets/images/champion-select/announcement-detail.png');
        z-index: 2;


    }

    &::before {

        content: '';
        width: 425px;
        height: 43px;
        position: absolute;
        top: 57px;
        right: -100px;
        background-image: url('/assets/images/champion-select/announcement-detail.png');
        transform: scaleX(-1) scale(1.1);
        z-index: 2;


    }

    
    .bar-fifteen-seconds {

        animation-name: AnimationBar;
        animation-duration: 15s;
        animation-timing-function: linear;

    }

    
    .bar-thirty-seconds {

        animation-name: AnimationBar;
        animation-duration: 30s;
        animation-timing-function: linear;

    }

    @keyframes AnimationBar {
        0% {

            width: 100%;

        }
        100% {

            width: 0%;

        }
    }

}

footer {

    width: 800px;
    margin: 2rem auto 0;
    display: flex;
    align-items: center;
    justify-items: center;
    justify-content: center;
    position: absolute;
    bottom: 1rem;
    left: calc(50% - 400px);

    .edit-rune {

        width: 35px;
        height: 35px;
        background-color: #1e2328;
        border-radius: 50%;
        border: 2px solid #9d7730;
        transition-duration: .2s;
        cursor: pointer;

        &:hover {

            transform: scale(1.05);
            filter: brightness(150%);

        }

    }

    select {

        background-color: #1e2328;
        font-size: 1rem;
        color: #d4bf90;
        font-weight: bold;
        border: 2px solid #9d7730;
        letter-spacing: 1px;
        padding: .6rem 2rem;
        margin: 0 2rem;
        transition-duration: .2s;
        cursor: pointer;

        &:hover {

            transform: scale(1.05);
            filter: brightness(150%);

        }

    }

    .summoners-spells {

        img {
            
            width: 42px;
            padding: 0 4px

        }

    }

    &::after {

        content: '';
        width: 200px;
        height: 2px;
        background-color: #9d773070;
        position: absolute;
        left: 0;
        z-index: 2;

    }

    &::before {

        content: '';
        width: 200px;
        height: 2px;
        background-color: #9d773070;
        position: absolute;
        right: 0;
        z-index: 2;

    }

}



.ahri { background-position: -550px -5px !important }
.amumu { background-position: -550px -5px !important }
.annie { background-position: -628px -5px !important }
.ashe { background-position: -628px -5px !important }
.azir { background-position: -619px -5px !important }
.brand { background-position: -619px -5px !important }
.braum { 

    background-position: -1095px -5px !important;
    background-size: 2000px !important;

}
.caitlyn { background-position: -619px -5px !important }
.camille { 

    background-position: -1095px -5px !important;
    background-size: 2000px !important;

}
.cassiopeia { background-position: -619px -5px !important }
.chogatch { background-position: -460px -5px !important }
.corki { background-position: -619px -5px !important }
.diana { background-position: -619px -5px !important }
.drmundo { background-position: -619px -5px !important }
.draven { background-position: -619px -5px !important }
.ekko { background-position: -619px -5px !important }
.elise { 

    background-position: -990px -5px !important;
    background-size: 2000px !important;

}
.ezreal { background-position: -619px -5px !important }
.fiora { 

    background-position: -990px -5px !important;
    background-size: 2500px !important;

}
.fizz { background-position: -619px -5px !important }
.galio { 

    background-position: -480px 102px !important;
    background-size: 2000px !important;

}
.gp { background-position: -619px -5px !important }
.graves { background-position: -619px 110px !important }
.illaoi { background-position: -526px 115px !important }
.irelia { background-position: -325px 115px !important }
.janna { background-position: -614px -10px !important }
.jarvan {

    background-position: -929px -5px !important;
    background-size: 2000px !important;

}
.jhin { background-position: -462px 110px !important }
.jinx { background-position: -568px 5px !important }
.kaisa { background-position: -237px 102px !important }
.kalista { background-position: -584px 68px !important }
.katarina { background-position: -470px -37px !important }
.kayle { background-position: -363px 118px !important }
.kayn { background-position: -311px -8px !important }
.khazix { 
    
    background-position: -929px -222px !important;
    background-size: 2000px !important;

}
.kindred { background-position: -550px !important }
.kled { background-position: -536px 72px !important }
.kogmaw { background-position: -597px -61px !important }
.leona { background-position: -619px 68px !important }
.lucian { background-position: -619px 43px !important }
.lux { background-position: -501px 21px !important }
.malphite { background-position: -573px -51px !important }
.malzahar { background-position: -501px 104px !important }
.mordekaiser { background-position: -275px 116px !important }
.morgana { background-position: -145px 30px !important }
.nami { background-position: -618px 30px !important }
.nunu { background-position: -618px -106px !important }
.orianna { background-position: -618px 107px !important }
.poppy { background-position: -618px 98px !important }

================================================
FILE: src/app/modules/client/game/champion-select/champion-select.component.spec.ts
================================================
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { ChampionSelectComponent } from './champion-select.component';

describe('ChampionSelectComponent', () => {
  let component: ChampionSelectComponent;
  let fixture: ComponentFixture<ChampionSelectComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ ChampionSelectComponent ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(ChampionSelectComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: src/app/modules/client/game/champion-select/champion-select.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Champions } from 'src/data/champions';
import { Player } from 'src/data/player';
import { SoundService } from '../../sound.service';

@Component({
  selector: 'app-champion-select',
  templateUrl: './champion-select.component.html',
  styleUrls: ['./champion-select.component.scss']
})
export class ChampionSelectComponent implements OnInit {

  player: any = Player

  champions: any = Champions

  declarePeriod: boolean = false
  banPeriod: boolean = false
  banReviewPeriod: boolean = false
  pickPeriod: boolean = false
  loadOutPeriod: boolean = false

  filter: string = 'all'

  timerActive: boolean = false
  timerNumber: number = 15

  currentChampionSelected: any = null
  currentChampionSelectedIndex: number = null
  currentChampionBanSelected: any = null
  currentChampionBanSelectedIndex: number = null

  playerPick: boolean = false
  allyPicks: any = []
  enemyPicks: any = []

  playerBan: any = null
  allyBans: any = []
  enemyBans: any = []

  championsAvaliables: any = []


  constructor(private router: Router,
              private soundService: SoundService) {

  }

  ngOnInit(): void {

    this.pauseSound('matchFound')

    setTimeout( () => {  this.playSound('championSelectIntro') }, 400)

    setTimeout( () => {

      document.getElementById('player1').classList.remove('ally-team-champs-intro-animation')

      setTimeout( () => {

        document.getElementById('player2').classList.remove('ally-team-champs-intro-animation')

        setTimeout( () => {

          document.getElementById('player3').classList.remove('ally-team-champs-intro-animation')
          document.getElementById('assigned').style.opacity = '1' 

          setTimeout( () => {
  
            document.getElementById('player4').classList.remove('ally-team-champs-intro-animation')

            setTimeout( () => {
    
              document.getElementById('player5').classList.remove('ally-team-champs-intro-animation')

              setTimeout( () => {

                this.initDeclarePeriod()

                setTimeout( () => {

                  this.timerActive = false

                  document.getElementById('allyBarWrapper').classList.remove('blue-bar')
                  document.getElementById('enemyBarWrapper').classList.remove('blue-bar')
                  document.getElementById('allyBar').classList.remove('bar-fifteen-seconds')
                  document.getElementById('enemyBar').classList.remove('bar-fifteen-seconds')
                  document.getElementById('allyBarWrapper').classList.add('red-bar')
                  document.getElementById('enemyBarWrapper').classList.add('red-bar')

                  setTimeout( () => {
  
                    this.initBanPeriod()

                    setTimeout( () => {

                      if(this.timerActive == true) {

                        this.timerActive = false  

                      }

                      if(this.playerBan == null) {

                        this.router.navigateByUrl('/client/play/lobby')

                      }

                    }, 31000)
  
                  }, 100)

                }, 15000)

              },1000 )
    
            },700 )
  
          },800 )

        },500 )

      },700 )

    }, 1700 )

  }



  initDeclarePeriod() {

    this.declarePeriod = true

    this.playSound('championSelectChampionsVisible')

    document.getElementById('assigned').style.opacity = '0' 
    document.getElementById('overlayBackground').style.opacity = '.6' 
    document.getElementById('mainContent').style.opacity = '1' 
    document.getElementById('mainContent').style.zIndex = '1' 
    document.getElementById('player1').classList.add('ally-team-champs-border')
    document.getElementById('player2').classList.add('ally-team-champs-border')
    document.getElementById('player3').classList.add('ally-team-champs-border')
    document.getElementById('player4').classList.add('ally-team-champs-border')
    document.getElementById('player5').classList.add('ally-team-champs-border')

    document.getElementById('allyBarWrapper').classList.add('blue-bar')
    document.getElementById('enemyBarWrapper').classList.add('blue-bar')
    document.getElementById('allyBar').classList.add('bar-fifteen-seconds')
    document.getElementById('enemyBar').classList.add('bar-fifteen-seconds')

    this.timerActive = true
    this.initTimer()

  }



  initBanPeriod() {

    this.declarePeriod = false
    this.banPeriod = true

    this.playSound('championSelectBanIntro')

    document.getElementById('overlayBackground').classList.add('overlay-background-ban')
    document.getElementById('allyBar').classList.add('bar-thirty-seconds')
    document.getElementById('enemyBar').classList.add('bar-thirty-seconds')
    document.getElementById('enemyTeamChamps').classList.add('enemy-team-champs-visible')

    this.timerNumber = 30
    this.timerActive = true
    this.initTimer()

  }



  initBanReviewPeriod() {

    document.getElementById('allyBarWrapper').style.opacity = '0'
    document.getElementById('enemyBarWrapper').style.opacity = '0'
    document.getElementById('allyBar').classList.remove('bar-thirty-seconds')
    this.banPeriod = false
    this.banReviewPeriod = true
    this.timerActive = false
    this.timerNumber = 30

    setTimeout( () => { this.playSound('championSelectBanReviewIntro') }, 4000 )

    do {

      let randomChampion = this.champions[Math.floor(Math.random() * this.champions.length)]

      this.allyBans.push(randomChampion)

    } while( this.allyBans.length < 4 )

    do {

      let randomChampion = this.champions[Math.floor(Math.random() * this.champions.length)]

      this.enemyBans.push(randomChampion)

    } while( this.enemyBans.length < 5 )

    setTimeout( () => {

      for(let ban of this.enemyBans) {
  
        this.champions[this.champions.indexOf(ban)].selectable = false
  
      }

      for(let ban of this.allyBans) {
  
        this.champions[this.champions.indexOf(ban)].selectable = false
  
      }

      this.championsAvaliables = this.champions.filter(champion => champion.selectable == true)

      do {

        let randomChampion = this.championsAvaliables[Math.floor(Math.random() * this.championsAvaliables.length)]
  
        this.enemyPicks.push(randomChampion)
  
      } while( this.enemyPicks.length < 5 )

      do {

        let randomChampion = this.championsAvaliables[Math.floor(Math.random() * this.championsAvaliables.length)]
  
        this.allyPicks.push(randomChampion)
  
      } while( this.allyPicks.length < 4 )

    },2000 )

    setTimeout( () => {

      document.getElementById('overlayBackground').classList.remove('overlay-background-ban')
      document.getElementById('bans').style.opacity = '0'
      document.getElementById('bans').style.zIndex = '-2'
      document.getElementById('chamiponList').style.opacity = '1'
      document.getElementById('chamiponList').style.zIndex = '2'

      this.initPickPeriod()

    }, 7000 )


  }



  initPickPeriod() {

    this.playSound('championSelectPickIntro')
    this.playSound('pickPeriodIntro')

    document.getElementById('allyBarWrapper').classList.remove('red-bar')
    document.getElementById('allyBarWrapper').classList.add('blue-bar')
    document.getElementById('allyBarWrapper').style.opacity = '1'
    document.getElementById('allyBar').classList.add('bar-thirty-seconds')
    this.banReviewPeriod = false
    this.pickPeriod = true
    this.timerNumber = 30
    this.timerActive = true

    setTimeout(()=> { 

      if(this.playerPick == false) {
        
        this.router.navigateByUrl('/client/play/lobby')

      }

     }, 30000)

  }



  initLoadOutPeriod() {

    this.playSound('championSelectLoadoutIntro')

    this.loadOutPeriod = true
    document.getElementById('allyBar').classList.add('bar-thirty-seconds')
    document.getElementById('allyBar').style.width = '100%'
    document.getElementById('enemyBarWrapper').classList.add('blue-bar')
    document.getElementById('enemyBar').classList.add('bar-thirty-seconds')
    document.getElementById('enemyBar').style.width = '100%'

    localStorage.setItem('playerPick', JSON.stringify(this.currentChampionSelected))
    localStorage.setItem('allyTeam', JSON.stringify(this.allyPicks))
    localStorage.setItem('enemyTeam', JSON.stringify(this.enemyPicks))

    setTimeout(()=> { 

      this.router.navigateByUrl('/client/game/loading')

     }, 30000)

  }



  initTimer() {

    setTimeout( () => {

      this.timerNumber = this.timerNumber - 1

      if(this.timerNumber > 0) {

        if(this.timerNumber < 6) {

          if(this.declarePeriod == true) {

            this.playSound('championSelectTimerCount')

          } else {

            this.playSound('championSelectTimer')

          }

        }

        this.initTimer()

      }

    }, 1000)


  }



  pickEnemyChampions() {

    do {

      let randomChampion = this.champions[Math.floor(Math.random() * this.champions.length)]

      this.enemyBans.push(randomChampion)

    } while( this.enemyPicks.length < 5 )

    setTimeout( () => {

      for(let ban of this.enemyBans) {
  
        this.champions[this.champions.indexOf(ban)].selectable = false
  
    }

    }, 2000)

  }



  selectChampion(champion, index) {

    if(this.champions[index].selectable == true) {

      if(this.declarePeriod || this.pickPeriod) {

        this.currentChampionSelected = champion
        this.currentChampionSelectedIndex = index

      } else if(this.banPeriod) {

        this.currentChampionBanSelected = champion
        this.currentChampionBanSelectedIndex = index

      }

    }

  }



  banChampion() {

    if(this.currentChampionBanSelected !== null) {

      this.playSound('changeGameModeButtonClick')
      this.playSound('championSelectBan')
      
      document.getElementById('chamiponList').style.opacity = '0'
      document.getElementById('chamiponList').style.zIndex = '-1'

      this.playerBan = this.currentChampionBanSelected
      this.champions[this.currentChampionBanSelectedIndex].selectable = false

      this.initBanReviewPeriod()

    }

  }



  pickChampion() {

    if(this.currentChampionSelected !== null) {

      this.playSound('championSelectPick')

      this.playerPick = true
      this.pickPeriod = false
      this.timerActive = false
      this.timerNumber = 30
      document.getElementById('chamiponList').style.opacity = '0'
      document.getElementById('chamiponList').style.zIndex = '-2'
      document.getElementById('allyBar').classList.remove('bar-thirty-seconds')
      document.getElementById('enemyBar').classList.remove('bar-thirty-seconds')
      document.getElementById('enemyBarWrapper').classList.remove('red-bar')

      setTimeout(()=>{

        this.initLoadOutPeriod()

      },1)

    }

  }



  changeFilter(filter) {

    this.playSound('championSelectChampionsFilter')

    if(this.filter == filter) {

      this.filter = 'all'

    } else {

      this.filter = filter

    }

  }

  adjustChampion(champion) {

    switch (champion) {
      case 'Ahri':
        return 'ahri'
      case 'Amumu':
        return 'amumu'
      case 'Annie':
        return 'annie'
      case 'Ashe':
        return 'ashe'
      case 'Azir':
        return 'azir'
      case 'Brand':
        return 'brand'
      case 'Braum':
        return 'braum'
      case 'Caitlyn':
        return 'caitlyn'
      case 'Camille':
        return 'camille'
      case 'Cassiopeia':
        return 'cassiopeia'
      case "Cho'Gatch":
        return 'chogatch'
      case 'Corki':
        return 'corki'
      case 'Diana':
        return 'diana'
      case 'Dr.Mundo':
        return 'drmundo'
      case 'Draven':
        return 'draven'
      case 'Ekko':
        return 'ekko'
      case 'Elise':
        return 'elise'
      case 'Ezreal':
        return 'ezreal'
      case 'Fiora':
        return 'fiora'
      case 'Fizz':
        return 'fizz'
      case 'Galio':
        return 'galio'
      case 'Gangplank':
        return 'gp'
      case 'Garen':
        return 'gp'
      case 'Gnar':
        return 'gp'
      case 'Gragas':
        return 'gp'
      case 'Graves':
        return 'graves'
      case 'Hecarim':
        return 'graves'
      case 'Heimerdinger':
        return 'gp'
      case 'Illaoi':
        return 'illaoi'
      case 'Irelia':
        return 'irelia'
      case 'Janna':
        return 'janna'
      case 'Jarvan IV':
        return 'jarvan'
      case 'Jax':
        return 'jarvan'
      case 'Jayce':
        return 'jarvan'
      case 'Jhin':
        return 'jhin'
      case 'Jinx':
        return 'jinx'
      case "Kai'Sa":
        return 'kaisa'
      case 'Kalista':
        return 'kalista'
      case 'Karma':
        return 'kalista'
      case 'Karthus':
        return 'kalista'
      case 'Kassadin':
        return 'kalista'
      case 'Katarina':
        return 'katarina'
      case 'Kayle':
        return 'kayle'
      case 'Kayn':
        return 'kayn'
      case 'Kennen':
        return 'jarvan'
      case "Kha'Zix":
        return 'khazix'
      case 'Kindred':
        return 'kindred'
      case 'Kled':
        return 'kled'
      case `Kog'Maw`:
        return 'kogmaw'
      case 'Leona':
        return 'leona'
      case 'Lissandra':
        return 'leona'
      case 'Lucian':
        return 'lucian'
      case 'Lulu':
        return 'leona'
      case 'Lux':
        return 'lux'
      case 'Malphite':
        return 'malphite'
      case 'Malzahar':
        return 'malzahar'
      case 'Maokai':
        return 'lucian'
      case 'Master Yi':
        return 'lux'
      case 'Miss Fortune':
        return 'lux'
      case 'Mordekaiser':
        return 'mordekaiser'
      case 'Morgana':
        return 'morgana'
      case 'Nami':
        return 'nami'
      case 'Nasus':
        return 'nami'
      case 'Nautilus':
        return 'nami'
      case 'Nidalee':
        return 'nami'
      case 'Nocturne':
        return 'nami'
      case 'Nunu & Willump':
        return 'nunu'
      case 'Orianna':
        return 'orianna'
      case 'Poppy':
        return 'poppy'
      case 'Quinn':
        return 'three-hundred-sixty-pixels'
      case 'Rakan':
        return 'three-hundred-sixty-pixels'
      case 'Rammus':
        return 'three-hundred-sixty-pixels'
      case 'Rengar':
        return 'three-hundred-sixty-pixels'
      case 'Riven':
        return 'three-hundred-pixels'
      case 'Rumble':
        return 'three-hundred-sixty-pixels'
      case 'Ryze':
        return 'three-hundred-pixels'
      case 'Sejuani':
        return 'three-hundred-sixty-pixels'
      case 'Shaco':
        return 'three-hundred-pixels'
      case 'Shen':
        return 'three-hundred-pixels'
      case 'Shyvana':
        return 'three-hundred-twenty-five-pixels'
      case 'Singed':
        return 'three-hundred-twenty-five-pixels'
      case 'Sion':
        return 'three-hundred-twenty-five-pixels'
      case 'Sivir':
        return 'three-hundred-sixty-pixels'
      case 'Skarner':
        return 'three-hundred-sixty-pixels'
      case 'Skarner':
        return 'three-hundred-sixty-pixels'
      case 'Sona':
        return 'three-hundred-sixty-pixels'
      case 'Swain':
        return 'three-hundred-sixty-pixels'
      case 'Syndra':
        return 'three-hundred-pixels'
      case 'Tahm Kench':
        return 'three-hundred-twenty-five-pixels'
      case 'Taliyah':
        return 'three-hundred-twenty-five-pixels'
      case 'Talon':
        return 'three-hundred-sixty-pixels'
      case 'Taric':
        return 'three-hundred-pixels'
      case 'Teemo':
        return 'three-hundred-pixels'
      case 'Thresh':
        return 'three-hundred-sixty-pixels'
      case 'Tristana':
        return 'three-hundred-sixty-pixels'
      case 'Trundle':
        return 'three-hundred-sixty-pixels'
      case 'Tryndamere':
        return 'three-hundred-pixels'
      case 'Twisted Fate':
        return 'three-hundred-pixels'
      case 'Vayne':
        return 'three-hundred-pixels'
      case 'Veigar':
        return 'three-hundred-sixty-pixels'
      case 'Vi':
        return 'three-hundred-sixty-pixels'
      case 'Viego':
        return 'three-hundred-sixty-pixels'
      case 'Viktor':
        return 'three-hundred-sixty-pixels'
      case 'Vladimir':
        return 'three-hundred-sixty-pixels'
      case 'Volibear':
        return 'three-hundred-sixty-pixels'
      case 'Warwick':
        return 'three-hundred-sixty-pixels'
      case 'Wukong':
        return 'three-hundred-sixty-pixels'
      case 'Xayah':
        return 'three-hundred-sixty-pixels'
      case 'Yasuo':
        return 'three-hundred-pixels'
      case 'Yorick':
        return 'three-hundred-sixty-pixels'
      case 'Yuumi':
        return 'four-hundred-seventy-pixels'
      case 'Zac':
        return 'three-hundred-sixty-pixels'
      case 'Zed':
        return 'three-hundred-twenty-five-pixels'
      case 'Ziggs':
        return 'three-hundred-pixels'
      case 'Zyra':
        return 'three-hundred-pixels'
    }

  }



  playSound(sound) {

    this.soundService.playSound(sound)

  }



  pauseSound(sound) {

    this.soundService.pauseSound(sound)

  }

}


================================================
FILE: src/app/modules/client/game/game-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { ChampionSelectComponent } from './champion-select/champion-select.component';
import { LoadingComponent } from './loading/loading.component';

const routes: Routes = [

  { path: 'champion-select', component: ChampionSelectComponent },
  { path: 'loading', component: LoadingComponent }

];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class GameRoutingModule { }


================================================
FILE: src/app/modules/client/game/game.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { GameRoutingModule } from './game-routing.module';
import { ChampionSelectComponent } from './champion-select/champion-select.component';
import { LoadingComponent } from './loading/loading.component';


@NgModule({
  declarations: [ChampionSelectComponent, LoadingComponent],
  imports: [
    CommonModule,
    GameRoutingModule
  ]
})
export class GameModule { }


================================================
FILE: src/app/modules/client/game/loading/loading.component.html
================================================
<video class="video-background" autoplay loop muted>
    <source src="https://lolstatic-a.akamaihd.net/frontpage/apps/prod/signup/pt_BR/8e94ec10717c7745c7506cd9597327cb3d12485b/assets/pt_BR/assets/summoners-rift.mp4" type="video/mp4">
</video>

<a [ngClass]="{'back-home': backHome}" routerLink="/client/home/overview">Back to home</a>

<div id="container" class="container">

    <div class="teams">

        <ul id="blueTeam" class="team blue-team">
            <li class="blue-team" [ngClass]="adjustChampion(allyTeam[0].name)" style="background-image: url('{{allyTeam[0].coverPicture}}')">
                <div class="wrapper">
                    <div class="informations">
                        <span class="champion-name">{{allyTeam[0].name}}</span>
                        <img class="profile-image" src="https://opgg-static.akamaized.net/images/profile_icons/profileIcon3890.jpg?image=q_auto:best&v=1518361200">
                        <span class="player-name">Teste</span>
                        <div class="summoners-spells">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerFlash.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerDot.png?image=c_scale,q_auto,w_42&v=1612855207">
                        </div>
                        <div class="runes">
                            <img class="primary-rune" src="https://opgg-static.akamaized.net/images/lol/perk/8439.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img class="secondary-rune" src="https://opgg-static.akamaized.net/images/lol/perkStyle/8300.png?image=c_scale,q_auto,w_32&v=1612855207">
                        </div>
                        <div class="rank">
                            <img src="https://i.pinimg.com/originals/6a/10/c7/6a10c7e84c9f4e4aa9412582d28f3fd2.png">
                            <span class="tier">Diamound III</span>
                            <span class="lp">87 lp</span>
                        </div>
                        <div class="maestry">
                            <img src="https://i.pinimg.com/originals/3e/d0/4e/3ed04e8a94b7ddc38712c67575210159.png">
                            <span class="points">2.000.000</span>
                        </div>
                    </div>
                </div>
            </li>
            <li class="blue-team" [ngClass]="adjustChampion(allyTeam[1].name)" style="background-image: url('{{allyTeam[1].coverPicture}}')">
                <div class="wrapper">
                    <div class="informations">
                        <span class="champion-name">{{allyTeam[1].name}}</span>
                        <img class="profile-image" src="https://opgg-static.akamaized.net/images/profile_icons/profileIcon3890.jpg?image=q_auto:best&v=1518361200">
                        <span class="player-name">Teste</span>
                        <div class="summoners-spells">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerFlash.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerDot.png?image=c_scale,q_auto,w_42&v=1612855207">
                        </div>
                        <div class="runes">
                            <img class="primary-rune" src="https://opgg-static.akamaized.net/images/lol/perk/8439.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img class="secondary-rune" src="https://opgg-static.akamaized.net/images/lol/perkStyle/8300.png?image=c_scale,q_auto,w_32&v=1612855207">
                        </div>
                        <div class="rank">
                            <img src="https://i.pinimg.com/originals/6a/10/c7/6a10c7e84c9f4e4aa9412582d28f3fd2.png">
                            <span class="tier">Diamound III</span>
                            <span class="lp">87 lp</span>
                        </div>
                        <div class="maestry">
                            <img src="https://i.pinimg.com/originals/3e/d0/4e/3ed04e8a94b7ddc38712c67575210159.png">
                            <span class="points">2.000.000</span>
                        </div>
                    </div>
                </div>
            </li>
            <li class="blue-team" [ngClass]="adjustChampion(playerPick.name)" style="background-image: url('{{playerPick.coverPicture}}')">
                <div class="wrapper">
                    <div class="informations">
                        <span class="champion-name">{{playerPick.name}}</span>
                        <img class="profile-image" src="https://opgg-static.akamaized.net/images/profile_icons/profileIcon3890.jpg?image=q_auto:best&v=1518361200">
                        <span class="current-player player-name">{{player.name}}</span>
                        <div class="summoners-spells">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerFlash.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerDot.png?image=c_scale,q_auto,w_42&v=1612855207">
                        </div>
                        <div class="runes">
                            <img class="primary-rune" src="https://opgg-static.akamaized.net/images/lol/perk/8439.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img class="secondary-rune" src="https://opgg-static.akamaized.net/images/lol/perkStyle/8300.png?image=c_scale,q_auto,w_32&v=1612855207">
                        </div>
                        <div class="rank">
                            <img src="https://i.pinimg.com/originals/6a/10/c7/6a10c7e84c9f4e4aa9412582d28f3fd2.png">
                            <span class="tier">Diamound III</span>
                            <span class="lp">87 lp</span>
                        </div>
                        <div class="maestry">
                            <img src="https://i.pinimg.com/originals/3e/d0/4e/3ed04e8a94b7ddc38712c67575210159.png">
                            <span class="points">2.000.000</span>
                        </div>
                    </div>
                </div>
            </li>
            <li class="blue-team" [ngClass]="adjustChampion(allyTeam[2].name)" style="background-image: url('{{allyTeam[2].coverPicture}}')">
                <div class="wrapper">
                    <div class="informations">
                        <span class="champion-name">{{allyTeam[2].name}}</span>
                        <img class="profile-image" src="https://opgg-static.akamaized.net/images/profile_icons/profileIcon3890.jpg?image=q_auto:best&v=1518361200">
                        <span class="player-name">Teste</span>
                        <div class="summoners-spells">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerFlash.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerDot.png?image=c_scale,q_auto,w_42&v=1612855207">
                        </div>
                        <div class="runes">
                            <img class="primary-rune" src="https://opgg-static.akamaized.net/images/lol/perk/8439.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img class="secondary-rune" src="https://opgg-static.akamaized.net/images/lol/perkStyle/8300.png?image=c_scale,q_auto,w_32&v=1612855207">
                        </div>
                        <div class="rank">
                            <img src="https://i.pinimg.com/originals/6a/10/c7/6a10c7e84c9f4e4aa9412582d28f3fd2.png">
                            <span class="tier">Diamound III</span>
                            <span class="lp">87 lp</span>
                        </div>
                        <div class="maestry">
                            <img src="https://i.pinimg.com/originals/3e/d0/4e/3ed04e8a94b7ddc38712c67575210159.png">
                            <span class="points">2.000.000</span>
                        </div>
                    </div>
                </div>
            </li>
            <li class="blue-team" [ngClass]="adjustChampion(allyTeam[3].name)" style="background-image: url('{{allyTeam[3].coverPicture}}')">
                <div class="wrapper">
                    <div class="informations">
                        <span class="champion-name">{{allyTeam[3].name}}</span>
                        <img class="profile-image" src="https://opgg-static.akamaized.net/images/profile_icons/profileIcon3890.jpg?image=q_auto:best&v=1518361200">
                        <span class="player-name">Teste</span>
                        <div class="summoners-spells">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerFlash.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerDot.png?image=c_scale,q_auto,w_42&v=1612855207">
                        </div>
                        <div class="runes">
                            <img class="primary-rune" src="https://opgg-static.akamaized.net/images/lol/perk/8439.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img class="secondary-rune" src="https://opgg-static.akamaized.net/images/lol/perkStyle/8300.png?image=c_scale,q_auto,w_32&v=1612855207">
                        </div>
                        <div class="rank">
                            <img src="https://i.pinimg.com/originals/6a/10/c7/6a10c7e84c9f4e4aa9412582d28f3fd2.png">
                            <span class="tier">Diamound III</span>
                            <span class="lp">87 lp</span>
                        </div>
                        <div class="maestry">
                            <img src="https://i.pinimg.com/originals/3e/d0/4e/3ed04e8a94b7ddc38712c67575210159.png">
                            <span class="points">2.000.000</span>
                        </div>
                    </div>
                </div>
            </li>
        </ul>

        <ul id="redTeam" class="team red-team">
            <li *ngFor="let enemy of enemyTeam" [ngClass]="adjustChampion(enemy.name)" class="blue-team" style="background-image: url('{{enemy.coverPicture}}')">
                <div class="wrapper">
                    <div class="informations">
                        <span class="champion-name">{{enemy.name}}</span>
                        <img class="profile-image" src="https://opgg-static.akamaized.net/images/profile_icons/profileIcon3890.jpg?image=q_auto:best&v=1518361200">
                        <span class="player-name">Teste</span>
                        <div class="summoners-spells">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerFlash.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img src="https://opgg-static.akamaized.net/images/lol/spell/SummonerDot.png?image=c_scale,q_auto,w_42&v=1612855207">
                        </div>
                        <div class="runes">
                            <img class="primary-rune" src="https://opgg-static.akamaized.net/images/lol/perk/8439.png?image=c_scale,q_auto,w_42&v=1612855207">
                            <img class="secondary-rune" src="https://opgg-static.akamaized.net/images/lol/perkStyle/8300.png?image=c_scale,q_auto,w_32&v=1612855207">
                        </div>
                        <div class="rank">
                            <img src="https://i.pinimg.com/originals/6a/10/c7/6a10c7e84c9f4e4aa9412582d28f3fd2.png">
                            <span class="tier">Diamound I</span>
                            <span class="lp">27 lp</span>
                        </div>
                        <div class="maestry">
                            <img src="https://i.pinimg.com/originals/3e/d0/4e/3ed04e8a94b7ddc38712c67575210159.png">
                            <span class="points">25.200</span>
                        </div>
                    </div>
                </div>
            </li>
        </ul>

    </div>

</div>

================================================
FILE: src/app/modules/client/game/loading/loading.component.scss
================================================
.video-background {
    
    position: fixed;
    width: 100vw;
    height: 100vh;
    top: 0;
    left: 0;
    transform: scale(1.8);

}

.back-home {

    right: 1rem !important;
    opacity: 1;

}

a {

    color: #938f83;
    background-color: #1e2328;
    text-decoration: none;
    text-transform: uppercase;
    font-weight: bold;
    margin-top: 2rem;
    padding: 0.8rem 2rem;
    display: inline-block;
    border: 2px solid #c8aa6d;
    transition-duration: 0.2s;
    z-index: 2;
    cursor: pointer;
    position: fixed;
    transition-duration: 1s;
    bottom: 1rem;
    right: -12rem;
    opacity: 0;

    &:hover {

        transform: scale(1.1);
        filter: brightness(120%);

    }

}

.container {

    width: 100%;
    height: 100vh;
    backdrop-filter: blur(6px);
    background: rgb(0,224,255);
    background: linear-gradient(180deg, rgba(0, 225, 255, 0.200) 0%, rgba(135,105,139,0) 50%, rgba(255,0,36,0.200) 100%);
    overflow: hidden;

    .teams {

        display: flex;
        flex-flow: column;
        justify-content: center;
        align-items: center;
        height: 100vh;
        transition-duration: .2s;

        .team {

            color: white;
            font-size: 18px;
            display: flex;
            flex-wrap: wrap;
            align-items: center;
            justify-content: space-around;
            padding: 2rem 0;

        }

        li {

            background-size: cover;
            background-position: center;
            height: 400px;
            border: solid 2px #88652b;
            width: 250px;
            margin: 0 1rem;
            transition-duration: .5s;
            transform: scale(1);
            opacity: 0;

            .wrapper {

                overflow: hidden;
                width: 100%;
                height: 100%;

            }

            .informations {

                width: 100%;
                height: 510px;
                background: rgb(255,0,36);
                background: linear-gradient(180deg, #ff002400 0%, #000000a8 30%);
                margin-top: 282px;
                text-align: center;
                position: relative;
                transition-duration: .5s;

                .profile-image {

                    display: block;
                    width: 50px;
                    margin: .8rem auto 4px;
                    border-radius: 50%;
                    border: 2px solid #c69f43;

                }

                .player-name {

                    font-size: 14px;
                    padding-top: 12px;

                }

                .current-player {

                    color: #c69f43;

                }

                .summoners-spells {

                    position: absolute;
                    top: 42px;
                    left: 2px;

                    img {

                        width: 34px;
                        margin: 0 .2rem;
                        border: 2px solid #6464627c;
                        box-sizing: border-box;

                    }

                }

                .runes {

                    position: absolute;
                    top: 30px;
                    right: -14px;

                    img {

                        background-color: #000000b9;
                        border-radius: 50%;
                        border: 2px solid #c69f43;
                        padding: 2px;

                    }

                    .primary-rune {

                        width: 40px;
                        position: relative;
                        z-index: 1;

                    }

                    .secondary-rune {

                        width: 25px;
                        position: relative;
                        z-index: 2;
                        top: 10px;
                        left: -20px;

                    }


                }

                &::before {

                    content: '';
                    position: absolute;
                    top: 1.2rem;
                    left: 0;
                    background-image: url('./../../../../../assets/images/loading-screen/loading-screen-detail.png');
                    width: 85px;
                    height: 15px;

                }

                &::after {

                    content: '';
                    position: absolute;
                    top: 1.2rem;
                    right: 0;
                    background-image: url('./../../../../../assets/images/loading-screen/loading-screen-detail.png');
                    width: 85px;
                    height: 15px;
                    transform: rotateY(180deg);

                }

                .rank {

                    img {
                    
                        padding-top: 32px;
                        width: 160px;
                    }

                    span {

                        color: #ffffffad;
                        font-size: 18px;
                        text-transform: uppercase;
                        font-weight: bold;
                        letter-spacing: 2px;
                        display: block;

                    }

                    .tier {

                        font-size: 18px;

                    }

                    .lp {

                        padding-top: 12px;
                        font-size: 14px;

                    }

                }

                .maestry {

                    img {
                    
                        padding-top: 32px;
                        width: 60px;
                    
                    }

                    .points {

                        color: #ffffffad;
                        font-size: 12px;
                        display: block;

                    }

                }

            }

            &:hover {

                transform: scale(1.1) !important;
                box-shadow: 0 0 60px rgba(0, 0, 0, 0.500);

                .informations {

                    transform: translateY(-390px);

                }

            }

        }

        .blue-team {

            position: relative;
            left: -12px;

            li {

                animation: FadeInDown 1s forwards;
                position: relative;

                @keyframes FadeInDown {
                    
                    0% {

                        opacity: 0;
                        top: -80px;

                    }
                    100% {

                        opacity: 1;
                        top: 0;

                    }

                }

                &:nth-child(2) {

                    animation-delay: .2s;

                }

                &:nth-child(3) {

                    animation-delay: .3s;

                }

                &:nth-child(4) {

                    animation-delay: .4s;

                }

                &:nth-child(5) {

                    animation-delay: .5s;

                }

                &::after {

                    content: '';
                    background-image: url('./../../../../../assets/images/loading-screen/border-detail.png');
                    background-position: center;
                    background-repeat: no-repeat;
                    background-size: cover;
                    width: 250px;
                    height: 15px;
                    position: absolute;
                    bottom: -15px;

                }

            }

        }

        .red-team {

            position: relative;
            right: -12px;

            li {

                animation: FadeInUp 1s forwards;
                position: relative;

                @keyframes FadeInUp {
                    
                    0% {

                        opacity: 0;
                        bottom: -80px;

                    }
                    100% {

                        opacity: 1;
                        bottom: 0;

                    }

                }

                &:nth-child(1) {

                    animation-delay: .5s;

                }

                &:nth-child(2) {

                    animation-delay: .4s;

                }

                &:nth-child(3) {

                    animation-delay: .3s;

                }

                &:nth-child(4) {

                    animation-delay: .2s;

                }

                &::after {

                    content: '';
                    background-image: url('./../../../../../assets/images/loading-screen/border-detail.png');
                    background-position: center;
                    background-repeat: no-repeat;
                    background-size: cover;
                    width: 250px;
                    height: 15px;
                    position: absolute;
                    top: -15px;
                    transform: rotateX(160deg);

                }

            }

        }

    }

}

.two-hundred-sixty-five-pixels {

    background-position: 265px !important;

}

.two-hundred-seventy-five-pixels {

    background-position: 275px !important;

}

.two-hundred-ninety-pixels {

    background-position: 290px !important;

}

.two-hundred-ninety-five-pixels {

    background-position: 295px !important;

}

.three-hundred-pixels {

    background-position: 300px !important;

}

.three-hundred-ten-pixels {

    background-position: 310px !important;

}

.three-hundred-fifteen-pixels {

    background-position: 315px !important;

}

.three-hundred-twenty-five-pixels {

    background-position: 325px !important;

}

.three-hundred-fourty-five-pixels {

    background-position: 345px !important;

}

.three-hundred-sixty-pixels {

    background-position: 360px !important;

}

.three-hundred-ninety-pixels {

    background-position: 390px !important;

}

.four-hundred-pixels {

    background-position: 400px !important;

}

.four-hundred-fifteen-pixels {

    background-position: 415px !important;

}

.four-hundred-thirty-pixels {

    background-position: 430px !important;

}

.four-hundred-forty-pixels {

    background-position: 440px !important;

}

.four-hundred-seventy-pixels {

    background-position: 470px !important;

}

.five-hundred-forty-pixels {

    background-position: 540px !important;

}

================================================
FILE: src/app/modules/client/game/loading/loading.component.spec.ts
================================================
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { LoadingComponent } from './loading.component';

describe('LoadingComponent', () => {
  let component: LoadingComponent;
  let fixture: ComponentFixture<LoadingComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ LoadingComponent ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(LoadingComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: src/app/modules/client/game/loading/loading.component.ts
================================================
import { Component, HostListener, OnInit } from '@angular/core';

@Component({
  selector: 'app-loading',
  templateUrl: './loading.component.html',
  styleUrls: ['./loading.component.scss']
})
export class LoadingComponent implements OnInit {

  player: any = localStorage.getItem('username')
  playerPick: any = JSON.parse(localStorage.getItem('playerPick'))
  allyTeam: any = JSON.parse(localStorage.getItem('allyTeam'))
  enemyTeam: any = JSON.parse(localStorage.getItem('enemyTeam'))
  backHome: boolean = false

  constructor() { }

  ngOnInit(): void {

    setTimeout(() => {this.backHome = true}, 2000)

  }



  adjustChampion(champion) {

    switch (champion) {
      case 'Ahri':
        return 'three-hundred-sixty-pixels'
      case 'Aatrox':
        return 'three-hundred-sixty-pixels'
      case 'Alistar':
        return 'three-hundred-ninety-pixels'
      case 'Amumu':
        return 'three-hundred-sixty-pixels'
      case 'Annie':
        return 'two-hundred-sixty-five-pixels'
      case 'Ashe':
        return 'three-hundred-ten-pixels'
      case 'Aurelion Sol':
        return 'four-hundred-thirty-pixels'
      case 'Azir':
        return 'three-hundred-fifteen-pixels'
      case 'Bard':
        return 'three-hundred-sixty-pixels'
      case 'Blitzcrank':
        return 'three-hundred-twenty-five-pixels'
      case 'Brand':
        return 'two-hundred-seventy-five-pixels'
      case 'Braum':
        return 'two-hundred-ninety-pixels'
      case 'Caitlyn':
        return 'two-hundred-ninety-five-pixels'
      case 'Camille':
        return 'two-hundred-ninety-five-pixels'
      case 'Cassiopeia':
        return 'three-hundred-sixty-pixels'
      case "Cho'Gatch":
        return 'three-hundred-sixty-pixels'
      case 'Corki':
        return 'three-hundred-fifteen-pixels'
      case 'Darius':
        return 'three-hundred-ninety-pixels'
      case 'Diana':
        return 'three-hundred-fifteen-pixels'
      case 'Dr.Mundo':
        return 'three-hundred-fifteen-pixels'
      case 'Draven':
        return 'three-hundred-twenty-five-pixels'
      case 'Ekko':
        return 'three-hundred-twenty-five-pixels'
      case 'Elise':
        return 'three-hundred-twenty-five-pixels'
      case 'Evelynn':
        return 'four-hundred-forty-pixels'
      case 'Ezreal':
        return 'three-hundred-sixty-pixels'
      case 'Fiddlesticks':
        return 'five-hundred-forty-pixels'
      case 'Fiora':
        return 'three-hundred-sixty-pixels'
      case 'Fizz':
        return 'three-hundred-pixels'
      case 'Galio':
        return 'four-hundred-seventy-pixels'
      case 'Gangplank':
        return 'three-hundred-pixels'
      case 'Garen':
        return 'three-hundred-pixels'
      case 'Gnar':
        return 'three-hundred-pixels'
      case 'Gragas':
        return 'three-hundred-sixty-pixels'
      case 'Graves':
        return 'three-hundred-sixty-pixels'
      case 'Hecarim':
        return 'three-hundred-pixels'
      case 'Heimerdinger':
        return 'three-hundred-pixels'
      case 'Illaoi':
        return 'three-hundred-fourty-five-pixels'
      case 'Irelia':
        return 'four-hundred-forty-pixels'
      case 'Ivern':
        return 'four-hundred-forty-pixels'
      case 'Janna':
        return 'two-hundred-ninety-pixels'
      case 'Jarvan IV':
        return 'three-hundred-fourty-five-pixels'
      case 'Jax':
        return 'three-hundred-fourty-five-pixels'
      case 'Jayce':
        return 'three-hundred-fourty-five-pixels'
      case 'Jhin':
        return 'four-hundred-fifteen-pixels'
      case 'Jinx':
        return 'three-hundred-fourty-five-pixels'
      case "Kai'Sa":
        return 'four-hundred-seventy-pixels'
      case 'Kalista':
        return 'three-hundred-sixty-pixels'
      case 'Karma':
        return 'three-hundred-pixels'
      case 'Karthus':
        return 'four-hundred-pixels'
      case 'Kassadin':
        return 'three-hundred-ten-pixels'
      case 'Katarina':
        return 'three-hundred-sixty-pixels'
      case 'Kayle':
        return 'four-hundred-thirty-pixels'
      case 'Kayle':
        return 'four-hundred-thirty-pixels'
      case 'Kennen':
        return 'three-hundred-twenty-five-pixels'
      case "Kha'Zix":
        return 'three-hundred-twenty-five-pixels'
      case 'Kindred':
        return 'three-hundred-twenty-five-pixels'
      case 'Kled':
        return 'three-hundred-pixels'
      case "Kog'Maw":
        return 'three-hundred-pixels'
      case 'LeBlanc':
        return 'three-hundred-twenty-five-pixels'
      case 'Lee Sin':
        return 'three-hundred-sixty-pixels'
      case 'Leona':
        return 'two-hundred-sixty-five-pixels'
      case 'Lissandra':
        return 'three-hundred-twenty-five-pixels'
      case 'Lucian':
        return 'three-hundred-twenty-five-pixels'
      case 'Lulu':
        return 'three-hundred-twenty-five-pixels'
      case 'Lux':
        return 'three-hundred-sixty-pixels'
      case 'Malphite':
        return 'three-hundred-sixty-pixels'
      case 'Malzahar':
        return 'four-hundred-pixels'
      case 'Maokai':
        return 'four-hundred-pixels'
      case 'Master Yi':
        return 'two-hundred-ninety-pixels'
      case 'Miss Fortune':
        return 'two-hundred-ninety-pixels'
      case 'Morgana':
        return 'five-hundred-forty-pixels'
      case 'Nami':
        return 'two-hundred-ninety-pixels'
      case 'Nasus':
        return 'three-hundred-sixty-pixels'
      case 'Nautilus':
        return 'three-hundred-pixels'
      case 'Nidalee':
        return 'three-hundred-pixels'
      case 'Nocturne':
        return 'three-hundred-sixty-pixels'
      case 'Nunu & Willump':
        return 'three-hundred-sixty-pixels'
      case 'Olaf':
        return 'three-hundred-sixty-pixels'
      case 'Orianna':
        return 'two-hundred-ninety-pixels'
      case 'Poppy':
        return 'three-hundred-sixty-pixels'
      case 'Quinn':
        return 'three-hundred-sixty-pixels'
      case 'Rakan':
        return 'three-hundred-sixty-pixels'
      case 'Rammus':
        return 'three-hundred-sixty-pixels'
      case 'Rengar':
        return 'three-hundred-sixty-pixels'
      case 'Riven':
        return 'three-hundred-pixels'
      case 'Rumble':
        return 'three-hundred-sixty-pixels'
      case 'Ryze':
        return 'three-hundred-pixels'
      case 'Sejuani':
        return 'three-hundred-sixty-pixels'
      case 'Shaco':
        return 'three-hundred-pixels'
      case 'Shen':
        return 'three-hundred-pixels'
      case 'Shyvana':
        return 'three-hundred-twenty-five-pixels'
      case 'Singed':
        return 'three-hundred-twenty-five-pixels'
      case 'Sion':
        return 'three-hundred-twenty-five-pixels'
      case 'Sivir':
        return 'three-hundred-sixty-pixels'
      case 'Skarner':
        return 'three-hundred-sixty-pixels'
      case 'Skarner':
        return 'three-hundred-sixty-pixels'
      case 'Sona':
        return 'three-hundred-sixty-pixels'
      case 'Swain':
        return 'three-hundred-sixty-pixels'
      case 'Syndra':
        return 'three-hundred-pixels'
      case 'Tahm Kench':
        return 'three-hundred-twenty-five-pixels'
      case 'Taliyah':
        return 'three-hundred-twenty-five-pixels'
      case 'Talon':
        return 'three-hundred-sixty-pixels'
      case 'Taric':
        return 'three-hundred-pixels'
      case 'Teemo':
        return 'three-hundred-pixels'
      case 'Thresh':
        return 'three-hundred-sixty-pixels'
      case 'Tristana':
        return 'three-hundred-sixty-pixels'
      case 'Trundle':
        return 'three-hundred-sixty-pixels'
      case 'Tryndamere':
        return 'three-hundred-pixels'
      case 'Twisted Fate':
        return 'three-hundred-pixels'
      case 'Vayne':
        return 'three-hundred-pixels'
      case 'Veigar':
        return 'three-hundred-sixty-pixels'
      case 'Vi':
        return 'three-hundred-sixty-pixels'
      case 'Viego':
        return 'three-hundred-sixty-pixels'
      case 'Viktor':
        return 'three-hundred-sixty-pixels'
      case 'Vladimir':
        return 'three-hundred-sixty-pixels'
      case 'Volibear':
        return 'three-hundred-sixty-pixels'
      case 'Warwick':
        return 'three-hundred-sixty-pixels'
      case 'Wukong':
        return 'three-hundred-sixty-pixels'
      case 'Xayah':
        return 'three-hundred-sixty-pixels'
      case 'Yasuo':
        return 'three-hundred-pixels'
      case 'Yorick':
        return 'three-hundred-sixty-pixels'
      case 'Yuumi':
        return 'four-hundred-seventy-pixels'
      case 'Zac':
        return 'three-hundred-sixty-pixels'
      case 'Zed':
        return 'three-hundred-twenty-five-pixels'
      case 'Ziggs':
        return 'three-hundred-pixels'
      case 'Zyra':
        return 'three-hundred-pixels'
    }

  }

  @HostListener('document:mousemove', ['$event']) 

  onMouseMove(mouseTrack) {

    let offsetX = mouseTrack.pageX / 100
    
    document.getElementById('blueTeam').style.transform = `translateX(${offsetX}px)`
    document.getElementById('redTeam').style.transform = `translateX(-${offsetX}px)`

  }

}


================================================
FILE: src/app/modules/client/home/home/home.component.html
================================================
<nav class="component-menu">

    <ul>

        <li (click)="playSound('submenuClick')"><a routerLinkActive="item-menu-active" routerLink="overview">Overview</a></li>
        <li (click)="playSound('submenuClick')"><a routerLinkActive="item-menu-active" routerLink="patch-notes">Patch Notes</a></li>

    </ul>

</nav>

<div class="content">
    <router-outlet></router-outlet>
</div>

================================================
FILE: src/app/modules/client/home/home/home.component.scss
================================================
@import './../../../../../assets/scss/menu-component.scss'

================================================
FILE: src/app/modules/client/home/home/home.component.spec.ts
================================================
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { HomeComponent } from './home.component';

describe('HomeComponent', () => {
  let component: HomeComponent;
  let fixture: ComponentFixture<HomeComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ HomeComponent ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(HomeComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: src/app/modules/client/home/home/home.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { BackgroundService } from '../../background.service';
import { SoundService } from '../../sound.service';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.scss']
})
export class HomeComponent implements OnInit {

  constructor( private soundService: SoundService ) {}

  ngOnInit(): void {
  }



  playSound(sound) {

    this.soundService.playSound(sound)

  }

}


================================================
FILE: src/app/modules/client/home/home-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { OverviewComponent } from './overview/overview.component';
import { PatchNotesComponent } from './patch-notes/patch-notes.component';

const routes: Routes = [

  { path: '', redirectTo: 'overview', pathMatch: 'full' },
  { path: '', component: HomeComponent, children: [
  
    { path: 'overview', component: OverviewComponent },
    { path: 'patch-notes', component: PatchNotesComponent },
  
  ]}

];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class HomeRoutingModule { }


================================================
FILE: src/app/modules/client/home/home.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { HomeRoutingModule } from './home-routing.module';
import { OverviewComponent } from './overview/overview.component';
import { HomeComponent } from './home/home.component';
import { PatchNotesComponent } from './patch-notes/patch-notes.component';


@NgModule({
  declarations: [OverviewComponent, HomeComponent, PatchNotesComponent],
  imports: [
    CommonModule,
    HomeRoutingModule
  ]
})
export class HomeModule { }


================================================
FILE: src/app/modules/client/home/overview/overview.component.html
================================================
<div class="container">

    <h1>Angular of Legends</h1>
    <p>Welcome to Angular of Legends, a clone of League of Legends Client made by Ivin Rodrigues</p>
    <a href="https://github.com/IvinRodrigues" target="_blank">My Github</a>

</div>

================================================
FILE: src/app/modules/client/home/overview/overview.component.scss
================================================
.container {

    h1 {
    
        color: #f0e6d2;
        font-size: 3rem;
        text-transform: uppercase;
        font-weight: bold;
        letter-spacing: 1px;
        display: block;
        margin-top: 20%;
    
    }
    
    p {
    
        font-family: 'Roboto', sans-serif;
        margin-top: 2rem;
        color: #938f83;
        display: block;
    
    }

    a {

        color: #938f83;
        background-color: #1e2328;
        text-decoration: none;
        text-transform: uppercase;
        font-weight: bold;
        margin-top: 2rem;
        padding: .8rem 2rem;
        display: inline-block;
        border: 2px solid #c8aa6d;
        transition-duration: .2s;

        &:hover {

            color: #f0e6d2;


        }

    }

}

================================================
FILE: src/app/modules/client/home/overview/overview.component.spec.ts
================================================
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { OverviewComponent } from './overview.component';

describe('OverviewComponent', () => {
  let component: OverviewComponent;
  let fixture: ComponentFixture<OverviewComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ OverviewComponent ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(OverviewComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: src/app/modules/client/home/overview/overview.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { BackgroundService } from '../../background.service';

@Component({
  selector: 'app-overview',
  templateUrl: './overview.component.html',
  styleUrls: ['./overview.component.scss']
})
export class OverviewComponent implements OnInit {

  constructor(private backgroundService: BackgroundService) {

    this.backgroundService.changeBackground({ 
      backgroundUrl: 'https://4.bp.blogspot.com/-fXQUf52mB0I/XO98d2WF4ZI/AAAAAAAAGls/P3BtEoQqEoszt_NmeXJxyi2Tx9rB_qJeACKgBGAs/w0/galaxy-slayer-zed-lol-4K-97.jpg',
      backgroundSize: 'cover',
      backgroundPosition: 'top'
    })

  }

  ngOnInit(): void {
  }

}


================================================
FILE: src/app/modules/client/home/patch-notes/patch-notes.component.html
================================================
<h1 
Download .txt
gitextract_svczxah5/

├── .browserslistrc
├── .editorconfig
├── .gitignore
├── README.md
├── angular.json
├── e2e/
│   ├── protractor.conf.js
│   ├── src/
│   │   ├── app.e2e-spec.ts
│   │   └── app.po.ts
│   └── tsconfig.json
├── karma.conf.js
├── package.json
├── src/
│   ├── app/
│   │   ├── app-routing.module.ts
│   │   ├── app.component.html
│   │   ├── app.component.scss
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   ├── app.module.ts
│   │   ├── layout/
│   │   │   └── main-client-layout/
│   │   │       ├── main-client-layout.component.html
│   │   │       ├── main-client-layout.component.scss
│   │   │       ├── main-client-layout.component.spec.ts
│   │   │       └── main-client-layout.component.ts
│   │   └── modules/
│   │       ├── auth/
│   │       │   ├── auth-routing.module.ts
│   │       │   ├── auth.module.ts
│   │       │   └── login/
│   │       │       ├── login.component.html
│   │       │       ├── login.component.scss
│   │       │       ├── login.component.spec.ts
│   │       │       └── login.component.ts
│   │       └── client/
│   │           ├── background.service.ts
│   │           ├── chat/
│   │           │   ├── chat.component.html
│   │           │   ├── chat.component.scss
│   │           │   ├── chat.component.spec.ts
│   │           │   └── chat.component.ts
│   │           ├── client-routing.module.ts
│   │           ├── client.module.ts
│   │           ├── game/
│   │           │   ├── champion-select/
│   │           │   │   ├── champion-select.component.html
│   │           │   │   ├── champion-select.component.scss
│   │           │   │   ├── champion-select.component.spec.ts
│   │           │   │   └── champion-select.component.ts
│   │           │   ├── game-routing.module.ts
│   │           │   ├── game.module.ts
│   │           │   └── loading/
│   │           │       ├── loading.component.html
│   │           │       ├── loading.component.scss
│   │           │       ├── loading.component.spec.ts
│   │           │       └── loading.component.ts
│   │           ├── home/
│   │           │   ├── home/
│   │           │   │   ├── home.component.html
│   │           │   │   ├── home.component.scss
│   │           │   │   ├── home.component.spec.ts
│   │           │   │   └── home.component.ts
│   │           │   ├── home-routing.module.ts
│   │           │   ├── home.module.ts
│   │           │   ├── overview/
│   │           │   │   ├── overview.component.html
│   │           │   │   ├── overview.component.scss
│   │           │   │   ├── overview.component.spec.ts
│   │           │   │   └── overview.component.ts
│   │           │   └── patch-notes/
│   │           │       ├── patch-notes.component.html
│   │           │       ├── patch-notes.component.scss
│   │           │       ├── patch-notes.component.spec.ts
│   │           │       └── patch-notes.component.ts
│   │           ├── play/
│   │           │   ├── lobby/
│   │           │   │   ├── lobby.component.html
│   │           │   │   ├── lobby.component.scss
│   │           │   │   ├── lobby.component.spec.ts
│   │           │   │   └── lobby.component.ts
│   │           │   ├── play-menu/
│   │           │   │   ├── play-menu.component.html
│   │           │   │   ├── play-menu.component.scss
│   │           │   │   ├── play-menu.component.spec.ts
│   │           │   │   └── play-menu.component.ts
│   │           │   ├── play-routing.module.ts
│   │           │   ├── play.module.ts
│   │           │   └── pvp/
│   │           │       ├── pvp.component.html
│   │           │       ├── pvp.component.scss
│   │           │       ├── pvp.component.spec.ts
│   │           │       └── pvp.component.ts
│   │           ├── play.service.ts
│   │           ├── profile/
│   │           │   ├── match-history/
│   │           │   │   ├── match-history.component.html
│   │           │   │   ├── match-history.component.scss
│   │           │   │   ├── match-history.component.spec.ts
│   │           │   │   └── match-history.component.ts
│   │           │   ├── overview/
│   │           │   │   ├── overview.component.html
│   │           │   │   ├── overview.component.scss
│   │           │   │   ├── overview.component.spec.ts
│   │           │   │   └── overview.component.ts
│   │           │   ├── profile/
│   │           │   │   ├── profile.component.html
│   │           │   │   ├── profile.component.scss
│   │           │   │   ├── profile.component.spec.ts
│   │           │   │   └── profile.component.ts
│   │           │   ├── profile-routing.module.ts
│   │           │   └── profile.module.ts
│   │           └── sound.service.ts
│   ├── assets/
│   │   ├── .gitkeep
│   │   ├── scss/
│   │   │   ├── animations.scss
│   │   │   ├── buttons.scss
│   │   │   └── menu-component.scss
│   │   └── sounds/
│   │       ├── khazix.ogg
│   │       ├── khazix.ogg.sfk
│   │       ├── tf.ogg
│   │       ├── tf.ogg.sfk
│   │       ├── zed.ogg
│   │       └── zed.ogg.sfk
│   ├── data/
│   │   ├── champions.ts
│   │   ├── friends.ts
│   │   ├── items.ts
│   │   ├── player.ts
│   │   └── spells.ts
│   ├── environments/
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.scss
│   └── test.ts
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.spec.json
└── tslint.json
Download .txt
SYMBOL INDEX (121 symbols across 34 files)

FILE: e2e/protractor.conf.js
  method onPrepare (line 26) | onPrepare() {

FILE: e2e/src/app.po.ts
  class AppPage (line 3) | class AppPage {
    method navigateTo (line 4) | navigateTo(): Promise<unknown> {
    method getTitleText (line 8) | getTitleText(): Promise<string> {

FILE: src/app/app-routing.module.ts
  class AppRoutingModule (line 15) | class AppRoutingModule { }

FILE: src/app/app.component.ts
  class AppComponent (line 8) | class AppComponent {

FILE: src/app/app.module.ts
  class AppModule (line 18) | class AppModule { }

FILE: src/app/layout/main-client-layout/main-client-layout.component.ts
  class MainClientLayoutComponent (line 14) | class MainClientLayoutComponent implements OnInit, AfterViewInit {
    method constructor (line 31) | constructor(private backgroundService: BackgroundService,
    method ngOnInit (line 106) | ngOnInit(): void {
    method playSound (line 111) | playSound(sound) {
    method pauseSound (line 119) | pauseSound(sound) {
    method ngAfterViewInit (line 127) | ngAfterViewInit(): void {
    method changeOnlineStatus (line 133) | changeOnlineStatus() {
    method changeGeralVisibility (line 141) | changeGeralVisibility() {
    method ajustPopoversPosition (line 149) | ajustPopoversPosition() {
    method showPopover (line 168) | showPopover(id) {
    method hidePopover (line 176) | hidePopover(id) {
    method changeChatVisibility (line 184) | changeChatVisibility(friend?) {
    method queueTime (line 193) | queueTime() {
    method cancelQueue (line 238) | cancelQueue() {
    method acceptMatch (line 246) | acceptMatch() {
    method cancelMatch (line 260) | cancelMatch() {
    method changeBugModalVisibility (line 279) | changeBugModalVisibility() {

FILE: src/app/modules/auth/auth-routing.module.ts
  class AuthRoutingModule (line 15) | class AuthRoutingModule { }

FILE: src/app/modules/auth/auth.module.ts
  class AuthModule (line 18) | class AuthModule { }

FILE: src/app/modules/auth/login/login.component.ts
  class LoginComponent (line 11) | class LoginComponent implements OnInit {
    method constructor (line 17) | constructor( private route: Router,
    method ngOnInit (line 30) | ngOnInit(): void {
    method makeLogin (line 38) | makeLogin() {
    method usernameIdentify (line 51) | usernameIdentify() {
    method closeModal (line 67) | closeModal() {

FILE: src/app/modules/client/background.service.ts
  class BackgroundService (line 7) | class BackgroundService {
    method changeBackground (line 11) | changeBackground(url) {
    method getBackgroundObservable (line 19) | getBackgroundObservable(): Observable<any> {

FILE: src/app/modules/client/chat/chat.component.ts
  class ChatComponent (line 10) | class ChatComponent implements OnInit {
    method constructor (line 17) | constructor() {
    method ngOnInit (line 27) | ngOnInit(): void {
    method selectChat (line 35) | selectChat(friend) {
    method sendMessage (line 43) | sendMessage() {

FILE: src/app/modules/client/client-routing.module.ts
  class ClientRoutingModule (line 23) | class ClientRoutingModule { }

FILE: src/app/modules/client/client.module.ts
  class ClientModule (line 22) | class ClientModule { }

FILE: src/app/modules/client/game/champion-select/champion-select.component.ts
  class ChampionSelectComponent (line 12) | class ChampionSelectComponent implements OnInit {
    method constructor (line 45) | constructor(private router: Router,
    method ngOnInit (line 50) | ngOnInit(): void {
    method initDeclarePeriod (line 132) | initDeclarePeriod() {
    method initBanPeriod (line 160) | initBanPeriod() {
    method initBanReviewPeriod (line 180) | initBanReviewPeriod() {
    method initPickPeriod (line 259) | initPickPeriod() {
    method initLoadOutPeriod (line 287) | initLoadOutPeriod() {
    method initTimer (line 312) | initTimer() {
    method pickEnemyChampions (line 345) | pickEnemyChampions() {
    method selectChampion (line 369) | selectChampion(champion, index) {
    method banChampion (line 391) | banChampion() {
    method pickChampion (line 412) | pickChampion() {
    method changeFilter (line 440) | changeFilter(filter) {
    method adjustChampion (line 456) | adjustChampion(champion) {
    method playSound (line 695) | playSound(sound) {
    method pauseSound (line 703) | pauseSound(sound) {

FILE: src/app/modules/client/game/game-routing.module.ts
  class GameRoutingModule (line 17) | class GameRoutingModule { }

FILE: src/app/modules/client/game/game.module.ts
  class GameModule (line 16) | class GameModule { }

FILE: src/app/modules/client/game/loading/loading.component.ts
  class LoadingComponent (line 8) | class LoadingComponent implements OnInit {
    method constructor (line 16) | constructor() { }
    method ngOnInit (line 18) | ngOnInit(): void {
    method adjustChampion (line 26) | adjustChampion(champion) {
    method onMouseMove (line 287) | onMouseMove(mouseTrack) {

FILE: src/app/modules/client/home/home-routing.module.ts
  class HomeRoutingModule (line 23) | class HomeRoutingModule { }

FILE: src/app/modules/client/home/home.module.ts
  class HomeModule (line 17) | class HomeModule { }

FILE: src/app/modules/client/home/home/home.component.ts
  class HomeComponent (line 10) | class HomeComponent implements OnInit {
    method constructor (line 12) | constructor( private soundService: SoundService ) {}
    method ngOnInit (line 14) | ngOnInit(): void {
    method playSound (line 19) | playSound(sound) {

FILE: src/app/modules/client/home/overview/overview.component.ts
  class OverviewComponent (line 9) | class OverviewComponent implements OnInit {
    method constructor (line 11) | constructor(private backgroundService: BackgroundService) {
    method ngOnInit (line 21) | ngOnInit(): void {

FILE: src/app/modules/client/home/patch-notes/patch-notes.component.ts
  class PatchNotesComponent (line 9) | class PatchNotesComponent implements OnInit {
    method constructor (line 11) | constructor(private backgroundService: BackgroundService) {
    method ngOnInit (line 17) | ngOnInit(): void {

FILE: src/app/modules/client/play.service.ts
  class PlayService (line 7) | class PlayService {
    method constructor (line 9) | constructor() { }
    method changeQueueState (line 14) | changeQueueState(url) {
    method getQueueObservable (line 22) | getQueueObservable(): Observable<any> {
    method changeLobbyState (line 30) | changeLobbyState(url) {
    method getLobbyObservable (line 38) | getLobbyObservable(): Observable<any> {

FILE: src/app/modules/client/play/lobby/lobby.component.ts
  class LobbyComponent (line 11) | class LobbyComponent implements OnInit {
    method constructor (line 17) | constructor(private backgroundService: BackgroundService,
    method ngOnInit (line 49) | ngOnInit(): void {
    method enterQueue (line 76) | enterQueue() {
    method cancelQueue (line 89) | cancelQueue() {
    method closeLobby (line 98) | closeLobby() {
    method openRoleSelect (line 106) | openRoleSelect() {
    method closeRoleSelect (line 118) | closeRoleSelect() {
    method selectRole (line 130) | selectRole(role) {
    method playSound (line 139) | playSound(sound) {

FILE: src/app/modules/client/play/play-menu/play-menu.component.ts
  class PlayMenuComponent (line 9) | class PlayMenuComponent implements OnInit {
    method constructor (line 11) | constructor(private soundService: SoundService) {}
    method ngOnInit (line 13) | ngOnInit(): void {
    method playSound (line 18) | playSound(sound) {

FILE: src/app/modules/client/play/play-routing.module.ts
  class PlayRoutingModule (line 23) | class PlayRoutingModule { }

FILE: src/app/modules/client/play/play.module.ts
  class PlayModule (line 17) | class PlayModule { }

FILE: src/app/modules/client/play/pvp/pvp.component.ts
  class PvpComponent (line 10) | class PvpComponent implements OnInit {
    method constructor (line 14) | constructor(private backgroundService: BackgroundService) {
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: src/app/modules/client/profile/match-history/match-history.component.ts
  class MatchHistoryComponent (line 11) | class MatchHistoryComponent implements OnInit, AfterViewInit {
    method constructor (line 57) | constructor() { }
    method ngOnInit (line 59) | ngOnInit(): void {
    method ngAfterViewInit (line 65) | ngAfterViewInit(): void {

FILE: src/app/modules/client/profile/overview/overview.component.ts
  class OverviewComponent (line 9) | class OverviewComponent implements OnInit {
    method constructor (line 11) | constructor(private backgroundService: BackgroundService) {
    method ngOnInit (line 21) | ngOnInit(): void {

FILE: src/app/modules/client/profile/profile-routing.module.ts
  class ProfileRoutingModule (line 23) | class ProfileRoutingModule { }

FILE: src/app/modules/client/profile/profile.module.ts
  class ProfileModule (line 17) | class ProfileModule { }

FILE: src/app/modules/client/profile/profile/profile.component.ts
  class ProfileComponent (line 10) | class ProfileComponent implements OnInit {
    method constructor (line 15) | constructor(private soundService: SoundService) { }
    method ngOnInit (line 17) | ngOnInit(): void {
    method changeBannerVisible (line 22) | changeBannerVisible(condition) {
    method playSound (line 30) | playSound(sound) {

FILE: src/app/modules/client/sound.service.ts
  class SoundService (line 6) | class SoundService {
    method constructor (line 46) | constructor() { }
    method playSound (line 50) | playSound(sound) {
    method pauseSound (line 58) | pauseSound(sound) {
Condensed preview — 114 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (349K chars).
[
  {
    "path": ".browserslistrc",
    "chars": 853,
    "preview": "# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.\n# For addit"
  },
  {
    "path": ".editorconfig",
    "chars": 274,
    "preview": "# Editor configuration, see https://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size ="
  },
  {
    "path": ".gitignore",
    "chars": 631,
    "preview": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\n/dist\n/tmp\n/out-tsc\n# Only "
  },
  {
    "path": "README.md",
    "chars": 399,
    "preview": "![Preview](https://angularoflegends.ivinrodrigues.com/assets/images/preview.png)\n\n# AngularOfLegends\n\nWelcome to the Ang"
  },
  {
    "path": "angular.json",
    "chars": 3748,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"newProjectRoot\": \"projects\",\n  \""
  },
  {
    "path": "e2e/protractor.conf.js",
    "chars": 869,
    "preview": "// @ts-check\n// Protractor configuration file, see link for more information\n// https://github.com/angular/protractor/bl"
  },
  {
    "path": "e2e/src/app.e2e-spec.ts",
    "chars": 649,
    "preview": "import { AppPage } from './app.po';\nimport { browser, logging } from 'protractor';\n\ndescribe('workspace-project App', ()"
  },
  {
    "path": "e2e/src/app.po.ts",
    "chars": 301,
    "preview": "import { browser, by, element } from 'protractor';\n\nexport class AppPage {\n  navigateTo(): Promise<unknown> {\n    return"
  },
  {
    "path": "e2e/tsconfig.json",
    "chars": 294,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"../tsconfig.json\",\n  \"compi"
  },
  {
    "path": "karma.conf.js",
    "chars": 1028,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "package.json",
    "chars": 1324,
    "preview": "{\n  \"name\": \"angular-of-legends\",\n  \"version\": \"0.0.0\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng serve\",\n    \"bui"
  },
  {
    "path": "src/app/app-routing.module.ts",
    "chars": 454,
    "preview": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes "
  },
  {
    "path": "src/app/app.component.html",
    "chars": 369,
    "preview": "<div class=\"warning\">\n\n    <img src=\"https://vignette.wikia.nocookie.net/leagueoflegends/images/e/e3/Despair_Emote.png/r"
  },
  {
    "path": "src/app/app.component.scss",
    "chars": 700,
    "preview": ".warning {\n\n    background-color: black;\n    width: 100vw;\n    height: 100vh;\n    position: fixed;\n    top: 0;\n    left:"
  },
  {
    "path": "src/app/app.component.spec.ts",
    "chars": 1087,
    "preview": "import { TestBed } from '@angular/core/testing';\nimport { RouterTestingModule } from '@angular/router/testing';\nimport {"
  },
  {
    "path": "src/app/app.component.ts",
    "chars": 221,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'app-root',\n  templateUrl: './app.component.html',\n"
  },
  {
    "path": "src/app/app.module.ts",
    "chars": 394,
    "preview": "import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\n\nimport { AppRoutin"
  },
  {
    "path": "src/app/layout/main-client-layout/main-client-layout.component.html",
    "chars": 12510,
    "preview": "<div [ngClass]=\"{'background-client-queue': inQueue}\" id=\"backgroundClient\"></div>\n\n<video [ngClass]=\"{'video-background"
  },
  {
    "path": "src/app/layout/main-client-layout/main-client-layout.component.scss",
    "chars": 34980,
    "preview": "#backgroundClient {\n\n    background-repeat: no-repeat;\n    background-size: cover;\n    background-position: top;\n    pos"
  },
  {
    "path": "src/app/layout/main-client-layout/main-client-layout.component.spec.ts",
    "chars": 698,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { MainClientLayoutComponent } from './main-cl"
  },
  {
    "path": "src/app/layout/main-client-layout/main-client-layout.component.ts",
    "chars": 6172,
    "preview": "import { AfterViewInit, Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Bac"
  },
  {
    "path": "src/app/modules/auth/auth-routing.module.ts",
    "chars": 350,
    "preview": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { LoginComponen"
  },
  {
    "path": "src/app/modules/auth/auth.module.ts",
    "chars": 453,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuthRoutingModule } "
  },
  {
    "path": "src/app/modules/auth/login/login.component.html",
    "chars": 1887,
    "preview": "<div class=\"container\">\n    \n    <aside>\n\n        <img class=\"logo\" src=\"/assets/images/auth/minimalist-logo.png\">\n\n    "
  },
  {
    "path": "src/app/modules/auth/login/login.component.scss",
    "chars": 7668,
    "preview": ".container {\n\n    background-image: url('https://images.contentstack.io/v3/assets/blt731acb42bb3d1659/blt7225731dfb1a126"
  },
  {
    "path": "src/app/modules/auth/login/login.component.spec.ts",
    "chars": 619,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { LoginComponent } from './login.component';\n"
  },
  {
    "path": "src/app/modules/auth/login/login.component.ts",
    "chars": 1204,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { Rou"
  },
  {
    "path": "src/app/modules/client/background.service.ts",
    "chars": 372,
    "preview": "import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\n@Injectable({\n  providedIn: 'ro"
  },
  {
    "path": "src/app/modules/client/chat/chat.component.html",
    "chars": 1119,
    "preview": "<div class=\"chat-container\">\n\n    <ul class=\"chat-list\">\n\n        <li *ngFor=\"let friend of friends\" (click)=\"selectChat"
  },
  {
    "path": "src/app/modules/client/chat/chat.component.scss",
    "chars": 3941,
    "preview": ".chat-container {\n\n    width: 600px;\n    height: 500px;\n    background-color: #010911b4;\n    backdrop-filter: blur(12px)"
  },
  {
    "path": "src/app/modules/client/chat/chat.component.spec.ts",
    "chars": 612,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { ChatComponent } from './chat.component';\n\nd"
  },
  {
    "path": "src/app/modules/client/chat/chat.component.ts",
    "chars": 851,
    "preview": "import { Component, Input, OnInit } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimpor"
  },
  {
    "path": "src/app/modules/client/client-routing.module.ts",
    "chars": 885,
    "preview": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { MainClientLay"
  },
  {
    "path": "src/app/modules/client/client.module.ts",
    "chars": 604,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { ClientRoutingModule "
  },
  {
    "path": "src/app/modules/client/game/champion-select/champion-select.component.html",
    "chars": 18580,
    "preview": "<div class=\"background\"></div>\n\n<video class=\"video-background\" autoplay muted>\n    <source src=\"./assets/images/champio"
  },
  {
    "path": "src/app/modules/client/game/champion-select/champion-select.component.scss",
    "chars": 28159,
    "preview": "\n\n.delay1 {\n\n    animation-delay: 700ms !important;\n\n}\n\n.delay2 {\n\n    animation-delay: 1400ms !important;\n\n}\n\n.delay3 {"
  },
  {
    "path": "src/app/modules/client/game/champion-select/champion-select.component.spec.ts",
    "chars": 683,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { ChampionSelectComponent } from './champion-"
  },
  {
    "path": "src/app/modules/client/game/champion-select/champion-select.component.ts",
    "chars": 17312,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Champions } from '"
  },
  {
    "path": "src/app/modules/client/game/game-routing.module.ts",
    "chars": 519,
    "preview": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { ChampionSelec"
  },
  {
    "path": "src/app/modules/client/game/game.module.ts",
    "chars": 464,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { GameRoutingModule } "
  },
  {
    "path": "src/app/modules/client/game/loading/loading.component.html",
    "chars": 12327,
    "preview": "<video class=\"video-background\" autoplay loop muted>\n    <source src=\"https://lolstatic-a.akamaihd.net/frontpage/apps/pr"
  },
  {
    "path": "src/app/modules/client/game/loading/loading.component.scss",
    "chars": 10258,
    "preview": ".video-background {\n    \n    position: fixed;\n    width: 100vw;\n    height: 100vh;\n    top: 0;\n    left: 0;\n    transfor"
  },
  {
    "path": "src/app/modules/client/game/loading/loading.component.spec.ts",
    "chars": 633,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { LoadingComponent } from './loading.componen"
  },
  {
    "path": "src/app/modules/client/game/loading/loading.component.ts",
    "chars": 9191,
    "preview": "import { Component, HostListener, OnInit } from '@angular/core';\n\n@Component({\n  selector: 'app-loading',\n  templateUrl:"
  },
  {
    "path": "src/app/modules/client/home/home/home.component.html",
    "chars": 384,
    "preview": "<nav class=\"component-menu\">\n\n    <ul>\n\n        <li (click)=\"playSound('submenuClick')\"><a routerLinkActive=\"item-menu-a"
  },
  {
    "path": "src/app/modules/client/home/home/home.component.scss",
    "chars": 58,
    "preview": "@import './../../../../../assets/scss/menu-component.scss'"
  },
  {
    "path": "src/app/modules/client/home/home/home.component.spec.ts",
    "chars": 612,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { HomeComponent } from './home.component';\n\nd"
  },
  {
    "path": "src/app/modules/client/home/home/home.component.ts",
    "chars": 486,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BackgroundService } from '../../background.service';\nimport "
  },
  {
    "path": "src/app/modules/client/home/home-routing.module.ts",
    "chars": 686,
    "preview": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { HomeComponent"
  },
  {
    "path": "src/app/modules/client/home/home.module.ts",
    "chars": 522,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { HomeRoutingModule } "
  },
  {
    "path": "src/app/modules/client/home/overview/overview.component.html",
    "chars": 242,
    "preview": "<div class=\"container\">\n\n    <h1>Angular of Legends</h1>\n    <p>Welcome to Angular of Legends, a clone of League of Lege"
  },
  {
    "path": "src/app/modules/client/home/overview/overview.component.scss",
    "chars": 760,
    "preview": ".container {\n\n    h1 {\n    \n        color: #f0e6d2;\n        font-size: 3rem;\n        text-transform: uppercase;\n        "
  },
  {
    "path": "src/app/modules/client/home/overview/overview.component.spec.ts",
    "chars": 640,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { OverviewComponent } from './overview.compon"
  },
  {
    "path": "src/app/modules/client/home/overview/overview.component.ts",
    "chars": 674,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BackgroundService } from '../../background.service';\n\n@Compo"
  },
  {
    "path": "src/app/modules/client/home/patch-notes/patch-notes.component.html",
    "chars": 461,
    "preview": "<h1 class=\"patch-note-title\">Patch 1.0 notes</h1>\n<p class=\"patch-note-author\">Ivin Rodrigues - 02/20/2021</p>\n<p class="
  },
  {
    "path": "src/app/modules/client/home/patch-notes/patch-notes.component.scss",
    "chars": 688,
    "preview": ".patch-note-title {\n    \n    color: #f0e6d2;\n    font-size: 2rem;\n    text-transform: uppercase;\n    font-weight: bold;\n"
  },
  {
    "path": "src/app/modules/client/home/patch-notes/patch-notes.component.spec.ts",
    "chars": 655,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { PatchNotesComponent } from './patch-notes.c"
  },
  {
    "path": "src/app/modules/client/home/patch-notes/patch-notes.component.ts",
    "chars": 453,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BackgroundService } from '../../background.service';\n\n@Compo"
  },
  {
    "path": "src/app/modules/client/play/lobby/lobby.component.html",
    "chars": 6239,
    "preview": "<header>\n    <img src=\"./assets/images/play-icons/sr-hover.png\">\n    <span>Ranked solo/duo</span>\n    <span>Draft</span>"
  },
  {
    "path": "src/app/modules/client/play/lobby/lobby.component.scss",
    "chars": 8425,
    "preview": "@import '/src/assets/scss/animations.scss';\n@import '/src/assets/scss/buttons.scss';\n\nheader {\n\n    width: calc(100% - 3"
  },
  {
    "path": "src/app/modules/client/play/lobby/lobby.component.spec.ts",
    "chars": 619,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { LobbyComponent } from './lobby.component';\n"
  },
  {
    "path": "src/app/modules/client/play/lobby/lobby.component.ts",
    "chars": 2452,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BackgroundService } from '../../background.service';\nimport "
  },
  {
    "path": "src/app/modules/client/play/play-menu/play-menu.component.html",
    "chars": 931,
    "preview": "<nav class=\"component-menu\">\n\n    <ul>\n\n        <li><a routerLinkActive=\"item-menu-active\" routerLink=\"pvp\">pvp</a></li>"
  },
  {
    "path": "src/app/modules/client/play/play-menu/play-menu.component.scss",
    "chars": 1076,
    "preview": "@import './../../../../../assets/scss/menu-component.scss';\n\n.confirm-button {\n\n    background-image: url('/assets/image"
  },
  {
    "path": "src/app/modules/client/play/play-menu/play-menu.component.spec.ts",
    "chars": 641,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { PlayMenuComponent } from './play-menu.compo"
  },
  {
    "path": "src/app/modules/client/play/play-menu/play-menu.component.ts",
    "chars": 441,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { SoundService } from '../../sound.service';\n\n@Component({\n  s"
  },
  {
    "path": "src/app/modules/client/play/play-routing.module.ts",
    "chars": 641,
    "preview": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { LobbyComponen"
  },
  {
    "path": "src/app/modules/client/play/play.module.ts",
    "chars": 498,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { PlayRoutingModule } "
  },
  {
    "path": "src/app/modules/client/play/pvp/pvp.component.html",
    "chars": 2289,
    "preview": "<nav>\n\n    <ul>\n\n        <li id=\"sr\" class=\"game delay1\">\n\n            <img src=\"./assets/images/play-icons/sr-enabled.p"
  },
  {
    "path": "src/app/modules/client/play/pvp/pvp.component.scss",
    "chars": 4116,
    "preview": "@import '/src/assets/scss/animations.scss';\n\nul {\n\n    display: flex;\n    height: 100%;\n\n    .game {\n\n        animation:"
  },
  {
    "path": "src/app/modules/client/play/pvp/pvp.component.spec.ts",
    "chars": 605,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { PvpComponent } from './pvp.component';\n\ndes"
  },
  {
    "path": "src/app/modules/client/play/pvp/pvp.component.ts",
    "chars": 1163,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BackgroundService } from '../../background.service';\nimport "
  },
  {
    "path": "src/app/modules/client/play.service.ts",
    "chars": 573,
    "preview": "import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\n@Injectable({\n  providedIn: 'ro"
  },
  {
    "path": "src/app/modules/client/profile/match-history/match-history.component.html",
    "chars": 3907,
    "preview": "<ul class=\"match-history\">\n\n    <li *ngFor=\"let match of matchs\" class=\"match\">\n\n        <div class=\"champion-image-wrap"
  },
  {
    "path": "src/app/modules/client/profile/match-history/match-history.component.scss",
    "chars": 9143,
    "preview": ".match-history {\n    \n    width: calc(100% - 532px);\n    height: calc(100% - 68px);\n    overflow: auto;\n    position: ab"
  },
  {
    "path": "src/app/modules/client/profile/match-history/match-history.component.spec.ts",
    "chars": 669,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { MatchHistoryComponent } from './match-histo"
  },
  {
    "path": "src/app/modules/client/profile/match-history/match-history.component.ts",
    "chars": 7997,
    "preview": "import { AfterViewInit, Component, OnInit } from '@angular/core'\nimport { Champions } from 'src/data/champions'\nimport {"
  },
  {
    "path": "src/app/modules/client/profile/overview/overview.component.html",
    "chars": 3423,
    "preview": "<ul class=\"profile-info\">\n\n    <li class=\"rank-item\">\n        <span>Solo/duo</span>\n        <span class=\"subtitle\">plati"
  },
  {
    "path": "src/app/modules/client/profile/overview/overview.component.scss",
    "chars": 5240,
    "preview": ".profile-info {\n\n    width: calc( 100% - 380px);\n    height: 100%;\n    float: right;\n    display: flex;\n    justify-cont"
  },
  {
    "path": "src/app/modules/client/profile/overview/overview.component.spec.ts",
    "chars": 640,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { OverviewComponent } from './overview.compon"
  },
  {
    "path": "src/app/modules/client/profile/overview/overview.component.ts",
    "chars": 609,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BackgroundService } from '../../background.service';\n\n@Compo"
  },
  {
    "path": "src/app/modules/client/profile/profile/profile.component.html",
    "chars": 1032,
    "preview": "<div [ngClass]=\"{'overlay-background-visible': !overview}\" class=\"overlay-background\"></div>\n\n<nav class=\"component-menu"
  },
  {
    "path": "src/app/modules/client/profile/profile/profile.component.scss",
    "chars": 1358,
    "preview": "@import './../../../../../assets/scss/menu-component.scss';\n\n.overlay-background-visible {\n\n    opacity: .6 !important;\n"
  },
  {
    "path": "src/app/modules/client/profile/profile/profile.component.spec.ts",
    "chars": 633,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { ProfileComponent } from './profile.componen"
  },
  {
    "path": "src/app/modules/client/profile/profile/profile.component.ts",
    "chars": 602,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { Player } from 'src/data/player';\nimport { SoundService } fro"
  },
  {
    "path": "src/app/modules/client/profile/profile-routing.module.ts",
    "chars": 717,
    "preview": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { OverviewCompo"
  },
  {
    "path": "src/app/modules/client/profile/profile.module.ts",
    "chars": 554,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { ProfileRoutingModule"
  },
  {
    "path": "src/app/modules/client/sound.service.ts",
    "chars": 2995,
    "preview": "import { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class SoundService {\n\n  path: "
  },
  {
    "path": "src/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/assets/scss/animations.scss",
    "chars": 712,
    "preview": "@keyframes SlideUp {\n\n    0% {\n\n        transform: translateY(100%);\n        opacity: 0;\n\n    }\n    100% {\n\n        tran"
  },
  {
    "path": "src/assets/scss/buttons.scss",
    "chars": 357,
    "preview": ".button-client {\n\n    color: #938f83;\n    background-color: #1e2328;\n    text-decoration: none;\n    text-transform: uppe"
  },
  {
    "path": "src/assets/scss/menu-component.scss",
    "chars": 1199,
    "preview": ".component-menu {\n\n    margin-top: 7rem;\n    margin-bottom: 6px;\n    padding: 0 2rem;\n    position: relative;\n    z-inde"
  },
  {
    "path": "src/data/champions.ts",
    "chars": 33570,
    "preview": "export let Champions: any  = [\n\n        {name: 'Ahri', role: 'mid', picture: 'https://www.mobafire.com/images/avatars/ah"
  },
  {
    "path": "src/data/friends.ts",
    "chars": 5370,
    "preview": "export let Friends = [\n\n    { id: 1, name: 'Weslley', status: 0, statusMessage: 'Online', profilePicture: 'https://opgg-"
  },
  {
    "path": "src/data/items.ts",
    "chars": 2333,
    "preview": "export let Items: any = [\n\n    { id:1, name: 'Duskblade of Draktharr', image: 'https://ddragon.leagueoflegends.com/cdn/1"
  },
  {
    "path": "src/data/player.ts",
    "chars": 195,
    "preview": "export let Player: any = {\n\n    name: localStorage.getItem('username'),\n    picture: 'https://opgg-static.akamaized.net/"
  },
  {
    "path": "src/data/spells.ts",
    "chars": 379,
    "preview": "export let Spells: any = [\n\n    { id: 1, name: 'Ignite', image: 'https://ddragon.leagueoflegends.com/cdn/11.4.1/img/spel"
  },
  {
    "path": "src/environments/environment.prod.ts",
    "chars": 51,
    "preview": "export const environment = {\n  production: true\n};\n"
  },
  {
    "path": "src/environments/environment.ts",
    "chars": 662,
    "preview": "// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environm"
  },
  {
    "path": "src/index.html",
    "chars": 757,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"author\" content=\"Ivin Rodrigues\">\n  <meta"
  },
  {
    "path": "src/main.ts",
    "chars": 371,
    "preview": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynami"
  },
  {
    "path": "src/polyfills.ts",
    "chars": 3064,
    "preview": "/***************************************************************************************************\n * Load `$localize`"
  },
  {
    "path": "src/styles.scss",
    "chars": 7468,
    "preview": "/* http://meyerweb.com/eric/tools/css/reset/ \n   v2.0 | 20110126\n   License: none (public domain)\n*/\n\n@font-face {\n\n    "
  },
  {
    "path": "src/test.ts",
    "chars": 753,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/"
  },
  {
    "path": "tsconfig.app.json",
    "chars": 287,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "tsconfig.json",
    "chars": 458,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"compileOnSave\": false,\n  \"compilerOpti"
  },
  {
    "path": "tsconfig.spec.json",
    "chars": 333,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "tslint.json",
    "chars": 3185,
    "preview": "{\n  \"extends\": \"tslint:recommended\",\n  \"rulesDirectory\": [\n    \"codelyzer\"\n  ],\n  \"rules\": {\n    \"align\": {\n      \"optio"
  }
]

// ... and 6 more files (download for full content)

About this extraction

This page contains the full source code of the IvinRodrigues/AngularOfLegends GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 114 files (318.1 KB), approximately 84.5k tokens, and a symbol index with 121 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!