content: replace scaffolding with bilingual pages and case studies

Ship the final German and English copy, compose every route from shared page primitives, and cover claims, parity and contact briefing in tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-25 17:34:04 +02:00
parent 9ea2885c7b
commit d954361724
95 changed files with 4161 additions and 419 deletions

View File

@@ -1,7 +1,18 @@
import { computed, inject, Injectable, type Signal } from '@angular/core';
import { LocaleService } from '../i18n/locale.service';
import { type RouteId } from '../routing/route-ids';
import { type PageCopy } from './content.contracts';
import {
CASE_STUDY_IDS,
type CaseStudyCopy,
type CaseStudyId,
type ContactPageCopy,
type HomePageCopy,
type LegalPageCopy,
type PageCopy,
type ServicePageCopy,
type ServicePageId,
type StackPageCopy,
} from './content.contracts';
import { SITE_CONTENT } from './content.token';
@Injectable({ providedIn: 'root' })
@@ -9,7 +20,38 @@ export class ContentService {
private readonly localeService = inject(LocaleService);
private readonly content = inject(SITE_CONTENT);
page(routeId: RouteId): Signal<PageCopy | undefined> {
page(routeId: RouteId): Signal<PageCopy> {
return computed(() => this.content[this.localeService.locale()].pages[routeId]);
}
home(): Signal<HomePageCopy> {
return computed(() => this.content[this.localeService.locale()].home);
}
service(id: ServicePageId): Signal<ServicePageCopy> {
return computed(() => this.content[this.localeService.locale()].services[id]);
}
caseStudy(id: CaseStudyId): Signal<CaseStudyCopy> {
return computed(() => this.content[this.localeService.locale()].cases[id]);
}
cases(): Signal<readonly CaseStudyCopy[]> {
return computed(() => {
const cases = this.content[this.localeService.locale()].cases;
return CASE_STUDY_IDS.map((id) => cases[id]);
});
}
contact(): Signal<ContactPageCopy> {
return computed(() => this.content[this.localeService.locale()].contact);
}
stack(): Signal<StackPageCopy> {
return computed(() => this.content[this.localeService.locale()].stack);
}
legal(id: 'imprint' | 'privacy'): Signal<LegalPageCopy> {
return computed(() => this.content[this.localeService.locale()].legal[id]);
}
}