@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^5.7
tailwindcss^3
daisyui^4
@tailwindcss/typography^0.5.10

Tailwind-Konfiguration

Damit Tailwind die in shipyard-Komponenten verwendeten Klassen korrekt erkennt, musst du die Paketpfade zum content-Array in deiner tailwind.config.mjs hinzufügen:

const path = require('node:path')

/** @type {import('tailwindcss').Config} */
export default {
  content: [
    './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}',
    // Füge dies hinzu, um shipyard-base Komponenten-Styles einzuschließen
    path.join(
      path.dirname(require.resolve('@levino/shipyard-base')),
      '../astro/**/*.astro',
    ),
  ],
  // ... Rest deiner Konfiguration
}

Dies stellt sicher, dass Tailwind die shipyard-Komponentendateien scannt und alle notwendigen CSS-Klassen in deinen Build einschließt.

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
brandstringJaMarkenname in Navigationsleiste und Sidebar
titlestringJaSeitentitel im HTML <title> Tag
taglinestringJaKurze Beschreibung deiner Seite
navigationNavigationTreeJaGlobale Navigationsstruktur (siehe unten)
scriptsScript[]Nein[]Skripte im Seitenkopf
footerFooterConfigNeinFooter-Konfiguration (Links, Copyright, Stil)
hideBrandingbooleanNeinfalse”Built with Shipyard” Branding ausblenden
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
hrefstringNeinLink-Ziel-URL
subEntryNavigationTreeNeinVerschachtelte 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
copyrightstringCopyright-Hinweis (unterstützt HTML)
logoFooterLogoOptionales 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

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>

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({ /* ... */ })],
})