<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Design-Notizen on Liftoff</title><link>https://hugo-liftoff.kevinhorst.de/de/categories/design-notizen/</link><description>Recent content in Design-Notizen on Liftoff</description><generator>Hugo</generator><language>de</language><lastBuildDate>Fri, 12 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hugo-liftoff.kevinhorst.de/de/categories/design-notizen/index.xml" rel="self" type="application/rss+xml"/><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>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></channel></rss>