Zum Inhalt springen

Websites entwickeln

Websites entwickeln

Best Practices für ADDXION Marketing-Sites — Astro, Neon Consumer, SEO, Architektur.

ConsumerRepoStack
addxion.comaddxion-comAstro 5, Bun, Neon, CF Pages
süpersüperNext.js, Neon, CF (öffentliche Surfaces: Login)
addxion.aiaddxion-aiTanStack Start (öffentliche Surfaces: Guest/Login)
Externe ReferenzimprodentAstro 6, Tailwind Plus, statisches Hosting (nicht ADDXION-Standard)

Ökosystem-Grenzen: Repo Boundaries. Nach Package-Änderungen: Docs-Sync.

Geschwister-Repos:

GitHub/
addxion-neon/
addxion-docs/
addxion-com/
"@addxion/neon": "file:../addxion-neon/packages/neon",
"@addxion/components": "file:../addxion-neon/packages/components"

Consumer nutzen @addxion/neon, nicht @addxion/core (interne Engine).

Terminal-Fenster
cd addxion-com
bun install
bun run dev # :4123 — Marketing; /docs/* proxied zu addxion-docs :4321

Details: CSS Architecture.

DateiInhalt
brand.cssMarken-Tokens (ink, cream, electric, Fonts) — SSOT in addxion-com
site.csstailwindcss + Inter + brand.css + Marketing-Komponenten (.btn, .wrapper)
cp-page.cssOptional: Produktseiten-Layout (CallPilot, Automation) — analog süper-Kurse-Layer
neon.css@import "@addxion/neon/styles" — nur wenn Neon-Primitives mit tw: gebraucht werden

Marketing-Layout importiert nur site.css. neon.css nicht global laden, wenn die Seite unpräfixiertes Tailwind nutzt.

SSOT: Typografie — Font-Stack und Type Scale.

Keine Google Fonts CDN. Inter self-hosted:

@import "@addxion/neon/fonts/inter.css";

System-Schrift (SF Pro) zuerst, Inter als Fallback. Stack und Scale-Tokens in Consumer-brand.css setzen, nicht in addxion-neon.

Größen/Tracking nach improdent-Metriken; Familie bleibt ADDXION-Stack (--font-display: var(--font-sans)).

SurfaceRolleToken / Muster
Hero-HeadlineDisplay--text-display, tracking -0.04em, weight 400
Section-TitelHeading--text-heading / --text-heading-lg, tracking -0.03em, weight 400
FließtextBody--text-body (1rem / 1.75rem), optional --text-body-lg
Eyebrow / MetaUItext-sm, font-semibold oder font-medium

Consumer: addxion-com; öffentliche Surfaces von addxion-ai (Guest/Login). App-interne PageHeader-Titel nutzen --text-title (UI), nicht Display.

Bei wenigen Seiten reicht eine flache Struktur (pages/ + components/). Ab etwa 3–4 Seiten lohnt sich die Schichtung aus improdent:

