Heute habe ich @wendermedia/astro-components v3.0.0 auf npm veröffentlicht. Das ist kein Patch und kein Minor-Release — es ist ein Major-Bump mit drei zusammenhängenden Migrationen: Astro 5 → 6, Tailwind 3 → 4 in den Templates, und Lizenzwechsel von MIT zur Wender Media Source License v1.0.
Warum drei Migrationen in einem Release
Drei Breaking Changes in einem einzigen Major-Bump sehen wie schlechtes Engineering aus — aber die Alternative wäre schlimmer. Drei separate Major-Releases (3.0 für Astro 6, 4.0 für Tailwind 4 in Templates, 5.0 für die Lizenz) hätten Konsumenten gezwungen, drei Migrationen hintereinander durchzuführen. Das ist Reibung ohne Mehrwert.
Stattdessen: eine Migration, eine Migration-Anleitung, ein einziger CHANGELOG-Eintrag. Wer auf v2.x bleiben will (weil die Codebasis noch auf Astro 5 läuft), pinnt einfach @wendermedia/astro-components@2.1.0 und bekommt weiterhin MIT-lizenzierten Code.
Astro 5 → 6: was sich ändert
Astro 6 ist nicht nur ein Dependency-Bump. Es entfernt mehrere APIs vollständig und ändert die Standardwerte einiger anderer:
Node 18 und 20 werden nicht mehr unterstützt. Vite 7 ist neu (oder optional Vite 8 — beide funktionieren).
Der Import `import { ViewTransitions } from "astro:transitions"` funktioniert nicht mehr. Ersatz: `ClientRouter` (gleiche API, neuer Name).
Die alte Collections-API mit `type: "content"` und `type: "data"` ist weg. Neue Loader-basierte API mit `glob()` und `file()` aus `astro/loaders`.
`z.string().email()` → `z.email()`. Importpfad jetzt aus `astro/zod`. Kein `astro:schema` mehr.
Ersatz: `import.meta.glob()` mit `{ eager: true }` oder Content Collections.
Die alte Tailwind-Integration unterstützt Astro 6 nicht. Ersatz: `@tailwindcss/vite` als Vite-Plugin.
Die Library selbst (src/, integrations/) ist erstaunlich unbeeinflusst von diesen Änderungen — null Astro.glob-Aufrufe, null <ViewTransitions />, null Content Collections im Source. Die ganze Migrationsarbeit liegt in den Templates und Bundles, also den Scaffolds, die Konsumenten in ihre eigenen Projekte kopieren.
Tailwind 4 in Templates: aus Integration wird Vite-Plugin
In v2.x nutzten alle Templates @astrojs/tailwind (die offizielle Astro-Integration). Diese Integration ist seit Tailwind 4 deprecated und unterstützt Astro 6 nicht. Der Wechsel:
import { defineConfig } from 'astro/config';
import tailwind from '@astrojs/tailwind';
export default defineConfig({
integrations: [tailwind()],
}); import { defineConfig } from 'astro/config';
import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
integrations: [],
vite: {
plugins: [tailwindcss()],
},
}); Plus: tailwind.config.js ist tot. Tailwind 4 liest die JS-Config nicht mehr — alle Tokens leben jetzt als CSS Custom Properties in @theme-Blöcken in der global.css. Das ist ein eigenes Migrations-Thema, aber für Library-Konsumenten relevant: wer ein Template kopiert, muss auch sein eigenes Theme-System auf @theme umstellen.
Storybook 8 → 10: Addons absorbiert
Storybook 9 hat die meisten Essential-Addons in den Core absorbiert. Storybook 10 hat die leeren Stub-Pakete entfernt. Was vorher als separate Packages installiert wurde, lebt jetzt als Subpath-Export im storybook-Hauptpaket:
| Storybook 8 | Storybook 10 |
|---|---|
| @storybook/addon-essentials | Im Core absorbiert (storybook/actions, storybook/viewport, storybook/highlight) |
| @storybook/addon-interactions | Im Core absorbiert (storybook/test mit fn()) |
| @storybook/addon-links | Im Core absorbiert |
| @storybook/blocks | @storybook/addon-docs/blocks |
| @storybook/manager-api | storybook/manager-api |
| @storybook/theming/create | storybook/theming/create |
Praktisch hieß das: vier Pakete aus den devDependencies entfernen, ein neues hinzufügen (@storybook/addon-docs für MDX/Meta-Parsing in Welcome-Stories), drei Subpath-Imports in .storybook/manager.ts umschreiben. Die 158 Story-Dateien selbst blieben unverändert — der kanonische Meta/StoryObj-Import aus @storybook/web-components ist auch in v10 noch gültig.
Lizenzwechsel: MIT → Wender Media Source License v1.0
Die spannendste Änderung. v2.x lief unter MIT-Lizenz. v3.0 läuft unter einer neuen, selbstgeschriebenen Lizenz: der Wender Media Source License v1.0 (WMSL v1.0). SPDX-Identifier: LicenseRef-Wender-Media-Source-1.0.
Das ist kein OSI-genehmigter Open-Source-Lizenztext. Es ist eine Source-Available-Lizenz mit Copyleft-Anteilen, inspiriert von der Struktur der Mozilla Public License 2.0:
Kommerzielle Nutzung gratis, lokale Modifikationen, Weitergabe unter derselben Lizenz, Einbindung in kompatible Projekte.
Copyright-Header in modifizierten Dateien beibehalten, LICENSE-Datei in Weitergaben mitschicken, author/contributors in derivativen package.json beibehalten.
README-Badge "Built with @wendermedia/astro-components" oder eine Erwähnung im Credits-Bereich. Keine Pflicht — Adoption über Reibung trumpft Sichtbarkeit.
Sublizenzieren unter permissiverer Lizenz (kein Re-License zu MIT/Apache), Copyright-Header entfernen, Authorship verfälschen, "Wender Media" als Name in derivativen Werken.
Wer MIT-Code braucht, nutzt v2.1.0. Wer auf Astro 6 ist und mit der WMSL leben kann, bekommt v3.0 mit allen neuen Patterns.
Die Asymmetrie zwischen Library- und Site-Migration
Eine Library zu migrieren, die in einer Library-Repo lebt (ein npm-Paket, kein Site-Build), hat eine Eigenheit: das Source-Code-Verzeichnis (src/) ist erstaunlich neutral gegenüber Astro-Major-Bumps. Die ganze Arbeit konzentriert sich in vier disjunkten Bereichen:
LICENSE neu schreiben (354 Zeilen, 14 Sektionen), NOTICE-Datei, package.json (license, version, peerDeps, optionalDeps, engines), README mit Attribution-Sektion, CHANGELOG, MIGRATION-Guide, alle Copyright-Header.
Sieben ViewTransitions → ClientRouter, vier Content-Collections-Schemas auf Content Layer API, fünf astro.configs auf @tailwindcss/vite, alle z.string().method()-Aufrufe auf zod-4-Syntax.
Acht Bundle-astro.configs auf Tailwind 4, vier Content-Collection-Configs verschoben (src/content/config.ts → src/content.config.ts), bundles/blog rss.xml.ts post.slug → post.id, Starlight auf 0.39.1.
.storybook/-Configs auf neue Subpath-Imports, Welcome.mdx auf @storybook/addon-docs/blocks, vier deprecated Addons gedroppt, addon-docs hinzugefügt, vitest-Compat verifiziert.
Die vier Bereiche überlappen sich nicht — LICENSE/package.json/README im Root, templates/, bundles/ und .storybook/ sind dateiscope-disjunkt. Sobald man diese Asymmetrie sieht, schreibt sich die Migrationsstrategie von selbst: jeder Layer kann unabhängig bearbeitet werden, kein Git-Worktree-Tanz nötig, weil nichts kollidiert. Die Barrel-Datei index.ts der Library ist im Grunde neutral — nur der Copyright-Header und der Versionsstring ändern sich.
Konsumenten-Migration: was du tun musst
Wenn du @wendermedia/astro-components in deinem Projekt nutzt und auf v3.0 upgraden willst, gibt es eine vollständige Migrationsanleitung im Repo. Die Kurzfassung:
Upgrade von v2.x auf v3.0 in fünf Schritten
- Node prüfen
node --version sollte 22.12 oder höher sein. Falls nicht: nvm install 22 && nvm use 22.
- Astro 6 installieren
npm install astro@^6 in deinem Projekt. Folge der offiziellen Astro-Migration für deine Templates.
- Library aktualisieren
npm install @wendermedia/astro-components@^3 — die alte v2.1.0 bleibt verfügbar, falls du zurück musst.
- Tailwind 4 einrichten
Falls du die Templates kopierst: @astrojs/tailwind durch @tailwindcss/vite ersetzen, tailwind.config.js durch @theme in CSS.
- Verifizieren
npm run build muss durchlaufen. Bei Problemen: das v2.1.0-Pin (npm install @wendermedia/astro-components@2.1.0) gibt dir die alte MIT-Version zurück.
Was als Nächstes kommt
v3.0 ist der Beginn einer neuen Linie. v3.x wird Astro 6 als Plattform behalten, aber die 158 Komponenten weiter ausbauen. Zwei Dinge sind in der Pipeline:
- React/Vue/Svelte/Solid-Komponenten — die framework-agnostischen Versionen unter
integrations/react/,integrations/vue/etc. werden um etwa 30 Komponenten erweitert. - Experimentelle Komponenten-Generierungs-CLI —
wm-components new <Beschreibung>scaffoldet neue Komponenten aus einer kurzen Beschreibung, passend zum Design-System. Experimentell, kommt mit v3.2.
Das v2.1.0-Pin bleibt als langfristige LTS-Option für Astro 5-Projekte verfügbar — keine Updates, aber auch keine Downloads-Penalty.
Links: