Collapse the four service routes into one anchored page.

Legacy detail URLs now 308 to locale-neutral fragments, and crawl plus JSON-LD follow the 18-path set.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-27 00:41:16 +02:00
parent b95dbd8e1a
commit 2635d0c639
29 changed files with 343 additions and 382 deletions

View File

@@ -1,13 +1,133 @@
@if (page(); as copy) {
<div class="content-container stack page">
<app-page-hero [hero]="copy.hero" [ctas]="copy.ctas" />
@for (section of copy.sections; track section.id) {
<app-content-section [section]="section" />
}
<app-systems-map
[heading]="copy.systemsMap.heading"
[intro]="copy.systemsMap.intro"
[headingLevel]="2"
/>
<section class="stack service-areas" [attr.aria-labelledby]="'service-areas-heading'">
<h2 id="service-areas-heading">{{ copy.sectionsHeading }}</h2>
@for (section of copy.serviceSections; track section.id) {
<article class="service-section stack" [attr.aria-labelledby]="section.id">
<header class="service-section-header stack">
<h2 [id]="section.id">{{ section.title }}</h2>
<p class="service-section-lead">{{ section.lead }}</p>
</header>
<section
class="stack service-part"
[id]="section.situation.id"
[attr.aria-labelledby]="section.situation.id + '-heading'"
>
<h3 [id]="section.situation.id + '-heading'">{{ section.situation.headline }}</h3>
@for (paragraph of section.situation.body ?? []; track $index) {
<p>{{ paragraph }}</p>
}
</section>
<section
class="stack service-part"
[id]="section.diagnosis.id"
[attr.aria-labelledby]="section.diagnosis.id + '-heading'"
>
<h3 [id]="section.diagnosis.id + '-heading'">{{ section.diagnosis.headline }}</h3>
@for (paragraph of section.diagnosis.body ?? []; track $index) {
<p>{{ paragraph }}</p>
}
</section>
<section
class="stack service-part"
[id]="section.implementation.id"
[attr.aria-labelledby]="section.implementation.id + '-heading'"
>
<h3 [id]="section.implementation.id + '-heading'">
{{ section.implementation.headline }}
</h3>
@for (paragraph of section.implementation.body ?? []; track $index) {
<p>{{ paragraph }}</p>
}
</section>
<section
class="stack service-part"
[id]="section.operation.id"
[attr.aria-labelledby]="section.operation.id + '-heading'"
>
<h3 [id]="section.operation.id + '-heading'">{{ section.operation.headline }}</h3>
@for (paragraph of section.operation.body ?? []; track $index) {
<p>{{ paragraph }}</p>
}
</section>
<section
class="stack offerings-group"
[attr.aria-labelledby]="deliveredHeadingId(section.id)"
>
<h3 [id]="deliveredHeadingId(section.id)">{{ copy.deliveredOfferingsHeading }}</h3>
<ul class="stack offerings">
@for (offering of deliveredOfferings(section); track offering.id) {
<li [attr.data-offering-status]="offering.status">
<h4>{{ offering.title }}</h4>
<p>{{ offering.body }}</p>
@if (caseBackedNote(offering); as note) {
<p class="case-backed">{{ note }}</p>
}
</li>
}
</ul>
</section>
<section
class="stack offerings-group"
[attr.aria-labelledby]="offerHeadingId(section.id)"
>
<h3 [id]="offerHeadingId(section.id)">{{ copy.offerOfferingsHeading }}</h3>
<ul class="stack offerings">
@for (offering of offerOfferings(section); track offering.id) {
<li [attr.data-offering-status]="offering.status">
<h4>{{ offering.title }}</h4>
<p>{{ offering.body }}</p>
</li>
}
</ul>
</section>
<section
class="stack service-part"
[id]="section.evidence.id"
[attr.aria-labelledby]="section.evidence.id + '-heading'"
>
<h3 [id]="section.evidence.id + '-heading'">{{ section.evidence.heading }}</h3>
<p>{{ section.evidence.note }}</p>
<div class="evidence-cases stack">
@for (study of evidenceCases(section); track study.id) {
<app-case-card [caseStudy]="study" [idPrefix]="'evidence-' + section.id" />
}
</div>
</section>
<section
class="stack service-part"
[id]="section.inquiry.id"
[attr.aria-labelledby]="section.inquiry.id + '-heading'"
>
<h3 [id]="section.inquiry.id + '-heading'">{{ section.inquiry.headline }}</h3>
@for (paragraph of section.inquiry.body ?? []; track $index) {
<p>{{ paragraph }}</p>
}
<app-cta-row [ctas]="copy.ctas.slice(-2)" />
</section>
</article>
}
</section>
</div>
}