src/pages/*.astro → dünn: Meta, Layout, Route-Komponente
src/components/routes/ → AppShell + Page-Entry (React)
src/components/content/ → Section-Zusammenstellung
src/components/shell/ → Header, Footer, wiederkehrendes Chrome
src/lib/*.ts → statische Daten (Produkte, Team, Jobs)

Regel: Astro-Seiten bleiben kurz. Wiederkehrende Logik und Daten gehören in lib/ oder Shell-Komponenten, nicht in jede Page kopiert.

addxion-com hat aktuell 2 Marketing-Pages — Refactor auf routes/content/shell ist optional, das Muster gilt für Wachstum.

ChromePackageInhaltMount
Marketing Header@addxion/components (MarketingHeader)Logo, öffentliche Nav, CTAsnur öffentliche Layouts
App PageHeader@addxion/shellSeitentitel, Command, App-TabsAuth-App, geschützte Routen

Shared-Struktur in @addxion/components/react/MarketingHeader (Sticky, Backdrop, Desktop-Nav, Mobile-Drawer). Inhalt und Marke bleiben im Consumer: dünner SiteHeader-Wrapper mit Logo, Nav-Array, Actions und Brand-Klassen.

import { MarketingHeader } from '@addxion/components/react'

Referenz-Consumer:

RepoWrapperMount
addxion-comsrc/components/shell/SiteHeader.tsxHeader.astro (client:load)
addxion-aisrc/components/marketing/site-header.tsx_guest/route.tsx
süpersrc/components/layout/SiteHeader.tsx(super)/login/layout.tsx

Nicht in _auth, (protected) oder anderen App-Layouts mounten — dort bleibt @addxion/shell PageHeader. Keine Marken-Tokens (cream, ink, …) im Package; Brand-Klassen nur im Wrapper.

React-Inseln gezielt hydratisieren:

DirectiveEinsatz
client:loadAbove-the-fold: Header, Hero, AppShell
client:visibleBelow-the-fold: Carousels, Stats, Feature-Grids
client:idleUnterseiten, Legal, wenig interaktive Bereiche

Nicht alles mit client:load — das erhöht initiales JS unnötig.

Zentrale Site-Konfiguration in src/lib/site.ts:

export function getSiteUrl(): string {
const raw = import.meta.env.PUBLIC_SITE_URL ?? 'https://addxion.com'
return String(raw).replace(/\/$/, '')
}
ExportZweck
getSiteUrl()Canonical-Basis; PUBLIC_SITE_URL für Preview/Staging
siteNameOG site_name, JSON-LD
siteDescriptionDefaultFallback-Meta
siteDefaultOgImagePath/og.png
getStructuredDataJsonLd(siteUrl)@graph: WebSite + Organization

Programmatische Endpunkte statt statischer Dateien:

  • src/pages/sitemap.xml.ts — explizite URL-Liste mit changefreq / priority
  • src/pages/robots.txt.tsSitemap: ${getSiteUrl()}/sitemap.xml

Keine /docs/* URLs in der Marketing-Sitemap. Plattform-Docs laufen über separates CF Pages-Projekt (addxion-docs).

Neue Marketing-Seite → URL in Sitemap eintragen.

Layout.astro bezieht Defaults aus site.ts:

  • Canonical, OG, Twitter Cards
  • <script type="application/ld+json"> mit getStructuredDataJsonLd()
  • Domänenspezifische Schemas (z. B. Dentist, JobPosting) nur beim jeweiligen Consumer ergänzen
  • 404: robots="noindex, follow" (kein Index, Links folgen)
  • Fixe Navigation: scroll-padding-top in site.css für Anker-Sprünge unter sticky Header

addxion-com nutzt ClientRouter (Astro View Transitions). Das ist für Marketing ohne schwere Embeds in Ordnung.

Bei Drittanbieter-Widgets (Reviews, CMP, Chat) kann SPA-Navigation Probleme machen: Widgets bleiben nach Zurück-Navigation leer bis Hard-Reload. Dann entweder:

  • Full-Page-Navigation ohne ClientRouter, oder
  • Lifecycle-Bridge (astro:before-swap) für betroffene Embeds

Referenz: improdent verzichtet bewusst auf ClientRouter wegen Elfsight.

DateiRepoInhalt
public/llms.txtaddxion-comMarketing-Index, Produktlinks, Verweis auf Docs
public/llms-full.txtaddxion-comVolltext nur Marketing-Seiten
public/llms.txtaddxion-docsPlattform-Docs-Index

Bei neuer Marketing-Seite: llms.txt und ggf. llms-full.txt in addxion-com. Bei neuer Plattform-Doc: addxion-docs llms.txt und Starlight-Content.

Details: Documentation as Code.

Documentation as Code: keine KI-Floskeln, kein Gedankenstrich-Spam.

Zusätzlich (aus improdent AGENTS.md):

  • Keine Bindestriche in Fließtext — umformulieren zu fließendem Satz
  • Externe Quellen (Templates, Kits) ans eigene Design System anpassen, nicht 1:1 übernehmen
  • Produktnamen: Neon, AI — ohne „ADDXION®“-Präfix im Produktnamen

Für UI mit Neon-Primitives: AI-ready Neon.

Kurz:

  1. MCP @addxion/mcp in .cursor/mcp.json (cwd: ../addxion-neon)
  2. Vor Implementierung: list_rules, get_component
  3. tw: Prefix, semantische Tokens, Brand nur in brand.css
  4. bun run check (neon), bun run build (com)
ConsumerHostingBesonderheit
addxion.comCloudflare Pagesfunctions/_middleware.ts proxied /docs/* → addxion-docs
süperCloudflare PagesEigener Consumer, eigene brand.css
improdentStatisch / FTPReferenz für SEO-Muster, nicht ADDXION-Deploy-Standard

addxion-com: bun run deploy. Docs separat: cd addxion-docs && bun run deploy.

  1. src/pages/<slug>.astro anlegen
  2. Meta (title, description) — Defaults aus site.ts nutzen
  3. URL in sitemap.xml.ts eintragen
  4. public/llms.txt aktualisieren
  5. Bei Bedarf llms-full.txt ergänzen
  6. bun run build in addxion-com
IDWahrheit
T-PKG-NEONConsumer-Einstieg: @addxion/neon, nicht @addxion/core
T-NEON-BRANDMarkenwerte in Consumer brand.css
T-BRAND-STRATEGYMarkenstrategie nur in addxion-docs /docs/branding/
T-REPO-BOUNDARYKlare Repo-Verantwortung pro Inhaltstyp

Scope: Marketing-Websites — addxion.com, süper, Neon-Consumer.

  • Referenz: addxion-com; @addxion/neon als Design-Einstieg
  • brand.css pro Consumer für Markenwerte und Type-Scale-Tokens
  • Typografie: Hero → Display, Section → Heading, Body base/7Typografie
  • Copy und Positionierung an Branding ausrichten
  • Nach Package-Änderung: Docs-Sync