<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Artikel on Liftoff</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/</link><description>Recent content in Artikel on Liftoff</description><generator>Hugo</generator><language>de</language><lastBuildDate>Fri, 10 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hugo-liftoff.kevinhorst.de/de/articles/index.xml" rel="self" type="application/rss+xml"/><item><title>Alle Markdown-Elemente auf einer Seite</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/markdown-reference/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/markdown-reference/</guid><description>&lt;!-- markdownlint-configure-file {
 "MD010": false,
 "MD014": false,
 "MD028": false,
 "MD029": false,
 "MD040": false
} --&gt;
&lt;p&gt;Dieser Artikel darf ruhig überladen wirken, das ist Absicht. Er spielt
jedes Markdown-Element durch, das im Theme gestaltet ist. Damit lassen
sich Typografie, Abstände und der Kontrast im Dark Mode an einer Stelle
prüfen. Was hier schief aussieht, sieht auch in deinen Inhalten schief
aus.&lt;/p&gt;
&lt;p&gt;Jeder Abschnitt zeigt zuerst den Quelltext, darunter das Ergebnis.&lt;/p&gt;</description></item><item><title>Eine Doku-Seite an einem Nachmittag</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/shipping-a-docs-site/</link><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/shipping-a-docs-site/</guid><description>&lt;p&gt;Die meisten Doku-Seiten scheitern an der Struktur, nicht am Text. Der
erste Nachmittag geht für den Generator drauf, der zweite für die
Navigation, und nach dem dritten stehen vier Seiten und die Lust ist
weg. Diese Anleitung springt direkt zu dem Teil, in dem du schreibst.&lt;/p&gt;
&lt;h2 id="als-modul-einbinden-nicht-forken"&gt;Als Modul einbinden, nicht forken&lt;/h2&gt;
&lt;p&gt;Binde Liftoff als Hugo-Modul ein, statt es nach &lt;code&gt;themes/&lt;/code&gt; zu kopieren.
So bleiben Updates möglich, und dein Repository bleibt überschaubar.&lt;/p&gt;</description></item><item><title>Icons ohne Build-Schritt</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/icons-without-a-build-step/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/icons-without-a-build-step/</guid><description>&lt;p&gt;Icon-Fonts liefern jede Glyphe an jeden Besucher aus. Sprite-Sheets
brauchen einen Build-Schritt und eine Namenskonvention, die sich
niemand merkt. Liftoff geht einen dritten Weg: Jedes Icon wird während
des Hugo-Builds von der Iconify-API geladen und als SVG eingebettet.&lt;/p&gt;
&lt;div class="codeblock"&gt;
 &lt;div class="codeblock__head"&gt;
 &lt;span class="codeblock__lang"&gt;go-html-template&lt;/span&gt;
 &lt;button type="button" class="codeblock__copy" data-action="copy-code" aria-label="Kopieren"&gt;Kopieren&lt;/button&gt;
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;partial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;icon.html&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;simple-icons:codeberg&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Jedes Set auf Iconify funktioniert, adressiert als &lt;code&gt;set:name&lt;/code&gt;. Ein
Name ohne Präfix landet bei den Material Design Icons, &lt;code&gt;check&lt;/code&gt; und
&lt;code&gt;mdi:check&lt;/code&gt; sind also dasselbe Icon.&lt;/p&gt;</description></item><item><title>Zweisprachig ab dem ersten Tag</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/multilingual-from-day-one/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/multilingual-from-day-one/</guid><description>&lt;p&gt;Eine zweite Sprache nachzurüsten sieht nach einem Nachmittag aus und
wird ein Wochenende. Jede Inhaltsdatei braucht ein Gegenstück, jeder
Menüeintrag eine Übersetzung, jede Data-Datei eine Variante, und jedes
fest verdrahtete Datumsformat entpuppt sich als englisch.&lt;/p&gt;
&lt;p&gt;Vorab konfiguriert kostet es fast nichts, selbst wenn es bei einer
Sprache bleibt.&lt;/p&gt;
&lt;div class="codeblock"&gt;
 &lt;div class="codeblock__head"&gt;
 &lt;span class="codeblock__lang"&gt;toml&lt;/span&gt;
 &lt;button type="button" class="codeblock__copy" data-action="copy-code" aria-label="Kopieren"&gt;Kopieren&lt;/button&gt;
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;defaultContentLanguage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;de&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;defaultContentLanguageInSubdir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Deutsch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Die Sprache steckt danach im Dateinamen: &lt;code&gt;about.md&lt;/code&gt; und &lt;code&gt;about.en.md&lt;/code&gt;
liegen nebeneinander, Hugo verknüpft sie von selbst.&lt;/p&gt;</description></item><item><title>Ein Performance-Budget, das man einhält</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/a-performance-budget/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/a-performance-budget/</guid><description>&lt;p&gt;Ein Performance-Budget funktioniert nur, wenn es kurz genug ist, um im
Kopf zu bleiben. Für eine Inhaltsseite reichen drei Zahlen.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Budget&lt;/th&gt;
					&lt;th&gt;Zielwert&lt;/th&gt;
					&lt;th&gt;Was es sprengt&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Requests pro Seite&lt;/td&gt;
					&lt;td&gt;unter 10&lt;/td&gt;
					&lt;td&gt;Webfonts, Analytics&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CSS&lt;/td&gt;
					&lt;td&gt;unter 30 kB&lt;/td&gt;
					&lt;td&gt;Utility-Frameworks&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JavaScript&lt;/td&gt;
					&lt;td&gt;unter 10 kB&lt;/td&gt;
					&lt;td&gt;alles mit Build-Schritt&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Liftoff gibt sein JavaScript für drei Dinge aus: den Theme-Umschalter,
