Zum Inhalt springen

@levino/shipyard-base

Das Base-Paket ist das Fundament von shipyard. Es bietet das Kern-Konfigurationssystem und Layouts, die deine Seite antreiben.

Installation

npm install @levino/shipyard-base

Peer Dependencies

npm install tailwindcss daisyui @tailwindcss/typography
PaketVersion
astro^7.2.4
tailwindcss^4
daisyui^5
@tailwindcss/typography^0.5.20

Tailwind-Konfiguration

shipyard verwendet Tailwind CSS 4, das einen CSS-basierten Konfigurationsansatz nutzt. Für detaillierte Setup-Anweisungen siehe die Tailwind CSS Setup-Anleitung.

Konfiguration

Füge die shipyard-Integration zu deiner astro.config.mjs hinzu:

import shipyard from '@levino/shipyard-base'
import { defineConfig } from 'astro/config'

export default defineConfig({
  integrations: [
    shipyard({
      brand: 'Meine Seite',
      title: 'Meine tolle Seite',
      tagline: 'Erstellt mit shipyard',
      navigation: {
        docs: { label: 'Dokumentation', href: '/docs' },
        blog: { label: 'Blog', href: '/blog' },
      },
    }),
  ],
})

Konfigurationsoptionen

OptionTypErforderlichStandardBeschreibung
brandstringJa—Markenname in Navigationsleiste und Sidebar
titlestringJa—Seitentitel im HTML <title> Tag
taglinestringJa—Kurze Beschreibung deiner Seite
navigationNavigationTreeJa—Globale Navigationsstruktur (siehe unten)
scriptsScript[]Nein[]Skripte im Seitenkopf
footerFooterConfigNein—Footer-Konfiguration (Links, Copyright, Stil)
hideBrandingbooleanNeinfalse“Built with Shipyard” Branding ausblenden
defaultImagestringNein—Fallback-Vorschaubild (URL oder /Pfad in public/) für Seiten ohne eigenes image:. Wird unverändert weitergereicht — nicht optimiert (Config-Importe können nicht durch Astros Bildpipeline laufen)
localestringNein—Sprache der Seite, wenn Astros i18n-Routing nicht konfiguriert ist (z. B. 'de'). Setzt <html lang> und shipyards eingebaute Beschriftungen wie „Auf dieser Seite“, „Weiter“ oder „Diese Seite bearbeiten“. Englisch und Deutsch sind eingebaut, andere Sprachen fallen auf Englisch zurück. Mit konfiguriertem i18n gilt die Sprache der jeweiligen Seite
skipToContentLabelstringNeinEingebaute BeschriftungÜberschreibt die Beschriftung des „Zum Inhalt springen“-Links
onBrokenLinks'ignore' | 'log' | 'warn' | 'throw'Nein'warn'Verhalten bei defekten internen Links während des Builds

Die navigation-Option definiert die Hauptnavigation deiner Seite. Jeder Eintrag kann haben:

EigenschaftTypErforderlichStandardBeschreibung
labelstringNeinKey-NameAnzeigetext in Navigation
hrefstringNein—Link-Ziel-URL
subEntryNavigationTreeNein—Verschachtelte Einträge für Dropdown-Menüs

Einfache Navigation:

navigation: {
  docs: { label: 'Doku', href: '/docs' },
  blog: { label: 'Blog', href: '/blog' },
  about: { label: 'Über uns', href: '/about' },
}

Verschachtelte Navigation mit Dropdowns:

navigation: {
  docs: {
    label: 'Dokumentation',
    subEntry: {
      'getting-started': { label: 'Erste Schritte', href: '/docs/getting-started' },
      'api-reference': { label: 'API-Referenz', href: '/docs/api' },
    },
  },
  blog: { label: 'Blog', href: '/blog' },
}

Skripte hinzufügen

Füge Analytics oder andere Skripte zu jeder Seite hinzu:

shipyard({
  // ... andere Optionen
  scripts: [
    'https://example.com/analytics.js',
    { src: 'https://example.com/script.js', async: true },
  ],
})

Passe den Footer deiner Seite mit Links, Copyright-Hinweis und Styling an. Shipyard unterstützt sowohl einfache (einzeilige) als auch mehrspaltige Footer-Layouts, ähnlich wie Docusaurus.

Ein einfacher Footer zeigt Links in einer horizontalen Zeile:

shipyard({
  // ... andere Optionen
  footer: {
    links: [
      { label: 'Dokumentation', to: '/docs' },
      { label: 'Blog', to: '/blog' },
      { label: 'GitHub', href: 'https://github.com/myorg/myrepo' },
    ],
    copyright: 'Copyright © 2025 Meine Firma. Alle Rechte vorbehalten.',
  },
})

