UI-Komponenten in mehreren Projekten nutzen mit Tailwind
Wenn man kurz nacheinander mehrere Projekte startet, möchte man ungern immer wieder alles von vorne bauen. Vor allem Formularfelder, oder so einen Quatsch.
Ich schrieb mir bei Kioski also schon ein paar Blade-Komponenten und wollte die in Konpasu nun weiterverwenden, doch wie mache ich das am Besten?
Composer
Der erste Schritt war erstmal, die Komponenten in ein eigenes Composer-Package auszulagern. Dazu kopierte ich alles in einen Ordner und legte einen ServiceProvider an, der Laravel mitteilt, wo der Kram nun liegt:
final class PwaBluiServiceProvider extends ServiceProvider
{
public function boot(): void
{
Blade::anonymousComponentPath(__DIR__ . '/../resources/views/components', 'pwablui');
Blade::componentNamespace('PwaBlui\\Views\\Components', 'pwablui');
}
}
Ja, das ganze heißt PwaBlui. Für Philipp Waldhauer Blade UI. Ich muss das ja abgrenzen von meinen Vue-Componenten, die nur PWUI heißen. Ohne a. Was ist eigentlich los.
Jedenfalls kann ich die Komponenten nun benutzen:
<x-pwablui::form.row>
<x-pwablui::form.label for="username">Username</x-pwablui::form.label>
<x-pwablui::form.text name="username" type="text" placeholder=""/>
</x-pwablui::form.row>
Das Composer-Package habe ich mit diesem Trick für die lokale Entwicklung installiert, so wird es direkt lokal per Symlink installiert.
Ich hab noch keine Ahnung, wie das funktioniert, wenn man das jetzt von Github läd, composer install
macht und die Daten nicht lokal liegen hat. Muss ich mal noch ausprobieren.
Tailwind
Nach der kurzen Freude kam direkt die Ernüchterung: Natürlich war im neuen Projekt jetzt auch alles Lila, denn die Komponenten benutzten alle bg-indigo
als Farbe. Doch auch dafür gibt es eine Lösung, danke an den Tailwind-Experten Nils an dieser Stelle, denn über die Theme-API kann man Tailwind überzeugen, sowas ganz schlau zu handeln:
theme: {
extend: {
backgroundColor: ({ theme }) => ({
primary: theme('colors.emerald'),
}),
ringColor: ({ theme }) => ({
primary: theme('colors.emerald'),
}),
textColor: ({ theme }) => ({
primary: theme('colors.emerald'),
}),
borderColor: ({ theme }) => ({
primary: theme('colors.emerald'),
})
},
},
Nun kann ich in den Komponenten einfach bg-primary
benutzen und in den Projekten einfach die entsprechenden Farben in der Konfiguration einstellen. Fast als würde man eine normale CSS-Datei nehmen und dort Variablen überschreiben.
Verrückt!