die Copy-Buttons an Codeblöcken und den Blueprint-Filter. Alle drei
bleiben ohne Skripte benutzbar, und nur deshalb dürfen sie überhaupt
existieren.&lt;/p&gt;</description></item><item><title>Dark Mode, der das System respektiert</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/dark-mode-defaults/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/dark-mode-defaults/</guid><description>&lt;p&gt;Ein Umschalter, der für alle erst mal dunkel startet, ist eine
Geschmacksfrage im Gewand eines Features. Liftoff liest zuerst
&lt;code&gt;prefers-color-scheme&lt;/code&gt; und schreibt erst dann nach &lt;code&gt;localStorage&lt;/code&gt;, wenn
jemand tatsächlich ein Schema wählt.&lt;/p&gt;
&lt;div class="codeblock"&gt;
 &lt;div class="codeblock__head"&gt;
 &lt;span class="codeblock__lang"&gt;js&lt;/span&gt;
 &lt;button type="button" class="codeblock__copy" data-action="copy-code" aria-label="Kopieren"&gt;Kopieren&lt;/button&gt;
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;liftoff.theme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;matchMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;(prefers-color-scheme: light)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Diese Reihenfolge ist der Punkt. Wer sein System hell eingestellt hat,
bekommt eine helle Seite, ohne dass kurz Dunkel aufblitzt. Wer danach
bewusst auf Dunkel wechselt, behält Dunkel, auch wenn sich das System
später ändert: Eine ausdrückliche Wahl schlägt eine abgeleitete.&lt;/p&gt;</description></item><item><title>Über Design-Tokens</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/design-tokens/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/design-tokens/</guid><description>&lt;p&gt;Liftoff legt seine Palette, sein Spacing und die Typografie als CSS
Custom Properties auf &lt;code&gt;:root&lt;/code&gt; offen. Konsument:innen können das Theme
anpassen, ohne es zu forken.&lt;/p&gt;
&lt;h2 id="override-pattern"&gt;Override-Pattern&lt;/h2&gt;
&lt;p&gt;Lege eine kleine CSS-Datei in &lt;code&gt;assets/css/&lt;/code&gt; deiner Seite ab und binde
sie nach dem Theme-Bundle ein.&lt;/p&gt;
&lt;div class="codeblock"&gt;
 &lt;div class="codeblock__head"&gt;
 &lt;span class="codeblock__lang"&gt;css&lt;/span&gt;
 &lt;button type="button" class="codeblock__copy" data-action="copy-code" aria-label="Kopieren"&gt;Kopieren&lt;/button&gt;
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--color-accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#ff7a59&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--color-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#0d0a0a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Der Light-Mode ist Opt-in über &lt;code&gt;data-theme=&amp;quot;light&amp;quot;&lt;/code&gt; am &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;-Element.
Der eingebaute Toggle merkt sich die Wahl in &lt;code&gt;localStorage&lt;/code&gt;, Fallback
ist &lt;code&gt;prefers-color-scheme&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="warum-nicht-tailwind"&gt;Warum nicht Tailwind&lt;/h2&gt;
&lt;p&gt;Für ein Theme, das als Hugo-Modul ausgeliefert wird, ist eine
Node-Toolchain Reibung. Reines CSS mit Variablen bringt keine
Abhängigkeiten und bleibt lesbar.&lt;/p&gt;</description></item><item><title>Hallo, Liftoff</title><link>https://hugo-liftoff.kevinhorst.de/de/articles/hello-liftoff/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><guid>https://hugo-liftoff.kevinhorst.de/de/articles/hello-liftoff/</guid><description>&lt;p&gt;Ich habe für jede kleine Produktseite immer wieder dasselbe Gerüst
gebaut: einen Hero mit Code-Block, OS-spezifische Installations-Tabs,
ein Feature-Grid, eine Doku-Sektion und einen abschließenden CTA.
Liftoff bündelt diese Bausteine in einem Hugo-Theme mit sinnvollen
Dark-Defaults.&lt;/p&gt;
&lt;h2 id="was-im-ersten-wurf-drin-ist"&gt;Was im ersten Wurf drin ist&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hero-Partial aus dem Front Matter&lt;/li&gt;
&lt;li&gt;OS-Tabs als leichter Shortcode&lt;/li&gt;
&lt;li&gt;Code-Blöcke mit Copy-Button&lt;/li&gt;
&lt;li&gt;Feature-, Integrations-, Pricing-, Testimonial- und CTA-Shortcodes&lt;/li&gt;
&lt;li&gt;Doku-Layout mit Karten-Index, &amp;ldquo;On this page&amp;rdquo;-TOC, Vor/Zurück-Navigation&lt;/li&gt;
&lt;li&gt;Blog- und Showcase-Bereiche&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wohin-es-geht"&gt;Wohin es geht&lt;/h2&gt;
&lt;p&gt;I18n-Strings sind für Deutsch und Englisch dabei. Weitere Sprachen sind
eine &lt;code&gt;i18n/&amp;lt;lang&amp;gt;.yaml&lt;/code&gt;-Datei entfernt.&lt;/p&gt;</description></item></channel></rss>