Zum Inhalt springen

PageHeader — Cross-App-Sync

PageHeader — Cross-App-Sync

Wie süper und addxion.ai denselben PageHeader strukturell teilen, inhaltlich aber getrennt bleiben.

manifest.ts (pro App)
→ @addxion/xi/nav resolveSection(manifest, pathname)
→ @addxion/shell PageHeader (Layout, Spacing, Slots)
→ @addxion/neon Tokens, Typografie
SchichtSSOTVerantwortung
Layout & Verhalten@addxion/shellSpacing, Tab-Regeln, Slots, Animationen
Styling@addxion/neonTokens, Typografie, Farben
Seitentitelmanifest.ts pro Applabel der aktiven Section
Titel-Auflösung@addxion/xi/navresolveSection(manifest, pathname)

süper und addxion.ai konsumieren dieselbe PageHeader-Komponente aus addxion-ai/packages/shell (extrahiert aus süper). Siehe Shell-Architektur.

  • Tab-Seiten: nur Titel, kein Untertitel
  • mb-3 am Header
  • Titel ausschließlich über resolveSection, nie hardcodiert in Consumer-Layouts

Apps verdrahten nur Manifest und Route. Keine Layout-Logik im Consumer:

import { PageHeader } from "@addxion/shell";
import { resolveSection } from "@addxion/xi/nav";
import { appManifest } from "@/manifest";
export function AppPageHeader({ pathname }: { pathname: string }) {
const section = resolveSection(appManifest, pathname);
return <PageHeader title={section?.label} />;
}

Erlaubt im Consumer: Routing-Hook, Manifest-Import, optionale App-Actions als Props (wenn Shell-API das vorsieht).

Nicht erlaubt im Consumer: eigene PageHeader-Implementierung, Spacing-Overrides, app-spezifische Untertitel-Logik.

Jede strukturelle Änderung (Padding, Back-Button, Actions-Slot, Untertitel-Regeln) gehört nur nach addxion-ai/packages/shell. Consumer-Repos (süper, addxion-ai) halten höchstens einen dünnen Wrapper — keine zweite Komponente mit Layout/CSS.

// süper/src/manifest.ts bzw. addxion-ai/src/manifest.ts
sections: [
{ id: "theorie-pruefung", href: "/theorie-pruefung", label: "Theorie & Prüfung", nav: true },
],

Titel-Änderungen = nur manifest.ts der betroffenen App. Shell bleibt unberührt.

Drift entsteht oft durch unterschiedliche @addxion/shell-Versionen in süper und addxion.ai.

ModusEmpfehlung
Lokal"@addxion/shell": "file:../addxion-ai/packages/shell"
ReleaseBeide Apps im gleichen PR-Zyklus auf dieselbe Shell-Version bumpen

adapters/next und adapters/tanstack existieren in Shell. Beide Apps sollten denselben Adapter-Pfad nutzen — unterschiedliche Einbindung erzeugt subtile Verhaltensunterschiede trotz identischer Komponente.

Spacing und Typografie kommen aus Shell + Neon. className-Overrides oder brand.css-Hacks am Header führen zu visueller Drift.

ÄnderungWoFolge
Layout, Spacing, Slots, Verhaltenaddxion-ai/packages/shellVersion bump → süper + addxion.ai Dependency aktualisieren
Seitentitel, neue Tab-Labelsmanifest.ts der AppShell unverändert
Architektur-Entscheidungaddxion-docsDiese Seite oder Shell-Architektur

Checkliste nach Shell-Änderung:

  1. addxion-ai/packages/shell — Code
  2. süper + addxion.ai — Dependency-Version
  3. addxion-docs — shell/guidance/page-header.md bei neuen Regeln
  4. Visuell in beiden Apps prüfen (gleiche Route-Struktur, unterschiedliche Titel)

Siehe auch Docs-Sync.

Wenn Header zwischen Apps abweichen:

  1. Gibt es in süper oder addxion.ai noch eine lokale PageHeader-Implementierung?
  2. Stimmen die @addxion/shell-Versionen überein?
  3. Nutzen beide Apps den gleichen Framework-Adapter?
  4. Gibt es CSS-Overrides am Header in Consumer-brand.css?
Anti-PatternFolge
PageHeader in süper und addxion.ai parallel pflegenGarantierte Drift
Titel in Layout/Route hardcodenSync unmöglich
Nav-Items im Header statt ManifestVerletzt xi-nav-Vertrag
Shell-Versionen auseinanderlaufen lassenGleiche Komponente, anderes Verhalten
App-CSS auf Shell-KomponentenVisuell „fast gleich“, aber nicht identisch
IDWahrheit
T-SHELL-PAGEHEADERPageHeader-Struktur in Shell, Titel im Manifest
T-MAINTAINEinmal pflegen — keine Doppelpflege
T-NAV-MANIFESTNav aus manifest.ts + xi/nav

Scope: PageHeader strukturell in @addxion/shell, Titel pro App in manifest.ts.

  • Keine lokalen PageHeader-Forks in süper oder addxion.ai
  • Nach Shell-Änderung: beide Consumer auf gleiche @addxion/shell-Version
  • Titel nur via resolveSection, nie hardcoden
  • Leitprinzip: Einmal pflegen