<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kilian Valkhof</title>
	<atom:link href="https://kilianvalkhof.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://kilianvalkhof.com</link>
	<description>Front-end &#38; user experience developer</description>
	<lastBuildDate>Wed, 25 Mar 2026 09:54:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">3707709</site>	<item>
		<title>Progressive enhancement as a benefit of CSS Nesting</title>
		<link>https://kilianvalkhof.com/2026/css-html/progressive-enhancement-as-a-benefit-of-css-nesting/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Fri, 06 Mar 2026 15:00:01 +0000</pubDate>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[CSS & HTML]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3470</guid>

					<description><![CDATA[<p>Something I knew is that in browser that support CSS nesting you can nest @media queries inside of other CSS declarations. What I only fully grasped a few days ago is how well this works for progressive enhancement. I&#8217;ve happily used (and wrote about) CSS and @media nesting for about six years now. Primarily through [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2026/css-html/progressive-enhancement-as-a-benefit-of-css-nesting/">Progressive enhancement as a benefit of CSS Nesting</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>Something I knew is that in browser that support CSS nesting you can nest <code>@media</code> queries <em>inside</em> of other CSS declarations. What I only fully grasped a few days ago is <em>how well this works</em> for progressive enhancement.<span id="more-3470"></span></p>
<p>I&#8217;ve happily used (and <a href="https://kilianvalkhof.com/2021/css-html/css-nesting-specificity-and-you/">wrote</a> <a href="https://kilianvalkhof.com/2023/css-html/the-gotchas-of-css-nesting/">about</a>) CSS and <code>@media</code> nesting for about six years now. Primarily through PostCSS, where it gets compiled away, and directly for the styling in Polypane where I know the exact browser engine. I have also had to implement my own parser for it in early 2023, when I implemented support for it in <a href="https://polypane.app/blog/polypane-13-css-nesting-extension-support-in-beta-search-by-selector-and-chromium-110/#elements-panel-css-nesting-and-toggling-classes">Polypane&#8217;s Elements panel</a> (one of the first browsers that supported it).</p>
<p>So I&#8217;m far from a stranger to the workings of native CSS Nesting.</p>
<h3 id="progressive-enhancement-in-context">Progressive enhancement in context <a class="deep-link" href="#progressive-enhancement-in-context">#</a></h3>
<p>Progressive enhancement is a way of setting up your code such that you provide a well-supported basis that works across all the browsers you target, and then you <em>add</em> functionality when support is better.</p>
<p>In the context of accessibility, we often say that you should build the accessible variant as the default (for example, no animations) and only when the user indicates they <em>don&#8217;t</em> need the accessible variant (for example, no-preference for reduced motion) then you <strong>add</strong> features on top of that accessible default (by adding animations).</p>
<p>This makes the accessible version the one that gets used when anything goes wrong, and if everything goes right and people want a little extra, they can get that without hampering the experience for others.</p>
<h3 id="the-issues-that-brings">The issues that brings <a class="deep-link" href="#the-issues-that-brings">#</a></h3>
<p>Unfortunately in &#8216;traditional&#8217; CSS this often ends up with having styles of an element living in two different places (one inside and one outside a media query).</p>
<pre><code>.my-element {
  width: min(1000px, -1rem + 100vw);
  max-height: calc(-2rem + 100svh);
  /* ...and a bunch more */
  scale: 0.5;
  opacity: 0;
}

/* potentially lots of other CSS until 
   you get to the "accessibility block" */

@media (prefers-reduced-motion: no-preference) {
  .my-element {
    transition: 0.5s ease-in-out all;
    /* maybe some additional styling to make this work well */
  }
}</code></pre>
<p>That causes quite a few potential complications, especially for the long-term maintenance of code:</p>
<ul>
<li>Accidentally editing the wrong ruleset</li>
<li>Not updating both when needed</li>
<li>Forgetting to remove one of the rulesets when a component gets removed</li>
<li>Selector ordering issues causing the wrong styles to apply</li>
</ul>
<p>Because there is nothing that keeps track of the inherent link between the two rulesets, it&#8217;s one of those &#8220;great in theory, slightly more complicated in practice&#8221; situations.</p>
<h3 id="progressive-enhancement-with-css-nesting">Progressive enhancement with CSS Nesting <a class="deep-link" href="#progressive-enhancement-with-css-nesting">#</a></h3>
<p>A couple of days ago I nested an <code>@media</code> query, something I must&#8217;ve done hundreds of times over the course of all those years. But in this case, here&#8217;s what I did:</p>
<pre><code>.my-element {
  width: min(1000px, -1rem + 100vw);
  max-height: calc(-2rem + 100svh);
  /* ...and a bunch more */
  scale: 0.5;
  opacity: 0;
  
  @media (prefers-reduced-motion: no-preference) {
    transition: 0.5s ease-in-out all;
  }
  
  &:open {
    opacity: 1;
    scale: 1;
  }
}</code></pre>
<p>Nothing out of the ordinary, but when looking at the ruleset I realized that this is now a fully self-contained, progressively enhanced CSS style!</p>
<p>The transition only gets applied for users with no-preference for motion. The logic for the progressive enhancement is co-located with the rest of the styles, and should I ever remove this component, I won&#8217;t need to hunt down a second place where I use the same selector.</p>
<h3 id="obvious">Obvious? <a class="deep-link" href="#obvious">#</a></h3>
<p>After writing it down it seemed really obvious, but that wasn&#8217;t the case for me <em>before</em> I had written it, and neither was it to <a href="https://bsky.app/profile/kilianvalkhof.com/post/3mgajemyv6k2f">folks on Bluesky</a>, who seemed to enjoy my short post on it. So I figured it was worth a quick article on my blog as well.</p>
<p>If it was obvious to you and you had been doing it for a long time: that&#8217;s great! If this made you go &#8220;huh, yeah&#8221; then I hope it makes your progressive enhancements a little bit easier going forward.</p>The post <a href="https://kilianvalkhof.com/2026/css-html/progressive-enhancement-as-a-benefit-of-css-nesting/">Progressive enhancement as a benefit of CSS Nesting</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3470</post-id>	</item>
		<item>
		<title>Programming principles for front-end developers</title>
		<link>https://kilianvalkhof.com/2026/css-html/programming-principles-for-front-end-developers/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Mon, 26 Jan 2026 09:08:56 +0000</pubDate>
				<category><![CDATA[CSS & HTML]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3460</guid>

					<description><![CDATA[<p>Like many front-end developers, I don’t have a formal computer science background. I rolled into this discipline as a designer wanting more control over the end product. Because of that, a lot of computer science things are lost on me. All I know about capital-s Software Development, I learned as I went from various sources. [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2026/css-html/programming-principles-for-front-end-developers/">Programming principles for front-end developers</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>Like many front-end developers, I don’t have a formal computer science background. I rolled into this discipline as a designer wanting more control over the end product. Because of that, a lot of computer science things are lost on me.<span id="more-3460"></span></p>
<p>All I know about capital-s Software Development, I learned as I went from various sources. The result is that I now carry with me a number of maxims, sayings and rules-of-thumb that help me make development choices while I&#8217;m building something. Late last year I finally sat down and wrote about these principles over on <a href="https://piccalil.li">Piccalilli</a>:</p>
<p><b><a href="https://piccalil.li/blog/programming-principles-for-self-taught-front-end-developers/">Programming principles for front-end developers</a></b></p>
<p>The article really  resonated with people. Not only was it the most read article on Piccalilli in 2025 (despite being released at the end of November), I also got numerous messages from people about how this helped them think about their code in new ways. It was difficult to find the right way to articulate my approach in a way that made sense (The article idea was on my backlog for well over a year) and didn&#8217;t just present the end result but instead showed how to think about code in a way that works for you.</p>
<p>I&#8217;m very excited to share that I will be presenting this topic as various conferences throughout the year. The first will be at <a href="https://confoo.ca/en/2026/session/programming-principles-for-front-end-developers">Confoo in Montreal</a>, at the end of February. Later this year I&#8217;ll be presenting it at a conference in Europe too, but that hasn&#8217;t been announced yet.</p>
<p>I&#8217;d love to give this talk at more conferences and meetups. If you checked out the article and think it would be a good fit for your audience, please <a href="/speaking/">reach out</a>!</p>The post <a href="https://kilianvalkhof.com/2026/css-html/programming-principles-for-front-end-developers/">Programming principles for front-end developers</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3460</post-id>	</item>
		<item>
		<title>My pick of the year for the State of CSS Survey</title>
		<link>https://kilianvalkhof.com/2025/css-html/my-pick-of-the-year-for-the-state-of-css-survey/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Wed, 20 Aug 2025 08:01:08 +0000</pubDate>
				<category><![CDATA[CSS & HTML]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3429</guid>

					<description><![CDATA[<p>The State of CSS survey results are always fun to read through, and the &#8216;pick of the year&#8217; by everyone in particular. Whenever Sacha asks me if I have one I blank, and then a few days later there&#8217;s an obvious answer. My 2025 Pick: text-wrap: balance; I canâ€™t remember the last time a new [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2025/css-html/my-pick-of-the-year-for-the-state-of-css-survey/">My pick of the year for the State of CSS Survey</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>The <a href="https://2025.stateofcss.com/en-US">State of CSS survey</a> results are always fun to read through, and the &#8216;pick of the year&#8217; by everyone in particular. Whenever <a href="https://sachagreif.com/">Sacha</a> asks me if I have one I blank, and then a few days later there&#8217;s an obvious answer.<span id="more-3429"></span></p>
<h3>My 2025 Pick: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/text-wrap">text-wrap: balance;</a></h3>
<blockquote><p>
I canâ€™t remember the last time a new CSS property was introduced that I could just add to any stylesheet new and old. Itâ€™s a little magic one liner that makes your titles much nicer with zero downsides. Add it to your css resets!</p>
</blockquote>
<p>There have been many awesome new CSS features in the past 12 months, like view transitions, scroll driven animations, anchor positioning, @starting-style, field-sizing, animating to auto and ::details-content to name just a few.</p>
<p>They&#8217;re great, but most of those aren&#8217;t fully cross-browser yet and they are all fairly specific features around animation or positioning for where there isn&#8217;t really a good fallback in other browsers (you&#8217;d have to feature detect and use a polyfill or equivalent javascript).</p>
<p>However <code>text-wrap: balance</code> (and its buddy <code>text-wrap: pretty</code>) is this delightful single line of CSS that makes your site <em>a tiny bit better</em>, and support is great:</p>
<picture style="display: block"><source type="image/webp" srcset="https://caniuse.bitsofco.de/static/v1/css-text-wrap-balance-1755676359879.webp"><source type="image/png" srcset="https://caniuse.bitsofco.de/static/v1/css-text-wrap-balance-1755676359879.png"><img decoding="async" src="https://caniuse.bitsofco.de/static/v1/css-text-wrap-balance-1755676359879.jpg" alt="Data on support for the css-text-wrap-balance feature across the major browsers from caniuse.com">
        </picture>
<p>Text-wrap: balance will make sure that the words are properly balanced across lines, avoiding the situation where the last line will have one or two words.</p>
<p>No one will notice if it&#8217;s missing, but you can just add it to all your headings in your CSS reset and they will look slightly better:</p>
<pre><code>h1,
h2,
h3,
h4,
h5,
h6 {
  text-wrap: balance
}</code></pre>
<p>Or, in <a href="https://chromestatus.com/feature/5090991750250496">some future version</a> of <a href="https://polypane.app">your browser</a>:</p>
<pre><code>:heading {
  text-wrap: balance
}</code></pre>
<p>Having new CSS that is so widely useful and applicable, that you can add without any negative consequences for non-supporting browsers is pretty rare (and pretty exciting!) and that&#8217;s why it&#8217;s my pick of the year.</p>
<p>Go check out the <a href="https://2025.stateofcss.com/en-US">State of CSS survey</a> to read everyone else&#8217;s picks!</p>
<p>ps. I completely nicked this post idea from Ana, who wrote about her pick: <a href="https://ohhelloana.blog/my-pick-of-the-year-css/">My pick of the year for the State of CSS Survey by Ana Rodrigues</a></p>The post <a href="https://kilianvalkhof.com/2025/css-html/my-pick-of-the-year-for-the-state-of-css-survey/">My pick of the year for the State of CSS Survey</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3429</post-id>	</item>
		<item>
		<title>Show Me The Magic podcast</title>
		<link>https://kilianvalkhof.com/2025/web/show-me-the-magic-podcast/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Wed, 30 Jul 2025 14:00:10 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3426</guid>

					<description><![CDATA[<p>Last night (!) I recorded an episode of the Show me the magic podcast with Frederick Tubiermont. Frederick saw Polypane listed as one of the Paddle Launchpad Finalists (Hooray!) and reached out to ask if I wanted to record an episode with him. Thanks Frederick for having me on, and for the great conversation (on [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2025/web/show-me-the-magic-podcast/">Show Me The Magic podcast</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>Last night (!) I recorded an episode of the Show me the magic podcast with <a href="https://www.linkedin.com/in/fredericktubiermont/">Frederick Tubiermont</a>. Frederick saw Polypane listed as one of the Paddle Launchpad Finalists (Hooray!) and reached out to ask if I wanted to record an episode with him.<span id="more-3426"></span></p>
<p>Thanks Frederick for having me on, and for the great conversation (on and off camera!)</p>
<p><iframe src="https://www.youtube-nocookie.com/embed/BMJlus7YGOE?si=JL0cNtcPcM1T9YKV" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen style="width:100%;aspect-ratio: 560/315"></iframe></p>The post <a href="https://kilianvalkhof.com/2025/web/show-me-the-magic-podcast/">Show Me The Magic podcast</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3426</post-id>	</item>
		<item>
		<title>Software Engineering Daily podcast</title>
		<link>https://kilianvalkhof.com/2025/css-html/software-engineering-daily-podcast/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Wed, 07 May 2025 08:00:11 +0000</pubDate>
				<category><![CDATA[CSS & HTML]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3417</guid>

					<description><![CDATA[<p>Recently, wholesome human from the internet Josh Goldberg interviewed me for the Software Engineering Daily podcast. We talked about Polypane, the web development landscape, and how I got into web development. Listen to the Podcast: Visit Software Engineering Daily for the show notes and transcript. Thanks Joel for asking me to be on the podcast, [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2025/css-html/software-engineering-daily-podcast/">Software Engineering Daily podcast</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>Recently, wholesome human from the internet <a href="https://www.joshuakgoldberg.com/">Josh Goldberg</a> interviewed me for the <a href="https://softwareengineeringdaily.com/2025/05/06/polypane-with-kilian-valkhof/">Software Engineering Daily</a> podcast. We talked about Polypane, the web development landscape, and how I got into web development.<span id="more-3417"></span></p>
<figure><figcaption>Listen to the Podcast:</figcaption><audio style="width:100%" controls src="https://traffic.megaphone.fm/SED4120945539.mp3"></audio><br />
</figure>
<p>Visit <a href="https://softwareengineeringdaily.com/2025/05/06/polypane-with-kilian-valkhof/">Software Engineering Daily</a> for the show notes and transcript.</p>
<p>Thanks Joel for asking me to be on the podcast, and thanks Josh for a wonderful conversation!</p>The post <a href="https://kilianvalkhof.com/2025/css-html/software-engineering-daily-podcast/">Software Engineering Daily podcast</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		<enclosure url="https://traffic.megaphone.fm/SED4120945539.mp3" length="0" type="audio/mpeg" />

		<post-id xmlns="com-wordpress:feed-additions:1">3417</post-id>	</item>
		<item>
		<title>Tag, you&#8217;re it</title>
		<link>https://kilianvalkhof.com/2025/life/tag-youre-it/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Thu, 01 May 2025 10:47:28 +0000</pubDate>
				<category><![CDATA[Life]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3406</guid>

					<description><![CDATA[<p>I got tagged by Hidde to blog some answers to questions about blogging, and since I definitely don&#8217;t use this blog enough, I&#8217;m taking him up on it &#8230;roughly a month later. Why did you start blogging in the first place? # This is what I wrote back in December of 2006 (19 years ðŸ’€) [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2025/life/tag-youre-it/">Tag, you’re it</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>I got tagged by <a href="https://hidde.blog/tagged/">Hidde</a> to blog some answers to questions about blogging, and since I <i>definitely</i> don&#8217;t use this blog enough, I&#8217;m taking him up on it &#8230;roughly a month later. <span id="more-3406"></span></p>
<h3 id="why-did-you-start-blogging-in-the-first-place">Why did you start blogging in the first place? <a class="deep-link" href="#why-did-you-start-blogging-in-the-first-place">#</a></h3>
<p>This is what I wrote back in December of 2006 (19 years ðŸ’€) in the first post:</p>
<blockquote><p>I&#8217;m gonna use this online space to talk about CSS, Design, the web in general, GTD, and maybe some javascript and php once I become a bit more familiar with it (That is, once Iâ€™ve crossed the border between â€œI think this should workâ€ to â€œdamnit, this should work!â€)</p>
</blockquote>
<p>Which.. yeah, tracks pretty well. I particularly like that the &#8220;GTD&#8221; category has existed since 2006 and has <em>zero posts</em>.</p>
<p>I also wrote this:</p>
<blockquote><p> Short story: I make websites, I like to be involved in the online community, and (perhaps unfortunately) I think I could add something to it. </p>
</blockquote>
<p>Which I&#8217;d like to think I also managed decently.</p>
<p>As with most people&#8217;s blogs, mine is also terribly neglected. Reading back on that makes me pretty happy with the past 19 years though.</p>
<h3 id="what-platform-are-you-using-to-manage-your-blog-and-why-did-you-choose-it-have-you-blogged-on-other-platforms-before">What platform are you using to manage your blog and why did you choose it? Have you blogged on other platforms before <a class="deep-link" href="#what-platform-are-you-using-to-manage-your-blog-and-why-did-you-choose-it-have-you-blogged-on-other-platforms-before">#</a></h3>
<p>I used WordPress and have since 2006. It&#8217;s nicely full-featured with RSS and categories and tags and widgets and I don&#8217;t have to think about anything. It has also survived all WordPress updates since I first put it up on WordPress 2.0.</p>
<p>I&#8217;ve played around with a bunch of blogging systems for other projects but I&#8217;m pretty lazy when it comes to platforms so I&#8217;ve never felt a strong need to move away from WordPress.</p>
<p>That said, if I ever, <em>ever</em> get around to doing a proper redesign, I&#8217;d probably move to Astro and have a static site that lets me write markdown directly, doesn&#8217;t use PHP or a database and is generally just easier to fiddle with.</p>
<h3 id="how-do-you-write-your-posts-for-example-in-a-local-editing-tool-or-in-a-panel-dashboard-thataes-part-of-your-blog">How do you write your posts? For example, in a local editing tool, or in a panel/dashboard thatâ€™s part of your blog? <a class="deep-link" href="#how-do-you-write-your-posts-for-example-in-a-local-editing-tool-or-in-a-panel-dashboard-thataes-part-of-your-blog">#</a></h3>
<p>I&#8217;m pretty low tech. I usually write in a plain text editor, either gedit or, if I already have it open, VS code. Most often just directly as HTML(-ish: WordPress makes the paragraphs for me, but headings, links etc I do manually) but sometimes it&#8217;s markdown if I feel like it, and then I compile the HTML from that.</p>
<p>I use the classic editor in WordPress so I just paste it in when I&#8217;m done, and check the preview to make sure everything works well.</p>
<p>This post is a gedit post.</p>
<h3 id="when-do-you-feel-most-inspired-to-write">When do you feel most inspired to write? <a class="deep-link" href="#when-do-you-feel-most-inspired-to-write">#</a></h3>
<p>Usually I find out about some technical thing that I think People Should Know, so I write about it. Nowadays, those kind of posts tend to go on the <a href="https://polypane.app/blog/">Polypane Blog</a> because, well, <em>marketing</em>, but also because it&#8217;s much easier for me to add inline widgets, get code highlighting etc.</p>
<p>This blog nowadays is more about updates on stuff I do elsewhere (like podcasts), which I write about after they happened.</p>
<h3 id="do-you-publish-immediately-after-writing-or-do-you-let-it-simmer-a-bit-as-a-draft">Do you publish immediately after writing, or do you let it simmer a bit as a draft <a class="deep-link" href="#do-you-publish-immediately-after-writing-or-do-you-let-it-simmer-a-bit-as-a-draft">#</a></h3>
<p>Almost always immediately after writing it. Usually I just need to get something out and there&#8217;s no point in refining it unless it&#8217;s a release announcement. If it&#8217;s technical, I just write it up, check it for spelling and grammar mistakes and then ship it.</p>
<h3 id="what-are-you-generally-interested-in-writing-about">What are you generally interested in writing about? <a class="deep-link" href="#what-are-you-generally-interested-in-writing-about">#</a></h3>
<p>Technical stuff I&#8217;m working on right now. That&#8217;s almost always HTML/CSS/JS, with some Electron and A11y thrown in.</p>
<h3 id="whataes-your-favourite-post-on-your-blog">Whatâ€™s your favourite post on your blog? <a class="deep-link" href="#whataes-your-favourite-post-on-your-blog">#</a></h3>
<p>Back in the dayâ„¢ my <a href="https://kilianvalkhof.com/2008/css-html/understanding-css-positioning-part-1/">series on CSS Positioning</a> was one of my first long, extensive explorations of a topic and it ended up being used in university courses, mentioned in books etc. Still proud of that.</p>
<p>More recently (&#8230;by which I mean <em>4 years ago</em>) I wrote an article titled <a href="https://kilianvalkhof.com/2021/css-html/you-want-overflow-auto-not-overflow-scroll/">You want overflow: auto, not overflow: scroll</a>. My idea was to just get to point instantly and then when people want to read more they can, or they can just go &#8220;oh right&#8221; and apply it.</p>
<p>Since then, the &#8220;you want X, not Y&#8221; format keeps popping up, which makes me happy. Like on <a href="https://css-tricks.com/you-want-minmax10px-1fr-not-1fr/">CSS Tricks</a> or <a href="https://www.bram.us/2024/02/14/scroll-driven-animations-you-want-overflow-clip-not-overflow-hidden/">Scroll-Driven Animations: You want overflow: clip, not overflow: hidden</a> by Bramus.</p>
<p>To me it&#8217;s a very pleasing way to write titles, like anti-clickbait.</p>
<h3 id="who-are-you-writing-for">Who are you writing for? <a class="deep-link" href="#who-are-you-writing-for">#</a></h3>
<p>Ideally, &#8220;me&#8221; from a day or so ago when I didn&#8217;t know The Thing. Or me from a day ago that used to know The Thing, but forgot, and now needed a reminder/refresher to know The Thing again.</p>
<p>And then I imagine there&#8217;s many other people like me that also benefit from The Thing.</p>
<h3 id="any-future-plans-for-your-blog-maybe-a-redesign-a-move-to-another-platform-or-adding-a-new-feature">Any future plans for your blog? Maybe a redesign, a move to another platform, or adding a new feature? <a class="deep-link" href="#any-future-plans-for-your-blog-maybe-a-redesign-a-move-to-another-platform-or-adding-a-new-feature">#</a></h3>
<p>The current design is from 2016 and pretty long in the tooth. I&#8217;d like to do a new design with a homepage less focused on just the articles since I do so many other things <em>elsewhere</em> now. And then technically I&#8217;d like to use Astro. But updating this blog is so far down the list of priorities that it&#8217;s even quite far down the &#8220;things I would be doing if I had infinite time&#8221; list.</p>
<h3 id="next">Next! <a class="deep-link" href="#next">#</a></h3>
<p>Should they accept the challenge, I tag <a href="https://nerdy.dev/">Adam</a>, <a href="https://www.stefanjudis.com/blog/">Stefan</a>, <a href="https://www.bram.us">Bramus</a> and <a href="https://www.matuzo.at/blog/">Manuel</a>!</p>The post <a href="https://kilianvalkhof.com/2025/life/tag-youre-it/">Tag, you’re it</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3406</post-id>	</item>
		<item>
		<title>Pixel with purpose podcast</title>
		<link>https://kilianvalkhof.com/2025/web/pixel-with-purpose-podcast/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Fri, 25 Apr 2025 09:09:36 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3403</guid>

					<description><![CDATA[<p>I recorded a podcast with the folks from Nordcraft on their new Pixels with Purpose podcast channel. We chatted about accessibility, education around that and of course about Polypane. Check it out: Or watch the video: Thanks Salma and and Andreas for having me on, I had a lot of fun!</p>
The post <a href="https://kilianvalkhof.com/2025/web/pixel-with-purpose-podcast/">Pixel with purpose podcast</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>I recorded a podcast with the folks from <a href="https://nordcraft.com/">Nordcraft</a> on their new <a href="https://pxwithpurpose.com/">Pixels with Purpose</a> podcast channel. We chatted about accessibility, education around that and of course about Polypane. <span id="more-3403"></span></p>
<p>Check it out:</p>
<p><iframe src="https://widget.spreaker.com/player?show_id=6572858&amp;theme=light&amp;playlist=false&amp;playlist-continuous=false&amp;playlist-loop=false&amp;playlist-autoupdate=true&amp;chapters-image=true&amp;episode_image_position=left&amp;hide-likes=false&amp;hide-comments=false&amp;hide-sharing=false&amp;hide-logo=false&amp;hide-download=true&amp;hide-episode-description=false&amp;hide-playlist-images=false&amp;hide-playlist-descriptions=false" width="100%" height="200px" frameborder="0" class="ftaNwg spreaker-player" id="spreaker-player-879033"></iframe></p>
<p>Or watch the video:</p>
<p><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/o2K79hsx-hE?si=lYvRrI-o-QwEvSte" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>Thanks Salma and and Andreas for having me on, I had a lot of fun!</p>The post <a href="https://kilianvalkhof.com/2025/web/pixel-with-purpose-podcast/">Pixel with purpose podcast</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3403</post-id>	</item>
		<item>
		<title>Advent Calendars</title>
		<link>https://kilianvalkhof.com/2025/css-html/advent-calendars/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Mon, 06 Jan 2025 12:40:28 +0000</pubDate>
				<category><![CDATA[CSS & HTML]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3383</guid>

					<description><![CDATA[<p>Happy new year! In December I was lucky enough to write articles for three different advent calendars: HTMHell, 12 days of web and the Fronteers Advent calendar. Starting off right: Where autofocus shines on HTMHell the autofocus attribute is one of my favorite ways to improve very specific interactions on HTML pages, and in the [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2025/css-html/advent-calendars/">Advent Calendars</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>Happy new year! In December I was lucky enough to write articles for three different advent calendars: HTMHell, 12 days of web and the Fronteers Advent calendar.<span id="more-3383"></span></p>
<h3><a href="https://htmhell.dev/adventcalendar/2024/2/">Starting off right: Where autofocus shines</a> on HTMHell</h3>
<p>the <code>autofocus</code> attribute is one of my favorite ways to improve very specific interactions on HTML pages, and in the article I explain what those are, where to add it and where to definitely <em>not</em> it as well.</p>
<h3><a href="https://12daysofweb.dev/2024/css-box-decoration-break/">CSS box-decoration-break</a> on 12 Days of Web</h3>
<p>box-decoration-break is a CSS property that lets you decide what the decorations of a box should do if that box is broken across multiple lines. If that sentences reads like gibberish to you, check out the article!</p>
<h3><a href="https://www.fronteers.nl/en/blog/2024/12/what-determines-the-accessible-name-of-an-element">What determines the accessible name of an element?</a> on Fronteers</h3>
<p>The accessible name of an element is how the browser passes an element to assistive technologies like screen readers or braille displays, and forms the way someone who cannot (fully) see a site consumes the content.</p>
<p>This article was originally written in Dutch, so if you prefer that you can read it here: <a href="https://www.fronteers.nl/nl/blog/2024/12/wat-bepaalt-de-toegankelijke-naam-van-een-element">Wat bepaalt de toegankelijke naam van een element?</a>.</p>
<p>All the best for 2025!</p>The post <a href="https://kilianvalkhof.com/2025/css-html/advent-calendars/">Advent Calendars</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3383</post-id>	</item>
		<item>
		<title>An outline version of the new CSS logo</title>
		<link>https://kilianvalkhof.com/2024/css-html/an-outline-version-of-the-new-css-logo/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Wed, 20 Nov 2024 15:01:07 +0000</pubDate>
				<category><![CDATA[CSS & HTML]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3350</guid>

					<description><![CDATA[<p>CSS got a new logo! After well over a decade of using the &#8220;CSS3&#8221; badge, there&#8217;s now a new CSS logo that fits nicely next to the JS, TS and friends logo&#8217;s. CSS Logo A purple square with rounded corners and the letters CSS inside in white And here it is among friends: Looks pretty [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2024/css-html/an-outline-version-of-the-new-css-logo/">An outline version of the new CSS logo</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>CSS got a new logo! After well over a decade of using the &#8220;CSS3&#8221; badge, there&#8217;s now a new CSS logo that fits nicely next to the JS, TS and friends logo&#8217;s.<span id="more-3350"></span></p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="250" height="250" style="display:block;margin-inline: auto" viewBox="0 0 1000 1000" role="img" aria-labelledby="css-logo-title css-logo-description">
  <title id="css-logo-title">CSS Logo</title>
  <desc id="css-logo-description">A purple square with rounded corners and the letters CSS inside in white</desc>
  <path fill="#639" d="M0 0H840A160 160 0 0 1 1000 160V840A160 160 0 0 1 840 1000H160A160 160 0 0 1 0 840V0Z"/>
  <path fill="#fff" d="M816.54 919.9c-32.39 0-57.16-9.42-74.5-28.35-17.15-19.03-26.08-46.18-26.88-81.64h69.8c.4 31.36 11.42 47.08 33.08 47.08 11.04 0 18.86-3.5 23.37-10.42 4.41-6.9 6.72-17.93 6.72-33.05 0-12.02-3.01-22.04-8.83-29.95a73.2 73.2 0 0 0-29.48-21.14L783.95 750c-23.06-11.02-39.81-24.04-50.14-39.27-10.03-15.13-15.04-36.36-15.04-63.5 0-30.36 8.83-55 26.37-73.94 18.05-18.93 42.62-28.34 74-28.34 30.3 0 53.76 9.31 70.3 27.84 16.85 18.64 25.67 45.28 26.38 80.14h-67.19c.4-11.4-1.9-22.72-6.72-33.06-3.8-7.6-11.23-11.41-22.26-11.41-19.65 0-29.48 11.71-29.48 35.05 0 11.83 2.4 21.04 7.22 28.05A65.18 65.18 0 0 0 822.76 689l24.77 10.92c25.57 11.72 44.02 26.05 55.35 43.38 11.43 17.23 17.05 40.27 17.05 69.12 0 34.56-9.03 61.1-27.38 79.63-18.25 18.53-43.62 27.85-76 27.85Zm-225.42 0c-32.4 0-57.16-9.42-74.51-28.35-17.15-19.03-26.07-46.18-26.87-81.64h69.79c.4 31.36 11.43 47.08 33.1 47.08 11.02 0 18.84-3.5 23.25-10.42 4.52-6.9 6.72-17.93 6.72-33.05 0-12.02-2.9-22.04-8.72-29.95a73.2 73.2 0 0 0-29.48-21.14L558.53 750c-23.07-11.02-39.81-24.04-50.14-39.27-10.03-15.13-15.04-36.36-15.04-63.5 0-30.36 8.82-55 26.37-73.94 18.05-18.93 42.62-28.34 74-28.34 30.29 0 53.75 9.31 70.2 27.84 17.05 18.64 25.77 45.28 26.47 80.14h-67.18c.4-11.4-1.9-22.72-6.72-33.06-3.81-7.6-11.23-11.41-22.26-11.41-19.66 0-29.49 11.71-29.49 35.05 0 11.83 2.41 21.04 7.22 28.05A65.18 65.18 0 0 0 597.33 689l24.77 10.92c25.57 11.72 44.02 26.05 55.36 43.38 11.33 17.23 17.04 40.27 17.04 69.12 0 34.56-9.12 61.1-27.37 79.63-18.25 18.53-43.62 27.85-76.01 27.85Zm-234.75 0c-31.7 0-56.86-8.62-75.51-25.85-18.65-17.12-27.88-42.87-27.88-76.93V648.83c0-33.85 9.83-59.5 29.48-77.13 19.96-17.43 46.13-26.24 78.52-26.24 31.39 0 56.15 9.01 74.5 26.84 18.56 17.93 27.88 44.58 27.88 80.14v13.32h-73.9v-12.92c0-13.72-3.01-23.84-8.83-30.45a26.46 26.46 0 0 0-21.66-10.32c-12.03 0-20.55 4.1-25.37 12.42a79.04 79.04 0 0 0-6.72 36.66v146.26c0 30.55 10.74 46.08 32.1 46.38 10.02 0 17.54-3.61 22.76-10.82a51.74 51.74 0 0 0 7.72-30.46V801.6h73.9v11.42c0 23.74-4.61 43.57-13.94 59.4a88.8 88.8 0 0 1-38.2 35.66 121.46 121.46 0 0 1-54.85 11.82Z"/>
</svg></p>
<p>And here it is among friends:</p>
<p><img decoding="async" src="https://kilianvalkhof.com/wp-content/uploads/386806341-cc8f4dcc-8999-4599-97ab-b5bb022b1dcc-1024x213.png" alt="CSS, JS, TS, WA and HTML logos" width="100%" /></p>
<p>Looks pretty good right?</p>
<h3 id="outline-version">Outline version <a class="deep-link" href="#outline-version">#</a></h3>
<p>I can&#8217;t wait to see this replace the &#8220;CSS3&#8221; badge across the web and wanted to update the icon for the <a href="https://polypane.app/docs/live-css/">Live CSS panel in Polypane</a> too.</p>
<p>All the icons in Polypane are from the <a href="https://tabler-icons.io/">Tabler icons</a> icon set which are all in &#8220;outline style&#8221; on a 24 by 24px grid, so last Friday I spent a few hours creating a 24 by 24 pixel outline version of the logo, shown here at 24px, 48px, 128px and 256px.</p>
<div style="display:flex;justify-content:center;align-items:center;gap:1rem">
<svg
   width="24"
   height="24"
   viewBox="0 0 24 24"
   fill="none"
   stroke="#000"
   stroke-linecap="round"
   stroke-linejoin="round"
   class="icon icon-tabler icon-tabler-css"
   stroke-width="2"
   xmlns="http://www.w3.org/2000/svg">
  <path stroke-linejoin="miter" d="m 3,3 c 5,0 10,0 16,0 1,0 2,1 2,2 v 14 c 0,1 -1,2 -2,2 H 5 C 4,21 3,20 3,19 3,14 3,8 3,3 Z" />
  <path fill="currentColor" stroke="none" d="M12.63 11.5c-.58 0-1.07.19-1.41.56-.34.36-.5.85-.5 1.42 0 .5.09.91.28 1.22.2.3.52.55.94.75l.46.22c.18.08.34.2.46.34.08.1.12.26.12.44a1.08 1.06 0 0 1-.1.52c-.04.08-.11.12-.27.12-.15 0-.24-.05-.3-.15-.08-.1-.13-.3-.13-.56a.15.15 0 0 0-.15-.13H10.8a.15.15 0 0 0-.15.14c.02.66.18 1.18.51 1.56.34.37.82.55 1.42.55s1.1-.18 1.44-.54c.36-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.39 2.34 0 0 0-1.03-.83l-.44-.2a1 .98 0 0 1-.38-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.05-.05.13-.1.27-.1.15 0 .2.05.25.13.07.17.11.34.1.53 0 .08.07.15.15.15h1.18c.09 0 .15-.07.15-.15a2.37 2.32 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.34-.55zm3.95 0a1.8 1.76 0 0 0-1.4.56c-.34.36-.5.85-.5 1.42 0 .5.08.91.28 1.22.2.3.52.55.94.75l.45.22h.01c.18.08.33.2.45.34.08.1.13.26.13.44 0 .26-.04.43-.1.52-.04.08-.12.12-.28.12-.15 0-.23-.05-.3-.15-.07-.1-.12-.3-.13-.56a.15.15 0 0 0-.15-.13h-1.22a.15.15 0 0 0-.15.14 2.44 2.4 0 0 0 .5 1.56c.34.37.83.55 1.43.55s1.09-.18 1.44-.54c.35-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.38 2.33 0 0 0-1.04-.83l-.43-.2a1 .98 0 0 1-.39-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.06-.05.13-.1.27-.1.16 0 .21.05.25.13a1 .98 0 0 1 .1.53c0 .08.07.15.16.15h1.18c.08 0 .15-.07.15-.15a2.38 2.33 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.35-.55zm-8.04 0c-.6 0-1.1.18-1.47.52-.39.34-.57.85-.57 1.5v3c0 .64.17 1.14.54 1.47.35.34.84.51 1.42.51.36 0 .71-.07 1.03-.23.31-.14.57-.39.74-.68.18-.32.26-.7.26-1.15v-.2a.15.15 0 0 0-.15-.14h-1.3a.15.15 0 0 0-.15.15v.2a.93.91 0 0 1-.1.45c-.07.1-.14.13-.28.13-.15 0-.23-.05-.3-.15-.07-.1-.11-.3-.11-.54v-2.61c-.02-.2.02-.4.1-.6.06-.09.14-.13.31-.13a.3.3 0 0 1 .27.13c.07.08.11.22.11.45v.24c0 .07.07.14.15.14h1.3c.08 0 .15-.07.15-.14v-.25c0-.66-.17-1.18-.53-1.54a1.92 1.88 0 0 0-1.42-.52Z"/>
</svg><br />
<svg
   width="48"
   height="48"
   viewBox="0 0 24 24"
   fill="none"
   stroke="#000"
   stroke-linecap="round"
   stroke-linejoin="round"
   class="icon icon-tabler icon-tabler-css"
   stroke-width="2"
   xmlns="http://www.w3.org/2000/svg">
  <path stroke-linejoin="miter" d="m 3,3 c 5,0 10,0 16,0 1,0 2,1 2,2 v 14 c 0,1 -1,2 -2,2 H 5 C 4,21 3,20 3,19 3,14 3,8 3,3 Z" />
  <path fill="currentColor" stroke="none" d="M12.63 11.5c-.58 0-1.07.19-1.41.56-.34.36-.5.85-.5 1.42 0 .5.09.91.28 1.22.2.3.52.55.94.75l.46.22c.18.08.34.2.46.34.08.1.12.26.12.44a1.08 1.06 0 0 1-.1.52c-.04.08-.11.12-.27.12-.15 0-.24-.05-.3-.15-.08-.1-.13-.3-.13-.56a.15.15 0 0 0-.15-.13H10.8a.15.15 0 0 0-.15.14c.02.66.18 1.18.51 1.56.34.37.82.55 1.42.55s1.1-.18 1.44-.54c.36-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.39 2.34 0 0 0-1.03-.83l-.44-.2a1 .98 0 0 1-.38-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.05-.05.13-.1.27-.1.15 0 .2.05.25.13.07.17.11.34.1.53 0 .08.07.15.15.15h1.18c.09 0 .15-.07.15-.15a2.37 2.32 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.34-.55zm3.95 0a1.8 1.76 0 0 0-1.4.56c-.34.36-.5.85-.5 1.42 0 .5.08.91.28 1.22.2.3.52.55.94.75l.45.22h.01c.18.08.33.2.45.34.08.1.13.26.13.44 0 .26-.04.43-.1.52-.04.08-.12.12-.28.12-.15 0-.23-.05-.3-.15-.07-.1-.12-.3-.13-.56a.15.15 0 0 0-.15-.13h-1.22a.15.15 0 0 0-.15.14 2.44 2.4 0 0 0 .5 1.56c.34.37.83.55 1.43.55s1.09-.18 1.44-.54c.35-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.38 2.33 0 0 0-1.04-.83l-.43-.2a1 .98 0 0 1-.39-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.06-.05.13-.1.27-.1.16 0 .21.05.25.13a1 .98 0 0 1 .1.53c0 .08.07.15.16.15h1.18c.08 0 .15-.07.15-.15a2.38 2.33 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.35-.55zm-8.04 0c-.6 0-1.1.18-1.47.52-.39.34-.57.85-.57 1.5v3c0 .64.17 1.14.54 1.47.35.34.84.51 1.42.51.36 0 .71-.07 1.03-.23.31-.14.57-.39.74-.68.18-.32.26-.7.26-1.15v-.2a.15.15 0 0 0-.15-.14h-1.3a.15.15 0 0 0-.15.15v.2a.93.91 0 0 1-.1.45c-.07.1-.14.13-.28.13-.15 0-.23-.05-.3-.15-.07-.1-.11-.3-.11-.54v-2.61c-.02-.2.02-.4.1-.6.06-.09.14-.13.31-.13a.3.3 0 0 1 .27.13c.07.08.11.22.11.45v.24c0 .07.07.14.15.14h1.3c.08 0 .15-.07.15-.14v-.25c0-.66-.17-1.18-.53-1.54a1.92 1.88 0 0 0-1.42-.52Z"/>
</svg><br />
<svg
   width="128"
   height="128"
   viewBox="0 0 24 24"
   fill="none"
   stroke="#000"
   stroke-linecap="round"
   stroke-linejoin="round"
   class="icon icon-tabler icon-tabler-css"
   stroke-width="2"
   xmlns="http://www.w3.org/2000/svg">
  <path stroke-linejoin="miter" d="m 3,3 c 5,0 10,0 16,0 1,0 2,1 2,2 v 14 c 0,1 -1,2 -2,2 H 5 C 4,21 3,20 3,19 3,14 3,8 3,3 Z" />
  <path fill="currentColor" stroke="none" d="M12.63 11.5c-.58 0-1.07.19-1.41.56-.34.36-.5.85-.5 1.42 0 .5.09.91.28 1.22.2.3.52.55.94.75l.46.22c.18.08.34.2.46.34.08.1.12.26.12.44a1.08 1.06 0 0 1-.1.52c-.04.08-.11.12-.27.12-.15 0-.24-.05-.3-.15-.08-.1-.13-.3-.13-.56a.15.15 0 0 0-.15-.13H10.8a.15.15 0 0 0-.15.14c.02.66.18 1.18.51 1.56.34.37.82.55 1.42.55s1.1-.18 1.44-.54c.36-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.39 2.34 0 0 0-1.03-.83l-.44-.2a1 .98 0 0 1-.38-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.05-.05.13-.1.27-.1.15 0 .2.05.25.13.07.17.11.34.1.53 0 .08.07.15.15.15h1.18c.09 0 .15-.07.15-.15a2.37 2.32 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.34-.55zm3.95 0a1.8 1.76 0 0 0-1.4.56c-.34.36-.5.85-.5 1.42 0 .5.08.91.28 1.22.2.3.52.55.94.75l.45.22h.01c.18.08.33.2.45.34.08.1.13.26.13.44 0 .26-.04.43-.1.52-.04.08-.12.12-.28.12-.15 0-.23-.05-.3-.15-.07-.1-.12-.3-.13-.56a.15.15 0 0 0-.15-.13h-1.22a.15.15 0 0 0-.15.14 2.44 2.4 0 0 0 .5 1.56c.34.37.83.55 1.43.55s1.09-.18 1.44-.54c.35-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.38 2.33 0 0 0-1.04-.83l-.43-.2a1 .98 0 0 1-.39-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.06-.05.13-.1.27-.1.16 0 .21.05.25.13a1 .98 0 0 1 .1.53c0 .08.07.15.16.15h1.18c.08 0 .15-.07.15-.15a2.38 2.33 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.35-.55zm-8.04 0c-.6 0-1.1.18-1.47.52-.39.34-.57.85-.57 1.5v3c0 .64.17 1.14.54 1.47.35.34.84.51 1.42.51.36 0 .71-.07 1.03-.23.31-.14.57-.39.74-.68.18-.32.26-.7.26-1.15v-.2a.15.15 0 0 0-.15-.14h-1.3a.15.15 0 0 0-.15.15v.2a.93.91 0 0 1-.1.45c-.07.1-.14.13-.28.13-.15 0-.23-.05-.3-.15-.07-.1-.11-.3-.11-.54v-2.61c-.02-.2.02-.4.1-.6.06-.09.14-.13.31-.13a.3.3 0 0 1 .27.13c.07.08.11.22.11.45v.24c0 .07.07.14.15.14h1.3c.08 0 .15-.07.15-.14v-.25c0-.66-.17-1.18-.53-1.54a1.92 1.88 0 0 0-1.42-.52Z"/>
</svg><br />
<svg
   width="256"
   height="256"
   viewBox="0 0 24 24"
   fill="none"
   stroke="#000"
   stroke-linecap="round"
   stroke-linejoin="round"
   class="icon icon-tabler icon-tabler-css"
   stroke-width="2"
   xmlns="http://www.w3.org/2000/svg">
  <path stroke-linejoin="miter" d="m 3,3 c 5,0 10,0 16,0 1,0 2,1 2,2 v 14 c 0,1 -1,2 -2,2 H 5 C 4,21 3,20 3,19 3,14 3,8 3,3 Z" />
  <path fill="currentColor" stroke="none" d="M12.63 11.5c-.58 0-1.07.19-1.41.56-.34.36-.5.85-.5 1.42 0 .5.09.91.28 1.22.2.3.52.55.94.75l.46.22c.18.08.34.2.46.34.08.1.12.26.12.44a1.08 1.06 0 0 1-.1.52c-.04.08-.11.12-.27.12-.15 0-.24-.05-.3-.15-.08-.1-.13-.3-.13-.56a.15.15 0 0 0-.15-.13H10.8a.15.15 0 0 0-.15.14c.02.66.18 1.18.51 1.56.34.37.82.55 1.42.55s1.1-.18 1.44-.54c.36-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.39 2.34 0 0 0-1.03-.83l-.44-.2a1 .98 0 0 1-.38-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.05-.05.13-.1.27-.1.15 0 .2.05.25.13.07.17.11.34.1.53 0 .08.07.15.15.15h1.18c.09 0 .15-.07.15-.15a2.37 2.32 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.34-.55zm3.95 0a1.8 1.76 0 0 0-1.4.56c-.34.36-.5.85-.5 1.42 0 .5.08.91.28 1.22.2.3.52.55.94.75l.45.22h.01c.18.08.33.2.45.34.08.1.13.26.13.44 0 .26-.04.43-.1.52-.04.08-.12.12-.28.12-.15 0-.23-.05-.3-.15-.07-.1-.12-.3-.13-.56a.15.15 0 0 0-.15-.13h-1.22a.15.15 0 0 0-.15.14 2.44 2.4 0 0 0 .5 1.56c.34.37.83.55 1.43.55s1.09-.18 1.44-.54c.35-.36.52-.88.52-1.53 0-.53-.1-.98-.32-1.31a2.38 2.33 0 0 0-1.04-.83l-.43-.2a1 .98 0 0 1-.39-.27.76.74 0 0 1-.1-.4c0-.2.04-.32.1-.4.06-.05.13-.1.27-.1.16 0 .21.05.25.13a1 .98 0 0 1 .1.53c0 .08.07.15.16.15h1.18c.08 0 .15-.07.15-.15a2.38 2.33 0 0 0-.5-1.53 1.7 1.67 0 0 0-1.35-.55zm-8.04 0c-.6 0-1.1.18-1.47.52-.39.34-.57.85-.57 1.5v3c0 .64.17 1.14.54 1.47.35.34.84.51 1.42.51.36 0 .71-.07 1.03-.23.31-.14.57-.39.74-.68.18-.32.26-.7.26-1.15v-.2a.15.15 0 0 0-.15-.14h-1.3a.15.15 0 0 0-.15.15v.2a.93.91 0 0 1-.1.45c-.07.1-.14.13-.28.13-.15 0-.23-.05-.3-.15-.07-.1-.11-.3-.11-.54v-2.61c-.02-.2.02-.4.1-.6.06-.09.14-.13.31-.13a.3.3 0 0 1 .27.13c.07.08.11.22.11.45v.24c0 .07.07.14.15.14h1.3c.08 0 .15-.07.15-.14v-.25c0-.66-.17-1.18-.53-1.54a1.92 1.88 0 0 0-1.42-.52Z"/>
</svg>
</div>
<p>The official repo <a href="https://github.com/CSS-Next/logo.css/issues/38">isn&#8217;t accepting variants</a> but I&#8217;ve proposed it for inclusion in Tabler icons here: <a href="https://github.com/tabler/tabler-icons/issues/1266">CSS icon #1266</a> so if you&#8217;d like to see it added make sure to leave a comment or Emoji response there.</p>
<h3 id="grab-it-here">Grab it here <a class="deep-link" href="#grab-it-here">#</a></h3>
<p>While it hopefully will be added to an icon set soon, you can also just grab the icon from this page, for example by <a href="https://polypane.app/blog/polypane-20-1-the-accessibility-tree/#copy-svg-from-context-menu">right-clicking them in Polypane</a> and selecting &#8220;Copy SVG as code&#8221;.</p>
<p><video src="https://polypane.app/static/copysvg-25cb8bf522b36d8c7cdfee10da8650cc.mp4" muted="" controls="" preload="true" loading="lazy" playsinline="" class="imgshadow" style="max-width:100%"></video></p>The post <a href="https://kilianvalkhof.com/2024/css-html/an-outline-version-of-the-new-css-logo/">An outline version of the new CSS logo</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		<enclosure url="https://polypane.app/static/copysvg-25cb8bf522b36d8c7cdfee10da8650cc.mp4" length="1382601" type="video/mp4" />

		<post-id xmlns="com-wordpress:feed-additions:1">3350</post-id>	</item>
		<item>
		<title>How I automate electron-to-chromium updates</title>
		<link>https://kilianvalkhof.com/2024/electron/how-i-automate-electron-to-chromium-updates/</link>
		
		<dc:creator><![CDATA[Kilian Valkhof]]></dc:creator>
		<pubDate>Mon, 26 Aug 2024 12:45:13 +0000</pubDate>
				<category><![CDATA[Electron]]></category>
		<guid isPermaLink="false">https://kilianvalkhof.com/?p=3336</guid>

					<description><![CDATA[<p>For the past 6 or so years I&#8217;ve been maintaining the electron-to-chromium package and I realise I never wrote a blog post about it. Electron-to-chromium is an NPM package that maps Electron versions to Chromium versions so you can input e.g. Electron 32 and get back Chrome 128. This is useful because a lot of [&#8230;]</p>
The post <a href="https://kilianvalkhof.com/2024/electron/how-i-automate-electron-to-chromium-updates/">How I automate electron-to-chromium updates</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></description>
										<content:encoded><![CDATA[<p>For the past 6 or so years I&#8217;ve been maintaining the <code>electron-to-chromium</code> package and I realise I never wrote a blog post about it. Electron-to-chromium is an NPM package that maps Electron versions to Chromium versions so you can input e.g. Electron 32 and get back Chrome 128.<span id="more-3336"></span></p>
<p>This is useful because a lot of tools will happily take &#8220;Chrome >= 128&#8221; as a configuration option for e.g. transpilation and minification, but it&#8217;s pretty annoying to look up the chromium version of your electron release each time.</p>
<p>A lot of tools use <a href="https://github.com/browserslist/browserslist">browserslist</a> for this browser-to-support-table mapping and thanks to electron-to-chromium you can write <code>Electron &gt;= 32</code> and that will be supported in everything Browserslist uses: Babel-preset-env, autoprefixer, stylelint and a bunch more. All in all, `electron-to-chromium is currently downloaded almost 47 million times each week.</p>
<h3 id="the-automation-setup">The automation setup <a class="deep-link" href="#the-automation-setup">#</a></h3>
<p>Because Electron releases relatively frequently, the creator of Browserslist suggested that I automate the entire process to avoid a ton of manual work. I&#8217;m glad he did! For the past 6 years that automation has been smoothly humming along on my <a href="https://m.do.co/c/bb22ea58e765">DigitalOcean</a> server. Here&#8217;s how it works:</p>
<ul>
<li>Every 15 minutes, a cron job kicks in.</li>
<li>It updates the `electron-releases` dependency and runs my <a href="https://github.com/Kilian/electron-to-chromium/blob/master/automated-update.js">automated-update.js</a> script.</li>
<li>That runs the <a href="https://github.com/Kilian/electron-to-chromium/blob/master/build.mjs">build</a> and <a href="https://github.com/Kilian/electron-to-chromium/blob/master/test.js">test</a> scripts.</li>
<li>If those fail I get sent an e-mail with the problem.</li>
<li>Otherwise with a new version of Electron the build step has generated new files and so `git status &#8211;porcelain` returns text.</li>
<li>That means we need to publish a new version, so the script adds the new files, creates a new patch version and pushes the update and the new tagged release to GitHub.</li>
<li>As a last step, it releases the version to NPM and I get a confirmation email.</li>
</ul>
<h4 id="2026-update">2026 update <a class="deep-link" href="#2026-update">#</a></h4>
<p>With NPM no longer allowing automated publishing I have moved the publishing step to GitHub Actions. My server is still responsible for checking for updated and keeping the git repository humming along, but going from git to NPM is handled by GH actions.</p>
<h3 id="benefits">Benefits <a class="deep-link" href="#benefits">#</a></h3>
<p>This automation has made my life so much easier:</p>
<ul>
<li>Updates go live super fast &#8211; usually within minutes of an Electron release.</li>
<li>The package is always current without me having to babysit it.</li>
<li>Automated tests mean fewer chances for bugs to sneak in and there&#8217;s a number of fail saves.</li>
<li>I can focus on other stuff instead of manual updates.</li>
</ul>
<h3 id="other-updates">Other updates <a class="deep-link" href="#other-updates">#</a></h3>
<p>Other than keeping up to date with Electron I haven&#8217;t needed to do a whole lot of maintenance on the package but last month I configured it to no longer include nightly versions in the released package. That brought the package size down from 299kB to 144kB.</p>
<p>With 47 million downloads per week, that&#8217;s almost 7TB of data saved every week!</p>
<h3 id="a-shout-out-to-digitalocean">A shout-out to DigitalOcean <a class="deep-link" href="#a-shout-out-to-digitalocean">#</a></h3>
<p>electron-to-chromium has been sponsored by DigitalOcean&#8217;s open source sponsoring for a couple of years now, which is really great. That gets me very flexible infrastructure with DigitalOcean footing the bill. Thank you DO!</p>
<p>That&#8217;s pretty much it! It&#8217;s not groundbreaking stuff, but it&#8217;s a fun bit of automation that keeps things running smoothly. If you&#8217;re maintaining a package that needs frequent updates, you might want to try something similar!</p>The post <a href="https://kilianvalkhof.com/2024/electron/how-i-automate-electron-to-chromium-updates/">How I automate electron-to-chromium updates</a> first appeared on <a href="https://kilianvalkhof.com">Kilian Valkhof</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3336</post-id>	</item>
	</channel>
</rss>
