@if (isFirstRoleAtCompany(i)) {

+ class="absolute left-0 top-0 w-10 h-10 object-contain opacity-90 rounded-[10%] bg-logo-bg"
+ [class.invert]="entry.invertLogo" />
{{ (entry.key + '.COMPANY') | translate }}
diff --git a/src/app/pages/about/about.component.spec.ts b/src/app/pages/about/about.component.spec.ts
index de635d3..5a64900 100644
--- a/src/app/pages/about/about.component.spec.ts
+++ b/src/app/pages/about/about.component.spec.ts
@@ -5,6 +5,7 @@ import { MatIconRegistry } from '@angular/material/icon';
import { provideRouter } from '@angular/router';
import { provideTranslateService } from '@ngx-translate/core';
import { AboutComponent } from './about.component';
+import { AssetsConstants } from '../../constants/AssetsConstants';
/**
* No translations are loaded, so the translate pipe echoes the key back. That is
@@ -110,6 +111,16 @@ describe('AboutComponent', () => {
expect(textOf('[data-testid="role"]')).not.toContain('ABOUT.XP.COMPANY0.ROLE');
});
+ it('inverts the opaque white logos so they read as dark tiles', () => {
+ const inverted = fixture.debugElement
+ .queryAll(By.css('img.invert'))
+ .map(img => new URL(img.nativeElement.src, 'http://localhost').pathname);
+ const expected = [AssetsConstants.COLORDIGITAL_LOGO, AssetsConstants.TERAPORT_LOGO]
+ .map(src => new URL(src, 'http://localhost/').pathname);
+
+ expect(new Set(inverted)).toEqual(new Set(expected));
+ });
+
it('reveals the earlier positions when the toggle button is clicked', () => {
click('toggle-experience');
@@ -166,11 +177,14 @@ describe('AboutComponent', () => {
describe('education', () => {
it('shows only the post-school entries until the toggle button is clicked', () => {
expect(textOf('[data-testid="education-where"]')).toContain('ABOUT.EDUCATION.E6.WHERE');
- expect(textOf('[data-testid="education-where"]')).not.toContain('ABOUT.EDUCATION.E0.WHERE');
+ expect(textOf('[data-testid="education-where"]')).not.toContain('ABOUT.EDUCATION.E2.WHERE');
+ expect(textOf('[data-testid="education-where"]').length).toBe(3);
click('toggle-education');
+ expect(textOf('[data-testid="education-where"]')).toContain('ABOUT.EDUCATION.E2.WHERE');
expect(textOf('[data-testid="education-where"]')).toContain('ABOUT.EDUCATION.E0.WHERE');
+ expect(textOf('[data-testid="education-where"]').length).toBe(7);
});
});
diff --git a/src/app/pages/about/about.component.ts b/src/app/pages/about/about.component.ts
index 2b1c004..88f4fbf 100644
--- a/src/app/pages/about/about.component.ts
+++ b/src/app/pages/about/about.component.ts
@@ -17,6 +17,8 @@ interface ExperienceEntry {
company: string;
logo: string;
highlightCount: number;
+ /** The source file is opaque white; inverting gives the same dark tile as the other logos. */
+ invertLogo?: boolean;
}
interface SkillGroup {
@@ -50,25 +52,29 @@ export class AboutComponent {
key: 'ABOUT.XP.COMPANY9',
company: 'colordigital',
logo: AssetsConstants.COLORDIGITAL_LOGO,
- highlightCount: 3
+ highlightCount: 3,
+ invertLogo: true
},
{
key: 'ABOUT.XP.COMPANY8',
company: 'teraport',
logo: AssetsConstants.TERAPORT_LOGO,
- highlightCount: 3
+ highlightCount: 3,
+ invertLogo: true
},
{
key: 'ABOUT.XP.COMPANY7',
company: 'colordigital-earlier',
logo: AssetsConstants.COLORDIGITAL_LOGO,
- highlightCount: 3
+ highlightCount: 3,
+ invertLogo: true
},
{
key: 'ABOUT.XP.COMPANY6',
company: 'colordigital-earlier',
logo: AssetsConstants.COLORDIGITAL_LOGO,
- highlightCount: 3
+ highlightCount: 3,
+ invertLogo: true
},
{
key: 'ABOUT.XP.COMPANY5',
diff --git a/src/app/shared/components/particles-background/particles-background.component.scss b/src/app/shared/components/particles-background/particles-background.component.scss
index b429a16..fa17474 100644
--- a/src/app/shared/components/particles-background/particles-background.component.scss
+++ b/src/app/shared/components/particles-background/particles-background.component.scss
@@ -7,3 +7,7 @@
z-index: -1;
pointer-events: none;
}
+
+canvas {
+ box-shadow: none;
+}
diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json
index 8beee6d..1b26842 100644
--- a/src/assets/i18n/de.json
+++ b/src/assets/i18n/de.json
@@ -1,7 +1,7 @@
{
"APP": {
"TITLE": "Playground",
- "COPYRIGHT": "Bilder und Sourcecode sind urheberrechtlich geschützt, keine Nutzung ohne Zustimmung!",
+ "COPYRIGHT": "Alle Rechte vorbehalten.",
"AI_NOTICE": "Entstanden mit einem KI-gestützten Engineering-Workflow.",
"AI_NOTICE_LINK": "Wie ich mit KI arbeite"
},
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
index e6ae0bc..87cfc47 100644
--- a/src/assets/i18n/en.json
+++ b/src/assets/i18n/en.json
@@ -1,7 +1,7 @@
{
"APP": {
"TITLE": "Playground",
- "COPYRIGHT": "Images and code protected by copyright, no use without permission!",
+ "COPYRIGHT": "All rights reserved.",
"AI_NOTICE": "Built with an AI-assisted engineering workflow.",
"AI_NOTICE_LINK": "How I build with AI"
},
diff --git a/src/assets/projects/to-be-played/architecture.svg b/src/assets/projects/to-be-played/architecture.svg
index 48eebf6..893f42f 100644
--- a/src/assets/projects/to-be-played/architecture.svg
+++ b/src/assets/projects/to-be-played/architecture.svg
@@ -1,6 +1,6 @@