@@ -0,0 +1,3 @@ | |||
{ | |||
"deno.enable": false | |||
} |
@@ -10,6 +10,8 @@ import { SaltyPiranhaComponent } from './pages/game-dashboard/salty-piranha/salt | |||
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 { 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 = [ | |||
@@ -17,6 +19,10 @@ const routes: Routes = [ | |||
path: 'resume', | |||
component: ResumeComponent, | |||
}, | |||
{ | |||
path: 'pdf', | |||
component: ResumePdfComponent, | |||
}, | |||
{ | |||
path: 'games', | |||
children: [ | |||
@@ -47,6 +53,10 @@ const routes: Routes = [ | |||
path: 'projects', | |||
component: ProjectDashboardComponent, | |||
}, | |||
{ | |||
path: 'music', | |||
component: MusicComponent, | |||
}, | |||
{ | |||
path: 'legal', | |||
component: ImpressumComponent, |
@@ -21,7 +21,10 @@ import { LaserBluesComponent } from './pages/game-dashboard/laser-blues/laser-bl | |||
import { SaltyPiranhaComponent } from './pages/game-dashboard/salty-piranha/salty-piranha.component'; | |||
import { KeepInTouchComponent } from './pages/keep-in-touch/keep-in-touch.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({ | |||
@@ -39,7 +42,10 @@ import { HobbyDashboardComponent } from './pages/hobby-dashboard/hobby-dashboard | |||
SaltyPiranhaComponent, | |||
KeepInTouchComponent, | |||
ImpressumComponent, | |||
HobbyDashboardComponent, | |||
MusicComponent, | |||
MusicHeaderComponent, | |||
ResumePdfComponent, | |||
PdfHeaderComponent, | |||
], | |||
imports: [ | |||
BrowserModule, |
@@ -0,0 +1,10 @@ | |||
<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> |
@@ -1,20 +1,20 @@ | |||
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(() => { | |||
TestBed.configureTestingModule({ | |||
declarations: [ HobbyDashboardComponent ] | |||
declarations: [ MusicHeaderComponent ] | |||
}) | |||
.compileComponents(); | |||
})); | |||
beforeEach(() => { | |||
fixture = TestBed.createComponent(HobbyDashboardComponent); | |||
fixture = TestBed.createComponent(MusicHeaderComponent); | |||
component = fixture.componentInstance; | |||
fixture.detectChanges(); | |||
}); |
@@ -0,0 +1,15 @@ | |||
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 { | |||
} | |||
} |
@@ -0,0 +1,3 @@ | |||
.default-header { | |||
background-image: url('assets/img/dark-fog-forest-haze.jpg'); | |||
} |
@@ -0,0 +1,11 @@ | |||
<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> |
@@ -0,0 +1,25 @@ | |||
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(); | |||
}); | |||
}); |
@@ -0,0 +1,15 @@ | |||
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 { | |||
} | |||
} |
@@ -1,150 +0,0 @@ | |||
<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> | |||
@@ -1,16 +0,0 @@ | |||
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 { | |||
} | |||
} |
@@ -1,16 +0,0 @@ | |||
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(); | |||
}); | |||
}); |
@@ -1,147 +0,0 @@ | |||
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}`); | |||
// }) | |||
// }); | |||
// } | |||
} |
@@ -0,0 +1,30 @@ | |||
<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> |
@@ -0,0 +1,25 @@ | |||
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(); | |||
}); | |||
}); |
@@ -0,0 +1,15 @@ | |||
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 { | |||
} | |||
} |
@@ -0,0 +1,254 @@ | |||
<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> |
@@ -0,0 +1,69 @@ | |||
.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%; | |||
} |
@@ -0,0 +1,269 @@ | |||
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]]; | |||
} | |||
} |
@@ -212,39 +212,15 @@ | |||
</div> | |||
<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"> | |||
<i class="fab fa-vuejs"></i> | |||
<div [innerHTML]="skill.iconHtml"></div> | |||
</div> | |||
<div class="text-center"> | |||
Vuejs | |||
{{ skill.name }} | |||
</div> | |||
</div> | |||
</div> | |||
@@ -291,6 +267,38 @@ | |||
</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="container"> | |||
<div class="row"> |
@@ -19,7 +19,6 @@ | |||
padding-top: 2%; | |||
} | |||
table { | |||
color: white; | |||
} | |||
@@ -36,19 +35,21 @@ table { | |||
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; | |||
} | |||
html, .main { | |||
html, | |||
.main { | |||
background-image: url("/assets/img/pexels-photo-1252890.jpeg"); | |||
background-position: center center; | |||
background-size: cover; | |||
background-attachment: fixed; | |||
margin-top: 0; | |||
} | |||
@@ -7,10 +7,19 @@ export const STAR_CLASS_MAP = { | |||
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; | |||
starCount?: Star; | |||
description?: { | |||
text?: string; | |||
links?: Link[]; | |||
}; | |||
} | |||
@Component({ | |||
selector: 'app-resume', | |||
@@ -48,23 +57,57 @@ export class ResumeComponent implements OnInit { | |||
public likeToLearn: Skill[] = [ | |||
{ | |||
name: 'IoT', | |||
iconHtml: 'fas fa-microchip', | |||
starCount: 0 | |||
iconHtml: '<i class="fas fa-microchip"></i>', | |||
}, | |||
{ | |||
name: 'Deep Learning', | |||
iconHtml: 'fas fa-cogs', | |||
starCount: 0 | |||
iconHtml: '<i class="fas fa-cogs"></i>', | |||
}, | |||
{ | |||
name: 'Game Development', | |||
iconHtml: 'fas fa-gamepad', | |||
starCount: 2 | |||
iconHtml: '<i class="fas fa-gamepad"></i>', | |||
}, | |||
{ | |||
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>', | |||
}, | |||
]; | |||