Für ein mehrspaltiges Layout verwende Objekte mit title und items:

shipyard({
  // ... andere Optionen
  footer: {
    style: 'dark',
    links: [
      {
        title: 'Doku',
        items: [
          { label: 'Erste Schritte', to: '/docs' },
          { label: 'API-Referenz', to: '/docs/api' },
        ],
      },
      {
        title: 'Community',
        items: [
          { label: 'Blog', to: '/blog' },
          { label: 'GitHub', href: 'https://github.com/myorg/myrepo' },
        ],
      },
    ],
    copyright: 'Copyright © 2025 Meine Firma.',
  },
})
OptionTypStandardBeschreibung
style'light' | 'dark''light'Footer-Farbthema
links(FooterLink | FooterLinkColumn)[][]Footer-Links oder -Spalten
copyrightstring—Copyright-Hinweis (unterstützt HTML)
logoFooterLogo—Optionales Footer-Logo
EigenschaftTypErforderlichBeschreibung
labelstringJaAnzeigetext für den Link
tostringEines von to/hrefInterner Link-Pfad (Locale-Präfix wird automatisch hinzugefügt)
hrefstringEines von to/hrefExterne URL (öffnet in neuem Tab)

FooterLinkColumn-Eigenschaften

EigenschaftTypErforderlichBeschreibung
titlestringJaSpalten-Überschrift
itemsFooterLink[]JaLinks innerhalb dieser Spalte

FooterLogo-Eigenschaften

EigenschaftTypErforderlichBeschreibung
altstringJaAlt-Text für das Logo
srcstringJaLogo-Bildquelle URL
srcDarkstringNeinOptionales Dark-Mode-Logo
hrefstringNeinLink-URL beim Klick auf das Logo
widthnumberNeinLogo-Breite in Pixel
heightnumberNeinLogo-Höhe in Pixel

Shipyard-Branding

Standardmäßig zeigt der Footer einen “Built with Shipyard” Link. Um dieses Branding auszublenden:

shipyard({
  // ... andere Optionen
  hideBranding: true,
})

Layouts

shipyard bietet Layouts für deine Seiten.

Page Layout

Das Basis-Layout für alle Seiten. Enthält Navigationsleiste, optionale Sidebar und Footer. Verwende es für eigene Astro-Komponenten.

Verwendung in Astro:

---
import { Page } from '@levino/shipyard-base/layouts'
---

<Page title="Meine Seite" description="Seitenbeschreibung">
  <h1>Seiteninhalt</h1>
</Page>
PropTypBeschreibung
titlestringSeitentitel (kombiniert mit Seitentitel)
descriptionstringSeitenbeschreibung für SEO

Named Slots

SlotBeschreibung
(default)Seiteninhalt
headEigene Elemente im HTML <head>
navbarExtraZusätzlicher Inhalt in der Navigationsleiste
sidebarExtraZusätzlicher Inhalt in der Sidebar

Eigene Head-Elemente einfügen

Verwende den head-Slot, um eigene Meta-Tags, Open Graph-Daten, Canonical-URLs oder strukturierte Daten (JSON-LD) in den <head> einzufügen, ohne ein eigenes Layout bauen zu müssen:

---
import { Page } from '@levino/shipyard-base/layouts'
---

<Page title="Mein Event" description="Ein Community-Event">
  <meta slot="head" property="og:type" content="event" />
  <meta slot="head" property="og:image" content="/images/event.jpg" />
  <link slot="head" rel="canonical" href="https://example.com/mein-event" />
  <script slot="head" type="application/ld+json" set:html={JSON.stringify({
    "@context": "https://schema.org",
    "@type": "Event",
    "name": "Mein Event"
  })} />

  <h1>Mein Event</h1>
</Page>

Markdown Layout

Ein Layout mit Tailwind Typography (prose) Styling. Verwende es für eigenständige Markdown-Seiten.

---
layout: '@levino/shipyard-base/layouts/Markdown.astro'
title: Meine Seite
---

# Meine Seite

Dein Markdown-Inhalt mit schöner Typografie...

Splash Layout

Ein Layout mit zentriertem Inhalt aber ohne Prose-Styling. Ideal für Landing Pages mit eigenem Styling.

---
layout: '@levino/shipyard-base/layouts/Splash.astro'
title: Willkommen
---

<div class="hero">
  <h1>Willkommen auf meiner Seite</h1>
</div>

Soziale Vorschaubilder (OG / Twitter)

