diff --git a/frontend/package.json b/frontend/package.json
index bbcd48e..1d63d70 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -79,6 +79,7 @@
"@typescript-eslint/eslint-plugin": "^8.60.1",
"@typescript-eslint/parser": "^8.60.1",
"angular-eslint": "21.4.0",
+ "baseline-browser-mapping": "^2.10.34",
"eslint": "^9.35.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-deprecation": "^3.0.0",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 4aecbe1..d70eddb 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -126,6 +126,9 @@ importers:
angular-eslint:
specifier: 21.4.0
version: 21.4.0(@angular/cli@22.0.0(@types/node@18.19.127)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.36.0(jiti@1.21.7))(typescript-eslint@8.60.1(eslint@9.36.0(jiti@1.21.7))(typescript@6.0.3))(typescript@6.0.3)
+ baseline-browser-mapping:
+ specifier: ^2.10.34
+ version: 2.10.34
eslint:
specifier: ^9.35.0
version: 9.36.0(jiti@1.21.7)
@@ -2096,8 +2099,9 @@ packages:
resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
engines: {node: ^4.5.0 || >= 5.9}
- baseline-browser-mapping@2.8.6:
- resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==}
+ baseline-browser-mapping@2.10.34:
+ resolution: {integrity: sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==}
+ engines: {node: '>=6.0.0'}
hasBin: true
beasties@0.4.2:
@@ -6321,7 +6325,7 @@ snapshots:
base64id@2.0.0: {}
- baseline-browser-mapping@2.8.6: {}
+ baseline-browser-mapping@2.10.34: {}
beasties@0.4.2:
dependencies:
@@ -6387,7 +6391,7 @@ snapshots:
browserslist@4.26.2:
dependencies:
- baseline-browser-mapping: 2.8.6
+ baseline-browser-mapping: 2.10.34
caniuse-lite: 1.0.30001743
electron-to-chromium: 1.5.222
node-releases: 2.0.21
diff --git a/frontend/src/app/app.component.scss b/frontend/src/app/app.component.scss
index 0e7199b..494bd54 100644
--- a/frontend/src/app/app.component.scss
+++ b/frontend/src/app/app.component.scss
@@ -6,17 +6,28 @@
left: 0;
width: 100%;
height: 100%;
- z-index: -1;
+ z-index: 0;
+ pointer-events: none;
}
.main-content {
grid-area: main;
background: transparent;
display: flex;
- justify-content: center;
- align-items: center;
+ justify-content: flex-start;
+ align-items: flex-start;
+ flex-direction: column;
grid-column: 1 / -1;
+ min-height: 0;
height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
+ box-sizing: border-box;
+ padding: 0 1rem 1rem;
+}
+
+.main-content > * {
+ width: 100%;
}
app-header {
@@ -30,6 +41,8 @@ app-footer {
}
.app-container {
+ position: relative;
+ z-index: 1;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: auto auto 1fr 1fr 1fr 1fr auto;
@@ -44,4 +57,5 @@ app-footer {
'footer footer footer footer';
height: 100vh;
background: transparent;
+ overflow: hidden;
}
diff --git a/frontend/src/app/app.config.ts b/frontend/src/app/app.config.ts
index dc34e12..cad2683 100644
--- a/frontend/src/app/app.config.ts
+++ b/frontend/src/app/app.config.ts
@@ -1,9 +1,14 @@
import { ApplicationConfig } from '@angular/core';
+import { provideHttpClient } from '@angular/common/http';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';
import { provideClientHydration, withNoIncrementalHydration } from '@angular/platform-browser';
export const appConfig: ApplicationConfig = {
- providers: [provideRouter(routes), provideClientHydration(withNoIncrementalHydration())],
+ providers: [
+ provideRouter(routes),
+ provideClientHydration(withNoIncrementalHydration()),
+ provideHttpClient(),
+ ],
};
diff --git a/frontend/src/app/pages/about/about.component.scss b/frontend/src/app/pages/about/about.component.scss
index a03d93e..04d0275 100644
--- a/frontend/src/app/pages/about/about.component.scss
+++ b/frontend/src/app/pages/about/about.component.scss
@@ -15,6 +15,7 @@
background: rgba($color-background-dark, 0.8);
padding: 1rem;
border-radius: 1rem;
+ border: 2px solid $color-accent;
.profile-image {
padding-top: 1rem;
@@ -45,6 +46,8 @@
width: min(100%, 38rem);
background: rgba($color-background-dark, 0.8);
padding: 1rem;
+ border: 2px solid $color-accent;
+ border-radius: 1rem;
.title {
text-align: center;
diff --git a/frontend/src/app/pages/music/music.component.html b/frontend/src/app/pages/music/music.component.html
index 67fc81f..0ab9c4f 100644
--- a/frontend/src/app/pages/music/music.component.html
+++ b/frontend/src/app/pages/music/music.component.html
@@ -1 +1,28 @@
-
music works!
+
+ Discographies
+ @if (releases$ | async; as releases) {
+ @for (item of releases; track item.title) {
+
+
+
+
{{ item.title }}
+
+
{{ item.short_infos[0].songs }}
+
{{ item.short_infos[0].songs_length }}
+
{{ item.short_infos[0].bpm }}
+
+
+
+ }
+ }
+
diff --git a/frontend/src/app/pages/music/music.component.scss b/frontend/src/app/pages/music/music.component.scss
index e69de29..6f3a17a 100644
--- a/frontend/src/app/pages/music/music.component.scss
+++ b/frontend/src/app/pages/music/music.component.scss
@@ -0,0 +1,91 @@
+@use 'variables' as *;
+
+:host {
+ display: block;
+ width: 100%;
+}
+
+.discographies {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-content: flex-start;
+ align-items: flex-start;
+ gap: 1.5em;
+ padding: 1em;
+ scroll-margin-top: 150px;
+ width: min(1500px, 100%);
+ margin-inline: auto;
+ box-sizing: border-box;
+
+ h1 {
+ flex-basis: 100%;
+ margin: 0;
+ color: $color-accent;
+ text-align: center;
+ }
+
+ article {
+ display: grid;
+ grid-template-rows: auto auto auto;
+ padding: 0.5em;
+ grid-gap: 0.5em;
+ width: min(420px, 100%);
+
+ > img {
+ grid-row: 1;
+ border: 2px solid $color-accent;
+ border-radius: 2em;
+ width: 100%;
+ height: auto;
+ }
+
+ .content {
+ grid-row: 3;
+ display: grid;
+ grid-template-columns: 20% 20% 35% 25%;
+ border: 2px solid $color-accent;
+ border-radius: 2em;
+ background: rgba($color-background-dark, 0.8);
+ padding: 1em;
+
+ h3 {
+ grid-column: 1/-1;
+ color: $color-accent;
+ }
+
+ time,
+ p {
+ margin: 2em 0 2em 0;
+ color: $color-text;
+ }
+ }
+ }
+
+ .content .icons {
+ grid-column: 1/-1;
+ display: flex;
+ justify-content: center;
+ padding: 0.5em;
+
+ img {
+ width: 128px;
+ height: 128px;
+ padding: 0.5em;
+ border: none;
+ border-radius: 0;
+ }
+ }
+}
+
+@media (min-width: 1024px) {
+ .discographies {
+ gap: 4.5rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .discographies {
+ gap: 4.5rem;
+ }
+}
diff --git a/frontend/src/app/pages/music/music.component.ts b/frontend/src/app/pages/music/music.component.ts
index 085d78a..4cfa036 100644
--- a/frontend/src/app/pages/music/music.component.ts
+++ b/frontend/src/app/pages/music/music.component.ts
@@ -1,11 +1,47 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
+import { AsyncPipe } from '@angular/common';
+import { HttpClient } from '@angular/common/http';
+import { inject } from '@angular/core';
+import { catchError, map, Observable, of } from 'rxjs';
+
+interface ReleaseInfo {
+ released: number;
+ songs: string;
+ songs_length: string;
+ bpm: string;
+ spotify_icon: string;
+ spotify_link: string;
+ youtube_icon: string;
+ youtube_link: string;
+ itunes_icon: string;
+ itunes_link: string;
+}
+
+interface Release {
+ image: string;
+ title: string;
+ short_infos: ReleaseInfo[];
+}
+
+interface MusicData {
+ releases: Release[];
+}
@Component({
standalone: true,
selector: 'app-music',
- imports: [],
+ imports: [AsyncPipe],
templateUrl: './music.component.html',
styleUrl: './music.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
})
-export class MusicComponent {}
+export class MusicComponent {
+ private readonly http = inject(HttpClient);
+
+ readonly releases$: Observable = this.http
+ .get('assets/musicdata.json')
+ .pipe(
+ map((data) => data.releases ?? []),
+ catchError(() => of([])),
+ );
+}
diff --git a/frontend/src/assets/musicdata.json b/frontend/src/assets/musicdata.json
new file mode 100644
index 0000000..e2345c5
--- /dev/null
+++ b/frontend/src/assets/musicdata.json
@@ -0,0 +1,76 @@
+{
+ "releases": [
+ {
+ "image": "assets/resources/covers/Cover_Find_Flow.jpg",
+ "title": "Find Flow",
+ "short_infos": [
+ {
+ "released": 2025,
+ "songs": "1 Song",
+ "songs_length": "5 Min. 45 sec",
+ "bpm": "128 BPM",
+ "spotify_icon": "assets/resources/icons/spotify.png",
+ "spotify_link": "https://open.spotify.com/intl-de/album/7543yReuf6ojw47puZiymj?si=OzUlK7siRGmvHsgOb37NZg",
+ "youtube_icon": "assets/resources/icons/youtube.png",
+ "youtube_link": "https://music.youtube.com/watch?v=mUo69BB3f5c&si=_kBvkxY5C53BHzkH",
+ "itunes_icon": "assets/resources/icons/itunes.png",
+ "itunes_link": "https://music.apple.com/ch/album/find-flow/1839233312?i=1839233313"
+ }
+ ]
+ },
+ {
+ "image": "assets/resources/covers/Cover_Breathe_Again.png",
+ "title": "Breath Again",
+ "short_infos": [
+ {
+ "released": 2025,
+ "songs": "1 Song",
+ "songs_length": "4 Min. 04 sec",
+ "bpm": "143 BPM",
+ "spotify_icon": "assets/resources/icons/spotify.png",
+ "spotify_link": "https://open.spotify.com/intl-de/album/3Zl4tMXmSVCSeb9uIdTiRq?si=kLGm17jPRQGwpiciHCaxBA",
+ "youtube_icon": "assets/resources/icons/youtube.png",
+ "youtube_link": "https://music.youtube.com/watch?v=BS053uOLDrE&si=aYqkf_lj2ocs3Hyy",
+ "itunes_icon": "assets/resources/icons/itunes.png",
+ "itunes_link": "https://music.apple.com/ch/album/breathe-again/1827254948?i=1827254950"
+ }
+ ]
+ },
+ {
+ "image": "assets/resources/covers/Cover_Summer_Vibes.jpeg",
+ "title": "Summer Vibes",
+ "short_infos": [
+ {
+ "released": 2018,
+ "songs": "1 Song",
+ "songs_length": "4 Min. 31 sec",
+ "bpm": "128 BPM",
+ "spotify_icon": "assets/resources/icons/spotify.png",
+ "spotify_link": "https://open.spotify.com/album/2XFUE1SkxBwVkHoxWSJN3W",
+ "youtube_icon": "assets/resources/icons/youtube.png",
+ "youtube_link": "https://www.youtube.com/watch?v=9Fig45Lgfrw&list=PLPY7SNMth8dYYcc24wvGpjXMTP7x189oE",
+ "itunes_icon": "assets/resources/icons/itunes.png",
+ "itunes_link": "https://music.apple.com/us/album/summer-vibes/1410121451?i=1410121722"
+ }
+ ]
+ },
+ {
+ "image": "assets/resources/covers/Cover_Heart_in_Fire.jpeg",
+ "title": "Heart in Fire",
+ "short_infos": [
+ {
+ "released": 2014,
+ "songs": "2 Song",
+ "songs_length": "9 Min. 22 sec",
+ "bpm": "128 BPM",
+ "spotify_icon": "assets/resources/icons/spotify.png",
+ "spotify_link": "https://open.spotify.com/album/4qEK9uwnvTNcWQrJue5dgr?si=r5UFkTUMRXaf6JIPuTCVQQ",
+ "youtube_icon": "assets/resources/icons/youtube.png",
+ "youtube_link": "https://www.youtube.com/watch?v=a1u3rpDJkvs&list=PLPY7SNMth8dYYcc24wvGpjXMTP7x189oE&index=2",
+ "itunes_icon": "assets/resources/icons/itunes.png",
+ "itunes_link": "https://music.apple.com/us/album/heart-in-fire-single/878646664"
+ }
+ ]
+ }
+ ]
+}
diff --git a/frontend/src/assets/resources/covers/Cover_Breathe_Again.png b/frontend/src/assets/resources/covers/Cover_Breathe_Again.png
new file mode 100644
index 0000000..23da3b2
Binary files /dev/null and b/frontend/src/assets/resources/covers/Cover_Breathe_Again.png differ
diff --git a/frontend/src/assets/resources/covers/Cover_Find_Flow.jpg b/frontend/src/assets/resources/covers/Cover_Find_Flow.jpg
new file mode 100644
index 0000000..b42d25e
Binary files /dev/null and b/frontend/src/assets/resources/covers/Cover_Find_Flow.jpg differ
diff --git a/frontend/src/assets/resources/covers/Cover_Heart_in_Fire.jpeg b/frontend/src/assets/resources/covers/Cover_Heart_in_Fire.jpeg
new file mode 100755
index 0000000..e8384b0
Binary files /dev/null and b/frontend/src/assets/resources/covers/Cover_Heart_in_Fire.jpeg differ
diff --git a/frontend/src/assets/resources/covers/Cover_Summer_Vibes.jpeg b/frontend/src/assets/resources/covers/Cover_Summer_Vibes.jpeg
new file mode 100755
index 0000000..45c4bdc
Binary files /dev/null and b/frontend/src/assets/resources/covers/Cover_Summer_Vibes.jpeg differ
diff --git a/frontend/src/assets/resources/icons/djredflame.png b/frontend/src/assets/resources/icons/djredflame.png
new file mode 100755
index 0000000..2f8aa8e
Binary files /dev/null and b/frontend/src/assets/resources/icons/djredflame.png differ
diff --git a/frontend/src/assets/resources/icons/facebook.png b/frontend/src/assets/resources/icons/facebook.png
new file mode 100755
index 0000000..acdc10d
Binary files /dev/null and b/frontend/src/assets/resources/icons/facebook.png differ
diff --git a/frontend/src/assets/resources/icons/instagram.png b/frontend/src/assets/resources/icons/instagram.png
new file mode 100755
index 0000000..9334a33
Binary files /dev/null and b/frontend/src/assets/resources/icons/instagram.png differ
diff --git a/frontend/src/assets/resources/icons/itunes.png b/frontend/src/assets/resources/icons/itunes.png
new file mode 100755
index 0000000..61b4214
Binary files /dev/null and b/frontend/src/assets/resources/icons/itunes.png differ
diff --git a/frontend/src/assets/resources/icons/sources.json b/frontend/src/assets/resources/icons/sources.json
new file mode 100755
index 0000000..07ba880
--- /dev/null
+++ b/frontend/src/assets/resources/icons/sources.json
@@ -0,0 +1,28 @@
+[
+ {
+ "Youtube": {
+ "Link": "https://www.flaticon.com/free-icon/youtube_665232?term=youtube&page=1&position=8&origin=search&related_id=665232",
+ "Contribute": " Stockio from www.flaticon.com'"
+ },
+ "Spotify": {
+ "Link": "https://www.flaticon.com/free-icon/spotify_1532448?term=spotify&page=1&position=79&origin=search&related_id=1532448",
+ "Contribute": "Spotify icons created by Freepik - Flaticon"
+ },
+ "Itunes": {
+ "Link": "https://www.flaticon.com/free-icon/itunes_1384029?term=itunes&page=1&position=2&origin=search&related_id=1384029",
+ "Contribute": " Freepik from www.flaticon.com'"
+ },
+ "Facebook": {
+ "Link": "https://www.flaticon.com/free-icon/facebook_665209",
+ "Contribute": " Stockio from www.flaticon.com'"
+ },
+ "Instagram": {
+ "Link": "https://www.flaticon.com/free-icon/instagram_1362857",
+ "Contribute": " Payungkead from www.flaticon.com'"
+ },
+ "Twitter": {
+ "Link": "https://www.flaticon.com/free-icon/twitter_356076",
+ "Contribute": " Freepik from www.flaticon.com'"
+ }
+ }
+]
diff --git a/frontend/src/assets/resources/icons/spotify.png b/frontend/src/assets/resources/icons/spotify.png
new file mode 100755
index 0000000..11b72ec
Binary files /dev/null and b/frontend/src/assets/resources/icons/spotify.png differ
diff --git a/frontend/src/assets/resources/icons/twitter.png b/frontend/src/assets/resources/icons/twitter.png
new file mode 100755
index 0000000..af3135c
Binary files /dev/null and b/frontend/src/assets/resources/icons/twitter.png differ
diff --git a/frontend/src/assets/resources/icons/youtube.png b/frontend/src/assets/resources/icons/youtube.png
new file mode 100755
index 0000000..693e80e
Binary files /dev/null and b/frontend/src/assets/resources/icons/youtube.png differ