From 5969e66872aceaed094bb845c2121a160b438c18 Mon Sep 17 00:00:00 2001 From: Lobo Date: Sun, 9 Nov 2025 12:21:34 +0100 Subject: [PATCH 1/3] Started with about page and my cv --- angular.json | 2 +- src/app/app.config.ts | 4 +- src/app/app.html | 36 ------ src/app/app.routes.ts | 4 +- src/app/app.scss | 13 --- src/app/app.ts | 32 ----- src/app/constants/AssetsConstants.ts | 7 ++ .../{Constants.ts => LocalStoreConstants.ts} | 2 +- src/app/constants/UrlConstants.ts | 4 + src/app/features/welcome/welcome.html | 28 ----- src/app/features/welcome/welcome.scss | 5 - src/app/features/welcome/welcome.ts | 18 --- src/app/layout/app/app.component.html | 9 ++ src/app/layout/app/app.component.scss | 10 ++ src/app/layout/app/app.component.ts | 16 +++ src/app/layout/topbar/topbar.component.html | 58 +++++++++ src/app/layout/topbar/topbar.component.scss | 73 ++++++++++++ src/app/layout/topbar/topbar.component.ts | 44 +++++++ src/app/pages/about/about.component.html | 110 ++++++++++++++++++ src/app/pages/about/about.component.scss | 86 ++++++++++++++ src/app/pages/about/about.component.ts | 60 ++++++++++ .../project-details.component.html | 1 + .../project-details.component.scss | 0 .../project-details.component.ts | 11 ++ .../pages/projects/projects.component.html | 1 + .../pages/projects/projects.component.scss | 0 src/app/pages/projects/projects.component.ts | 11 ++ src/app/service/language.service.ts | 6 +- src/app/service/reload.service.ts | 6 +- src/app/service/theme.service.ts | 8 +- src/{ => assets}/favicon.ico | Bin src/assets/i18n/de.json | 68 +++++++++-- src/assets/i18n/en.json | 67 +++++++++-- src/assets/me.webp | Bin 0 -> 107496 bytes src/index.html | 2 +- src/main.ts | 4 +- 36 files changed, 637 insertions(+), 169 deletions(-) delete mode 100644 src/app/app.html delete mode 100644 src/app/app.scss delete mode 100644 src/app/app.ts create mode 100644 src/app/constants/AssetsConstants.ts rename src/app/constants/{Constants.ts => LocalStoreConstants.ts} (80%) create mode 100644 src/app/constants/UrlConstants.ts delete mode 100644 src/app/features/welcome/welcome.html delete mode 100644 src/app/features/welcome/welcome.scss delete mode 100644 src/app/features/welcome/welcome.ts create mode 100644 src/app/layout/app/app.component.html create mode 100644 src/app/layout/app/app.component.scss create mode 100644 src/app/layout/app/app.component.ts create mode 100644 src/app/layout/topbar/topbar.component.html create mode 100644 src/app/layout/topbar/topbar.component.scss create mode 100644 src/app/layout/topbar/topbar.component.ts create mode 100644 src/app/pages/about/about.component.html create mode 100644 src/app/pages/about/about.component.scss create mode 100644 src/app/pages/about/about.component.ts create mode 100644 src/app/pages/project-details/project-details.component.html create mode 100644 src/app/pages/project-details/project-details.component.scss create mode 100644 src/app/pages/project-details/project-details.component.ts create mode 100644 src/app/pages/projects/projects.component.html create mode 100644 src/app/pages/projects/projects.component.scss create mode 100644 src/app/pages/projects/projects.component.ts rename src/{ => assets}/favicon.ico (100%) create mode 100644 src/assets/me.webp diff --git a/angular.json b/angular.json index 666b77a..c0d44b9 100644 --- a/angular.json +++ b/angular.json @@ -25,7 +25,7 @@ "tsConfig": "tsconfig.app.json", "inlineStyleLanguage": "scss", "assets": [ - "src/favicon.ico", + "src/assets/favicon.ico", { "glob": "**/*", "input": "public" diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 8fe8c53..03c2f48 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -6,7 +6,7 @@ import {provideAnimations} from '@angular/platform-browser/animations'; import {provideHttpClient} from '@angular/common/http'; import {provideTranslateService} from '@ngx-translate/core'; import {provideTranslateHttpLoader} from '@ngx-translate/http-loader'; -import {Constants} from './constants/Constants'; +import {LocalStoreConstants} from './constants/LocalStoreConstants'; const INITIAL_LANG = getInitialLang(); @@ -30,7 +30,7 @@ export const appConfig: ApplicationConfig = { }; function getInitialLang(): string { - const saved = localStorage.getItem(Constants.LANGUAGE_KEY); + const saved = localStorage.getItem(LocalStoreConstants.LANGUAGE_KEY); if (saved) return saved; const nav = typeof navigator !== 'undefined' ? navigator.language?.toLowerCase() : 'en'; return nav?.startsWith('de') ? 'de' : 'en'; diff --git a/src/app/app.html b/src/app/app.html deleted file mode 100644 index e69f15c..0000000 --- a/src/app/app.html +++ /dev/null @@ -1,36 +0,0 @@ - - {{ 'APP.TITLE' | translate }} - - - - - - - - - {{ lang.lang() === 'de' ? ('LANG.DE' | translate) : ('LANG.EN' | translate) }} - - - - - - {{ 'LANG.DE' | translate }} - - - - - {{ 'LANG.EN' | translate }} - - - - - - - - -
- -
diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index da126ee..2c0a7ba 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,6 +1,6 @@ import { Routes } from '@angular/router'; -import {WelcomeComponent} from './features/welcome/welcome'; +import {AboutComponent} from './pages/about/about.component'; export const routes: Routes = [ - { path: '', component: WelcomeComponent }, + { path: '', component: AboutComponent }, ]; diff --git a/src/app/app.scss b/src/app/app.scss deleted file mode 100644 index 4120908..0000000 --- a/src/app/app.scss +++ /dev/null @@ -1,13 +0,0 @@ -.spacer { flex: 1 1 auto; } -.container { max-width: 960px; margin: 24px auto; padding: 0 16px; } -mat-form-field { --mdc-outlined-text-field-container-shape: 20px; } - -.flag-icon { - width: 20px; - height: 14px; - object-fit: cover; - border-radius: 2px; - box-shadow: 0 0 0 1px rgba(0,0,0,.08) inset; - vertical-align: -2px; -} -mat-option .flag-icon { margin-right: 8px; } diff --git a/src/app/app.ts b/src/app/app.ts deleted file mode 100644 index 7ed0683..0000000 --- a/src/app/app.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Component, computed, effect, inject} from '@angular/core'; -import { RouterOutlet } from '@angular/router'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { MatSelectModule } from '@angular/material/select'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { FormsModule } from '@angular/forms'; - -import { TranslateModule } from '@ngx-translate/core'; -import { ThemeService } from './service/theme.service'; - -import {LanguageService} from './service/language.service'; - -@Component({ - selector: 'app-root', - standalone: true, - imports: [ - RouterOutlet, - MatToolbarModule, MatIconModule, MatButtonModule, - MatFormFieldModule, MatSelectModule, - FormsModule, - TranslateModule - ], - templateUrl: './app.html', - styleUrl: './app.scss', -}) -export class App { - readonly theme = inject(ThemeService); - readonly lang = inject(LanguageService); - readonly themeIcon = computed(() => this.theme.theme() === 'dark' ? 'light_mode' : 'dark_mode'); -} diff --git a/src/app/constants/AssetsConstants.ts b/src/app/constants/AssetsConstants.ts new file mode 100644 index 0000000..d11ad51 --- /dev/null +++ b/src/app/constants/AssetsConstants.ts @@ -0,0 +1,7 @@ +export class AssetsConstants { + + static readonly ME = '/assets/me.webp'; + static readonly LOGO = '/assets/favicon.ico'; + static readonly FLAG_DE = '/assets/flags/de.svg'; + static readonly FLAG_EN = '/assets/flags/gb.svg'; +} diff --git a/src/app/constants/Constants.ts b/src/app/constants/LocalStoreConstants.ts similarity index 80% rename from src/app/constants/Constants.ts rename to src/app/constants/LocalStoreConstants.ts index e1b8d9c..71d3b66 100644 --- a/src/app/constants/Constants.ts +++ b/src/app/constants/LocalStoreConstants.ts @@ -1,4 +1,4 @@ -export class Constants{ +export class LocalStoreConstants { static readonly THEME_KEY = 'theme'; static readonly LANGUAGE_KEY = 'lang'; diff --git a/src/app/constants/UrlConstants.ts b/src/app/constants/UrlConstants.ts new file mode 100644 index 0000000..ec5fe29 --- /dev/null +++ b/src/app/constants/UrlConstants.ts @@ -0,0 +1,4 @@ +export class UrlConstants { + static readonly LINKED_IN = 'https://www.linkedin.com/in/andreas-dahm-2395991ba'; + static readonly GIT_HUB = 'https://github.com/LoboTheDark'; +} diff --git a/src/app/features/welcome/welcome.html b/src/app/features/welcome/welcome.html deleted file mode 100644 index e20ab2d..0000000 --- a/src/app/features/welcome/welcome.html +++ /dev/null @@ -1,28 +0,0 @@ - - - {{ `WELCOME.TITLE` | translate }} - {{ `WELCOME.SUB` | translate }} - - - -

{{ `WELCOME.TEXT` | translate }}

-

- {{ `WELCOME.COUNTER` | translate }}: {{ count() }} -

-
- - - - - -
diff --git a/src/app/features/welcome/welcome.scss b/src/app/features/welcome/welcome.scss deleted file mode 100644 index c51b898..0000000 --- a/src/app/features/welcome/welcome.scss +++ /dev/null @@ -1,5 +0,0 @@ -mat-card { - margin-top: 2rem; - display: block; - background-color: var(--app-card-background); -} diff --git a/src/app/features/welcome/welcome.ts b/src/app/features/welcome/welcome.ts deleted file mode 100644 index f41e8a1..0000000 --- a/src/app/features/welcome/welcome.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, signal } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import {TranslatePipe} from '@ngx-translate/core'; - -@Component({ - selector: 'app-welcome', - standalone: true, - imports: [MatCardModule, MatButtonModule, MatIconModule, TranslatePipe], - templateUrl: './welcome.html', - styleUrl: './welcome.scss', -}) -export class WelcomeComponent { - readonly count = signal(0); - inc() { this.count.update(v => v + 1); } - reset() { this.count.set(0); } -} diff --git a/src/app/layout/app/app.component.html b/src/app/layout/app/app.component.html new file mode 100644 index 0000000..f236b2d --- /dev/null +++ b/src/app/layout/app/app.component.html @@ -0,0 +1,9 @@ + + +
+ +
+ +
+ © {{ currentYear }} Andreas Dahm - {{ `APP.COPYRIGHT` | translate }} +
diff --git a/src/app/layout/app/app.component.scss b/src/app/layout/app/app.component.scss new file mode 100644 index 0000000..f3ee3d5 --- /dev/null +++ b/src/app/layout/app/app.component.scss @@ -0,0 +1,10 @@ +.container { max-width: 1100px; margin: 0 auto; padding: 1rem; } +.app-surface { + background: var(--app-bg); + color: var(--app-fg); + transition: background-color 220ms ease, color 220ms ease; +} +.foot { + border-top: 1px solid rgba(0,0,0,.08); + padding: 1rem; text-align: center; opacity: .8; +} diff --git a/src/app/layout/app/app.component.ts b/src/app/layout/app/app.component.ts new file mode 100644 index 0000000..5a5aef1 --- /dev/null +++ b/src/app/layout/app/app.component.ts @@ -0,0 +1,16 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import {TopbarComponent} from '../topbar/topbar.component'; +import {TranslatePipe} from '@ngx-translate/core'; + + +@Component({ + selector: 'app-root', + standalone: true, + imports: [RouterOutlet, TopbarComponent, TranslatePipe], + templateUrl: './app.component.html', + styleUrl: './app.component.scss' +}) +export class AppComponent { + currentYear = new Date().getFullYear(); +} diff --git a/src/app/layout/topbar/topbar.component.html b/src/app/layout/topbar/topbar.component.html new file mode 100644 index 0000000..b93633d --- /dev/null +++ b/src/app/layout/topbar/topbar.component.html @@ -0,0 +1,58 @@ + + + + {{ 'APP.TITLE' | translate }} + + + + + + + + + + + + + + + diff --git a/src/app/layout/topbar/topbar.component.scss b/src/app/layout/topbar/topbar.component.scss new file mode 100644 index 0000000..a148769 --- /dev/null +++ b/src/app/layout/topbar/topbar.component.scss @@ -0,0 +1,73 @@ +.topbar { + position: sticky; top: 0; z-index: 100; + backdrop-filter: saturate(1.1) blur(8px); + background: + color-mix(in oklab, var(--app-bg) 80%, transparent); + border-bottom: 1px solid rgba(0,0,0,.08); + + .brand { + display:flex; align-items:center; gap:.6rem; + color: inherit; text-decoration: none; + .logo-dot { + width: 48px; height: 48px; border-radius: 50%; + } + .brand-text { font-weight: 600; letter-spacing:.2px; } + } + + .nav { display:flex; gap:.25rem; margin-left:.5rem; } + + .spacer { flex: 1; } + + .flag-icon { width: 18px; height: 18px; border-radius: 2px; margin-right:.5rem; } + + .menu-section { padding:.25rem .5rem .5rem; } + .menu-title { font-size:.75rem; opacity:.75; padding:.25rem .75rem .5rem; } + + .kbd { + margin-left:auto; font-size:.7rem; opacity:.65; border:1px solid currentColor; + border-radius:4px; padding:0 .35rem; + } +} + +::ng-deep .mat-mdc-menu-item .mdc-list-item__primary-text { + display: flex; + align-items: center; + gap: .5rem; +} + +::ng-deep .mat-mdc-menu-item .kbd { + margin-left: auto; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; + font-size: 11px; + line-height: 1.6; + padding: 0 .35rem; + border: 0px solid currentColor; + border-radius: 4px; + opacity: .65; +} + +::ng-deep .mat-mdc-menu-item .mat-icon { + width: 20px; height: 20px; font-size: 20px; +} + +::ng-deep .mat-mdc-menu-item .flag-icon { + width: 20px !important; + height: 14px !important; + object-fit: cover; + border-radius: 2px; + margin-right: .5rem; + vertical-align: middle; +} + +::ng-deep .mat-mdc-menu-panel { + border-radius: 10px !important; + border: 1px solid rgba(0,0,0,.14); +} +.dark ::ng-deep .mat-mdc-menu-panel { + border-color: rgba(255,255,255,.06); +} + +/* Responsive: Collapse navigation to icon if width is smaller than 760px */ +@media (max-width: 760px) { + .topbar .nav { display:none; } +} diff --git a/src/app/layout/topbar/topbar.component.ts b/src/app/layout/topbar/topbar.component.ts new file mode 100644 index 0000000..9dad819 --- /dev/null +++ b/src/app/layout/topbar/topbar.component.ts @@ -0,0 +1,44 @@ +import { Component, computed, inject } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TranslateModule } from '@ngx-translate/core'; +import { ThemeService } from '../../service/theme.service'; +import { LanguageService } from '../../service/language.service'; +import { MatDivider } from '@angular/material/divider'; +import {AssetsConstants} from '../../constants/AssetsConstants'; + +@Component({ + selector: 'app-topbar', + standalone: true, + imports: [ + RouterLink, + MatToolbarModule, MatIconModule, MatButtonModule, MatMenuModule, MatTooltipModule, + TranslateModule, MatDivider + ], + templateUrl: './topbar.component.html', + styleUrl: './topbar.component.scss' +}) +export class TopbarComponent { + readonly theme = inject(ThemeService); + readonly lang = inject(LanguageService); + + readonly themeIcon = computed(() => + this.theme.theme() === 'dark' ? 'light_mode' : 'dark_mode' + ); + + onKeydown(e: KeyboardEvent) { + const metaOrCtrl = e.metaKey || e.ctrlKey; + if (metaOrCtrl && (e.key.toLowerCase() === 'j')) { + e.preventDefault(); + this.theme.toggle(); + } + } + + setLang(code: 'de' | 'en') { this.lang.use(code); } + + protected readonly AssetsConstants = AssetsConstants; +} diff --git a/src/app/pages/about/about.component.html b/src/app/pages/about/about.component.html new file mode 100644 index 0000000..b8c830b --- /dev/null +++ b/src/app/pages/about/about.component.html @@ -0,0 +1,110 @@ +
+ +
+ {{ 'ABOUT.ALT.PROFILE' | translate }} +
+ +
+

{{ 'ABOUT.HELLO' | translate }}

+

+ {{ 'ABOUT.LEAD' | translate }} +

+ +
+
+ + {{ 'ABOUT.ROLE' | translate }} +
+
+ + {{ 'ABOUT.LOCATION' | translate }} +
+ +
+ + GitHub + · + LinkedIn +
+
+ + +
+
+ + +

{{ 'ABOUT.SECTION.SKILLS' | translate }}

+
+
+

{{ 'ABOUT.SECTION.PRIMARY' | translate }}

+ + @for (s of primarySkills; track primarySkills) { + {{ s | translate }} + } + +
+ +
+

{{ 'ABOUT.SECTION.TOOLSET' | translate }}

+ + @for (t of toolset; track toolset) { + {{ t | translate }} + } + +
+
+
+ + +

{{ 'ABOUT.SECTION.EXPERIENCE' | translate }}

+ +
+
+
+ {{ 'ABOUT.XP.T1.ROLE' | translate }} + {{ 'ABOUT.XP.T1.TIME' | translate }} +
+
{{ 'ABOUT.XP.T1.COMPANY' | translate }}
+
    +
  • {{ 'ABOUT.XP.T1.P1' | translate }}
  • +
  • {{ 'ABOUT.XP.T1.P2' | translate }}
  • +
  • {{ 'ABOUT.XP.T1.P3' | translate }}
  • +
+
+ + + +
+
+ {{ 'ABOUT.XP.T2.ROLE' | translate }} + {{ 'ABOUT.XP.T2.TIME' | translate }} +
+
{{ 'ABOUT.XP.T2.COMPANY' | translate }}
+
    +
  • {{ 'ABOUT.XP.T2.P1' | translate }}
  • +
  • {{ 'ABOUT.XP.T2.P2' | translate }}
  • +
+
+
+
+
diff --git a/src/app/pages/about/about.component.scss b/src/app/pages/about/about.component.scss new file mode 100644 index 0000000..fb5e36d --- /dev/null +++ b/src/app/pages/about/about.component.scss @@ -0,0 +1,86 @@ +.about { + display: grid; + gap: 1rem; +} + +/* Hero block: Photo + Intro */ +.hero { + display: grid; + grid-template-columns: 240px 1fr; + gap: 1.25rem; + border-radius: 16px; + background: var(--app-card-background); + + .photo { + align-items:flex-start; justify-content:center; + img { + display:block; + width: 100%; height: auto; + max-width: 220px; + border-radius: 12px; + box-shadow: 0 6px 24px rgba(0,0,0,.25); + object-fit: cover; + } + } + + .intro { + display:flex; flex-direction:column; gap:.5rem; + h1 { margin-top: .25rem } + .lead { opacity:.9; margin: .25rem 0 0.5rem; } + + .meta { + display:flex; flex-direction:column; gap:.25rem; + .row { + display:flex; align-items:center; gap:.4rem; + a { color: inherit; } + } + } + + .actions { + display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.5rem; margin-bottom: .25rem; + .mat-icon { margin-right:.25rem; } + } + } +} + +/* Skills block */ +.skills { + border-radius: 16px; + background: var(--app-card-background); + h2 { margin-top: .25rem; margin-left: .25rem; } + .chip-groups { + margin-left: .25rem; + display:grid; gap:1rem; + grid-template-columns: 1fr 1fr; + h3 { margin: .2rem 0 .4rem; font-size: .95rem; opacity:.85; } + mat-chip-set { + display:flex; flex-wrap:wrap; gap:.4rem; + } + } +} + +/* Experience block */ +.experience { + border-radius: 16px; + background: var(--app-card-background); + h2 { margin-top: .25rem;margin-left: .25rem; } + .xp-list { + margin-left: .25rem; + display: grid; gap: .75rem; + } + .xp-item { + .xp-head { + display:flex; align-items:baseline; gap:.5rem; + .time { opacity:.75; font-size:.9rem; } + } + .xp-sub { opacity:.9; margin-bottom:.25rem; } + ul { margin: .25rem 0 .5rem 1.15rem; } + } +} + +/* Responsive */ +@media (max-width: 900px) { + .hero { grid-template-columns: 1fr; } + .hero .photo { justify-content: flex-start; } + .skills .chip-groups { grid-template-columns: 1fr; } +} diff --git a/src/app/pages/about/about.component.ts b/src/app/pages/about/about.component.ts new file mode 100644 index 0000000..be63a71 --- /dev/null +++ b/src/app/pages/about/about.component.ts @@ -0,0 +1,60 @@ +import { Component, inject } from '@angular/core'; +import { CommonModule, NgOptimizedImage } from '@angular/common'; +import { MatCardModule } from '@angular/material/card'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { TranslateModule } from '@ngx-translate/core'; +import {RouterLink} from '@angular/router'; +import {UrlConstants} from '../../constants/UrlConstants'; +import {AssetsConstants} from '../../constants/AssetsConstants'; + + +@Component({ + selector: 'app-about', + standalone: true, + imports: [ + CommonModule, NgOptimizedImage, + MatCardModule, MatChipsModule, MatIconModule, MatButtonModule, MatDividerModule, + TranslateModule, RouterLink + ], + templateUrl: './about.component.html', + styleUrl: './about.component.scss' +}) +export class AboutComponent { + cvHref = 'assets/cv/andreas-dahm-cv.pdf'; + + primarySkills = [ + 'ABOUT.SKILLS.JAVA', + 'ABOUT.SKILLS.SPRING', + 'ABOUT.SKILLS.ANGULAR', + 'ABOUT.SKILLS.DOCKER', + 'ABOUT.SKILLS.UNITY', + 'ABOUT.SKILLS.PYTHON', + 'ABOUT.SKILLS.CSHARP', + 'ABOUT.SKILLS.TYPESCRIPT' + ]; + + toolset = [ + 'ABOUT.TOOLS.GIT', + 'ABOUT.TOOLS.GITHUB', + 'ABOUT.TOOLS.JENKINS', + 'ABOUT.TOOLS.K8S', + 'ABOUT.TOOLS.POSTGRES', + 'ABOUT.TOOLS.MONGO', + 'ABOUT.TOOLS.GRAFANA', + ]; + + + + openMail(event: Event) { + event.preventDefault(); + const user = 'andreas.dahm'; + const domain = 'gmail.com'; + globalThis.location.href = `mailto:${user}@${domain}`; + } + + protected readonly UrlConstants = UrlConstants; + protected readonly AssetsConstants = AssetsConstants; +} diff --git a/src/app/pages/project-details/project-details.component.html b/src/app/pages/project-details/project-details.component.html new file mode 100644 index 0000000..cc13d82 --- /dev/null +++ b/src/app/pages/project-details/project-details.component.html @@ -0,0 +1 @@ +

project-details works!

diff --git a/src/app/pages/project-details/project-details.component.scss b/src/app/pages/project-details/project-details.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/project-details/project-details.component.ts b/src/app/pages/project-details/project-details.component.ts new file mode 100644 index 0000000..47934ab --- /dev/null +++ b/src/app/pages/project-details/project-details.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-project-details', + imports: [], + templateUrl: './project-details.component.html', + styleUrl: './project-details.component.scss', +}) +export class ProjectDetailsComponent { + +} diff --git a/src/app/pages/projects/projects.component.html b/src/app/pages/projects/projects.component.html new file mode 100644 index 0000000..885859a --- /dev/null +++ b/src/app/pages/projects/projects.component.html @@ -0,0 +1 @@ +

projects works!

diff --git a/src/app/pages/projects/projects.component.scss b/src/app/pages/projects/projects.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/projects/projects.component.ts b/src/app/pages/projects/projects.component.ts new file mode 100644 index 0000000..2b83d2e --- /dev/null +++ b/src/app/pages/projects/projects.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-projects', + imports: [], + templateUrl: './projects.component.html', + styleUrl: './projects.component.scss', +}) +export class ProjectsComponent { + +} diff --git a/src/app/service/language.service.ts b/src/app/service/language.service.ts index 4556eb1..908b62d 100644 --- a/src/app/service/language.service.ts +++ b/src/app/service/language.service.ts @@ -1,6 +1,6 @@ import { Injectable, inject, signal } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; -import {Constants} from '../constants/Constants'; +import {LocalStoreConstants} from '../constants/LocalStoreConstants'; type Lang = 'de' | 'en'; @@ -19,12 +19,12 @@ export class LanguageService { use(l: Lang) { this.lang.set(l); this.translate.use(l); - try { localStorage.setItem(Constants.LANGUAGE_KEY, l); } catch {} + try { localStorage.setItem(LocalStoreConstants.LANGUAGE_KEY, l); } catch {} } private getInitial(): Lang { try { - const stored = localStorage.getItem(Constants.LANGUAGE_KEY) as Lang | null; + const stored = localStorage.getItem(LocalStoreConstants.LANGUAGE_KEY) as Lang | null; if (stored === 'de' || stored === 'en') return stored; } catch {} const browser = (navigator.language || 'en').toLowerCase(); diff --git a/src/app/service/reload.service.ts b/src/app/service/reload.service.ts index e05c006..f6d0ce1 100644 --- a/src/app/service/reload.service.ts +++ b/src/app/service/reload.service.ts @@ -1,5 +1,5 @@ import { Injectable, NgZone, signal } from '@angular/core'; -import {Constants} from '../constants/Constants'; +import {LocalStoreConstants} from '../constants/LocalStoreConstants'; @Injectable({ providedIn: 'root' }) @@ -20,13 +20,13 @@ export class ReloadService { private informListeners(e: StorageEvent, zone: NgZone) { - if (e.key === Constants.LANGUAGE_KEY) { + if (e.key === LocalStoreConstants.LANGUAGE_KEY) { zone.run(() => this._languageChangedTick.update(v => v + 1)); } } bumpLanguageChanged(): void { this._reloadTick.update(v => v + 1); - localStorage.setItem(Constants.RELOAD_ALL_LANG_LISTENER_KEY, String(Date.now())); + localStorage.setItem(LocalStoreConstants.RELOAD_ALL_LANG_LISTENER_KEY, String(Date.now())); } } diff --git a/src/app/service/theme.service.ts b/src/app/service/theme.service.ts index 902bf78..4959abb 100644 --- a/src/app/service/theme.service.ts +++ b/src/app/service/theme.service.ts @@ -1,7 +1,7 @@ import { Injectable, effect, inject, signal } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { OverlayContainer } from '@angular/cdk/overlay'; -import {Constants} from '../constants/Constants'; +import {LocalStoreConstants} from '../constants/LocalStoreConstants'; type Theme = 'light' | 'dark'; @@ -20,13 +20,13 @@ export class ThemeService { body.classList.toggle('dark', isDark); overlayEl.classList.toggle('dark', isDark); - try { localStorage.setItem(Constants.THEME_KEY, this.theme()); } catch {} + try { localStorage.setItem(LocalStoreConstants.THEME_KEY, this.theme()); } catch {} }); try { const mm = globalThis.matchMedia('(prefers-color-scheme: dark)'); mm.addEventListener('change', e => { - const stored = localStorage.getItem(Constants.THEME_KEY) as Theme | null; + const stored = localStorage.getItem(LocalStoreConstants.THEME_KEY) as Theme | null; if (!stored) this.setTheme(e.matches ? 'dark' : 'light'); }); } catch {} @@ -37,7 +37,7 @@ export class ThemeService { private getInitialTheme(): Theme { try { - const stored = localStorage.getItem(Constants.THEME_KEY) as Theme | null; + const stored = localStorage.getItem(LocalStoreConstants.THEME_KEY) as Theme | null; if (stored === 'dark' || stored === 'light') return stored; } catch {} try { diff --git a/src/favicon.ico b/src/assets/favicon.ico similarity index 100% rename from src/favicon.ico rename to src/assets/favicon.ico diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index b2bee79..c9edb2e 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1,13 +1,63 @@ { - "APP": { "TITLE": "Playground" }, - "WELCOME": { - "TITLE": "Willkommen 👋", - "SUB": "Angular 20 + Material", - "TEXT": "Das ist eine einfache Start-Komponente als Basis.", - "COUNTER": "Zähler", - "INC": "Inkrementieren", - "RESET": "Zurücksetzen" + "APP": { + "TITLE": "Playground", + "COPYRIGHT": "Bilder urheberrechtlich geschützt, keine Nutzung ohne Zustimmung!" + }, + "TOPBAR": { + "ABOUT": "Über mich", + "CONTACT": "Kontakt", + "PROJECTS": "Projekte", + "HOBBY": "Hobbies", + "SETTINGS": "Einstellungen", + "LANGUAGE": "Sprache", + "APPEARANCE": "Darstellung" }, "THEME": { "LIGHT": "Hell", "DARK": "Dunkel" }, - "LANG": { "LABEL": "Sprache", "EN": "Englisch", "DE": "Deutsch" } + "LANG": { "LABEL": "Sprache", "EN": "Englisch", "DE": "Deutsch" }, + "ABOUT": { + "ALT": { "PROFILE": "Profilfoto von Andreas Dahm" }, + "HELLO": "Hallo, ich bin Andreas Dahm.", + "LEAD": "Bereits in meiner Ausbildung zum Fachinformatiker hat mich fasziniert, wie man durch Code komplexe Probleme elegant lösen kann. Nach meinem Studium der Angewandten Informatik an der FH Bingen konnte ich diese Begeisterung in verschiedensten Projekten vertiefen – von 3D-Simulationen bis zu modernen Web-Applikationen. Heute arbeite ich als Senior Software Developer und Architekt mit Fokus auf Java, Angular und DevOps. Danke, dass du vorbeischaust!", + "ROLE": "Senior Software Entwickler / Full-Stack Entwickler / Softwarearchitekt", + "LOCATION": "München · Remote", + "DOWNLOAD_CV": "Lebenslauf herunterladen", + "VIEW_PROJECTS": "Projekte ansehen", + "CONTACT_ME": "Kontaktiere mich", + "SECTION": { + "SKILLS": "Fähigkeiten & Stack", + "PRIMARY": "Schwerpunkte", + "TOOLSET": "Toolset", + "EXPERIENCE": "Erfahrung" + }, + "SKILLS": { + "JAVA": "Java 8/Java 21+", + "SPRING": "Spring Boot 2/3", + "ANGULAR": "Angular 20+", + "DOCKER": "Docker", + "UNITY": "Unity", + "PYTHON": "Python", + "CSHARP": "C#", + "TYPESCRIPT": "TypeScript" + }, + "TOOLS": { + "GIT": "Git", + "GITHUB": "Github", + "JENKINS": "Jenkins", + "K8S": "Kubernetes / k3d", + "POSTGRES": "PostgreSQL", + "MONGO": "MongoDB", + "GRAFANA": "Grafana/Prometheus" + }, + "XP": { + "T1": { + "COMPANY": "Teraport GmbH", + "ROLE": "Senior Software Developer / Architect", + "TIME": "Feb. 2024 – heute", + "HIGHLIGHTS": { + "P1": "Architecture and implementation of database connectivity using Hibernate 6.x.", + "P2": "Design and development of a full-stack web application for collision analysis (Angular + Spring Boot + Docker)." + } + } + } + } } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 3db395b..82b38b4 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1,13 +1,62 @@ { - "APP": { "TITLE": "Playground" }, - "WELCOME": { - "TITLE": "Welcome 👋", - "SUB": "Angular 20 + Material", - "TEXT": "This is a simple start component.", - "COUNTER": "Counter", - "INC": "Increment", - "RESET": "Reset" + "APP": { + "TITLE": "Playground", + "COPYRIGHT": "Images protected by copyright, no use without permission!" + }, + "TOPBAR": { + "ABOUT": "About me", + "CONTACT": "Contact", + "PROJECTS": "Projects", + "HOBBY": "Hobby's", + "SETTINGS": "Settings", + "LANGUAGE": "Language", + "APPEARANCE": "Appearance" }, "THEME": { "LIGHT": "Light", "DARK": "Dark" }, - "LANG": { "LABEL": "Language", "EN": "English", "DE": "Deutsch" } + "LANG": { "LABEL": "Language", "EN": "English", "DE": "Deutsch" }, + "ABOUT": { + "ALT": { "PROFILE": "Profile photo of Andreas Dahm" }, + "HELLO": "Hello, I’m Andreas Dahm.", + "LEAD": "During my training as an application developer, I became fascinated by how complex problems can be solved elegantly through code. After studying Applied Computer Science at FH Bingen, I was able to deepen this passion in a wide variety of projects – from 3D simulations to modern web applications. Today, I work as a Senior Software Developer and Architect with a focus on Java, Angular, and DevOps. Thanks for stopping by!", + "ROLE": "Senior Software Developer / Full-Stack Developer / Software Architect", + "LOCATION": "Munich · Remote", + "DOWNLOAD_CV": "Download CV", + "VIEW_PROJECTS": "View projects", + "CONTACT_ME": "Contact me", + "SECTION": { + "SKILLS": "Skills & Stack", + "PRIMARY": "Core", + "TOOLSET": "Toolset", + "EXPERIENCE": "Experience" + }, + "SKILLS": { + "JAVA": "Java 8/Java 21+", + "SPRING": "Spring Boot 2/3", + "ANGULAR": "Angular 20+", + "DOCKER": "Docker", + "UNITY": "Unity", + "PYTHON": "Python", + "CSHARP": "C#", + "TYPESCRIPT": "TypeScript" + }, + "TOOLS": { + "GIT": "Git", + "GITHUB": "GITHUB", + "K8S": "Kubernetes / k3d", + "POSTGRES": "PostgreSQL", + "MONGO": "MongoDB", + "GRAFANA": "Grafana/Prometheus" + }, + "XP": { + "T1": { + "COMPANY": "Teraport GmbH", + "ROLE": "Senior Software Developer / Architect", + "TIME": "Feb. 2024 – heute", + "HIGHLIGHTS": { + "P1": "Architecture and implementation of database connectivity using Hibernate 6.x.", + "P2": "Design and development of a full-stack web application for collision analysis (Angular + Spring Boot + Docker)." + } + } + } + } } diff --git a/src/assets/me.webp b/src/assets/me.webp new file mode 100644 index 0000000000000000000000000000000000000000..87d37aebc606d63eb165e0c3eb1c0e37b821be9e GIT binary patch literal 107496 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%0AG!`TUtiaSN3HweQ-JSWp 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 literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index deaa5e4..d5ad8af 100644 --- a/src/index.html +++ b/src/index.html @@ -5,7 +5,7 @@ PlaygroundFrontend - + diff --git a/src/main.ts b/src/main.ts index de803b6..b0ef0a7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,11 +1,11 @@ import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { App } from './app/app'; import packageJson from '../package.json'; +import {AppComponent} from './app/layout/app/app.component'; if (packageJson.version) { console.log(`🌟 Frontend version: ${packageJson.version}`); } -bootstrapApplication(App, appConfig) +bootstrapApplication(AppComponent, appConfig) .catch((err) => console.error(err)); From 664aed47a652002590e12ebd4e01b7640aa7a6f9 Mon Sep 17 00:00:00 2001 From: Lobo Date: Sat, 29 Nov 2025 11:56:30 +0100 Subject: [PATCH 2/3] Update Angular and dependencies, add sponsor logos Upgraded Angular packages and related dependencies to version 20.3.14 and updated several @inquirer and other dependencies. Added new sponsor logos to the assets folder and updated the About page to display them, including changes to constants, HTML, SCSS, TypeScript, and i18n files. Minor style and content adjustments were made to the About page. --- package-lock.json | 626 ++++++++++++----------- package.json | 24 +- src/app/constants/AssetsConstants.ts | 8 + src/app/pages/about/about.component.html | 78 +++ src/app/pages/about/about.component.scss | 100 +++- src/app/pages/about/about.component.ts | 41 +- src/assets/i18n/de.json | 77 ++- src/assets/i18n/en.json | 77 ++- src/assets/logos/assyst_gmbh_logo.jpg | Bin 0 -> 2950 bytes src/assets/logos/bingen-logo-white.svg | 19 + src/assets/logos/dmixcloud_logo.jpg | Bin 0 -> 2142 bytes src/assets/logos/teraport_gmbh_logo.jpg | Bin 0 -> 2545 bytes src/index.html | 2 +- src/styles.scss | 2 + 14 files changed, 736 insertions(+), 318 deletions(-) create mode 100644 src/assets/logos/assyst_gmbh_logo.jpg create mode 100644 src/assets/logos/bingen-logo-white.svg create mode 100644 src/assets/logos/dmixcloud_logo.jpg create mode 100644 src/assets/logos/teraport_gmbh_logo.jpg diff --git a/package-lock.json b/package-lock.json index 55b21eb..d82ef29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,26 +8,26 @@ "name": "playground-frontend", "version": "0.1.0", "dependencies": { - "@angular-devkit/build-angular": "~20.3.9", - "@angular/animations": "20.3.10", + "@angular-devkit/build-angular": "~20.3.12", + "@angular/animations": "20.3.14", "@angular/cdk": "20.2.11", - "@angular/common": "20.3.10", - "@angular/compiler": "20.3.10", - "@angular/core": "20.3.10", - "@angular/forms": "20.3.10", + "@angular/common": "~20.3.14", + "@angular/compiler": "20.3.14", + "@angular/core": "20.3.14", + "@angular/forms": "~20.3.14", "@angular/material": "20.2.11", - "@angular/platform-browser": "20.3.10", - "@angular/router": "20.3.10", + "@angular/platform-browser": "~20.3.14", + "@angular/router": "~20.3.14", "@ngx-translate/core": "~17.0.0", "@ngx-translate/http-loader": "~17.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0" }, "devDependencies": { - "@angular/build": "20.3.9", - "@angular/cli": "20.3.9", - "@angular/compiler-cli": "20.3.10", - "@angular/platform-browser-dynamic": "20.3.10", + "@angular/build": "20.3.12", + "@angular/cli": "20.3.12", + "@angular/compiler-cli": "20.3.14", + "@angular/platform-browser-dynamic": "~20.3.14", "@types/jasmine": "~5.1.0", "jasmine-core": "~5.9.0", "karma": "~6.4.0", @@ -261,12 +261,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2003.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.9.tgz", - "integrity": "sha512-p0GO2H8hiZjRHI9sm4tXTF3OpWaEnkqvB0GBGJfGp8RvpPfDA2t3j2NAUNtd75H+B0xdfyWLmNq9YJGpy6gznA==", + "version": "0.2003.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.12.tgz", + "integrity": "sha512-5H40lAFF4CKY32C4HOp6bTlOF1f4WsGCwe7FjFQp9A+T7yoCBiHpIWt2JKTwV4sBoTKVDZOnuf0GG+UVKjQT4A==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.9", + "@angular-devkit/core": "20.3.12", "rxjs": "7.8.2" }, "engines": { @@ -276,16 +276,16 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.9.tgz", - "integrity": "sha512-DCzHY+EQ98u0h1n8s9add1KVSNWco1RW/Rl8TRkEuGmRQ43MpOfTIZQvlnnqaeMcNH0fZ4zkybVBDj7korJbZg==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.12.tgz", + "integrity": "sha512-HPepPbJA5vprYTWJaSCfpk0s1bPT6Ui6VjFOSb9oY+p9iq+MGkuB1I+swNcRcMLttyMD+FpbMd27F8jSeX5XVw==", "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.9", - "@angular-devkit/build-webpack": "0.2003.9", - "@angular-devkit/core": "20.3.9", - "@angular/build": "20.3.9", + "@angular-devkit/architect": "0.2003.12", + "@angular-devkit/build-webpack": "0.2003.12", + "@angular-devkit/core": "20.3.12", + "@angular/build": "20.3.12", "@babel/core": "7.28.3", "@babel/generator": "7.28.3", "@babel/helper-annotate-as-pure": "7.27.3", @@ -296,7 +296,7 @@ "@babel/preset-env": "7.28.3", "@babel/runtime": "7.28.3", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "20.3.9", + "@ngtools/webpack": "20.3.12", "ansi-colors": "4.1.3", "autoprefixer": "10.4.21", "babel-loader": "10.0.0", @@ -351,7 +351,7 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.9", + "@angular/ssr": "^20.3.12", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0 || ^30.2.0", @@ -408,12 +408,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2003.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.9.tgz", - "integrity": "sha512-2VSKR4BR/M3g5VvAJpKdytAErPt8Oj+HzTKp+ujVeJEBs3U48bpb6mZJOMTxU1YFf2hvawDQo5aiwkondS1qLg==", + "version": "0.2003.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.12.tgz", + "integrity": "sha512-IkhCU0nAsXYBQOfHu2gQBcYBKhaV1c8wYtu7MmelBcN/iUrG8hRf1sZx+ppUgsdZuBYxCiDiLpcfRVRCIASkvw==", "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2003.9", + "@angular-devkit/architect": "0.2003.12", "rxjs": "7.8.2" }, "engines": { @@ -427,9 +427,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.9.tgz", - "integrity": "sha512-bXsAGIUb4p60x548YmvnMvjwd3FwWz6re1uTM7dV0XH8nQn3XMhOQ3Q3sAckzJHxkDuaRhB3K/a4kupoOmVfTQ==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.12.tgz", + "integrity": "sha512-ReFxd/UOoVDr3+kIUjmYILQZF89qg62POdY7a7OqBH7plmInFlYVSEDouJvGqj3LVCPiqTk2ZOSChbhS/eLxXA==", "license": "MIT", "dependencies": { "ajv": "8.17.1", @@ -454,13 +454,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.9.tgz", - "integrity": "sha512-oaIjAKPmHMZBTC0met5M7dbXBeZnCNwmHacT/kBHNVBAz/NI95fuAfb2P0Jxt7gWdQXejDSxWp0tL+sZIyO0xw==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.12.tgz", + "integrity": "sha512-JqJ1u59y+Ud51k/8MHYzSP+aQOeC2PJBaDmMnvqfWVaIt6n3x4gc/VtuhqhpJ0SKulbFuOWgAfI6QbPFrgUYQQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.9", + "@angular-devkit/core": "20.3.12", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "8.2.0", @@ -473,9 +473,9 @@ } }, "node_modules/@angular/animations": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.10.tgz", - "integrity": "sha512-WSKHyF82URlAQkYGWZjozZgSYj2ClH40GDunayz6kuRewup639iH91HE8sbFfVqKgqELKIAy2E0LhmtDKnMwZA==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.14.tgz", + "integrity": "sha512-Sx3/XNu2rR+R8T8JkJEaIpZDZPk0IecS0Ayt6HTanNUZXuw0HVou3vkjR5B2St5nM4MXs0gh+S6aLNuArtqJTQ==", "license": "MIT", "peer": true, "dependencies": { @@ -485,17 +485,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.10" + "@angular/core": "20.3.14" } }, "node_modules/@angular/build": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.9.tgz", - "integrity": "sha512-Ulimvg6twPSCraaZECEmENfKBlD4M1yqeHlg6dCzFNM4xcwaGUnuG6O3cIQD59DaEvaG73ceM2y8ftYdxAwFow==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.12.tgz", + "integrity": "sha512-iAZve4VPviC8y6RFctyh3qFXSlP5mth9K46/0zasB4LV4pcmu8BrzIHERxIn/jCDNdVdPh973kxo1ksO4WpyuA==", "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.9", + "@angular-devkit/architect": "0.2003.12", "@babel/core": "7.28.3", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -537,7 +537,7 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.9", + "@angular/ssr": "^20.3.12", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^20.0.0", @@ -603,19 +603,19 @@ } }, "node_modules/@angular/cli": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.9.tgz", - "integrity": "sha512-4eKpRDg96B20yrKJqjA24zgxYy1RiRd70FvF/KG1hqSowsWwtzydtEJ3VM6iFWS9t1D8truuVpKjMEnn1Y274A==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.12.tgz", + "integrity": "sha512-vqVyVjbFPCRMjA5evL7tV2JeR6Anuzb9WcXTMB17fr7uzKNNAvo7KyRaOJjp+TU4JDARTNyGPy0aywfPx7R60A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2003.9", - "@angular-devkit/core": "20.3.9", - "@angular-devkit/schematics": "20.3.9", + "@angular-devkit/architect": "0.2003.12", + "@angular-devkit/core": "20.3.12", + "@angular-devkit/schematics": "20.3.12", "@inquirer/prompts": "7.8.2", "@listr2/prompt-adapter-inquirer": "3.0.1", "@modelcontextprotocol/sdk": "1.17.3", - "@schematics/angular": "20.3.9", + "@schematics/angular": "20.3.12", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.35.0", "ini": "5.0.0", @@ -638,9 +638,9 @@ } }, "node_modules/@angular/common": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.10.tgz", - "integrity": "sha512-12fEzvKbEqjqy1fSk9DMYlJz6dF1MJVXuC5BB+oWWJpd+2lfh4xJ62pkvvLGAICI89hfM5n9Cy5kWnXwnqPZsA==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.14.tgz", + "integrity": "sha512-OOUvjTtnpktJLsNupA+GFT2q5zNocPdpOENA8aSrXvAheNybLjgi+otO3U3sQsvB1VwaoEZ9GT5O3lZlstnA/A==", "license": "MIT", "peer": true, "dependencies": { @@ -650,14 +650,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.10", + "@angular/core": "20.3.14", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.10.tgz", - "integrity": "sha512-cW939Lr8GZjPSYfbQKIDNrUaHWmn2M+zBbERThfq5skLuY+xM60bJFv4NqBekfX6YqKLCY62ilUZlnImYIXaqA==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.14.tgz", + "integrity": "sha512-KFbfPPAbclzGDujCVruflCD9j4Zwwxvrg7Y4C9GJYs3LZ85t+BfIMDDnvpBUM07ZLnfY4TO4gQdHmJAcaGGXDQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -667,9 +667,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.10.tgz", - "integrity": "sha512-9BemvpFxA26yIVdu8ROffadMkEdlk/AQQ2Jb486w7RPkrvUQ0pbEJukhv9aryJvhbMopT66S5H/j4ipOUMzmzQ==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.14.tgz", + "integrity": "sha512-lFg9ikwRClzDPjdFiwynbVFIi1RJZf/0i+OHa3Ns2gzXxJeHNKMJrHHjWZ2DU4N2UpxH0YAPe22N9Bie28IuQQ==", "license": "MIT", "peer": true, "dependencies": { @@ -690,7 +690,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.10", + "@angular/compiler": "20.3.14", "typescript": ">=5.8 <6.0" }, "peerDependenciesMeta": { @@ -700,9 +700,9 @@ } }, "node_modules/@angular/core": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.10.tgz", - "integrity": "sha512-g99Qe+NOVo72OLxowVF9NjCckswWYHmvO7MgeiZTDJbTjF9tXH96dMx7AWq76/GUinV10sNzDysVW16NoAbCRQ==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.14.tgz", + "integrity": "sha512-rpyEbhWF6Fj/xI9IvNLZh5QBUYnoXuF7vX54CCtyQ2MHALxRR/aa1WRxjRM96cF2OqodQ/Gj3oYW8ei8hlBh4w==", "license": "MIT", "peer": true, "dependencies": { @@ -712,7 +712,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.10", + "@angular/compiler": "20.3.14", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" }, @@ -726,9 +726,9 @@ } }, "node_modules/@angular/forms": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.10.tgz", - "integrity": "sha512-9yWr51EUauTEINB745AaHwZNTHLpXIm4uxuykxzOg+g2QskEgVfH26uS8G2ogdNuwYpB8wnsXWr34qhM3qgOWw==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.14.tgz", + "integrity": "sha512-fGrJ589tU+AKoxf+kaRrEw7wlSfVr1/z/Fz625ggFCc6ySQEityKW3JsnLfNkh5qGrdxib4BOfF78f9J7Pyk+w==", "license": "MIT", "peer": true, "dependencies": { @@ -738,9 +738,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.10", - "@angular/core": "20.3.10", - "@angular/platform-browser": "20.3.10", + "@angular/common": "20.3.14", + "@angular/core": "20.3.14", + "@angular/platform-browser": "20.3.14", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -762,9 +762,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.10.tgz", - "integrity": "sha512-UV8CGoB5P3FmJciI3/I/n3L7C3NVgGh7bIlZ1BaB/qJDtv0Wq0rRAGwmT/Z3gwmrRtfHZWme7/CeQ2CYJmMyUQ==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.14.tgz", + "integrity": "sha512-Lviz9GfsIyOIBDal8QhIBKU8OMH29A0RhFw2opTC50sqKadXLN9CD7iSaAwQbNLc4mc3JAF4zth0AzKdHLbz7Q==", "license": "MIT", "peer": true, "dependencies": { @@ -774,9 +774,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "20.3.10", - "@angular/common": "20.3.10", - "@angular/core": "20.3.10" + "@angular/animations": "20.3.14", + "@angular/common": "20.3.14", + "@angular/core": "20.3.14" }, "peerDependenciesMeta": { "@angular/animations": { @@ -785,9 +785,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.10.tgz", - "integrity": "sha512-gtZPCuxfxxkMzHYBdTU9tJeTiHj+Aty3C408DJGtGU+7rZgKt9hDC14vQN9OVzB9Ly9Jwj2yr8u7AH80TxxCJw==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.14.tgz", + "integrity": "sha512-g9z/g8gIOrBCX1SQ/GWwB0+JXBC6CKe0+yRyy9GGeBLm/YXWZHxTkmnDmueXXfPtUl8TOAInE22wlLcfunWTrg==", "dev": true, "license": "MIT", "dependencies": { @@ -797,16 +797,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.10", - "@angular/compiler": "20.3.10", - "@angular/core": "20.3.10", - "@angular/platform-browser": "20.3.10" + "@angular/common": "20.3.14", + "@angular/compiler": "20.3.14", + "@angular/core": "20.3.14", + "@angular/platform-browser": "20.3.14" } }, "node_modules/@angular/router": { - "version": "20.3.10", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.10.tgz", - "integrity": "sha512-Z03cfH1jgQ7XMDJj4R8qAGqivcvhdG3wYBwaiN1K1ODBgPhbFKNeD4stKqYp7xBNtswmM2O2jMxrL/Djwju4Gg==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.14.tgz", + "integrity": "sha512-gi7/NuHRS9n9RCwh03VuVFizVMa2lKL/s+7yP3Ecq2nQ5uSeTMWb/91OmGEBwncI3wKPkYdQ9g3n6PvK/O8uDQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -815,9 +815,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.10", - "@angular/core": "20.3.10", - "@angular/platform-browser": "20.3.10", + "@angular/common": "20.3.14", + "@angular/core": "20.3.14", + "@angular/platform-browser": "20.3.14", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -2800,26 +2800,26 @@ } }, "node_modules/@inquirer/ansi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", - "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/checkbox": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", - "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -2855,19 +2855,19 @@ } }, "node_modules/@inquirer/core": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", - "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -2882,15 +2882,15 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.21", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", - "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/external-editor": "^1.0.2", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -2905,15 +2905,15 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", - "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -2928,13 +2928,13 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", + "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "engines": { @@ -2950,23 +2950,23 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", - "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", - "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -2981,14 +2981,14 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", - "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -3003,15 +3003,15 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", - "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -3057,15 +3057,15 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", - "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -3080,16 +3080,16 @@ } }, "node_modules/@inquirer/search": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", - "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -3104,17 +3104,17 @@ } }, "node_modules/@inquirer/select": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", - "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -3129,9 +3129,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", - "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "license": "MIT", "engines": { "node": ">=18" @@ -3956,9 +3956,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.9.tgz", - "integrity": "sha512-3h5laY9+kP7Tzociy3Lg5sMfpTTKMU+XbLQAHxnIvywHLD6r/fgVkwRli8GZf5JFMTwAkul0AQPKom9SCSWJLg==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.12.tgz", + "integrity": "sha512-ePuofHOtbgvEq2t+hcmL30s4q9HQ/nv9ABwpLiELdVIObcWUnrnizAvM7hujve/9CQL6gRCeEkxPLPS4ZrK9AQ==", "license": "MIT", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -4179,9 +4179,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -4942,14 +4942,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.9.tgz", - "integrity": "sha512-XkgTwGhhrx+MVi2+TFO32d6Es5Uezzx7Y7B/e2ulDlj08bizxQj+9wkeLt5+bR8JWODHpEntZn/Xd5WvXnODGA==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.12.tgz", + "integrity": "sha512-ikl+nkWUab/Z4eSkBHgq9FLIUH8qh4OcYKeBQ0fyWqIUFHyjjK0JOfwmH1g/3zAmuUMtkthHCehAtyKzCTQjVA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.9", - "@angular-devkit/schematics": "20.3.9", + "@angular-devkit/core": "20.3.12", + "@angular-devkit/schematics": "20.3.12", "jsonc-parser": "3.3.1" }, "engines": { @@ -5209,9 +5209,9 @@ } }, "node_modules/@types/jasmine": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.12.tgz", - "integrity": "sha512-1BzPxNsFDLDfj9InVR3IeY0ZVf4o9XV+4mDqoCfyPkbsA7dYyKAPAb2co6wLFlHcvxPlt1wShm7zQdV7uTfLGA==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.13.tgz", + "integrity": "sha512-MYCcDkruFc92LeYZux5BC0dmqo2jk+M5UIZ4/oFnAPCXN9mCcQhLyj7F3/Za7rocVyt5YRr1MmqJqFlvQ9LVcg==", "dev": true, "license": "MIT" }, @@ -5228,9 +5228,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", - "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -5870,9 +5870,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.8.25", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", - "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", + "version": "2.8.31", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz", + "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -5925,37 +5925,28 @@ } }, "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "dev": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", - "debug": "^4.4.0", + "debug": "^4.4.3", "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", + "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/bonjour-service": { @@ -5998,9 +5989,9 @@ } }, "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", "funding": [ { "type": "opencollective", @@ -6018,10 +6009,10 @@ "license": "MIT", "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", "update-browserslist-db": "^1.1.4" }, "bin": { @@ -6106,9 +6097,9 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -6215,9 +6206,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", "funding": [ { "type": "opencollective", @@ -6582,16 +6573,17 @@ } }, "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/content-type": { @@ -6665,12 +6657,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", - "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.26.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", @@ -6848,9 +6840,9 @@ } }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -6864,9 +6856,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "license": "MIT", "engines": { "node": ">=18" @@ -7037,9 +7029,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.245", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", - "integrity": "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==", + "version": "1.5.262", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz", + "integrity": "sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -8152,28 +8144,24 @@ "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { @@ -8381,9 +8369,9 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, "license": "MIT", "engines": { @@ -8794,9 +8782,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -9141,6 +9129,23 @@ "node": ">= 6" } }, + "node_modules/karma/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/karma/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9272,6 +9277,16 @@ "node": ">=0.10.0" } }, + "node_modules/karma/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/karma/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -9508,6 +9523,7 @@ "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", "license": "MIT", + "peer": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", @@ -9809,9 +9825,9 @@ } }, "node_modules/memfs": { - "version": "4.50.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.50.0.tgz", - "integrity": "sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz", + "integrity": "sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/json-pack": "^1.11.0", @@ -9911,16 +9927,20 @@ } }, "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mimic-function": { @@ -10291,9 +10311,9 @@ "optional": true }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", + "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -10509,9 +10529,9 @@ } }, "node_modules/npm-packlist/node_modules/proc-log": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.0.0.tgz", - "integrity": "sha512-KG/XsTDN901PNfPfAMmj6N/Ywg9tM+bHK8pAz+27fS4N4Pcr+4zoYBOcGSBu6ceXYNPxkLpa4ohtfxV1XcLAfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "dev": true, "license": "ISC", "engines": { @@ -10791,9 +10811,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -11131,9 +11151,9 @@ } }, "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "dev": true, "license": "MIT", "engines": { @@ -11406,16 +11426,16 @@ } }, "node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.10" @@ -13359,6 +13379,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -13587,6 +13608,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "license": "MIT", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -13827,6 +13849,22 @@ "node": ">= 6" } }, + "node_modules/webpack-dev-server/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", @@ -14489,13 +14527,13 @@ } }, "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", "dev": true, "license": "ISC", "peerDependencies": { - "zod": "^3.24.1" + "zod": "^3.25 || ^4" } } } diff --git a/package.json b/package.json index c527292..e37b339 100644 --- a/package.json +++ b/package.json @@ -10,26 +10,26 @@ }, "private": true, "dependencies": { - "@angular-devkit/build-angular": "~20.3.9", - "@angular/animations": "20.3.10", + "@angular-devkit/build-angular": "~20.3.12", + "@angular/animations": "20.3.14", "@angular/cdk": "20.2.11", - "@angular/common": "20.3.10", - "@angular/compiler": "20.3.10", - "@angular/core": "20.3.10", - "@angular/forms": "20.3.10", + "@angular/common": "~20.3.14", + "@angular/compiler": "20.3.14", + "@angular/core": "20.3.14", + "@angular/forms": "~20.3.14", "@angular/material": "20.2.11", - "@angular/platform-browser": "20.3.10", - "@angular/router": "20.3.10", + "@angular/platform-browser": "~20.3.14", + "@angular/router": "~20.3.14", "@ngx-translate/core": "~17.0.0", "@ngx-translate/http-loader": "~17.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0" }, "devDependencies": { - "@angular/build": "20.3.9", - "@angular/cli": "20.3.9", - "@angular/compiler-cli": "20.3.10", - "@angular/platform-browser-dynamic": "20.3.10", + "@angular/build": "20.3.12", + "@angular/cli": "20.3.12", + "@angular/compiler-cli": "20.3.14", + "@angular/platform-browser-dynamic": "~20.3.14", "@types/jasmine": "~5.1.0", "jasmine-core": "~5.9.0", "karma": "~6.4.0", diff --git a/src/app/constants/AssetsConstants.ts b/src/app/constants/AssetsConstants.ts index d11ad51..86c24c0 100644 --- a/src/app/constants/AssetsConstants.ts +++ b/src/app/constants/AssetsConstants.ts @@ -4,4 +4,12 @@ static readonly LOGO = '/assets/favicon.ico'; static readonly FLAG_DE = '/assets/flags/de.svg'; static readonly FLAG_EN = '/assets/flags/gb.svg'; + + //logos + static readonly TH_BINGEN_LOGO = '/assets/logos/assyst_gmbh_logo.jpg'; + static readonly ASSYST_LOG = '/assets/logos/bingen-logo-white.svg'; + static readonly COLORDIGITAL_LOGO = '/assets/logos/dmixcloud_logo.jpg'; + static readonly TERAPORT_LOGO = '/assets/logos/teraport_gmbh_logo.jpg'; + + static readonly CV: 'assets/cv/andreas-dahm-cv.pdf'; } diff --git a/src/app/pages/about/about.component.html b/src/app/pages/about/about.component.html index b8c830b..b799ddc 100644 --- a/src/app/pages/about/about.component.html +++ b/src/app/pages/about/about.component.html @@ -78,6 +78,84 @@

{{ 'ABOUT.SECTION.EXPERIENCE' | translate }}

+ +
+ @for (entry of xpKeys; track entry) { +
+
+
+ +
+
+ {{ (entry.key + '.ROLE') | translate }} + {{ (entry.key + '.TIME') | translate }} +
+ {{ (entry.key + '.COMPANY') | translate }} +
+
+ +
+ {{ (entry.key + '.COMPANY') | translate }} +
+ +
+
+
    +
  • {{ entry.key + '.HIGHLIGHTS.P1' | translate }}
  • +
  • {{ entry.key + '.HIGHLIGHTS.P2' | translate }}
  • +
  • {{ entry.key + '.HIGHLIGHTS.P3' | translate }}
  • +
+
+
+ + @if(entry.key !== xpKeys.at(xpKeys.length-1)?.key) + { + + } + } +
+ + +

{{ 'ABOUT.SECTION.PROJECTS' | translate }}

+ +
+
+
+ {{ 'ABOUT.XP.T1.ROLE' | translate }} + {{ 'ABOUT.XP.T1.TIME' | translate }} +
+
{{ 'ABOUT.XP.T1.COMPANY' | translate }}
+
    +
  • {{ 'ABOUT.XP.T1.P1' | translate }}
  • +
  • {{ 'ABOUT.XP.T1.P2' | translate }}
  • +
  • {{ 'ABOUT.XP.T1.P3' | translate }}
  • +
+
+ + + +
+
+ {{ 'ABOUT.XP.T2.ROLE' | translate }} + {{ 'ABOUT.XP.T2.TIME' | translate }} +
+
{{ 'ABOUT.XP.T2.COMPANY' | translate }}
+
    +
  • {{ 'ABOUT.XP.T2.P1' | translate }}
  • +
  • {{ 'ABOUT.XP.T2.P2' | translate }}
  • +
+
+
+
+ + +

{{ 'ABOUT.SECTION.EDUCATION' | translate }}

+
@@ -77,8 +66,6 @@

{{ 'ABOUT.SECTION.EXPERIENCE' | translate }}

- -
@for (entry of xpKeys; track entry) {
@@ -94,9 +81,6 @@
{{ (entry.key + '.ROLE') | translate }} {{ (entry.key + '.TIME') | translate }} -
- {{ (entry.key + '.COMPANY') | translate }} -
@@ -124,32 +108,45 @@

{{ 'ABOUT.SECTION.PROJECTS' | translate }}

+ @for (entry of projectKeys; track entry) {
-
- {{ 'ABOUT.XP.T1.ROLE' | translate }} - {{ 'ABOUT.XP.T1.TIME' | translate }} +
+ {{ (entry.key + '.TITLE') | translate }} +
+
+ {{ (entry.key + '.DESCRIPTION') | translate }} +
+ + +
+
    +
  • {{ entry.key + '.HIGHLIGHTS.P1' | translate }}
  • +
  • {{ entry.key + '.HIGHLIGHTS.P2' | translate }}
  • +
  • {{ entry.key + '.HIGHLIGHTS.P3' | translate }}
  • +
-
{{ 'ABOUT.XP.T1.COMPANY' | translate }}
-
    -
  • {{ 'ABOUT.XP.T1.P1' | translate }}
  • -
  • {{ 'ABOUT.XP.T1.P2' | translate }}
  • -
  • {{ 'ABOUT.XP.T1.P3' | translate }}
  • -
- - -
-
- {{ 'ABOUT.XP.T2.ROLE' | translate }} - {{ 'ABOUT.XP.T2.TIME' | translate }} -
-
{{ 'ABOUT.XP.T2.COMPANY' | translate }}
-
    -
  • {{ 'ABOUT.XP.T2.P1' | translate }}
  • -
  • {{ 'ABOUT.XP.T2.P2' | translate }}
  • -
-
+ @if(entry.key !== projectKeys.at(projectKeys.length-1)?.key) + { + + } + }
@@ -158,30 +155,20 @@
-
- {{ 'ABOUT.XP.T1.ROLE' | translate }} - {{ 'ABOUT.XP.T1.TIME' | translate }} -
-
{{ 'ABOUT.XP.T1.COMPANY' | translate }}
-
    -
  • {{ 'ABOUT.XP.T1.P1' | translate }}
  • -
  • {{ 'ABOUT.XP.T1.P2' | translate }}
  • -
  • {{ 'ABOUT.XP.T1.P3' | translate }}
  • -
-
+ @for (entry of educationKeys; track entry) { +
+ {{ (entry.key + '.WHERE') | translate }} + {{ (entry.key + '.WHEN') | translate }} +
+
+ {{ (entry.key + '.WHAT') | translate }} +
- - -
-
- {{ 'ABOUT.XP.T2.ROLE' | translate }} - {{ 'ABOUT.XP.T2.TIME' | translate }} -
-
{{ 'ABOUT.XP.T2.COMPANY' | translate }}
-
    -
  • {{ 'ABOUT.XP.T2.P1' | translate }}
  • -
  • {{ 'ABOUT.XP.T2.P2' | translate }}
  • -
+ @if(entry.key !== educationKeys.at(educationKeys.length-1)?.key) + { + + } + }
diff --git a/src/app/pages/about/about.component.scss b/src/app/pages/about/about.component.scss index 922ce6e..da02c8b 100644 --- a/src/app/pages/about/about.component.scss +++ b/src/app/pages/about/about.component.scss @@ -29,7 +29,7 @@ .lead { opacity:.9; margin: .25rem 0 0.5rem; } .meta { - display:flex; flex-direction:column; gap:.25rem; + display:flex; flex-direction:column; gap:.25rem; margin-bottom: 0.5rem; .row { display:flex; align-items:center; gap:.4rem; a { color: inherit; } @@ -37,8 +37,9 @@ } .actions { - display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.5rem; margin-bottom: 1rem; + display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.5rem; .mat-icon { margin-right:.25rem; } + } } } @@ -48,11 +49,13 @@ border-radius: 16px; padding: 5px; background: var(--app-card-background); + h2 { margin-top: .25rem; margin-left: .25rem; } .chip-groups { margin-left: .25rem; display:grid; gap:1rem; grid-template-columns: 1fr 1fr; + margin-bottom: .5rem; h3 { margin: .2rem 0 .4rem; font-size: .95rem; opacity:.85; } mat-chip-set { display:flex; flex-wrap:wrap; gap:.4rem; @@ -146,6 +149,7 @@ height: 48px; object-fit: contain; opacity: .9; + border-radius: 10%; background-color: var(--app-logo-bg); } @@ -173,6 +177,27 @@ opacity: .85; } +.link-row { + grid-row: 2; + grid-column: 2; + margin-top: .1rem; + opacity: .85; + vertical-align: center; +} + +.link-with-icon { + display: inline-flex; + align-items: center; + gap: .35rem; + line-height: 1; +} + +.link-with-icon mat-icon { + font-size: 18px; + height: 18px; + width: 18px; +} + .highlights { margin-top: .4rem; margin-left: .75rem; @@ -182,3 +207,11 @@ margin: .2rem 0; } } + +.highlights-noMargin { + margin-top: .4rem; + + li { + margin: .2rem 0; + } +} diff --git a/src/app/pages/about/about.component.ts b/src/app/pages/about/about.component.ts index 58e28a0..4a8ba67 100644 --- a/src/app/pages/about/about.component.ts +++ b/src/app/pages/about/about.component.ts @@ -6,7 +6,6 @@ import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatDividerModule } from '@angular/material/divider'; import { TranslateModule } from '@ngx-translate/core'; -import {RouterLink} from '@angular/router'; import {UrlConstants} from '../../constants/UrlConstants'; import {AssetsConstants} from '../../constants/AssetsConstants'; @@ -17,7 +16,7 @@ import {AssetsConstants} from '../../constants/AssetsConstants'; imports: [ CommonModule, NgOptimizedImage, MatCardModule, MatChipsModule, MatIconModule, MatButtonModule, MatDividerModule, - TranslateModule, RouterLink + TranslateModule ], templateUrl: './about.component.html', styleUrl: './about.component.scss' @@ -27,16 +26,20 @@ export class AboutComponent { xpKeys = [ { - key: 'ABOUT.XP.COMPANY7', + key: 'ABOUT.XP.COMPANY8', logo: AssetsConstants.TERAPORT_LOGO }, + { + key: 'ABOUT.XP.COMPANY7', + logo: AssetsConstants.COLORDIGITAL_LOGO + }, { key: 'ABOUT.XP.COMPANY6', logo: AssetsConstants.COLORDIGITAL_LOGO }, { key: 'ABOUT.XP.COMPANY5', - logo: AssetsConstants.COLORDIGITAL_LOGO + logo: AssetsConstants.ASSYST_LOG }, { key: 'ABOUT.XP.COMPANY4', @@ -48,7 +51,7 @@ export class AboutComponent { }, { key: 'ABOUT.XP.COMPANY2', - logo: AssetsConstants.ASSYST_LOG + logo: AssetsConstants.TH_BINGEN_LOGO }, { key: 'ABOUT.XP.COMPANY1', @@ -56,10 +59,52 @@ export class AboutComponent { }, { key: 'ABOUT.XP.COMPANY0', - logo: AssetsConstants.TH_BINGEN_LOGO + logo: AssetsConstants.CHAMAELEON_LOGO } ]; + projectKeys = [ + { + key: 'ABOUT.PROJECT.P2', + externalLink: 'https://andreas-dahm.eu/', + internalLink: 'projects' + }, + { + key: 'ABOUT.PROJECT.P1', + externalLink: 'https://store.steampowered.com/app/1532640/El_Mucho/', + internalLink: 'projects' + }, + { + key: 'ABOUT.PROJECT.P0', + externalLink: 'https://itch.io/c/6628860/lobos-collection', + internalLink: 'projects' + } + ]; + + educationKeys = [ + { + key: 'ABOUT.EDUCATION.E6' + }, + { + key: 'ABOUT.EDUCATION.E5' + }, + { + key: 'ABOUT.EDUCATION.E4' + }, + { + key: 'ABOUT.EDUCATION.E3' + }, + { + key: 'ABOUT.EDUCATION.E2' + }, + { + key: 'ABOUT.EDUCATION.E1' + }, + { + key: 'ABOUT.EDUCATION.E0' + } + ] + primarySkills = [ 'ABOUT.SKILLS.JAVA', 'ABOUT.SKILLS.SPRING', @@ -74,6 +119,7 @@ export class AboutComponent { toolset = [ 'ABOUT.TOOLS.GIT', 'ABOUT.TOOLS.GITHUB', + 'ABOUT.TOOLS.GITLAB', 'ABOUT.TOOLS.JENKINS', 'ABOUT.TOOLS.K8S', 'ABOUT.TOOLS.POSTGRES', diff --git a/src/app/pages/projects/projects.component.html b/src/app/pages/projects/projects.component.html index 885859a..7fb276e 100644 --- a/src/app/pages/projects/projects.component.html +++ b/src/app/pages/projects/projects.component.html @@ -1 +1 @@ -

projects works!

+

Working in progress!

diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 423bd99..d60a82c 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -27,7 +27,9 @@ "SKILLS": "Fähigkeiten & Stack", "PRIMARY": "Schwerpunkte", "TOOLSET": "Toolset", - "EXPERIENCE": "Erfahrung" + "EXPERIENCE": "Erfahrung", + "PROJECTS": "Projekte", + "EDUCATION": "Ausbildung" }, "SKILLS": { "JAVA": "Java 8/Java 21+", @@ -42,6 +44,7 @@ "TOOLS": { "GIT": "Git", "GITHUB": "Github", + "GITLAB": "Gitlab", "JENKINS": "Jenkins", "K8S": "Kubernetes / k3d", "POSTGRES": "PostgreSQL", @@ -49,7 +52,7 @@ "GRAFANA": "Grafana/Prometheus" }, "XP": { - "COMPANY7": { + "COMPANY8": { "COMPANY": "Teraport GmbH", "ROLE": "Senior Software Developer / Architect", "TIME": "Feb. 2024 – heute", @@ -59,7 +62,7 @@ "P3": "Entwicklung eines Kostenanalysetools mit dem Namen MIDO." } }, - "COMPANY6": { + "COMPANY7": { "COMPANY": "ColorDigital GmbH", "ROLE": "Lead Software Developer", "TIME": "März 2023 – Dez. 2023", @@ -69,7 +72,7 @@ "P3": "Zusammenarbeit mit Partnern und Kund:innen bei der Integration ihrer Systeme in die DMIx-Cloud." } }, - "COMPANY5": { + "COMPANY6": { "COMPANY": "ColorDigital GmbH", "ROLE": "Senior Software Developer", "TIME": "März 2021 – März 2023", @@ -79,7 +82,7 @@ "P3": "Entwicklung von „PAX“, einem Tool für den Datenaustausch zwischen der DMIx-Cloud und PLM/ERP-Systemen, inkl. CI/CD-Integration." } }, - "COMPANY4": { + "COMPANY5": { "COMPANY": "Assyst GmbH", "ROLE": "Teamleitung", "TIME": "Sep. 2015 – Feb. 2021", @@ -89,7 +92,7 @@ "P3": "Steuerung strategischer Initiativen im Bereich 3D-Softwareentwicklung." } }, - "COMPANY3": { + "COMPANY4": { "COMPANY": "Assyst GmbH", "ROLE": "Software Engineer", "TIME": "Apr. 2010 – Feb. 2021", @@ -99,7 +102,7 @@ "P3": "Mitarbeit an nationalen und internationalen Forschungsprojekten (EU7 und ZIM)." } }, - "COMPANY2": { + "COMPANY3": { "COMPANY": "Assyst GmbH", "ROLE": "Praktikum und Diplomarbeit", "TIME": "Apr. 2009 – Apr. 2010", @@ -109,7 +112,7 @@ "P3": "Erfolgreiche Umsetzung des Diplomthemas in Vidya." } }, - "COMPANY1": { + "COMPANY2": { "COMPANY": "TH Bingen (University of Applied Sciences)", "ROLE": "Tutor für Grundlagen der Java-Programmierung", "TIME": "Apr. 2008 – Aug. 2008", @@ -119,7 +122,7 @@ "P3": "Unterstützung bei praktischen Programmierübungen." } }, - "COMPANY0": { + "COMPANY1": { "COMPANY": "TH Bingen (University of Applied Sciences)", "ROLE": "Wissenschaftliche Hilfskraft", "TIME": "Okt. 2007 – Apr. 2008", @@ -128,6 +131,88 @@ "P2": "Implementierung einer Java-basierten Schnittstelle zu Microsoft Excel.", "P3": "Integration des MIT-Exhibit-Frameworks und Vorbereitung für die CeBIT 2008." } + }, + "COMPANY0": { + "COMPANY": "Chamaeleon AG", + "ROLE": "Ausbildung Fachinformatiker Anwendungsentwicklung", + "TIME": "Jul. 2002 – Jun. 2005", + "HIGHLIGHTS": { + "P1": "Entwicklung in PERL, PHP und ASP.", + "P2": "Portierung, Wartung und Reengineering von bestender Software.", + "P3": "Regelmäßige Durchführung von Systemtests und Qualitätskontrollen, sowie deren Dokumentation." + } + } + }, + "PROJECT": { + "P2": { + "TITLE": "Playground", + "DESCRIPTION": "Dieses Projekt ist, wie der Name schon sagt, ein persönlicher Playground, der im Laufe der Zeit wachsen soll. Es präsentiert verschiedene private Projekte, an denen ich arbeite, und dokumentiert deren Fortschritt, zentrale Ideen und wichtige Meilensteine.", + "LINK_EXTERNAL": "andreas-dahm.eu", + "LINK_INTERNAL": "Projektdetails", + "HIGHLIGHTS": { + "P1": "Einsatz moderner Technologien und CI/CD-Pipelines (Angular 20+, Spring Boot 4, GitHub).", + "P2": "Präsentation persönlicher Projekte und kontinuierliche Verbesserung algorithmischer Fähigkeiten.", + "P3": "Vertiefung von JavaScript/TypeScript-, Angular- und Spring-Boot-Kenntnissen durch praktisches Arbeiten." + } + }, + "P1": { + "TITLE": "El Mucho", + "DESCRIPTION": "Dies ist mein erstes veröffentlichtes Spiel auf Steam. Ich habe es gemeinsam mit meinem Bruder entwickelt und damit eines meiner persönlichen Ziele erreicht: ein eigenes Videospiel zu erstellen und zu veröffentlichen.", + "LINK_EXTERNAL": "Steam Store", + "LINK_INTERNAL": "Projektdetails", + "HIGHLIGHTS": { + "P1": "Veröffentlichung eines Spiels auf Steam und Integration der Steam-API.", + "P2": "Konzeption, Planung und vollständige Entwicklung eines eigenen Spiels.", + "P3": "Implementierung komplexer Algorithmen wie einer eigenen A*-Pfadfindungslogik und Spiel-KI." + } + }, + "P0": { + "TITLE": "Game Jams", + "DESCRIPTION": "Dieser Bereich zeigt einige meiner bisherigen Game-Jam-Beiträge. Game Jams sind eine großartige Möglichkeit, neue Spielideen auszuprobieren und schnell zu überprüfen, ob ein Game-Loop funktioniert. Die engen Zeitvorgaben fördern den Fokus, es ist faszinierend, was man in so kurzer Zeit alles schaffen kann.", + "LINK_EXTERNAL": "Itch.io Sammlung", + "LINK_INTERNAL": "Projektdetails", + "HIGHLIGHTS": { + "P1": "Planung eines realistischen Projektumfangs mit einem Team, der innerhalb von 48 Stunden umsetzbar ist.", + "P2": "Lernen, fokussiert und effizient unter strengen Zeitvorgaben zu arbeiten.", + "P3": "Die Freude zu erleben, in kurzer Zeit ein spielbares Projekt zu erstellen und andere damit spielen zu sehen." + } + } + }, + "EDUCATION": { + "E6": { + "WHERE": "FH Bingen (University of Applied Sciences)", + "WHEN": "2006 - 2010", + "WHAT": "Diplom (FH), Angewandte Informatik (Schnitt 1.4)" + }, + "E5": { + "WHERE": "FH Koblenz (University of Applied Sciences)", + "WHEN": "2005 - 2006", + "WHAT": "1 Semester Ingenieurinformatik" + }, + "E4": { + "WHERE": "BBS Montabaur", + "WHEN": "2002 - 2005", + "WHAT": "Ausbildung zum Fachinformatiker Anwendungsentwicklung" + }, + "E3": { + "WHERE": "BBS Andernach - Höhere Berufsbachschule (Informatik)", + "WHEN": "2000 - 2002", + "WHAT": "Fachhochschulreife" + }, + "E2": { + "WHERE": "BBS Andernach - Berufsfachschule Technik (E-Technik)", + "WHEN": "1998 - 2000", + "WHAT": "Realschulabschluss" + }, + "E1": { + "WHERE": "Hauptschule Hinter Burg Mayen (Albert Schweitzer Realschule plus)", + "WHEN": "1995 - 1998 ", + "WHAT": "Hauptschulabschluss" + }, + "E0": { + "WHERE": "Albert Schweitzer Realschule Mayen", + "WHEN": "1993 - 1995", + "WHAT": "Kein Abschluss. Wechsel zur Hauptschule" } } } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 161dc97..0d24dcc 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -27,7 +27,9 @@ "SKILLS": "Skills & Stack", "PRIMARY": "Core", "TOOLSET": "Toolset", - "EXPERIENCE": "Experience" + "EXPERIENCE": "Experience", + "PROJECTS": "Projects", + "EDUCATION": "Education" }, "SKILLS": { "JAVA": "Java 8/Java 21+", @@ -41,14 +43,16 @@ }, "TOOLS": { "GIT": "Git", - "GITHUB": "GITHUB", + "GITHUB": "Github", + "GITLAB": "Gitlab", + "JENKINS": "Jenkins", "K8S": "Kubernetes / k3d", "POSTGRES": "PostgreSQL", "MONGO": "MongoDB", "GRAFANA": "Grafana/Prometheus" }, "XP": { - "COMPANY7": { + "COMPANY8": { "COMPANY": "Teraport GmbH", "ROLE": "Senior Software Developer / Architect", "TIME": "Feb. 2024 – now", @@ -58,17 +62,17 @@ "P3": "Development of a cost analysis tool called MIDO." } }, - "COMPANY6": { + "COMPANY7": { "COMPANY": "ColorDigital GmbH", "ROLE": "Lead Software Developer", "TIME": "Mar. 2023 – Dec. 2023", "HIGHLIGHTS": { "P1": "Planning a new cloud architecture to migrate a large legacy monolith to a modern microservice-based platform.", "P2": "Led the development team of three to four backend engineers.", - "P3": "Collaborated with partners and customers on integrating their systems with the DMIx" + "P3": "Collaborated with partners and customers on integrating their systems with the DMIx." } }, - "COMPANY5": { + "COMPANY6": { "COMPANY": "ColorDigital GmbH", "ROLE": "Senior Software Developer", "TIME": "Mar. 2021 – Mar. 2023", @@ -78,7 +82,7 @@ "P3": "Development of 'PAX', a tool for data exchange between the DMIx cloud and customer PLM/ERP systems, including CI/CD integration." } }, - "COMPANY4": { + "COMPANY5": { "COMPANY": "Assyst GmbH", "ROLE": "Team leadership", "TIME": "Sep. 2015 – Feb. 2021", @@ -88,7 +92,7 @@ "P3": "Managed strategic initiatives in 3D software development." } }, - "COMPANY3": { + "COMPANY4": { "COMPANY": "Assyst GmbH", "ROLE": "Software engineer", "TIME": "Apr. 2010 – Feb. 2021", @@ -98,7 +102,7 @@ "P3": "Participated in national and international research projects (EU7 and ZIM)." } }, - "COMPANY2": { + "COMPANY3": { "COMPANY": "Assyst GmbH", "ROLE": "Internship and Diploma", "TIME": "Apr. 2009 – Apr. 2010", @@ -108,8 +112,8 @@ "P3": "Successfully implemented the diploma topic in Vidya." } }, - "COMPANY1": { - "COMPANY": "TH bingen (University of Applied Sciences)", + "COMPANY2": { + "COMPANY": "TH Bingen (University of Applied Sciences)", "ROLE": "Tutorial for fundamentals of Java programming", "TIME": "Apr. 2008 – Aug. 2008", "HIGHLIGHTS": { @@ -118,8 +122,8 @@ "P3": "Provided assistance during practical programming exercises." } }, - "COMPANY0": { - "COMPANY": "TH bingen (University of Applied Sciences)", + "COMPANY1": { + "COMPANY": "TH Bingen (University of Applied Sciences)", "ROLE": "Research Asssitent", "TIME": "Oct. 2007 – Apr. 2008", "HIGHLIGHTS": { @@ -128,6 +132,78 @@ "P3": "Integration of the MIT Exhibit framework and preparation for CeBIT 2008." } } + }, + "PROJECT": { + "P2": { + "TITLE": "Playground", + "DESCRIPTION": "This project is, as the name suggests, a personal playground that will grow over time. It showcases various private projects I’m working on and documents their progress, key ideas, and milestones.", + "LINK_EXTERNAL": "andreas-dahm.eu", + "LINK_INTERNAL": "Project details", + "HIGHLIGHTS": { + "P1": "Using modern technologies and CI/CD pipelines (Angular 20+, Spring Boot 4, GitHub).", + "P2": "Showcasing personal projects and improving algorithmic skills over time.", + "P3": "Deepening knowledge in JavaScript/TypeScript, Angular, Spring Boot and related technologies through hands-on practice." + } + }, + "P1": { + "TITLE": "El Mucho", + "DESCRIPTION": "This is my first published game on Steam. I developed it together with my brother, fulfilling one of my personal goals: creating and releasing my own video game.", + "LINK_EXTERNAL": "Steam Store", + "LINK_INTERNAL": "Project details", + "HIGHLIGHTS": { + "P1": "Publishing a game on Steam and integrating the Steam API.", + "P2": "Designing, planning and developing a complete game from scratch.", + "P3": "Implementing complex algorithms, including a custom A* pathfinding system and game AI logic." + } + }, + "P0": { + "TITLE": "Game Jams", + "DESCRIPTION": "This section showcases several of my past game jam creations. Game jams are a great way to explore new game ideas and quickly validate whether a game loop works. The tight time constraints force you to focus, and it’s always exciting to see what can be achieved within such a short timeframe.", + "LINK_EXTERNAL": "Itch.io Collection", + "LINK_INTERNAL": "Project details", + "HIGHLIGHTS": { + "P1": "Planning a realistic project scope with a team that can be built within 48 hours.", + "P2": "Learning to stay focused and work effectively under strict time constraints.", + "P3": "Experiencing the joy of creating a playable game in a short timeframe and seeing others enjoy it." + } + } + }, + "EDUCATION": { + "E6": { + "WHERE": "FH Bingen (University of Applied Sciences)", + "WHEN": "2006 – 2010", + "WHAT": "Diploma (FH), Applied Computer Science (final grade 1.4)" + }, + "E5": { + "WHERE": "FH Koblenz (University of Applied Sciences)", + "WHEN": "2005 – 2006", + "WHAT": "1 semester of Engineering Informatics" + }, + "E4": { + "WHERE": "BBS Montabaur", + "WHEN": "2002 – 2005", + "WHAT": "Apprenticeship as IT Specialist for Application Development" + }, + "E3": { + "WHERE": "BBS Andernach – Higher Vocational School (Computer Science)", + "WHEN": "2000 – 2002", + "WHAT": "University entrance qualification (Fachhochschulreife)" + }, + "E2": { + "WHERE": "BBS Andernach – Vocational School for Technology (Electrical Engineering)", + "WHEN": "1998 – 2000", + "WHAT": "Secondary school certificate (Realschulabschluss)" + }, + "E1": { + "WHERE": "Hauptschule Hinter Burg Mayen (Albert Schweitzer Realschule Plus)", + "WHEN": "1995 – 1998", + "WHAT": "Lower secondary school certificate (Hauptschulabschluss)" + }, + "E0": { + "WHERE": "Albert Schweitzer Realschule Mayen", + "WHEN": "1993 – 1995", + "WHAT": "No degree (transferred to lower secondary school)" + } } } } diff --git a/src/assets/logos/logo_chamaeleon.svg b/src/assets/logos/logo_chamaeleon.svg new file mode 100644 index 0000000..6e62da4 --- /dev/null +++ b/src/assets/logos/logo_chamaeleon.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/styles.scss b/src/styles.scss index 6305373..97f7cb0 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -27,12 +27,16 @@ $dark-theme: mat.define-theme(( --app-fg: #{mat.get-theme-color($light-theme, on-surface)}; --app-card-background: #fafafa; --app-logo-bg: #313131; + --link-color: #38a7ff; + --link-color-hover: #66bfff; } .dark { --app-bg: #{mat.get-theme-color($dark-theme, surface-container-low)}; --app-fg: #{mat.get-theme-color($dark-theme, on-surface)}; --app-card-background: #313131; --app-logo-bg: #313131; + --link-color: #6dbcff; + --link-color-hover: #9ad2ff; } /* ---- global background and tests ---- */ @@ -69,3 +73,15 @@ body { box-shadow 220ms ease, fill 220ms ease; } + +/* links */ +a { + color: var(--link-color); + text-decoration: none; + font-weight: 500; + + &:hover { + color: var(--link-color-hover); + text-decoration: underline; + } +}
diff --git a/src/app/pages/about/about.component.scss b/src/app/pages/about/about.component.scss index fb5e36d..922ce6e 100644 --- a/src/app/pages/about/about.component.scss +++ b/src/app/pages/about/about.component.scss @@ -37,7 +37,7 @@ } .actions { - display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.5rem; margin-bottom: .25rem; + display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.5rem; margin-bottom: 1rem; .mat-icon { margin-right:.25rem; } } } @@ -46,6 +46,7 @@ /* Skills block */ .skills { border-radius: 16px; + padding: 5px; background: var(--app-card-background); h2 { margin-top: .25rem; margin-left: .25rem; } .chip-groups { @@ -62,6 +63,47 @@ /* Experience block */ .experience { border-radius: 16px; + padding: 5px; + background: var(--app-card-background); + h2 { margin-top: .25rem;margin-left: .25rem; } + .xp-list { + margin-left: .25rem; + display: grid; gap: .75rem; + } + .xp-item { + .xp-head { + display:flex; align-items:baseline; gap:.5rem; + .time { opacity:.75; font-size:.9rem; } + } + .xp-sub { opacity:.9; margin-bottom:.25rem; } + ul { margin: .25rem 0 .5rem 1.15rem; } + } +} + +/* Experience block */ +.projects { + border-radius: 16px; + padding: 5px; + background: var(--app-card-background); + h2 { margin-top: .25rem;margin-left: .25rem; } + .xp-list { + margin-left: .25rem; + display: grid; gap: .75rem; + } + .xp-item { + .xp-head { + display:flex; align-items:baseline; gap:.5rem; + .time { opacity:.75; font-size:.9rem; } + } + .xp-sub { opacity:.9; margin-bottom:.25rem; } + ul { margin: .25rem 0 .5rem 1.15rem; } + } +} + +/* Experience block */ +.education { + border-radius: 16px; + padding: 5px; background: var(--app-card-background); h2 { margin-top: .25rem;margin-left: .25rem; } .xp-list { @@ -84,3 +126,59 @@ .hero .photo { justify-content: flex-start; } .skills .chip-groups { grid-template-columns: 1fr; } } + +.xp-head-grid { + display: grid; + grid-template-columns: calc(48px + .75rem) 1fr; /* 1: Logo, 2: Text */ + grid-template-rows: auto auto; /* 1: Role/Time, 2: Company */ + column-gap: .75rem; +} + +.logo-wrap { + grid-row: 1 / span 2; + grid-column: 1; + display: flex; + align-items: center; +} + +.company-logo { + width: 48px; + height: 48px; + object-fit: contain; + opacity: .9; + background-color: var(--app-logo-bg); +} + + +.head-row { + grid-row: 1; + grid-column: 2; + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: .5rem 1rem; + + strong { + font-size: 1rem; + } + .time { + opacity: .75; font-size: .9rem; + } +} + +.company-row { + grid-row: 2; + grid-column: 2; + margin-top: .1rem; + opacity: .85; +} + +.highlights { + margin-top: .4rem; + margin-left: .75rem; + padding-left: 1.2rem; + + li { + margin: .2rem 0; + } +} diff --git a/src/app/pages/about/about.component.ts b/src/app/pages/about/about.component.ts index be63a71..58e28a0 100644 --- a/src/app/pages/about/about.component.ts +++ b/src/app/pages/about/about.component.ts @@ -1,4 +1,4 @@ -import { Component, inject } from '@angular/core'; +import { Component} from '@angular/core'; import { CommonModule, NgOptimizedImage } from '@angular/common'; import { MatCardModule } from '@angular/material/card'; import { MatChipsModule } from '@angular/material/chips'; @@ -23,7 +23,42 @@ import {AssetsConstants} from '../../constants/AssetsConstants'; styleUrl: './about.component.scss' }) export class AboutComponent { - cvHref = 'assets/cv/andreas-dahm-cv.pdf'; + cvHref = AssetsConstants.CV; + + xpKeys = [ + { + key: 'ABOUT.XP.COMPANY7', + logo: AssetsConstants.TERAPORT_LOGO + }, + { + key: 'ABOUT.XP.COMPANY6', + logo: AssetsConstants.COLORDIGITAL_LOGO + }, + { + key: 'ABOUT.XP.COMPANY5', + logo: AssetsConstants.COLORDIGITAL_LOGO + }, + { + key: 'ABOUT.XP.COMPANY4', + logo: AssetsConstants.ASSYST_LOG + }, + { + key: 'ABOUT.XP.COMPANY3', + logo: AssetsConstants.ASSYST_LOG + }, + { + key: 'ABOUT.XP.COMPANY2', + logo: AssetsConstants.ASSYST_LOG + }, + { + key: 'ABOUT.XP.COMPANY1', + logo: AssetsConstants.TH_BINGEN_LOGO + }, + { + key: 'ABOUT.XP.COMPANY0', + logo: AssetsConstants.TH_BINGEN_LOGO + } + ]; primarySkills = [ 'ABOUT.SKILLS.JAVA', @@ -46,8 +81,6 @@ export class AboutComponent { 'ABOUT.TOOLS.GRAFANA', ]; - - openMail(event: Event) { event.preventDefault(); const user = 'andreas.dahm'; diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index c9edb2e..423bd99 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -49,13 +49,84 @@ "GRAFANA": "Grafana/Prometheus" }, "XP": { - "T1": { + "COMPANY7": { "COMPANY": "Teraport GmbH", "ROLE": "Senior Software Developer / Architect", "TIME": "Feb. 2024 – heute", "HIGHLIGHTS": { - "P1": "Architecture and implementation of database connectivity using Hibernate 6.x.", - "P2": "Design and development of a full-stack web application for collision analysis (Angular + Spring Boot + Docker)." + "P1": "Architektur und Implementierung der Datenbankanbindung mit Hibernate 6.x.", + "P2": "Konzeption und Entwicklung einer Full-Stack-Webanwendung für Kollisionsanalysen (Angular + Spring Boot + Docker).", + "P3": "Entwicklung eines Kostenanalysetools mit dem Namen MIDO." + } + }, + "COMPANY6": { + "COMPANY": "ColorDigital GmbH", + "ROLE": "Lead Software Developer", + "TIME": "März 2023 – Dez. 2023", + "HIGHLIGHTS": { + "P1": "Planung einer neuen Cloud-Architektur zur Migration eines umfangreichen Legacy-Monolithen in eine moderne Microservice-Plattform.", + "P2": "Leitung eines Teams von drei bis vier Backend-Entwickler:innen.", + "P3": "Zusammenarbeit mit Partnern und Kund:innen bei der Integration ihrer Systeme in die DMIx-Cloud." + } + }, + "COMPANY5": { + "COMPANY": "ColorDigital GmbH", + "ROLE": "Senior Software Developer", + "TIME": "März 2021 – März 2023", + "HIGHLIGHTS": { + "P1": "Arbeit an der DMIx-Core-Cloud, darunter die Implementierung einer Elasticsearch-basierten Echtzeit-Suchfunktion.", + "P2": "Implementierung des neuen Browser-Tools „Moodboard“ (Node.js + Vue.js).", + "P3": "Entwicklung von „PAX“, einem Tool für den Datenaustausch zwischen der DMIx-Cloud und PLM/ERP-Systemen, inkl. CI/CD-Integration." + } + }, + "COMPANY4": { + "COMPANY": "Assyst GmbH", + "ROLE": "Teamleitung", + "TIME": "Sep. 2015 – Feb. 2021", + "HIGHLIGHTS": { + "P1": "Teamleitung der Vidya-Softwareabteilung, inkl. Personalverantwortung und Bewerbungsprozesse.", + "P2": "Leitung mehrerer Projekte mit externen Partnern und Freelancer:innen.", + "P3": "Steuerung strategischer Initiativen im Bereich 3D-Softwareentwicklung." + } + }, + "COMPANY3": { + "COMPANY": "Assyst GmbH", + "ROLE": "Software Engineer", + "TIME": "Apr. 2010 – Feb. 2021", + "HIGHLIGHTS": { + "P1": "Arbeit an Kerntechnologien wie Algorithmen, Simulation, Rendering und Kollisions­erkennung.", + "P2": "Einsatz verschiedener Technologien, u. a. Java, OpenCL, OpenGL, GLSL-Shader, C++ und REST-Schnittstellen.", + "P3": "Mitarbeit an nationalen und internationalen Forschungsprojekten (EU7 und ZIM)." + } + }, + "COMPANY2": { + "COMPANY": "Assyst GmbH", + "ROLE": "Praktikum und Diplomarbeit", + "TIME": "Apr. 2009 – Apr. 2010", + "HIGHLIGHTS": { + "P1": "Implementierung produktiver Funktionen in der Echtzeit-Kleidersimulationssoftware Vidya.", + "P2": "Durchführung von Recherchen und Literaturstudien für die Diplomarbeit.", + "P3": "Erfolgreiche Umsetzung des Diplomthemas in Vidya." + } + }, + "COMPANY1": { + "COMPANY": "TH Bingen (University of Applied Sciences)", + "ROLE": "Tutor für Grundlagen der Java-Programmierung", + "TIME": "Apr. 2008 – Aug. 2008", + "HIGHLIGHTS": { + "P1": "Erstellung praktischer und theoretischer Lehrmaterialien.", + "P2": "Durchführung einer 20-stündigen Vorlesungsreihe für den Bioinformatik-Studiengang.", + "P3": "Unterstützung bei praktischen Programmierübungen." + } + }, + "COMPANY0": { + "COMPANY": "TH Bingen (University of Applied Sciences)", + "ROLE": "Wissenschaftliche Hilfskraft", + "TIME": "Okt. 2007 – Apr. 2008", + "HIGHLIGHTS": { + "P1": "Evaluation verschiedener Web-2.0-Technologien.", + "P2": "Implementierung einer Java-basierten Schnittstelle zu Microsoft Excel.", + "P3": "Integration des MIT-Exhibit-Frameworks und Vorbereitung für die CeBIT 2008." } } } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 82b38b4..161dc97 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -48,13 +48,84 @@ "GRAFANA": "Grafana/Prometheus" }, "XP": { - "T1": { + "COMPANY7": { "COMPANY": "Teraport GmbH", "ROLE": "Senior Software Developer / Architect", - "TIME": "Feb. 2024 – heute", + "TIME": "Feb. 2024 – now", "HIGHLIGHTS": { "P1": "Architecture and implementation of database connectivity using Hibernate 6.x.", - "P2": "Design and development of a full-stack web application for collision analysis (Angular + Spring Boot + Docker)." + "P2": "Design and development of a full-stack web application for collision analysis (Angular + Spring Boot + Docker).", + "P3": "Development of a cost analysis tool called MIDO." + } + }, + "COMPANY6": { + "COMPANY": "ColorDigital GmbH", + "ROLE": "Lead Software Developer", + "TIME": "Mar. 2023 – Dec. 2023", + "HIGHLIGHTS": { + "P1": "Planning a new cloud architecture to migrate a large legacy monolith to a modern microservice-based platform.", + "P2": "Led the development team of three to four backend engineers.", + "P3": "Collaborated with partners and customers on integrating their systems with the DMIx" + } + }, + "COMPANY5": { + "COMPANY": "ColorDigital GmbH", + "ROLE": "Senior Software Developer", + "TIME": "Mar. 2021 – Mar. 2023", + "HIGHLIGHTS": { + "P1": "Worked on the DMIx core cloud, including the implementation of an Elasticsearch-based real-time search module.", + "P2": "Implementation of a new browser tool called 'Moodboard' (Node.js + Vue.js).", + "P3": "Development of 'PAX', a tool for data exchange between the DMIx cloud and customer PLM/ERP systems, including CI/CD integration." + } + }, + "COMPANY4": { + "COMPANY": "Assyst GmbH", + "ROLE": "Team leadership", + "TIME": "Sep. 2015 – Feb. 2021", + "HIGHLIGHTS": { + "P1": "Team lead of the Vidya software department, including disciplinary responsibility and interviews.", + "P2": "Led several projects with external partners and freelancers.", + "P3": "Managed strategic initiatives in 3D software development." + } + }, + "COMPANY3": { + "COMPANY": "Assyst GmbH", + "ROLE": "Software engineer", + "TIME": "Apr. 2010 – Feb. 2021", + "HIGHLIGHTS": { + "P1": "Worked on core technologies such as algorithms, simulation, rendering, and collision detection.", + "P2": "Used technologies including Java, OpenCL, OpenGL, GLSL shaders, C++, and REST interfaces.", + "P3": "Participated in national and international research projects (EU7 and ZIM)." + } + }, + "COMPANY2": { + "COMPANY": "Assyst GmbH", + "ROLE": "Internship and Diploma", + "TIME": "Apr. 2009 – Apr. 2010", + "HIGHLIGHTS": { + "P1": "Implemented production features in the real-time cloth simulation software Vidya.", + "P2": "Conducted research and literature review for the diploma thesis.", + "P3": "Successfully implemented the diploma topic in Vidya." + } + }, + "COMPANY1": { + "COMPANY": "TH bingen (University of Applied Sciences)", + "ROLE": "Tutorial for fundamentals of Java programming", + "TIME": "Apr. 2008 – Aug. 2008", + "HIGHLIGHTS": { + "P1": "Preparation of practical and theoretical course material.", + "P2": "Held a 20-hour lecture series for the bioinformatics programme.", + "P3": "Provided assistance during practical programming exercises." + } + }, + "COMPANY0": { + "COMPANY": "TH bingen (University of Applied Sciences)", + "ROLE": "Research Asssitent", + "TIME": "Oct. 2007 – Apr. 2008", + "HIGHLIGHTS": { + "P1": "Evaluation of various Web 2.0 technologies.", + "P2": "Implementation of a Java-based interface for Microsoft Excel.", + "P3": "Integration of the MIT Exhibit framework and preparation for CeBIT 2008." } } } diff --git a/src/assets/logos/assyst_gmbh_logo.jpg b/src/assets/logos/assyst_gmbh_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97f27d4153e9c30f869a75e318839fef688ae6f6 GIT binary patch literal 2950 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 K@8*Bo9sU#7T;DDL literal 0 HcmV?d00001 diff --git a/src/assets/logos/bingen-logo-white.svg b/src/assets/logos/bingen-logo-white.svg new file mode 100644 index 0000000..899f800 --- /dev/null +++ b/src/assets/logos/bingen-logo-white.svg @@ -0,0 +1,19 @@ + diff --git a/src/assets/logos/dmixcloud_logo.jpg b/src/assets/logos/dmixcloud_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..befd8017575c3b712da8e6abda3eedcc10f01fae GIT binary patch literal 2142 zcmb7EdpJ~U7vFo&j2SbAy=TTHl$pfo#tg}&!J9W1$y-x7pg+ z0w4$gAo>9dU4S)!fgssI4T~Ne0f)n4aYQ^`j-WtPP#_UWB(fp}CMzO}BoeFwBUGBQ zva*7bs+tN-jY3nV$&!E=^dBrv9*2{skx69Q|7{EP073xv0(&vwN&rGY3<54Z1~kzk zAq*(1cgb*a5Ec(&2xwFT^~<75A@oM;Kp)^2IspX?8iX-0>YKa${RPNehLG~tHTxWY z9SLCC{Bnodi`n^9B+<6&+y>h(Sq@~~NL#DkBd*zs2shzeoy`sHpaEJ6+ zA4t9)l+|3*WS*FlS0?$={vzPX*w*A3Vd9YHS0m5cU9<8eqsSk{$m(AOqXhyWB!^jY zW3V8E0}vWaq0(873~d9nR00YC#6h!7f9doG?F0R5bwr^%O8Pe+G8ya-3&;^6;^5LM z`q*%Id0#lug?*}a&iqZfgP+mGd~=v@Hr;BEvrXUMNDI^?PNY=eb=5OURQ&R+L&zUS24!HKhJ zjY`*ZCqm=06Al*HyVyj}+H-Inv{$h>yyVP9U}$$N!CAeo+r!RTf<2F%4W2(?cIX{^9~*W$r2K%OHbjdi!Rwc` z0@s4G&bLG4LjK3m0gnSo{$9OSgY7x*YW)HSj_GPW9AOs`(}G^#e6+IVSI0^5RZ*t4 zYS+DuVtroYr&Pjja9USq%|m-tV)}J?N@|r)&(;UwEk?qWhN6TS_s1nSuipRMMT|ev zfKv=;7>|ruu~Av~*6t+k)j&-v;qr{ky@3xp6rl1s34L3OPur&HgZI)xEm2iqmIAWs3hEYHnssT zwd{~=XWu#IYV_z6bG z6U0EcA4G$TLUMw6bXKNF>d22uZY^FK4ok+Ye@z&>DeIE+%fiMQ>U`D19gz6r2R&nh z<4K|14?DtEbA-Sd*Pqh$4byj54kt~LcSRfyj>}tNqmXh(gJzhqPH-7{_PKp9c8nA;MUI^*z^%kD`?6BC>slY7@dQiAOeifD?~Thcj86sN`aibdfRH)WLHaM_HDga~HUxYb7D*W1cB2!K+9GLsCWYc?vgxK;Z0hnV0mJPlhtGM+gmEcExWxRz`z`5fxJw^F?T zx)2vsUPl@N9VGtYX|>+PIBg(uYuHKB7kG`^LuDE#*qVN<{kN=w(j%kc$232F8uAt? zX+7I+{^o+5jkRAdFD9k8`=t4pi{s(fU0$7Go##6z<6g-dY&Iq-nNHDsHKIjlE@>*O z>SO)6I~_tAx73xH2Tt_B9L~M`@`Lkjhj;%|IK5VmTw8UZ%d@y<8(oL5y5i``nE8bD zrun!tZ?E)qwTyA7Q42>@w-)Y(EoNDHtwnnlqDOumHX5H#Lv_CyVzjSXrCEw=cb`SbiubooJ zOY)Ou^%*@b;JEcfF;B*h@**`e)xU8V0N2z4zDvi(G6>7rF}IrQ6Li*vCZ+X&Oy={t H1<8K_hQmKL literal 0 HcmV?d00001 diff --git a/src/assets/logos/teraport_gmbh_logo.jpg b/src/assets/logos/teraport_gmbh_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..509c6d3a55d3dc8982419f798b4035ec6479a054 GIT binary patch literal 2545 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 AJOBUy literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index d5ad8af..cf4b896 100644 --- a/src/index.html +++ b/src/index.html @@ -2,7 +2,7 @@ - PlaygroundFrontend + Andreas Dahm - Playground diff --git a/src/styles.scss b/src/styles.scss index c081341..6305373 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -26,11 +26,13 @@ $dark-theme: mat.define-theme(( --app-bg: #{mat.get-theme-color($light-theme, surface-container-low)}; --app-fg: #{mat.get-theme-color($light-theme, on-surface)}; --app-card-background: #fafafa; + --app-logo-bg: #313131; } .dark { --app-bg: #{mat.get-theme-color($dark-theme, surface-container-low)}; --app-fg: #{mat.get-theme-color($dark-theme, on-surface)}; --app-card-background: #313131; + --app-logo-bg: #313131; } /* ---- global background and tests ---- */ From 839b7c9ba57285e3ad86dbf9695d7b13ef0d253a Mon Sep 17 00:00:00 2001 From: Lobo Date: Sat, 29 Nov 2025 15:13:47 +0100 Subject: [PATCH 3/3] Finalized the About page for now --- src/app/app.routes.ts | 4 + src/app/constants/AssetsConstants.ts | 5 +- src/app/layout/topbar/topbar.component.html | 4 +- src/app/pages/about/about.component.html | 109 ++++++++---------- src/app/pages/about/about.component.scss | 37 +++++- src/app/pages/about/about.component.ts | 58 +++++++++- .../pages/projects/projects.component.html | 2 +- src/assets/i18n/de.json | 103 +++++++++++++++-- src/assets/i18n/en.json | 102 +++++++++++++--- src/assets/logos/logo_chamaeleon.svg | 66 +++++++++++ src/styles.scss | 16 +++ 11 files changed, 410 insertions(+), 96 deletions(-) create mode 100644 src/assets/logos/logo_chamaeleon.svg diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 2c0a7ba..4320e95 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,6 +1,10 @@ import { Routes } from '@angular/router'; import {AboutComponent} from './pages/about/about.component'; +import {ProjectsComponent} from './pages/projects/projects.component'; export const routes: Routes = [ { path: '', component: AboutComponent }, + { path: 'about', component: AboutComponent}, + { path: 'projects', component: ProjectsComponent}, ]; + diff --git a/src/app/constants/AssetsConstants.ts b/src/app/constants/AssetsConstants.ts index 86c24c0..4727ef3 100644 --- a/src/app/constants/AssetsConstants.ts +++ b/src/app/constants/AssetsConstants.ts @@ -6,8 +6,9 @@ static readonly FLAG_EN = '/assets/flags/gb.svg'; //logos - static readonly TH_BINGEN_LOGO = '/assets/logos/assyst_gmbh_logo.jpg'; - static readonly ASSYST_LOG = '/assets/logos/bingen-logo-white.svg'; + static readonly CHAMAELEON_LOGO = '/assets/logos/logo_chamaeleon.svg'; + static readonly TH_BINGEN_LOGO = '/assets/logos/bingen-logo-white.svg'; + static readonly ASSYST_LOG = '/assets/logos/assyst_gmbh_logo.jpg'; static readonly COLORDIGITAL_LOGO = '/assets/logos/dmixcloud_logo.jpg'; static readonly TERAPORT_LOGO = '/assets/logos/teraport_gmbh_logo.jpg'; diff --git a/src/app/layout/topbar/topbar.component.html b/src/app/layout/topbar/topbar.component.html index b93633d..d42c9eb 100644 --- a/src/app/layout/topbar/topbar.component.html +++ b/src/app/layout/topbar/topbar.component.html @@ -12,8 +12,8 @@ diff --git a/src/app/pages/about/about.component.html b/src/app/pages/about/about.component.html index b799ddc..8c816ba 100644 --- a/src/app/pages/about/about.component.html +++ b/src/app/pages/about/about.component.html @@ -38,17 +38,6 @@ LinkedIn
- -