content: drop repeated reference headings and land case CTAs on anchors

Service notes now say why the public case fits, the four case CTAs
open the matching project fragment, and the Innofocus run-time figure
is a case metric as well as a home tile.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-25 17:52:37 +02:00
parent cfc7580a8f
commit 763bf435c9
8 changed files with 65 additions and 24 deletions

View File

@@ -6,6 +6,8 @@ import { SITE_CONTENT } from '../core/content/content.token';
import { SITE_CONTENT_DATA } from '../core/content/site-content';
import { SITE_CONFIG } from '../core/content/site-config';
import { CASE_STUDY_IDS } from '../core/content/content.contracts';
import { APP_LOCALES } from '../core/i18n/locale';
import { routePath } from '../core/routing/route-paths';
function headingLevel(element: Element): number {
return Number(element.tagName.slice(1));
@@ -95,4 +97,22 @@ describe('page rendering, semantics and accessibility', () => {
expect(SITE_CONTENT_DATA.de.pages.notFound.hero.headline).toBeTruthy();
});
it('sends the software service case CTA to the innofocus project anchor', async () => {
TestBed.configureTestingModule({
providers: [provideRouter(routes), { provide: SITE_CONTENT, useValue: SITE_CONTENT_DATA }],
});
const harness = await RouterTestingHarness.create();
for (const locale of APP_LOCALES) {
await harness.navigateByUrl(routePath('servicesSoftware', locale));
const root = harness.routeNativeElement as HTMLElement;
const expected = `${routePath('projects', locale)}#innofocus`;
const hrefs = [...root.querySelectorAll('a')].map(
(anchor) => anchor.getAttribute('href') ?? '',
);
expect(hrefs.some((href) => href.endsWith(expected))).toBe(true);
}
});
});