{ | |||||
"deno.enable": false | |||||
} |
import { LaserBluesComponent } from './pages/game-dashboard/laser-blues/laser-blues.component'; | import { LaserBluesComponent } from './pages/game-dashboard/laser-blues/laser-blues.component'; | ||||
import { WhatTheFungiComponent } from './pages/game-dashboard/what-the-fungi/what-the-fungi.component'; | import { WhatTheFungiComponent } from './pages/game-dashboard/what-the-fungi/what-the-fungi.component'; | ||||
import { ImpressumComponent } from './shared/impressum/impressum.component'; | import { ImpressumComponent } from './shared/impressum/impressum.component'; | ||||
import { MusicComponent } from './pages/music/music.component.ts'; | |||||
import { ResumePdfComponent } from './pages/resume-pdf/resume-pdf.component.ts'; | |||||
const routes: Routes = [ | const routes: Routes = [ | ||||
path: 'resume', | path: 'resume', | ||||
component: ResumeComponent, | component: ResumeComponent, | ||||
}, | }, | ||||
{ | |||||
path: 'pdf', | |||||
component: ResumePdfComponent, | |||||
}, | |||||
{ | { | ||||
path: 'games', | path: 'games', | ||||
children: [ | children: [ | ||||
path: 'projects', | path: 'projects', | ||||
component: ProjectDashboardComponent, | component: ProjectDashboardComponent, | ||||
}, | }, | ||||
{ | |||||
path: 'music', | |||||
component: MusicComponent, | |||||
}, | |||||
{ | { | ||||
path: 'legal', | path: 'legal', | ||||
component: ImpressumComponent, | component: ImpressumComponent, |
import { SaltyPiranhaComponent } from './pages/game-dashboard/salty-piranha/salty-piranha.component'; | import { SaltyPiranhaComponent } from './pages/game-dashboard/salty-piranha/salty-piranha.component'; | ||||
import { KeepInTouchComponent } from './pages/keep-in-touch/keep-in-touch.component'; | import { KeepInTouchComponent } from './pages/keep-in-touch/keep-in-touch.component'; | ||||
import { ImpressumComponent } from './shared/impressum/impressum.component'; | import { ImpressumComponent } from './shared/impressum/impressum.component'; | ||||
import { HobbyDashboardComponent } from './pages/hobby-dashboard/hobby-dashboard.component'; | |||||
import { MusicComponent } from './pages/music/music.component'; | |||||
import { ResumePdfComponent } from './pages/resume-pdf/resume-pdf.component'; | |||||
import { PdfHeaderComponent } from './page-header/pdf-header/pdf-header.component'; | |||||
import { MusicHeaderComponent } from './page-header/music-header/music-header.component'; | |||||
@NgModule({ | @NgModule({ | ||||
SaltyPiranhaComponent, | SaltyPiranhaComponent, | ||||
KeepInTouchComponent, | KeepInTouchComponent, | ||||
ImpressumComponent, | ImpressumComponent, | ||||
HobbyDashboardComponent, | |||||
MusicComponent, | |||||
MusicHeaderComponent, | |||||
ResumePdfComponent, | |||||
PdfHeaderComponent, | |||||
], | ], | ||||
imports: [ | imports: [ | ||||
BrowserModule, | BrowserModule, |
<div class="page-header section-dark page-header-xs" style="background-image: url('assets/img/black-and-silver-headphones-on-black-surface.jpg')"> | |||||
<div class="filter"></div> | |||||
<div class="content-center"> | |||||
<div class="container"> | |||||
<div class="title-brand"> | |||||
<h1 class="presentation-title">Music</h1> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> |
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | ||||
import { HobbyDashboardComponent } from './hobby-dashboard.component'; | |||||
import { MusicHeaderComponent } from './music-header.component'; | |||||
describe('HobbyDashboardComponent', () => { | |||||
let component: HobbyDashboardComponent; | |||||
let fixture: ComponentFixture<HobbyDashboardComponent>; | |||||
describe('MusicHeaderComponent', () => { | |||||
let component: MusicHeaderComponent; | |||||
let fixture: ComponentFixture<MusicHeaderComponent>; | |||||
beforeEach(async(() => { | beforeEach(async(() => { | ||||
TestBed.configureTestingModule({ | TestBed.configureTestingModule({ | ||||
declarations: [ HobbyDashboardComponent ] | |||||
declarations: [ MusicHeaderComponent ] | |||||
}) | }) | ||||
.compileComponents(); | .compileComponents(); | ||||
})); | })); | ||||
beforeEach(() => { | beforeEach(() => { | ||||
fixture = TestBed.createComponent(HobbyDashboardComponent); | |||||
fixture = TestBed.createComponent(MusicHeaderComponent); | |||||
component = fixture.componentInstance; | component = fixture.componentInstance; | ||||
fixture.detectChanges(); | fixture.detectChanges(); | ||||
}); | }); |
import { Component, OnInit } from '@angular/core'; | |||||
@Component({ | |||||
selector: 'app-music-header', | |||||
templateUrl: './music-header.component.html', | |||||
styleUrls: ['./music-header.component.css'] | |||||
}) | |||||
export class MusicHeaderComponent implements OnInit { | |||||
constructor() { } | |||||
ngOnInit(): void { | |||||
} | |||||
} |
.default-header { | |||||
background-image: url('assets/img/dark-fog-forest-haze.jpg'); | |||||
} |
<div | |||||
class="page-header section-dark default-header" | |||||
> | |||||
<div class="slide-in-right"> | |||||
<div class="title-brand text-left"> | |||||
<h1>Christian Ziermann</h1> | |||||
<h2>Web Developer</h2> | |||||
<h3>ziermach.de</h3> | |||||
</div> | |||||
</div> | |||||
</div> |
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
import { PdfHeaderComponent } from './pdf-header.component'; | |||||
describe('PdfHeaderComponent', () => { | |||||
let component: PdfHeaderComponent; | |||||
let fixture: ComponentFixture<PdfHeaderComponent>; | |||||
beforeEach(async(() => { | |||||
TestBed.configureTestingModule({ | |||||
declarations: [ PdfHeaderComponent ] | |||||
}) | |||||
.compileComponents(); | |||||
})); | |||||
beforeEach(() => { | |||||
fixture = TestBed.createComponent(PdfHeaderComponent); | |||||
component = fixture.componentInstance; | |||||
fixture.detectChanges(); | |||||
}); | |||||
it('should create', () => { | |||||
expect(component).toBeTruthy(); | |||||
}); | |||||
}); |
import { Component, OnInit } from '@angular/core'; | |||||
@Component({ | |||||
selector: 'app-pdf-header', | |||||
templateUrl: './pdf-header.component.html', | |||||
styleUrls: ['./pdf-header.component.css'] | |||||
}) | |||||
export class PdfHeaderComponent implements OnInit { | |||||
constructor() { } | |||||
ngOnInit(): void { | |||||
} | |||||
} |
<div class="wrapper"> | |||||
<app-game-header></app-game-header> | |||||
<div class="main"> | |||||
<div class="section section-dark"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-sm-4 offset-md-4"> | |||||
<div class="info text-center"> | |||||
<div class="icon icon-danger"> | |||||
<i class="fab fa-itch-io"></i> | |||||
</div> | |||||
<div class="description"> | |||||
<h4 class="info-title">Mini Beans Jam Games</h4> | |||||
<p class="description"> | |||||
All these games bellow where made for an GameJam called Mini | |||||
Beans Jam. The Challange was to create an game for an motto | |||||
given by 3 random words in 42 Hours (Friday - Sunday). I made | |||||
this Games with an small Hobby Team called WhyMonkeys. | |||||
</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="section section-gray"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-6"> | |||||
<div class="card"> | |||||
<img | |||||
class="card-img-top" | |||||
src="/assets/img/mrq-thumbnail.png" | |||||
alt="Card image cap" | |||||
/> | |||||
<div class="card-body"> | |||||
<h4 class="card-title">Magnetic Recycling Queen</h4> | |||||
<p class="card-text"> | |||||
The first game i helped to Develop. | |||||
Made with Unity. | |||||
</p> | |||||
<a | |||||
routerLink="/games/magnetic-recycling-queen" | |||||
class="btn btn-primary" | |||||
>Play Now!</a | |||||
> | |||||
<a href="https://karotofel.itch.io/mrq" class="btn btn-primary"> | |||||
Check out on <i class="fab fa-itch-io"></i> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="col-md-6"> | |||||
<div class="card"> | |||||
<img | |||||
class="card-img-top" | |||||
src="/assets/img/wtf-thumbnail.png" | |||||
alt="Card image cap" | |||||
/> | |||||
<div class="card-body"> | |||||
<h4 class="card-title">What the fungi</h4> | |||||
<p class="card-text"> | |||||
In this game i tried my self at an A* search algorithm It went | |||||
okay ... | |||||
</p> | |||||
<p> | |||||
Made with Unity. | |||||
</p> | |||||
<a routerLink="/games/what-the-fungi" class="btn btn-primary" | |||||
>Play Now!</a | |||||
> | |||||
<a | |||||
href="https://karotofel.itch.io/wtfungi" | |||||
class="btn btn-primary" | |||||
> | |||||
Check out on <i class="fab fa-itch-io"></i> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div class="col-md-6"> | |||||
<div class="card"> | |||||
<img | |||||
class="card-img-top" | |||||
id="disco-thumbnail" | |||||
src="/assets/img/disco-blues-thumbnail.png" | |||||
alt="Card image cap" | |||||
/> | |||||
<img | |||||
class="card-img-top" | |||||
id="disco-gif" | |||||
src="/assets/img/disco-blues.gif" | |||||
alt="Card image cap" | |||||
/> | |||||
<div class="card-body"> | |||||
<h4 class="card-title">Disc(o) Blues</h4> | |||||
<p class="card-text"> | |||||
This is game was far the most Complex i helped with. It's | |||||
Primary made for Mobile so the UI is in web a bit messy. The | |||||
idea and the Style is great but i was to much for the size of | |||||
team and the given time. | |||||
Made with Unity. | |||||
</p> | |||||
<a routerLink="/games/laser-blues" class="btn btn-primary" | |||||
>Play Now!</a | |||||
> | |||||
<a | |||||
href="https://karotofel.itch.io/laser-blues" | |||||
class="btn btn-primary" | |||||
> | |||||
Check out on <i class="fab fa-itch-io"></i> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="col-md-6"> | |||||
<div class="card"> | |||||
<img | |||||
class="card-img-top" | |||||
src="/assets/img/salty-piranha-thumbnail.png" | |||||
alt="Card image cap" | |||||
/> | |||||
<div class="card-body"> | |||||
<h4 class="card-title">Salty Prianha</h4> | |||||
<p class="card-text"> | |||||
First game where i did 100% of the coding. A small but nice | |||||
project only done by 2 people in less than 42 hours. Also my | |||||
first experience with the Godot Engine. | |||||
Made with Godot. | |||||
</p> | |||||
<a routerLink="/games/salty-piranha" class="btn btn-primary" | |||||
>Play Now!</a | |||||
> | |||||
<a | |||||
href="https://karotofel.itch.io/salty-piranha" | |||||
class="btn btn-primary" | |||||
> | |||||
Check out on <i class="fab fa-itch-io"></i> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
import { Component, OnInit } from '@angular/core'; | |||||
import { SpotifyService } from './spotify.service'; | |||||
@Component({ | |||||
selector: 'app-hobby-dashboard', | |||||
templateUrl: './hobby-dashboard.component.html', | |||||
styleUrls: ['./hobby-dashboard.component.css'] | |||||
}) | |||||
export class HobbyDashboardComponent implements OnInit { | |||||
constructor(public spotifyService: SpotifyService) { } | |||||
ngOnInit(): void { | |||||
} | |||||
} |
import { TestBed } from '@angular/core/testing'; | |||||
import { SpotifyService } from './spotify.service'; | |||||
describe('SpotifyService', () => { | |||||
let service: SpotifyService; | |||||
beforeEach(() => { | |||||
TestBed.configureTestingModule({}); | |||||
service = TestBed.inject(SpotifyService); | |||||
}); | |||||
it('should be created', () => { | |||||
expect(service).toBeTruthy(); | |||||
}); | |||||
}); |
import { Injectable } from '@angular/core'; | |||||
import { ServiceHelper } from 'app/helper/service-helper'; | |||||
@Injectable({ | |||||
providedIn: 'root' | |||||
}) | |||||
export class SpotifyService { | |||||
// protected _playlists: Array<Object> = []; | |||||
// protected spotifyWebApi = require('spotify-web-api-node'); | |||||
// constructor( | |||||
// protected offsetHelper: ServiceHelper.OfssetHelper, | |||||
// ) { } | |||||
// public async setUserPlaylists(): Promise<Object[]> { | |||||
// return new Promise<Object[]>( | |||||
// (resolve, reject) => { | |||||
// // get All Playlists of user | |||||
// this.getAllUserPlaylists().then( | |||||
// (playlists) => { | |||||
// this.resolvePlaylists(playlists).then(resolvedPlaylists => { | |||||
// this._playlists = resolvedPlaylists as Object[]; | |||||
// resolve(this._playlists); | |||||
// }); | |||||
// }, | |||||
// (err) => { | |||||
// reject(err); | |||||
// }); | |||||
// }); | |||||
// } | |||||
// public get playlists(): Array<Object> { | |||||
// return this._playlists; | |||||
// } | |||||
// public getPlaylistById(playlistId: string): Object | null { | |||||
// return this._playlists.find((playlist) => { | |||||
// return playlist['id'] === playlistId; | |||||
// }); | |||||
// } | |||||
// protected enlistPlaylistInQueue(playlist: Object) { | |||||
// console.debug(`Too many Requests save ${playlist} in Queue`); | |||||
// // TODO enlist Playlist in DB | |||||
// } | |||||
// protected async getAllUserPlaylists(pagingObject?: Object): Promise<Array<Object>> { | |||||
// return new Promise<Array<Object>>(async (resolve, reject) => { | |||||
// let playlists = new Array<Object>(); | |||||
// this.spotifyWebApi.getUserPlaylists({ offset: !!pagingObject ? pagingObject['offset'] : 0 }).then( | |||||
// async (paginatePlaylistsResponse) => { | |||||
// if (!paginatePlaylistsResponse) { | |||||
// reject(`Can't get Playlists of current user, response empty.`); | |||||
// } | |||||
// playlists = paginatePlaylistsResponse.body.items; | |||||
// pagingObject = paginatePlaylistsResponse.body; | |||||
// if (paginatePlaylistsResponse.body.next) { | |||||
// const offset = this.offsetHelper.getNextOffsetFromUrl(paginatePlaylistsResponse.body.next); | |||||
// if (offset === -1) { | |||||
// resolve(playlists); | |||||
// } | |||||
// pagingObject['offset'] = offset; | |||||
// this.getAllUserPlaylists(pagingObject).then((paginatePlaylists) => { | |||||
// playlists = playlists.concat(paginatePlaylists); | |||||
// resolve(playlists); | |||||
// }, | |||||
// (err) => { | |||||
// reject(err); | |||||
// }); | |||||
// return; | |||||
// } | |||||
// resolve(playlists); | |||||
// }, | |||||
// (err) => { | |||||
// if (err.statusCode === ServiceHelper.SPOTIFY_STAUS_CODES.TOO_MANY) { | |||||
// playlists.forEach(playlist => { | |||||
// this.enlistPlaylistInQueue(playlist) | |||||
// }); | |||||
// resolve(); | |||||
// return; | |||||
// } | |||||
// reject(`Can't get Playlists of current user ${err}`); | |||||
// } | |||||
// ); | |||||
// }); | |||||
// } | |||||
// protected async resolvePlaylists(playlists: Array<Object>): Promise<Object> { | |||||
// const getPlaylistTracksPromises = Array<Promise<Object>>(); | |||||
// for (const playlist of playlists) { | |||||
// getPlaylistTracksPromises.push( | |||||
// this.resolvePlaylist(playlist) | |||||
// ); | |||||
// } | |||||
// return Promise.all(getPlaylistTracksPromises); | |||||
// } | |||||
// protected resolvePlaylist( | |||||
// playlist, | |||||
// pagingObject? | |||||
// ): Promise<Object> { | |||||
// return new Promise<Object>(async (resolve, reject) => { | |||||
// this.spotifyWebApi.getPlaylistTracks(playlist.id, { offset: !!pagingObject ? pagingObject.offset : 0 }).then( | |||||
// (tracksResponse) => { | |||||
// const fullPlaylist = ServiceHelper.GenericHelper.deepClone(playlist); | |||||
// if (!playlist) { | |||||
// resolve(fullPlaylist); | |||||
// return; | |||||
// } | |||||
// fullPlaylist.tracks = tracksResponse.body; | |||||
// pagingObject = tracksResponse.body; | |||||
// if (tracksResponse.body.next) { | |||||
// const offset = this.offsetHelper.getNextOffsetFromUrl(tracksResponse.body.next); | |||||
// if (offset === -1) { | |||||
// resolve(fullPlaylist); | |||||
// return; | |||||
// } | |||||
// pagingObject.offset = offset; | |||||
// this.resolvePlaylist(fullPlaylist, pagingObject).then( | |||||
// (fullTracksResponse) => { | |||||
// if (fullTracksResponse) { | |||||
// fullPlaylist.tracks.items = fullPlaylist.tracks.items.concat(fullTracksResponse['tracks'].items); | |||||
// } | |||||
// resolve(fullPlaylist); | |||||
// }, | |||||
// (err) => { | |||||
// reject(err); | |||||
// }); | |||||
// return; | |||||
// } | |||||
// resolve(fullPlaylist); | |||||
// }, (err) => { | |||||
// if (err.statusCode === ServiceHelper.SPOTIFY_STAUS_CODES.TOO_MANY) { | |||||
// this.enlistPlaylistInQueue(playlist) | |||||
// resolve(); | |||||
// return; | |||||
// } | |||||
// reject(`Can't get Playlist: ${playlist.name}. ${err}`); | |||||
// }) | |||||
// }); | |||||
// } | |||||
} |
<div class="wrapper"> | |||||
<app-music-header></app-music-header> | |||||
<div class="main"> | |||||
<div class="section section-dark"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-sm-12"> | |||||
<div class="info text-center"> | |||||
<div class="icon icon-danger"> | |||||
<i class="fas fa-music"></i> | |||||
</div> | |||||
<h4 class="info-title">My favorite Music</h4> | |||||
<div class="info-separator separator"></div> | |||||
<div class="description"> | |||||
<iframe | |||||
src="https://open.spotify.com/embed/playlist/2ocjal6YJG4DOObS2AhGmP" | |||||
width="100%" | |||||
height="900px" | |||||
frameborder="0" | |||||
allowtransparency="true" | |||||
allow="encrypted-media" | |||||
></iframe> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> |
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
import { MusicComponent } from './music.component'; | |||||
describe('MusicComponent', () => { | |||||
let component: MusicComponent; | |||||
let fixture: ComponentFixture<MusicComponent>; | |||||
beforeEach(async(() => { | |||||
TestBed.configureTestingModule({ | |||||
declarations: [ MusicComponent ] | |||||
}) | |||||
.compileComponents(); | |||||
})); | |||||
beforeEach(() => { | |||||
fixture = TestBed.createComponent(MusicComponent); | |||||
component = fixture.componentInstance; | |||||
fixture.detectChanges(); | |||||
}); | |||||
it('should create', () => { | |||||
expect(component).toBeTruthy(); | |||||
}); | |||||
}); |
import { Component, OnInit } from '@angular/core'; | |||||
@Component({ | |||||
selector: 'app-music', | |||||
templateUrl: './music.component.html', | |||||
styleUrls: ['./music.component.css'] | |||||
}) | |||||
export class MusicComponent implements OnInit { | |||||
constructor() { } | |||||
ngOnInit(): void { | |||||
} | |||||
} |
<div class="wrapper"> | |||||
<app-pdf-header></app-pdf-header> | |||||
<div class="main"> | |||||
<div class="section section-transparent"> | |||||
<div class="container"> | |||||
<div class="owner"> | |||||
<div class="avatar"> | |||||
<img | |||||
src="/assets/img/avatar/profilbild.jpg" | |||||
alt="Circle Image" | |||||
class="img-circle img-responsive" | |||||
/> | |||||
</div> | |||||
<div class="name"> | |||||
<h4 class="title">Christian Ziermann</h4> | |||||
<h6 class="description">Web Developer</h6> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div class="col-md-6"> | |||||
<div class="personal"> | |||||
<h4 class="title">Personal</h4> | |||||
<div class="description"> | |||||
<table class=""> | |||||
<tr *ngFor="let personalColumn of displayedPersonalColumns"> | |||||
<th>{{ personalColumn | uppercase }}</th> | |||||
<td> | |||||
{{ | |||||
personalColumn == "birthdate" | |||||
? (personalData[personalColumn] | |||||
| date: "dd. MMMM yyyy") | |||||
: personalData[personalColumn] | |||||
}} | |||||
</td> | |||||
</tr> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="col-md-6"> | |||||
<div class="personal"> | |||||
<h4 class="title">Jobs</h4> | |||||
<table class="description"> | |||||
<tr> | |||||
<td class="job-date"> | |||||
July 2018 - Today | |||||
</td> | |||||
<td class="job-company"> | |||||
PlusServer | |||||
</td> | |||||
<td class="job-postion description"> | |||||
Web-Developer | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="job-date"> | |||||
August 2015 - July 2018 | |||||
</td> | |||||
<td class="job-company"> | |||||
PlusServer | |||||
</td> | |||||
<td class="job-postion description"> | |||||
Trainee application development | |||||
</td> | |||||
</tr> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
<div class="col-md-12"> | |||||
<div class="personal"> | |||||
<h4 class="title">Education</h4> | |||||
<table class="description ta"> | |||||
<tr> | |||||
<th>Date</th> | |||||
<th>School</th> | |||||
<th>Graduation</th> | |||||
</tr> | |||||
<tr></tr> | |||||
<tr class="job-date"> | |||||
<td> | |||||
August 2015 - July 2018 | |||||
</td> | |||||
<td> | |||||
Georg-Simon-Ohm-Berufskolleg Köln | |||||
</td> | |||||
<td> | |||||
IT specialist application development | |||||
</td> | |||||
</tr> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="section-transparent"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<h1 class="text-center col-md-12"> | |||||
Experience & Interests | |||||
</h1> | |||||
<div class="col-md-12"> | |||||
<div class="row"> | |||||
<div | |||||
*ngFor="let skill of skills" | |||||
class="text-center skill col-sm-3" | |||||
> | |||||
<div class="text-center skill-logo"> | |||||
<div [innerHTML]="skill.iconHtml"></div> | |||||
</div> | |||||
<div class="text-center"> | |||||
{{ skill.name }} | |||||
</div> | |||||
<div class="text-center"> | |||||
<i class="{{ getStarClass(skill.starCount, 0) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 1) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 2) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 3) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 4) }}"></i> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="section-transparent"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-4"> | |||||
<div class="row"> | |||||
<h2 class="col-sm-12 title text-center"> | |||||
Soft Skills | |||||
</h2> | |||||
</div> | |||||
<div class="row"> | |||||
<div | |||||
*ngFor="let skill of softSkills" | |||||
class="text-center skill col-sm-6" | |||||
> | |||||
<div class="text-center skill-logo"> | |||||
<div [innerHTML]="skill.iconHtml"></div> | |||||
</div> | |||||
<div class="text-center"> | |||||
{{ skill.name }} | |||||
</div> | |||||
<div class="text-center"> | |||||
<i class="{{ getStarClass(skill.starCount, 0) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 1) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 2) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 3) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 4) }}"></i> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="col-sm-4"> | |||||
<div class="row"> | |||||
<h2 class="col-sm-12 title text-center"> | |||||
Languages | |||||
</h2> | |||||
</div> | |||||
<div class="row"> | |||||
<div | |||||
*ngFor="let skill of languages" | |||||
class="text-center skill col-sm-6" | |||||
> | |||||
<div class="text-center skill-logo"> | |||||
<div [innerHTML]="skill.iconHtml"></div> | |||||
</div> | |||||
<div class="text-center"> | |||||
{{ skill.name }} | |||||
</div> | |||||
<div class="text-center"> | |||||
<i class="{{ getStarClass(skill.starCount, 0) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 1) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 2) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 3) }}"></i> | |||||
<i class="{{ getStarClass(skill.starCount, 4) }}"></i> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="col-sm-4"> | |||||
<div class="row"> | |||||
<div class="col-sm-12"> | |||||
<div class="row"> | |||||
<h2 class="col-sm-12 title text-center"> | |||||
Like to Learn | |||||
</h2> | |||||
</div> | |||||
<div class="row"> | |||||
<div | |||||
*ngFor="let skill of likeToLearn" | |||||
class="text-center skill col-sm-6" | |||||
> | |||||
<div class="text-center skill-logo"> | |||||
<div [innerHTML]="skill.iconHtml"></div> | |||||
</div> | |||||
<div class="text-center"> | |||||
{{ skill.name }} | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="section-transparent"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-8 mr-auto ml-auto"> | |||||
<h1 class="text-center">Hobbys</h1> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div *ngFor="let skill of hobbys" class="text-center skill col-sm-6"> | |||||
<div class="text-center skill-logo"> | |||||
<div [innerHTML]="skill.iconHtml"></div> | |||||
</div> | |||||
<div class="text-center"> | |||||
{{ skill.name }} | |||||
</div> | |||||
<div *ngIf="skill.description" class="text-center description"> | |||||
<div class="text-center"> | |||||
{{ skill.description.text }} | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="section-transparent"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-8 mr-auto ml-auto text-center"> | |||||
<h1 class="">Keep in touch?</h1> | |||||
<div>Mail: cziermann@mailbox.org</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="section section-transparent"></div> | |||||
</div> | |||||
</div> |
.no-border { | |||||
border: none; | |||||
} | |||||
.skill-logo { | |||||
font-size: 30px; | |||||
min-height: 1em !important; | |||||
min-width: 0.875em !important; | |||||
} | |||||
.skill-logo > div > img { | |||||
background-color: white; | |||||
} | |||||
.skill { | |||||
padding-left: 2%; | |||||
padding-right: 2%; | |||||
padding-bottom: 2%; | |||||
padding-top: 2%; | |||||
} | |||||
table { | |||||
color: white; | |||||
} | |||||
.default-header { | |||||
background-image: url("assets/img/dark-fog-forest-haze.jpg") !important; | |||||
} | |||||
.section-experience { | |||||
background-image: url("/assets/img/pexels-photo-1629236.jpeg"); | |||||
} | |||||
.section-profile-content { | |||||
background-image: url("/assets/img/pexels-photo-1629236.jpeg"); | |||||
} | |||||
.section-soft-skills { | |||||
background-image: url("/assets/img/pexels-photo-1629236.jpeg"); | |||||
} | |||||
.section-hobbys { | |||||
background-image: url("/assets/img/pexels-photo-1629236.jpeg"); | |||||
} | |||||
.section-transparent { | |||||
border-bottom: 1px solid transparent; | |||||
box-shadow: none; | |||||
background: transparent !important; | |||||
} | |||||
* { | |||||
background: white; | |||||
color: black !important; | |||||
} | |||||
html, | |||||
.main { | |||||
background: white; | |||||
color: black !important; | |||||
background-position: center center; | |||||
background-size: cover; | |||||
background-attachment: fixed; | |||||
margin-top: 0; | |||||
} | |||||
td { | |||||
padding-left: 2%; | |||||
} |
import { Component, OnInit } from '@angular/core'; | |||||
export type Star = 0 | 0.5 | 1 | 1.5 | 2 | 2.5 | 3 | 3.5 | 4 | 4.5 | 5; | |||||
export const STAR_CLASS_MAP = { | |||||
0: 'far fa-star', | |||||
0.5: 'fas fa-star-half', | |||||
1: 'fas fa-star', | |||||
} | |||||
export const MAX_STARS = 5; | |||||
export interface Link { | |||||
href: string; | |||||
name: string; | |||||
} | |||||
export interface Skill { | |||||
name: string; | |||||
iconHtml: string; | |||||
starCount?: Star; | |||||
description?: { | |||||
text?: string; | |||||
links?: Link[]; | |||||
}; | |||||
} | |||||
@Component({ | |||||
selector: 'app-resume-pdf', | |||||
templateUrl: './resume-pdf.component.html', | |||||
styleUrls: ['./resume-pdf.component.scss'] | |||||
}) | |||||
export class ResumePdfComponent implements OnInit { | |||||
public focus = false; | |||||
public focus1 = false; | |||||
displayedPersonalColumns = [ | |||||
'name', | |||||
'birthdate', | |||||
'location' | |||||
]; | |||||
personalData = { | |||||
name: 'Christian Ziermann', | |||||
birthdate: new Date('September 3, 1996'), | |||||
location: 'Aachner Straße 545 Cologne 50933', | |||||
} | |||||
public softSkills: Skill[] = [ | |||||
{ | |||||
name: 'Teamwork', | |||||
iconHtml: '<i class="fas fa-users"></i>', | |||||
starCount: 4 | |||||
}, | |||||
{ | |||||
name: 'Communication', | |||||
iconHtml: '<i class="fas fa-comments"></i>', | |||||
starCount: 4.5 | |||||
}, | |||||
]; | |||||
public likeToLearn: Skill[] = [ | |||||
{ | |||||
name: 'IoT', | |||||
iconHtml: '<i class="fas fa-microchip"></i>', | |||||
}, | |||||
{ | |||||
name: 'Deep Learning', | |||||
iconHtml: '<i class="fas fa-cogs"></i>', | |||||
}, | |||||
{ | |||||
name: 'Game Development', | |||||
iconHtml: '<i class="fas fa-gamepad"></i>', | |||||
}, | |||||
{ | |||||
name: 'Vuejs', | |||||
iconHtml: '<i class="fab fa-vuejs"></i>', | |||||
}, | |||||
]; | |||||
public hobbys: Skill[] = [ | |||||
{ | |||||
name: 'Gaming', | |||||
iconHtml: '<i class="fas fa-gamepad"></i>', | |||||
}, | |||||
{ | |||||
name: 'Music', | |||||
iconHtml: '<i class="fas fa-music"></i>', | |||||
description: { | |||||
links: [ | |||||
{ | |||||
href: '/music', | |||||
name: 'Checkout' | |||||
} | |||||
] | |||||
} | |||||
}, | |||||
{ | |||||
name: 'Programming', | |||||
iconHtml: '<i class="fas fa-code"></i>', | |||||
}, | |||||
{ | |||||
name: 'Cooking', | |||||
iconHtml: '<i class="fas fa-utensils"></i>', | |||||
}, | |||||
{ | |||||
name: 'Skating', | |||||
iconHtml: '<i class="fas fa-snowboarding"></i>', | |||||
}, | |||||
{ | |||||
name: 'Pen & Paper', | |||||
iconHtml: '<i class="far fa-edit"></i>', | |||||
}, | |||||
]; | |||||
public languages: Skill[] = [ | |||||
{ | |||||
name: 'German (native language)', | |||||
iconHtml: '<img height="30" src="/assets/icons/flags/german.png" alt="German">', | |||||
starCount: 5 | |||||
}, | |||||
{ | |||||
name: 'English', | |||||
iconHtml: '<img height="30" src="/assets/icons/flags/english.png" alt="English">', | |||||
starCount: 3.5 | |||||
}, | |||||
]; | |||||
public skills: Skill[] = [ | |||||
{ | |||||
name: 'Unit-testing', | |||||
iconHtml: '<i class="fas fa-vial"></i>', | |||||
starCount: 3 | |||||
}, | |||||
{ | |||||
name: 'Jira', | |||||
iconHtml: '<i class="fab fa-jira"></i> ', | |||||
starCount: 4 | |||||
}, | |||||
{ | |||||
name: 'Apache', | |||||
iconHtml: '<img height="30" src="/assets/icons/apache.png" alt="Apache">', | |||||
starCount: 2.5 | |||||
}, | |||||
{ | |||||
name: 'Nginx', | |||||
iconHtml: '<img height="30" src="/assets/icons/nginx.svg" alt="Nginx">', | |||||
starCount: 4.5 | |||||
}, | |||||
{ | |||||
name: 'Jenkins', | |||||
iconHtml: '<i class="fab fa-jenkins"></i>', | |||||
starCount: 3 | |||||
}, | |||||
{ | |||||
name: 'SQL', | |||||
iconHtml: '<i class="fas fa-database"></i>', | |||||
starCount: 3.5 | |||||
}, | |||||
{ | |||||
name: 'Python', | |||||
iconHtml: '<i class="fab fa-python"></i>', | |||||
starCount: 2 | |||||
}, | |||||
{ | |||||
name: 'PHP', | |||||
iconHtml: '<i class="fab fa-php"></i>', | |||||
starCount: 4 | |||||
}, | |||||
{ | |||||
name: 'HTML & CSS', | |||||
iconHtml: '<i class="fab fa-html5"></i>', | |||||
starCount: 4.5 | |||||
}, | |||||
{ | |||||
name: 'Angular 2+ & AngularJS', | |||||
iconHtml: '<i class="fab fa-angular"></i>', | |||||
starCount: 4.5 | |||||
}, | |||||
{ | |||||
name: 'NestJs', | |||||
iconHtml: '<img height="30" src="/assets/icons/nestjs.svg" alt="NestJs">', | |||||
starCount: 4 | |||||
}, | |||||
{ | |||||
name: 'Twig', | |||||
iconHtml: '<img height="30" src="/assets/icons/twig.png" alt="NestJs">', | |||||
starCount: 4.5 | |||||
}, | |||||
{ | |||||
name: 'Electron', | |||||
iconHtml: '<i class="fas fa-atom"></i>', | |||||
starCount: 4 | |||||
}, | |||||
{ | |||||
name: 'Typescript', | |||||
iconHtml: '<img height="30" color="white" class="skill-logo" src="/assets/icons/typescript.svg" alt="Typescript">', | |||||
starCount: 4 | |||||
}, | |||||
{ | |||||
name: 'Ubuntu', | |||||
iconHtml: '<i class="fab fa-ubuntu"></i>', | |||||
starCount: 4 | |||||
}, | |||||
{ | |||||
name: 'Docker', | |||||
iconHtml: '<i class="fab fa-docker"></i>', | |||||
starCount: 3 | |||||
}, | |||||
{ | |||||
name: 'Kubernetes', | |||||
iconHtml: '<img height="30" src="/assets/icons/kubernetes.png" alt="Kubernetes">', | |||||
starCount: 2 | |||||
}, | |||||
{ | |||||
name: 'Git', | |||||
iconHtml: '<i class="fab fa-git"></i>', | |||||
starCount: 4.5 | |||||
}, | |||||
{ | |||||
name: 'NPM', | |||||
iconHtml: '<i class="fab fa-npm"></i>', | |||||
starCount: 5 | |||||
}, | |||||
{ | |||||
name: 'Unity', | |||||
iconHtml: '<i class="fab fa-unity"></i>', | |||||
starCount: 2 | |||||
}, | |||||
{ | |||||
name: 'Godot', | |||||
iconHtml: '<img height="30" src="/assets/icons/kubernetes.png" alt="Godot">', | |||||
starCount: 4.5 | |||||
}, | |||||
{ | |||||
name: 'C#', | |||||
iconHtml: '<div height="30">C#</div>', | |||||
starCount: 4.5 | |||||
}, | |||||
]; | |||||
constructor() { } | |||||
ngOnInit(): void { | |||||
} | |||||
getStarClass(starCount: Star, starIndex: number) { | |||||
const starSizes: number[] = []; | |||||
let starCountWorker = starCount; | |||||
for (let starIterator = 1; starIterator <= MAX_STARS; starIterator++) { | |||||
if (starCountWorker >= 1) { | |||||
starCountWorker = (starCountWorker - 1) as Star; | |||||
starSizes.push(1); | |||||
} else { | |||||
if (starCountWorker === 0) { | |||||
starSizes.push(starCountWorker); | |||||
continue; | |||||
} | |||||
starSizes.push(starCountWorker); | |||||
starCountWorker = 0; | |||||
} | |||||
} | |||||
return STAR_CLASS_MAP[starSizes[starIndex]]; | |||||
} | |||||
} |
</div> | </div> | ||||
<div class="row"> | <div class="row"> | ||||
<div class="text-center skill col-sm-3"> | |||||
<div class="text-center skill-logo"> | |||||
<i class="fas fa-microchip"></i> | |||||
</div> | |||||
<div class="text-center"> | |||||
IoT | |||||
</div> | |||||
</div> | |||||
<div class="text-center skill col-sm-3"> | |||||
<div class="text-center skill-logo"> | |||||
<i class="fas fa-cogs"></i> | |||||
</div> | |||||
<div class="text-center"> | |||||
Deep Learning | |||||
</div> | |||||
</div> | |||||
<div class="text-center skill col-sm-3"> | |||||
<div class="text-center skill-logo"> | |||||
<i class="fas fa-gamepad"></i> | |||||
</div> | |||||
<div class="text-center"> | |||||
Game Development | |||||
</div> | |||||
</div> | |||||
<div class="text-center skill col-sm-3"> | |||||
<div | |||||
*ngFor="let skill of likeToLearn" | |||||
class="text-center skill col-sm-6" | |||||
> | |||||
<div class="text-center skill-logo"> | <div class="text-center skill-logo"> | ||||
<i class="fab fa-vuejs"></i> | |||||
<div [innerHTML]="skill.iconHtml"></div> | |||||
</div> | </div> | ||||
<div class="text-center"> | <div class="text-center"> | ||||
Vuejs | |||||
{{ skill.name }} | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="section section-transparent"></div> | |||||
<div class="section section-image section-hobbys"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-8 mr-auto ml-auto"> | |||||
<h1 class="text-center">Hobbys</h1> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div *ngFor="let skill of hobbys" class="text-center skill col-sm-6"> | |||||
<div class="text-center skill-logo"> | |||||
<div [innerHTML]="skill.iconHtml"></div> | |||||
</div> | |||||
<div class="text-center"> | |||||
{{ skill.name }} | |||||
</div> | |||||
<div *ngIf="skill.description" class="text-center description"> | |||||
<div class="text-center"> | |||||
{{ skill.description.text }} | |||||
</div> | |||||
<div *ngFor="let link of skill.description.links"> | |||||
<a class="btn btn-primary btn-fill btn-sm" [href]="link.href"> | |||||
{{ link.name }} | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="section section-transparent"> | <div class="section section-transparent"> | ||||
<div class="container"> | <div class="container"> | ||||
<div class="row"> | <div class="row"> |
padding-top: 2%; | padding-top: 2%; | ||||
} | } | ||||
table { | table { | ||||
color: white; | color: white; | ||||
} | } | ||||
background-image: url("/assets/img/pexels-photo-1629236.jpeg"); | background-image: url("/assets/img/pexels-photo-1629236.jpeg"); | ||||
} | } | ||||
.section-hobbys { | |||||
background-image: url("/assets/img/pexels-photo-1629236.jpeg"); | |||||
} | |||||
.section-transparent { | .section-transparent { | ||||
border-bottom: 1px solid transparent; | border-bottom: 1px solid transparent; | ||||
box-shadow: none; | box-shadow: none; | ||||
background: transparent !important; | background: transparent !important; | ||||
} | } | ||||
html, .main { | |||||
html, | |||||
.main { | |||||
background-image: url("/assets/img/pexels-photo-1252890.jpeg"); | background-image: url("/assets/img/pexels-photo-1252890.jpeg"); | ||||
background-position: center center; | background-position: center center; | ||||
background-size: cover; | background-size: cover; | ||||
background-attachment: fixed; | background-attachment: fixed; | ||||
margin-top: 0; | margin-top: 0; | ||||
} | } | ||||
1: 'fas fa-star', | 1: 'fas fa-star', | ||||
} | } | ||||
export const MAX_STARS = 5; | export const MAX_STARS = 5; | ||||
export interface Link { | |||||
href: string; | |||||
name: string; | |||||
} | |||||
export interface Skill { | export interface Skill { | ||||
name: string; | name: string; | ||||
iconHtml: string; | iconHtml: string; | ||||
starCount: Star; | |||||
starCount?: Star; | |||||
description?: { | |||||
text?: string; | |||||
links?: Link[]; | |||||
}; | |||||
} | } | ||||
@Component({ | @Component({ | ||||
selector: 'app-resume', | selector: 'app-resume', | ||||
public likeToLearn: Skill[] = [ | public likeToLearn: Skill[] = [ | ||||
{ | { | ||||
name: 'IoT', | name: 'IoT', | ||||
iconHtml: 'fas fa-microchip', | |||||
starCount: 0 | |||||
iconHtml: '<i class="fas fa-microchip"></i>', | |||||
}, | }, | ||||
{ | { | ||||
name: 'Deep Learning', | name: 'Deep Learning', | ||||
iconHtml: 'fas fa-cogs', | |||||
starCount: 0 | |||||
iconHtml: '<i class="fas fa-cogs"></i>', | |||||
}, | }, | ||||
{ | { | ||||
name: 'Game Development', | name: 'Game Development', | ||||
iconHtml: 'fas fa-gamepad', | |||||
starCount: 2 | |||||
iconHtml: '<i class="fas fa-gamepad"></i>', | |||||
}, | }, | ||||
{ | { | ||||
name: 'Vuejs', | name: 'Vuejs', | ||||
iconHtml: 'fab fa-vuejs', | |||||
starCount: 0 | |||||
iconHtml: '<i class="fab fa-vuejs"></i>', | |||||
}, | |||||
]; | |||||
public hobbys: Skill[] = [ | |||||
{ | |||||
name: 'Gaming', | |||||
iconHtml: '<i class="fas fa-gamepad"></i>', | |||||
}, | |||||
{ | |||||
name: 'Music', | |||||
iconHtml: '<i class="fas fa-music"></i>', | |||||
description: { | |||||
links: [ | |||||
{ | |||||
href: '/music', | |||||
name: 'Checkout' | |||||
} | |||||
] | |||||
} | |||||
}, | |||||
{ | |||||
name: 'Programming', | |||||
iconHtml: '<i class="fas fa-code"></i>', | |||||
}, | |||||
{ | |||||
name: 'Cooking', | |||||
iconHtml: '<i class="fas fa-utensils"></i>', | |||||
}, | |||||
{ | |||||
name: 'Skating', | |||||
iconHtml: '<i class="fas fa-snowboarding"></i>', | |||||
}, | |||||
{ | |||||
name: 'Pen & Paper', | |||||
iconHtml: '<i class="far fa-edit"></i>', | |||||
}, | }, | ||||
]; | ]; | ||||