Shipyard erzeugt für jede Seite automatisch Meta-Tags für soziale Vorschauen (og:image, twitter:image usw.). Die Bildquelle ergibt sich aus dem image-Frontmatter-Feld der Seite, mit einem seitenweiten Fallback über defaultImage.

Frontmatter image

Content-Collections (Docs, Blog) erwarten einen relativen Pfad zu einem lokalen Bild. Astros image()-Schema-Helper validiert den Pfad und löst ihn beim Parsen in eine ImageMetadata-Referenz auf, sodass shipyard die Datei durch Astros Bildpipeline schicken kann:

---
title: Meine Seite
description: Eine kurze Zusammenfassung, die auch als og:image:alt verwendet wird
image: ./hero.jpg
---

Shipyard erzeugt eine 1200×630-JPEG-Variante — die von Facebook, LinkedIn und Twitter empfohlene Größe und klein genug (unter ~200 KB), damit Chat-Clients (WhatsApp, Telegram) die Vorschau tatsächlich abrufen. Das Bild wird zugeschnitten (fit: cover), sodass jedes Quellseitenverhältnis funktioniert, und EXIF-Daten (GPS, Gerät, Zeitstempel) werden beim erneuten Kodieren entfernt. Du kannst also ein Foto direkt aus deiner Handy-Kamera in den Content-Ordner legen — keine manuelle Optimierung oder Vorab-Zuschnitt nötig.

Absolute URLs (https://...) werden im Frontmatter von Content-Collections nicht mehr akzeptiert — sie umgehen die Bildpipeline und können daher nicht optimiert werden. Lege die Datei stattdessen neben deine Markdown-Datei.

Seitenweiter Standard

Setze defaultImage als Fallback für Seiten ohne eigenes image::

shipyard({
  brand: 'Meine Seite',
  title: 'Meine Seite',
  tagline: 'Mit shipyard gebaut',
  navigation: { /* ... */ },
  defaultImage: '/og-default.jpg',
})

Der Pfad kann ein gegen site aus astro.config.* aufgelöster /...-Pfad sein (z. B. eine Datei in public/) oder eine vollständige URL. Asset-Importe aus src/ funktionieren hier nicht — astro.config.* wird ausgeführt, bevor Vites Asset-Pipeline aktiv ist, das Bild wird also unverändert weitergereicht und nicht optimiert. Wenn du einen optimierten seitenweiten Standard möchtest, optimiere ihn vorab manuell (1200×630 JPEG, < 200 KB) und liefere ihn aus public/ aus. Seiten mit eigenem image: haben immer Vorrang und laufen durch die Content-Collection-Pipeline.

Erzeugte Meta-Tags

Für Seiten mit Bild gibt shipyard aus:

  • og:image (absolute URL — von den meisten Scrapern erwartet)
  • og:image:width und og:image:height
  • og:image:type (z. B. image/jpeg für optimierte Varianten)
  • og:image:alt (Standard: description der Seite)
  • twitter:card (summary_large_image)
  • twitter:image und twitter:image:alt

Shipyard prüft während Produktions-Builds automatisch auf defekte interne Links. Dies hilft dir, Probleme zu erkennen, bevor du deine Seite veröffentlichst.

Konfiguration

Verwende die onBrokenLinks-Option, um zu steuern, was passiert, wenn defekte Links erkannt werden:

WertVerhalten
'ignore'Nicht auf defekte Links prüfen
'log'Defekte Links protokollieren, aber Build fortsetzen
'warn'Warnungen für defekte Links protokollieren (Standard)
'throw'Build bei defekten Links abbrechen

Beispiel - Build bei defekten Links abbrechen:

shipyard({
  brand: 'Meine Seite',
  title: 'Meine Seite',
  tagline: 'Erstellt mit shipyard',
  navigation: { /* ... */ },
  onBrokenLinks: 'throw',
})

Was geprüft wird

  • Interne Links die mit / beginnen (z.B. /docs/getting-started)
  • Links mit Query-Strings und Hash-Fragmenten (der Basispfad wird validiert)
  • Links zu HTML-Seiten, Verzeichnissen mit index.html und Asset-Dateien

Was ignoriert wird

  • Externe URLs (https://, http://)
  • Anker-Links (#section)
  • Spezielle Protokolle (mailto:, tel:, javascript:, data:)

Internationalisierung

Navigationslinks erhalten automatisch Locale-Präfixe wenn Astros i18n konfiguriert ist:

export default defineConfig({
  i18n: {
    defaultLocale: 'de',
    locales: ['de', 'en'],
    routing: { prefixDefaultLocale: true },
  },
  integrations: [shipyard({ /* ... */ })],
})