diff --git a/public/llms.txt b/public/llms.txt index 6e7214f..73cea68 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,6 +1,6 @@ # Antonio Ledebuhr -Fullstack and DevOps engineer in Tangermünde. The public site documents a curated set of stations, four service areas, and a local mailto briefing. German is the default language; English is the full second version. +Fullstack and DevOps engineer in Tangermünde. The public site documents six public cases, one services page with four anchored areas, and a briefing form that only opens a local mail client. German is the default language; English is the full second version. ## Profile @@ -15,14 +15,6 @@ Fullstack and DevOps engineer in Tangermünde. The public site documents a curat - https://antoniolede.de/leistungen - https://antoniolede.de/en/services -- https://antoniolede.de/leistungen/software -- https://antoniolede.de/en/services/software -- https://antoniolede.de/leistungen/hardware-netzwerk -- https://antoniolede.de/en/services/hardware-network -- https://antoniolede.de/leistungen/cluster -- https://antoniolede.de/en/services/clusters -- https://antoniolede.de/leistungen/ai-integration -- https://antoniolede.de/en/services/ai-integration ## Projects @@ -32,10 +24,14 @@ Fullstack and DevOps engineer in Tangermünde. The public site documents a curat - https://antoniolede.de/en/projects#innofocus - https://antoniolede.de/projekte#roesterei - https://antoniolede.de/en/projects#roesterei -- https://antoniolede.de/projekte#myspa -- https://antoniolede.de/en/projects#myspa +- https://antoniolede.de/projekte#bannier +- https://antoniolede.de/en/projects#bannier +- https://antoniolede.de/projekte#elbwaerme +- https://antoniolede.de/en/projects#elbwaerme - https://antoniolede.de/projekte#hdi - https://antoniolede.de/en/projects#hdi +- https://antoniolede.de/projekte#devdays +- https://antoniolede.de/en/projects#devdays ## Contact, stack and legal diff --git a/public/sitemap.xml b/public/sitemap.xml index b977bfa..3e8701a 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -18,30 +18,6 @@ - - https://antoniolede.de/leistungen/software - - - - - - https://antoniolede.de/leistungen/hardware-netzwerk - - - - - - https://antoniolede.de/leistungen/cluster - - - - - - https://antoniolede.de/leistungen/ai-integration - - - - https://antoniolede.de/projekte @@ -96,30 +72,6 @@ - - https://antoniolede.de/en/services/software - - - - - - https://antoniolede.de/en/services/hardware-network - - - - - - https://antoniolede.de/en/services/clusters - - - - - - https://antoniolede.de/en/services/ai-integration - - - - https://antoniolede.de/en/projects diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index e95c25d..6794461 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -13,18 +13,6 @@ const PAGE_LOADERS: Record = { home: () => import('./features/home/home').then((module) => module.HomePage), pitch: () => import('./features/pitch/pitch').then((module) => module.PitchPage), services: () => import('./features/services/services').then((module) => module.ServicesPage), - servicesSoftware: () => - import('./features/services/software/software').then((module) => module.ServicesSoftwarePage), - servicesHardwareNetwork: () => - import('./features/services/hardware-network/hardware-network').then( - (module) => module.ServicesHardwareNetworkPage, - ), - servicesClusters: () => - import('./features/services/clusters/clusters').then((module) => module.ServicesClustersPage), - servicesAi: () => - import('./features/services/ai-integration/ai-integration').then( - (module) => module.ServicesAiPage, - ), projects: () => import('./features/projects/projects').then((module) => module.ProjectsPage), stack: () => import('./features/stack/stack').then((module) => module.StackPage), about: () => import('./features/about/about').then((module) => module.AboutPage), diff --git a/src/app/core/navigation/navigation.service.ts b/src/app/core/navigation/navigation.service.ts index 997afbc..f766593 100644 --- a/src/app/core/navigation/navigation.service.ts +++ b/src/app/core/navigation/navigation.service.ts @@ -14,7 +14,6 @@ export interface ResolvedNavItem { readonly routeId: RouteId; readonly label: string; readonly link: unknown[]; - readonly children?: readonly ResolvedNavItem[]; } @Injectable({ providedIn: 'root' }) @@ -56,7 +55,6 @@ export class NavigationService { routeId: item.routeId, label: item.label[locale], link: routeCommands(item.routeId, locale), - children: item.children ? this.resolveItems(item.children, locale) : undefined, })); } diff --git a/src/app/core/navigation/navigation.ts b/src/app/core/navigation/navigation.ts index 0561f03..7675c4a 100644 --- a/src/app/core/navigation/navigation.ts +++ b/src/app/core/navigation/navigation.ts @@ -4,7 +4,6 @@ import { type RouteId } from '../routing/route-ids'; export interface NavItem { readonly routeId: RouteId; readonly label: Record; - readonly children?: readonly NavItem[]; } export const PRIMARY_NAV: readonly NavItem[] = [ @@ -15,24 +14,6 @@ export const PRIMARY_NAV: readonly NavItem[] = [ { routeId: 'services', label: { de: 'Leistungen', en: 'Services' }, - children: [ - { - routeId: 'servicesSoftware', - label: { de: 'Software', en: 'Software' }, - }, - { - routeId: 'servicesHardwareNetwork', - label: { de: 'Hardware und Netzwerk', en: 'Hardware and network' }, - }, - { - routeId: 'servicesClusters', - label: { de: 'Cluster', en: 'Clusters' }, - }, - { - routeId: 'servicesAi', - label: { de: 'KI-Integration', en: 'AI integration' }, - }, - ], }, { routeId: 'projects', diff --git a/src/app/core/routing/route-ids.ts b/src/app/core/routing/route-ids.ts index 2a6fc57..9b3e710 100644 --- a/src/app/core/routing/route-ids.ts +++ b/src/app/core/routing/route-ids.ts @@ -2,10 +2,6 @@ export type RouteId = | 'home' | 'pitch' | 'services' - | 'servicesSoftware' - | 'servicesHardwareNetwork' - | 'servicesClusters' - | 'servicesAi' | 'projects' | 'stack' | 'about' @@ -18,10 +14,6 @@ export const ROUTE_IDS: readonly RouteId[] = [ 'home', 'pitch', 'services', - 'servicesSoftware', - 'servicesHardwareNetwork', - 'servicesClusters', - 'servicesAi', 'projects', 'stack', 'about', diff --git a/src/app/core/routing/route-paths.spec.ts b/src/app/core/routing/route-paths.spec.ts index c774c02..0a106a6 100644 --- a/src/app/core/routing/route-paths.spec.ts +++ b/src/app/core/routing/route-paths.spec.ts @@ -27,12 +27,12 @@ describe('route paths', () => { expect(routePath('projects', 'en')).toBe('/en/projects'); }); - it('exposes pitch in both locales and keeps prerenderablePaths at 26', () => { + it('exposes pitch in both locales and keeps prerenderablePaths at 18', () => { expect(ROUTE_SEGMENTS.de.pitch).toBe('pitch'); expect(ROUTE_SEGMENTS.en.pitch).toBe('pitch'); expect(routePath('pitch', 'de')).toBe('/pitch'); expect(routePath('pitch', 'en')).toBe('/en/pitch'); - expect(prerenderablePaths()).toHaveLength(26); + expect(prerenderablePaths()).toHaveLength(18); }); it('includes both locales in prerenderable paths and excludes the wildcard', () => { diff --git a/src/app/core/routing/route-paths.ts b/src/app/core/routing/route-paths.ts index a21a5f4..f47d534 100644 --- a/src/app/core/routing/route-paths.ts +++ b/src/app/core/routing/route-paths.ts @@ -11,10 +11,6 @@ export const ROUTE_SEGMENTS: Record> = { home: '', pitch: 'pitch', services: 'leistungen', - servicesSoftware: 'leistungen/software', - servicesHardwareNetwork: 'leistungen/hardware-netzwerk', - servicesClusters: 'leistungen/cluster', - servicesAi: 'leistungen/ai-integration', projects: 'projekte', stack: 'stack', about: 'ueber-mich', @@ -27,10 +23,6 @@ export const ROUTE_SEGMENTS: Record> = { home: '', pitch: 'pitch', services: 'services', - servicesSoftware: 'services/software', - servicesHardwareNetwork: 'services/hardware-network', - servicesClusters: 'services/clusters', - servicesAi: 'services/ai-integration', projects: 'projects', stack: 'stack', about: 'about', diff --git a/src/app/core/seo/structured-data.ts b/src/app/core/seo/structured-data.ts index f880112..187c692 100644 --- a/src/app/core/seo/structured-data.ts +++ b/src/app/core/seo/structured-data.ts @@ -6,13 +6,7 @@ import { canonicalUrl } from './route-metadata'; const SCHEMA_CONTEXT = 'https://schema.org'; -const SERVICE_ROUTE_IDS: readonly RouteId[] = [ - 'services', - 'servicesSoftware', - 'servicesHardwareNetwork', - 'servicesClusters', - 'servicesAi', -]; +const SERVICE_ROUTE_IDS: readonly RouteId[] = ['services']; export type JsonLdValue = | string @@ -56,23 +50,23 @@ function professionalServiceNode( }; } -function serviceNode( - routeId: RouteId, +function serviceNodes( locale: AppLocale, content: Record, -): JsonLdValue { - const page = content[locale].pages[routeId]; +): readonly JsonLdValue[] { + const page = content[locale].services; + const servicesUrl = canonicalUrl('services', locale); - return { + return page.serviceSections.map((section) => ({ '@type': 'Service', - name: page.hero.headline, - description: page.description, - url: canonicalUrl(routeId, locale), + name: section.title, + description: section.lead, + url: `${servicesUrl}#${section.id}`, provider: { '@type': 'Person', name: SITE_CONFIG.personName, }, - }; + })); } function projectWorks( @@ -128,7 +122,7 @@ export function buildJsonLdGraph( if (routeId === 'home') { graph = [personNode(locale, content), professionalServiceNode(locale, content)]; } else if (SERVICE_ROUTE_IDS.includes(routeId)) { - graph = [serviceNode(routeId, locale, content)]; + graph = serviceNodes(locale, content); } else if (routeId === 'projects') { graph = projectWorks(locale, content); } else { diff --git a/src/app/features/home/home.html b/src/app/features/home/home.html index f3dfaea..25487a8 100644 --- a/src/app/features/home/home.html +++ b/src/app/features/home/home.html @@ -3,15 +3,16 @@ @for (section of copy.sections; track section.id) { - @if (section.id === 'scope') { + @if (section.id === 'areas') {

{{ copy.serviceAreasHeading }}