<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Arpit&apos;s Blog</title><description>The online home of Arpit Agrawal, a web designer-developer from India.</description><link>https://arpit.blog/</link><item><link>https://arpit.blog/notes/2026/09/tabindex--1/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/09/tabindex--1/</guid><description>&lt;p&gt;&lt;code&gt;tabindex=&quot;-1&quot;&lt;/code&gt; (or any negative value) makes an element focusable if it isn’t already, and removes it from the tab order. It can still receive focus programmatically or by click, but not via the &lt;kbd&gt;Tab&lt;/kbd&gt; key.&lt;/p&gt;
</description><pubDate>Wed, 02 Sep 2026 10:26:00 GMT</pubDate><category>html</category><category>accessibility</category></item><item><link>https://arpit.blog/notes/2026/09/headings-in-modal-dialogs/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/09/headings-in-modal-dialogs/</guid><description>&lt;p&gt;Today I learned that modal &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;s opened with &lt;code&gt;showModal()&lt;/code&gt; can have their own &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I discovered this while reading &lt;a href=&quot;https://github.com/GoogleChrome/modern-web-guidance/blob/main/skills/modern-web-guidance/guides/html/html.md&quot;&gt;Modern Web Guidance’s HTML guide&lt;/a&gt;. I was skeptical at first because it’s bad practice to have multiple &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;s on a single web page.&lt;/p&gt;
&lt;p&gt;But this exception for modal dialogs made sense when I learned what &lt;code&gt;showModal()&lt;/code&gt; does. It makes the rest of the page &lt;code&gt;inert&lt;/code&gt; and as mentioned on &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/inert&quot;&gt;MDN&lt;/a&gt;, &lt;code&gt;inert&lt;/code&gt; HTML elements and their flat tree descendants &lt;q&gt;are hidden from assistive technologies as they are excluded from the accessibility tree&lt;/q&gt;. So while the modal dialog is open there is no other &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; to compete with.&lt;/p&gt;
&lt;p&gt;I’m not sure if there is consensus on this because I have seen many examples where an &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; was used instead.&lt;/p&gt;
</description><pubDate>Wed, 02 Sep 2026 05:14:00 GMT</pubDate><category>html</category><category>accessibility</category></item><item><title>Modern Web Guidance as a starting point for my own token skills: getting agents to write better CSS | utilitybend</title><link>https://utilitybend.com/blog/modern-web-guidance-antigravity-and-my-own-design-token-skills/</link><guid isPermaLink="true">https://utilitybend.com/blog/modern-web-guidance-antigravity-and-my-own-design-token-skills/</guid><pubDate>Mon, 31 Aug 2026 11:31:00 GMT</pubDate><content:encoded>&lt;p&gt;Excellent article by Brecht De Ruyte on Modern Web Guidance: specifically what it is, how it works and how he pairs it with his own skills.&lt;/p&gt;
</content:encoded><category>ai</category><category>agentic-engineering</category></item><item><link>https://arpit.blog/notes/2026/08/curse-of-indiscipline/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/08/curse-of-indiscipline/</guid><description>&lt;p&gt;&lt;a href=&quot;https://x.com/MohapatraHemant/status/2086255070585495862&quot;&gt;Hemant Mohapatra on X&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The curse of discipline is that every day looks the same. The curse of indiscipline is that every year does.&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Sun, 30 Aug 2026 04:48:00 GMT</pubDate><category>discipline</category></item><item><title>CSS value resolution process</title><link>https://arpit.blog/articles/2026/08/css-value-resolution-process/</link><guid isPermaLink="true">https://arpit.blog/articles/2026/08/css-value-resolution-process/</guid><pubDate>Thu, 27 Aug 2026 09:25:00 GMT</pubDate><content:encoded>&lt;p&gt;Once the browser has parsed a document and built the DOM tree, it has to assign a value to every property for every element in the flat tree &lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;true&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, and in turn for every box those elements generate.&lt;/p&gt;
&lt;p&gt;The final value of a CSS property for a given element is the result of a multi-step calculation:&lt;/p&gt;
&lt;dl class=&quot;flow&quot;&gt;&lt;div&gt;&lt;dt&gt;1. Filtering:&lt;/dt&gt;&lt;dd&gt;Collect all declarations that apply to a given element&lt;/dd&gt;&lt;dd&gt;→ Output: declared values (zero or many per property)&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;2. &lt;a href=&quot;https://cascade.arpit.codes/&quot;&gt;Cascading&lt;/a&gt;:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;For each property, sort by precedence and resolve competing declarations&lt;/p&gt;&lt;/dd&gt;&lt;dd&gt;→ Output: cascaded value (at most one; may be none)&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;3. Defaulting:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Supply a value where the cascade produced none (inheritance or initial
value), and resolve the CSS-wide keywords &lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;true&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; when they are the cascaded
value of a property&lt;/p&gt;&lt;/dd&gt;&lt;dd&gt;→ Output: specified value&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;This results in exactly one specified value for every property (including custom properties) on every element. The remaining stages work out how those styles interact and what actually gets painted.&lt;/p&gt;
&lt;dl class=&quot;flow&quot;&gt;&lt;div&gt;&lt;dt&gt;4. Resolving:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Absolutise the specified values as far as possible &lt;em&gt;without&lt;/em&gt; layout &lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref=&quot;true&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dd&gt;→ Output: computed values (this is what inherits to children)&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;5. Formatting:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Complete the remaining calculations, which require laying out the document&lt;/p&gt;&lt;/dd&gt;&lt;dd&gt;→ Output: used values &lt;sup&gt;&lt;a href=&quot;#user-content-fn-4&quot; id=&quot;user-content-fnref-4&quot; data-footnote-ref=&quot;true&quot; aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;6. Constraining:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Adjust the used values based on what the rendering environment can
actually do&lt;/p&gt;&lt;/dd&gt;&lt;dd&gt;→ Output: actual values&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;section data-footnotes=&quot;true&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;The DOM tree with any shadow trees flattened in &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;&lt;code&gt;initial&lt;/code&gt;, &lt;code&gt;inherit&lt;/code&gt;, &lt;code&gt;unset&lt;/code&gt;,
&lt;code&gt;revert&lt;/code&gt; &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;For e.g. &lt;code&gt;width: auto&lt;/code&gt; computes to &lt;code&gt;auto&lt;/code&gt;, because you can’t resolve it without knowing the ancestors’ layout; the used value is a real length like 100px. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-4&quot;&gt;
&lt;p&gt;Used values only exist for properties that apply to that element or box type. For e.g. &lt;code&gt;flex&lt;/code&gt; has no used value on an element that isn’t a flex item. &lt;a href=&quot;#user-content-fnref-4&quot; data-footnote-backref aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><category>css</category></item><item><title>Pseudo-elements are not valid inside :is(), :where(), and &amp;</title><link>https://arpit.blog/articles/2026/08/pseudo-elements-not-valid-inside-is/</link><guid isPermaLink="true">https://arpit.blog/articles/2026/08/pseudo-elements-not-valid-inside-is/</guid><pubDate>Thu, 20 Aug 2026 13:59:00 GMT</pubDate><content:encoded>&lt;p&gt;A &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Pseudo-elements&quot;&gt;pseudo-element&lt;/a&gt; is not a valid selector inside &lt;code&gt;:is()&lt;/code&gt; or &lt;code&gt;:where()&lt;/code&gt;. As per the &lt;a href=&quot;https://www.w3.org/TR/selectors-4/#:~:text=Pseudo%2Delements%20cannot%20be%20represented%20by%20the%20matches%2Dany%20pseudo%2Dclass%3B%20they%20are%20not%20valid%20within%20:is().&quot;&gt;Selectors Level 4 spec&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pseudo-elements cannot be represented by the matches-any pseudo-class; they are not valid within &lt;code&gt;:is()&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The nesting selector &lt;code&gt;&amp;amp;&lt;/code&gt; behaves the same way. It desugars to the parent rule’s selector list wrapped in &lt;code&gt;:is()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;However, neither of them fails loudly. &lt;code&gt;:is()&lt;/code&gt; and &lt;code&gt;:where()&lt;/code&gt; take a &lt;em&gt;forgiving&lt;/em&gt; selector list, so an invalid argument is dropped and the rest of the rule carries on. Similarly, nesting inside a pseudo-element rule parses fine. The nested style rule just never matches anything, unless the parent list also contains non-pseudo-element selectors.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* exmaple 1 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.card::before&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	content&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	.&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;dark&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; &amp;amp; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* `&amp;amp;` can&amp;#39;t represent `.card::before`, so this matches nothing */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Either hoist the element out to the top level.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* exmaple 2 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.card::before&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	content&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.dark&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; .card::before&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or restructure so &lt;code&gt;&amp;amp;&lt;/code&gt; refers to the element and the pseudo-element is nested in it.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* exmaple 3 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.card&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;:before {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		content: &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;	.dark&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;::before&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A pseudo-element in the parent selector list doesn’t poison the whole list. &lt;code&gt;&amp;amp;&lt;/code&gt; drops just that entry and still represents the rest.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* exmaple 4 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.card&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.card::before&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; black&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	.&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;dark&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; &amp;amp; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* matches `.card`, but not `.card::before` */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The nested rule desugars to &lt;code&gt;.dark :is(.card, .card::before)&lt;/code&gt;, and the forgiving list throws out the pseudo-element, leaving &lt;code&gt;.dark :is(.card)&lt;/code&gt;. So the element turns red while its &lt;code&gt;::before&lt;/code&gt; stays black.&lt;/p&gt;
&lt;p&gt;From Chrome 130 / Safari 18.2 / Firefox 132 and onwards, bare declarations nested inside an at-rule are the exception. They do apply to the pseudo-element.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* exmaple 5 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.card::before&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	content&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; black&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	@&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;media&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; dark&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; white&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* applies to `.card::before` */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wrap those same declarations in &lt;code&gt;&amp;amp; { ... }&lt;/code&gt; and they stop applying.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* exmaple 6 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.card::before&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	content&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; black&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	@&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;media&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; dark&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;		&amp;amp; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;			color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; white&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* matches nothing */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So why does example 6 not work?&lt;/p&gt;
&lt;p&gt;The reason is that declarations can’t sit loose inside a nested at-rule as far as the CSSOM is concerned. A &lt;code&gt;CSSMediaRule&lt;/code&gt; exposes rules, and declarations only live on a style rule, so the parser has to wrap them in &lt;em&gt;something&lt;/em&gt;. Examples 5 and 6 differ in what that something is.&lt;/p&gt;
&lt;p&gt;Example 5 wraps them in a &lt;a href=&quot;https://drafts.csswg.org/css-nesting-1/#nested-declarations-rule&quot;&gt;nested declarations rule&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It matches the exact same elements and pseudo-elements as its parent style rule, with the same specificity behavior.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Whereas example 6 wraps them in &lt;code&gt;&amp;amp; { ... }&lt;/code&gt; and &lt;code&gt;&amp;amp;&lt;/code&gt; obeys selector rules: it desugars to &lt;code&gt;:is(.card::before)&lt;/code&gt;, which can’t represent the pseudo-element, so nothing matches.&lt;/p&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/css-nesting-cssnesteddeclarations&quot;&gt;CSS nesting improves with CSSNestedDeclarations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues/7433&quot;&gt;[css-nesting] How to resolve nested CSS with pseudo elements in the parent
#7433&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>pseudo-element</category><category>nesting</category><category>css</category></item><item><title>Make It Work vs. Make It Good - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2026/make-it-work-make-it-good/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2026/make-it-work-make-it-good/</guid><pubDate>Wed, 19 Aug 2026 17:16:00 GMT</pubDate><content:encoded>&lt;p&gt;I love how Jim Nielsen articulates the difference between making it work and making it good. “Does it work?” is exactly the kind of signal an LLM can be trained against: the tests pass or they don’t. There’s no equivalent for “Is it good?”, is there?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Make it work” is the first 90% of the work. “Make it good” is the other 90%.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>jim-nielsen</category></item><item><title>How To Use an Emoji as a Favicon Easily | CSS-Tricks</title><link>https://css-tricks.com/emoji-as-a-favicon/</link><guid isPermaLink="true">https://css-tricks.com/emoji-as-a-favicon/</guid><pubDate>Tue, 18 Aug 2026 04:41:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s the one-liner Chris Coyier uses:&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;link&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;	rel&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;	href&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;data:image/svg+xml,&amp;lt;svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22&amp;gt;&amp;lt;text y=%22.9em%22 font-size=%2290%22&amp;gt;🎯&amp;lt;/text&amp;gt;&amp;lt;/svg&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>favicon</category><category>svg</category><category>html</category></item><item><title>Accidental anonymity - macwright.com</title><link>https://macwright.com/2026/06/24/accidental-anonymity</link><guid isPermaLink="true">https://macwright.com/2026/06/24/accidental-anonymity</guid><pubDate>Sat, 15 Aug 2026 15:01:00 GMT</pubDate><content:encoded>&lt;p&gt;Tom MacWright on putting yourself out there and the fear of being found out for being imperfect:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;putting your art, writing, expression out to be judged by others is an act of bravery as much as talent, and a lot of people lack bravery. Sorry to say it but if you need your work to be polished and beyond reproach, that’s a determination and character problem, not a skill problem.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>career</category><category>ai</category></item><item><link>https://arpit.blog/notes/2026/08/contextualism-talk/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/08/contextualism-talk/</guid><description>&lt;p&gt;Just watched &lt;a href=&quot;https://conffab.com/presentation/contextualism/?gl=IKgpmf0z8RLu&quot;&gt;Adam Argyle’s CSS Day talk on Contextualism&lt;/a&gt;. Excellent as usual.&lt;/p&gt;
&lt;p&gt;Adam shared a mega list of things a component could and should respond to. He was so mad that most of our components (including his own) do almost none of it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://css-day-2026.netlify.app/&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Thu, 13 Aug 2026 11:53:00 GMT</pubDate><category>css</category><category>conference</category></item><item><link>https://arpit.blog/notes/2026/08/specs-assitive-tech/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/08/specs-assitive-tech/</guid><description>&lt;p&gt;Today I learned, through &lt;a href=&quot;https://practical-accessibility.today/&quot;&gt;Sara Soueidan’s course, Practical Accessibility&lt;/a&gt;, that spectacles/eyeglasses are a form of assistive technology.&lt;/p&gt;
&lt;p&gt;I’ve worn glasses for most of my life, but I’ve never really thought of myself as someone who uses assistive technology.&lt;/p&gt;
&lt;p&gt;It made me realize how easily we can think of assistive technology as something that exists for “people with disabilities,” rather than something many of us may rely on ourselves.&lt;/p&gt;
</description><pubDate>Mon, 10 Aug 2026 06:53:00 GMT</pubDate><category>accessibility</category></item><item><title>Don&apos;t be a meat proxy</title><link>https://gruhn.me/blog/2026-08-03/</link><guid isPermaLink="true">https://gruhn.me/blog/2026-08-03/</guid><pubDate>Tue, 04 Aug 2026 06:02:00 GMT</pubDate><content:encoded>&lt;p&gt;Niklas Gruhn, on relaying AI output verbatim:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By all means, prompt AI. But don’t just relay the output. Read it, understand it, validate it, and then write a response in your own words (a decent certificate that you’ve done the prior steps). Making that effort is value you can add.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This reminds me of &lt;a href=&quot;https://simonwillison.net/2023/Aug/27/wordcamp-llms/#:~:text=One%20of%20my%20rules%20is%20that%20I%20will%20not%20publish%20anything%20that%20takes%20someone%20else%20longer%20to%20read%20than%20it%20took%20me%20to%20write.&quot;&gt;Simon Willison’s rule&lt;/a&gt;, &lt;q&gt;I will not publish anything that takes someone else longer to read than it took me to write.&lt;/q&gt;&lt;/p&gt;
&lt;p&gt;Among friends I’ll sometimes skip the rewrite and share a link with the prompt in it instead. As &lt;a href=&quot;https://daverupert.com/2026/04/claude-no/&quot;&gt;Dave Rupert&lt;/a&gt; mentioned, he wants the prompt because it shows the context you gave the machine and your understanding of the problem: &lt;q&gt;I’d rather have the original prompt so I can just ask the machine myself.&lt;/q&gt; It’s the least bad way to relay, not an alternative to doing the work.&lt;/p&gt;
</content:encoded><category>ai</category><category>llm</category><category>simon-willison</category><category>dave-rupert</category></item><item><title>Should You Use AI for a Task? Here’s a Simple Way to Decide - Schneier on Security</title><link>https://www.schneier.com/blog/archives/2026/07/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide.html</link><guid isPermaLink="true">https://www.schneier.com/blog/archives/2026/07/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide.html</guid><pubDate>Fri, 31 Jul 2026 10:10:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;At work, if your job is to move a bunch of heavy things from one side of the room to another, you should use whatever assistive tech you have on hand: a wagon, a forklift… even an AI-powered robot. But at the gym, it makes no sense for that robot to lift weights for you. The point of weightlifting isn’t to move heavy things across the room; it’s to actually lift those heavy things.&lt;/p&gt;
&lt;p&gt;The same analysis holds for any task an AI can do for you. If it’s work—if the task has to be done and no one cares how—then it’s fine to use AI assistance. But if the task is more like the gym, and howthe task is done is at least as important, then it probably doesn’t make sense to use AI.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>ai</category><category>llm</category></item><item><title>&lt;/&gt; htmx ~ Vendoring</title><link>https://arpit.blog/2026-07-17T10:33+0530/</link><guid isPermaLink="true">https://arpit.blog/2026-07-17T10:33+0530/</guid><pubDate>Fri, 17 Jul 2026 05:03:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I learned, that copying and pasting other people’s code in your project is called vendoring. Carson Gross goes on to explain how vendoring can get pretty difficult to deal with and how that is actually its strength:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because dealing with large numbers of dependencies is difficult, vendoring encourages a culture of independence.&lt;/p&gt;
&lt;p&gt;You get more of what you make easy, and if you make dependencies easy, you get more of them.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>dependencies</category><category>npm</category><category>javascript</category><category>vendoring</category></item><item><link>https://arpit.blog/notes/2026/07/poetic-css/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/07/poetic-css/</guid><description>&lt;p&gt;I’ve put hours into learning CSS over the years and continue to do so happily. Building things with HTML and CSS is the part of the work I enjoy the most.&lt;/p&gt;
&lt;p&gt;But it always felt like there were gaps in my knowledge. So I just enrolled in &lt;a href=&quot;https://courses.oddbird.net/poetic-css/&quot;&gt;Poetic CSS&lt;/a&gt; to finally understand it from the inside out.&lt;/p&gt;
</description><pubDate>Wed, 08 Jul 2026 22:16:00 GMT</pubDate><category>css</category><category>course</category></item><item><title>Our CSS isn&apos;t opinionated enough - craigabbott.co.uk</title><link>https://www.craigabbott.co.uk/blog/2026/our-css-isnt-opinionated-enough/</link><guid isPermaLink="true">https://www.craigabbott.co.uk/blog/2026/our-css-isnt-opinionated-enough/</guid><pubDate>Mon, 06 Jul 2026 05:14:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;I think the way we currently write CSS subtly shapes the way we think about components. By having the visual styles completely decoupled from the semantic meaning, accessibility is easy to forget, because we can’t physically see missing attributes. When the styling hook is anchored to semantics, you can’t get the visual styles without also getting the parts that make it accessible.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>css</category><category>accessibility</category><category>semantics</category></item><item><title>If You are Asking for Human Attention, Demonstrate Human Effort | Tom Bedor&apos;s Blog</title><link>https://tombedor.dev/human-attention-and-human-effort/</link><guid isPermaLink="true">https://tombedor.dev/human-attention-and-human-effort/</guid><pubDate>Thu, 18 Jun 2026 08:10:00 GMT</pubDate><content:encoded>&lt;p&gt;Tom Bedor, on forwarding AI output to a colleague:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are requesting human attention, demonstrate human effort.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This reminded me of a line from &lt;a href=&quot;https://dontasktoask.com/&quot;&gt;Don’t ask to ask&lt;/a&gt;, &lt;q&gt;if you’re not willing to do the work to solve your problem, why should we?&lt;/q&gt;&lt;/p&gt;
</content:encoded><category>etiquette</category></item><item><link>https://arpit.blog/notes/2026/05/text-decorations-propagate-to-descendants/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/05/text-decorations-propagate-to-descendants/</guid><description>&lt;p&gt;Today I learned via &lt;a href=&quot;https://mastodon.social/@pawelgrzybek/116623309838307564&quot;&gt;Paweł Grzybek’s post on Mastodon&lt;/a&gt;, where &lt;a href=&quot;https://front-end.social/@css/116623467529621115&quot;&gt;Temani Afif pointed out&lt;/a&gt; that text decorations propagate to their descendants, they aren’t inherited.&lt;/p&gt;
&lt;p&gt;The difference between propagation and inheritance is that the descendants don’t get their own &lt;code&gt;text-decoration&lt;/code&gt; property. So, the line, color, style and thickness are all determined by the ancestor where &lt;code&gt;text-decoration&lt;/code&gt; was declared.&lt;/p&gt;
&lt;p&gt;A descendant can still declare its own &lt;code&gt;text-decoration&lt;/code&gt;, but that creates an additional decoration on top, it doesn’t modify or remove the ancestor’s.&lt;/p&gt;
</description><pubDate>Mon, 25 May 2026 03:17:00 GMT</pubDate><category>css</category><category>text-decoration</category></item><item><link>https://arpit.blog/notes/2026/05/tabindex-skip-link-targets/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/05/tabindex-skip-link-targets/</guid><description>&lt;p&gt;Today I learned, adding &lt;code&gt;tabindex=&quot;-1&quot;&lt;/code&gt; to skip link targets is likely no longer necessary in modern browsers.&lt;/p&gt;
&lt;p&gt;Manuel Matuzović &lt;a href=&quot;https://www.matuzo.at/blog/2026/skip-links-tabindex&quot;&gt;tested skip links without &lt;code&gt;tabindex=&quot;-1&quot;&lt;/code&gt; on targets&lt;/a&gt; across major browsers and screen readers on macOS, Windows and Android, concluding it is safe to remove in most setups, thanks to &lt;a href=&quot;https://html.spec.whatwg.org/multipage/interaction.html#sequential-focus-navigation&quot;&gt;sequential focus navigation starting point&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Furthermore, adding &lt;code&gt;tabindex=&quot;-1&quot;&lt;/code&gt; to skip link targets also introduces a regression in usability. With &lt;code&gt;tabindex=&quot;-1&quot;&lt;/code&gt; on &lt;code&gt;main&lt;/code&gt;, clicking on any non-interactive area inside &lt;code&gt;main&lt;/code&gt; makes &lt;code&gt;main&lt;/code&gt; itself the focus starting point. So, the next tab press sends focus to the first focusable element in &lt;code&gt;main&lt;/code&gt;, not the next one after where the user clicked. The gov.uk team &lt;a href=&quot;https://github.com/alphagov/govuk_elements/pull/534&quot;&gt;removed &lt;code&gt;tabindex&lt;/code&gt; from &lt;code&gt;main&lt;/code&gt;&lt;/a&gt; for this reason.&lt;/p&gt;
</description><pubDate>Thu, 21 May 2026 09:31:00 GMT</pubDate><category>html</category><category>accessibility</category><category>usability</category></item><item><title>Reminder: You Can Stitch Together Lots of Little HTML Pages With Navigations For Interactions - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2026/small-html-pages/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2026/small-html-pages/</guid><pubDate>Mon, 18 May 2026 05:30:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Turns out, if you have a website and you think of the browser as a way to navigate documents — rather than a runtime to execute arbitrary code and fetch, compile, and present them — things can be a lot simpler than our tools often prime us to make them.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>html</category><category>navigation</category></item><item><title>Nobody Gets Promoted for Simplicity – Terrible Software</title><link>https://terriblesoftware.org/2026/03/03/nobody-gets-promoted-for-simplicity/</link><guid isPermaLink="true">https://terriblesoftware.org/2026/03/03/nobody-gets-promoted-for-simplicity/</guid><pubDate>Mon, 18 May 2026 04:45:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;You can’t write a compelling narrative about the thing you &lt;em&gt;didn’t&lt;/em&gt; build. &lt;strong&gt;Nobody gets promoted for the complexity they avoided&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Complexity looks smart. Not because it is, but because our systems are set up to reward it.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>software-engineering</category><category>career</category></item><item><link>https://arpit.blog/notes/2026/05/parity-in-maths/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/05/parity-in-maths/</guid><description>&lt;p&gt;Today, while working through an exercise in &lt;a href=&quot;https://eloquentjavascript.net/&quot;&gt;Eloquent JavaScript&lt;/a&gt;, I learned about the concept of parity in maths.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The parity of an integer is its attribute of being even or odd. Thus, it can be said that 6 and 14 have the same parity (since both are even), whereas 7 and 12 have opposite parity (since 7 is odd and 12 is even).&lt;/p&gt;
&lt;p&gt;– Weisstein, Eric W, &lt;a href=&quot;https://mathworld.wolfram.com/Parity.html&quot;&gt;Parity&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Initially, I had assumed “same parity” meant “same value”, which is roughly what it means in English. However, in maths it’s narrower. It just means both numbers are even or both are odd.&lt;/p&gt;
</description><pubDate>Wed, 13 May 2026 12:06:00 GMT</pubDate><category>maths</category></item><item><title>James Shore: You Need AI That Reduces Maintenance Costs</title><link>https://www.jamesshore.com/v2/blog/2026/you-need-ai-that-reduces-your-maintenance-costs</link><guid isPermaLink="true">https://www.jamesshore.com/v2/blog/2026/you-need-ai-that-reduces-your-maintenance-costs</guid><pubDate>Tue, 12 May 2026 04:50:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Your AI coding agent, the one you use to write code, needs to reduce your maintenance costs. Not by a little bit, either. You write code twice as quick now? Better hope you’ve halved your maintenance costs. Three times as productive? One third the maintenance costs. Otherwise, you’re screwed. You’re trading a temporary speed boost for permanent indenture.&lt;/p&gt;
&lt;p&gt;[…] The math only works if the LLM &lt;em&gt;decreases&lt;/em&gt; your maintenance costs, and by exactly the inverse of the rate it adds code. If you double your output and your cost of maintaining that output, two times two means you’ve quadrupled your maintenance costs. If you double your output and hold your maintenance costs steady, two times one means you’ve &lt;em&gt;still&lt;/em&gt; doubled your maintenance costs.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>ai</category><category>agentic-engineering</category><category>maintenance</category></item><item><title>Getting Developers to Care about Accessibility: Carrots and Sticks - Sheri Byrne-Haber&apos;s Blog</title><link>https://www.sheribyrnehaber.com/getting-developers-to-care-about-accessibility-carrots-and-sticks/</link><guid isPermaLink="true">https://www.sheribyrnehaber.com/getting-developers-to-care-about-accessibility-carrots-and-sticks/</guid><pubDate>Wed, 06 May 2026 04:08:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;A developer who builds accessible interfaces is more skilled. Say this out loud. Repeat it often. A developer who creates accessible interfaces isn’t doing extra work; they’re doing the work the right way.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>accessibility</category></item><item><title>Do I belong in tech anymore? · Ky Decker</title><link>https://ky.fyi/posts/ai-burnout</link><guid isPermaLink="true">https://ky.fyi/posts/ai-burnout</guid><pubDate>Mon, 27 Apr 2026 04:31:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;No matter how rapidly technology changes, I am coalescing around some core beliefs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Things that are worth doing are worth doing well.&lt;/li&gt;
&lt;li&gt;Things that are done well require time and effort.&lt;/li&gt;
&lt;li&gt;You make meaning through the doing.&lt;/li&gt;
&lt;li&gt;Ideas are common; effort is not.&lt;/li&gt;
&lt;li&gt;There are no shortcuts.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
</content:encoded><category>ai</category><category>burnout</category></item><item><link>https://arpit.blog/notes/2026/04/inverted-themes-with-light-dark/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/04/inverted-themes-with-light-dark/</guid><description>&lt;p&gt;I just read Dave Rupert’s post on &lt;a href=&quot;https://daverupert.com/2026/04/inverted-light-dark/&quot;&gt;Inverted themes with &lt;code&gt;light-dark()&lt;/code&gt;&lt;/a&gt;. It’s great.&lt;/p&gt;
&lt;p&gt;I wish &lt;code&gt;light-dark()&lt;/code&gt; accepted any value and not just colors. I have a use case where I use lighter font weights in dark mode.&lt;/p&gt;
&lt;p&gt;Bramus wrote about a &lt;a href=&quot;https://www.bram.us/2025/09/30/css-custom-light-dark/&quot;&gt;custom &lt;code&gt;--light-dark()&lt;/code&gt; function&lt;/a&gt; using &lt;code&gt;@function&lt;/code&gt;, &lt;code&gt;if()&lt;/code&gt; and &lt;code&gt;color-scheme()&lt;/code&gt; that would solve this in the future.&lt;/p&gt;
</description><pubDate>Fri, 17 Apr 2026 22:48:00 GMT</pubDate><category>css</category><category>dave-rupert</category></item><item><link>https://arpit.blog/notes/2026/04/whiskey-web-and-whatnot-ai-anxiety/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/04/whiskey-web-and-whatnot-ai-anxiety/</guid><description>&lt;p&gt;Just watched the &lt;a href=&quot;https://www.youtube.com/watch?v=64PypG4gh6U&quot;&gt;latest Whiskey Web and Whatnot episode&lt;/a&gt; with Chris Coyier and Dave Rupert. No one would’ve guessed that I was watching a web dev podcast from how much I was laughing.&lt;/p&gt;
&lt;p&gt;At one point in the episode Adam mentions, “holy crap, my job is now leftover tokens in a burn window”. If Adam can feel like AI is making his work redundant then what hope do I have? 🙈&lt;/p&gt;
</description><pubDate>Thu, 09 Apr 2026 19:48:00 GMT</pubDate><category>ai</category><category>llm</category></item><item><title>What Is CSS Containment and How Can I Use It? – CSS Wizardry</title><link>https://csswizardry.com/2026/04/what-is-css-containment-and-how-can-i-use-it/</link><guid isPermaLink="true">https://csswizardry.com/2026/04/what-is-css-containment-and-how-can-i-use-it/</guid><pubDate>Mon, 06 Apr 2026 07:39:00 GMT</pubDate><content:encoded>&lt;p&gt;Harry Roberts on what CSS containment actually is, what each &lt;code&gt;contain&lt;/code&gt; value does, and how to use it confidently on real projects without creating hard-to-debug side effects.&lt;/p&gt;
</content:encoded><category>css</category><category>containment</category><category>harry-roberts</category></item><item><link>https://arpit.blog/notes/2026/04/css-cascade-site-update/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/04/css-cascade-site-update/</guid><description>&lt;p&gt;Last week, I built a &lt;a href=&quot;https://cascade.arpit.codes/&quot;&gt;visual explainer of the CSS Cascade&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I used anchor positioning with chained anchors to stack the cascade steps. It worked, but Safari 26.4 and earlier had a bug with chained anchors, so I had to exclude Safari entirely via an &lt;code&gt;@supports&lt;/code&gt; hack.&lt;/p&gt;
&lt;p&gt;I wasn’t entirely happy with that, so I refactored the layout to use a subgrid based approach with &lt;code&gt;grid-template-areas&lt;/code&gt;. Since &lt;a href=&quot;https://web-platform-dx.github.io/web-features-explorer/features/subgrid/&quot;&gt;subgrid became Baseline Widely Available&lt;/a&gt; recently, the timing also worked out.&lt;/p&gt;
&lt;p&gt;While I was at it, I also restructured the HTML such that each cascade step is now a list item inside an ordered list, which gives better semantics.&lt;/p&gt;
</description><pubDate>Sat, 04 Apr 2026 10:24:00 GMT</pubDate><category>css</category><category>grid</category></item><item><link>https://arpit.blog/notes/2026/03/cascade/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/03/cascade/</guid><description>&lt;p&gt;I built a &lt;a href=&quot;https://cascade.arpit.codes/&quot;&gt;visual explainer of the CSS Cascade&lt;/a&gt;, the algorithm that determines the “winning value” from a list of competing declarations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cascade.arpit.codes/&quot;&gt;&lt;img alt=&quot;CSS cascade - visual explainer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1260&quot; src=&quot;https://arpit.blog/_astro/cascade.Dw3UF1xW_2biUD3.webp&quot; srcset=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After Web Day Out 2026, I was checking out &lt;a href=&quot;https://fokus.dev/tools/uaplus/&quot;&gt;Manuel Matuzović’s UA+ stylesheet&lt;/a&gt;. Manuel mentioned that he wraps all rules in an anonymous layer to avoid specificity issues. I realised I didn’t actually understand how anonymous layers worked, so I went back and re-read &lt;a href=&quot;https://css-tricks.com/css-cascade-layers/&quot;&gt;Miriam Suzanne’s cascade layers guide on CSS-Tricks&lt;/a&gt;. I really liked the way Miriam presented the cascade and specifically the order of precedence within each step.&lt;/p&gt;
&lt;p&gt;Recently, while learning &lt;code&gt;@scope&lt;/code&gt;, I had come across a diagram of the cascade in &lt;a href=&quot;https://www.bram.us/2023/08/22/a-quick-introduction-to-css-scope/&quot;&gt;Bramus’ article on &lt;code&gt;@scope&lt;/code&gt;&lt;/a&gt;. I had seen it before in his &lt;a href=&quot;https://www.youtube.com/watch?v=zEPXyqj7pEA&quot;&gt;CSS Day 2022 talk&lt;/a&gt; as well but this time it stuck with me. The layout just made the cascade click visually.&lt;/p&gt;
&lt;p&gt;I wondered if I could combine Bramus’ cascade diagram layout with the order of precedence information from Miriam’s article. The early CodePen prototype turned out well enough that I decided to polish and publish it.&lt;/p&gt;
&lt;p&gt;There are still some things to be done. The website currently fails &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/resize-text.html&quot;&gt;WCAG Success Criterion 1.4.4: Resize Text (Level AA)&lt;/a&gt; under certain conditions. I haven’t landed on a fix that works for the design yet. Hit me up if you have any ideas.&lt;/p&gt;
</description><pubDate>Sun, 29 Mar 2026 12:06:00 GMT</pubDate><category>css</category><category>cascade</category></item><item><title>Writing code is cheap now - Agentic Engineering Patterns - Simon Willison&apos;s Weblog</title><link>https://simonwillison.net/guides/agentic-engineering-patterns/code-is-cheap/</link><guid isPermaLink="true">https://simonwillison.net/guides/agentic-engineering-patterns/code-is-cheap/</guid><pubDate>Tue, 24 Mar 2026 04:35:00 GMT</pubDate><content:encoded>&lt;p&gt;Simon Willison on what they mean by “good code”:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The code works. It does what it’s meant to do, without bugs.&lt;/li&gt;
&lt;li&gt;We &lt;em&gt;know the code works&lt;/em&gt;. We’ve taken steps to confirm to ourselves and to others that the code is fit for purpose.&lt;/li&gt;
&lt;li&gt;It solves the right problem.&lt;/li&gt;
&lt;li&gt;It handles error cases gracefully and predictably: it doesn’t just consider the happy path. Errors should provide enough information to help future maintainers understand what went wrong.&lt;/li&gt;
&lt;li&gt;It’s simple and minimal - it does only what’s needed, in a way that both humans and machines can understand now and maintain in the future.&lt;/li&gt;
&lt;li&gt;It’s protected by tests. The tests show that it works now and act as a regression suite to avoid it quietly breaking in the future.&lt;/li&gt;
&lt;li&gt;It’s documented at an appropriate level, and that documentation reflects the current state of the system - if the code changes an existing behavior the existing documentation needs to be updated to match.&lt;/li&gt;
&lt;li&gt;The design affords future changes. It’s important to maintain &lt;a href=&quot;https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it&quot;&gt;YAGNI&lt;/a&gt; - code with added complexity to anticipate future changes that may never come is often bad code - but it’s also important not to write code that makes future changes much harder than they should be.&lt;/li&gt;
&lt;li&gt;All of the other relevant “ilities” - accessibility, testability, reliability, security, maintainability, observability, scalability, usability - the non-functional quality measures that are appropriate for the particular class of software being developed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</content:encoded><category>agentic-engineering</category><category>simon-willison</category></item><item><title>Adactio: Journal—Magic</title><link>https://adactio.com/journal/22399</link><guid isPermaLink="true">https://adactio.com/journal/22399</guid><pubDate>Tue, 24 Mar 2026 04:26:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Libraries are bits of other people’s code that I call from my code. Frameworks are other people’s code that call bits of my code.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>abstractions</category><category>maintenance</category></item><item><title>What is agentic engineering? - Agentic Engineering Patterns - Simon Willison&apos;s Weblog</title><link>https://simonwillison.net/guides/agentic-engineering-patterns/what-is-agentic-engineering/</link><guid isPermaLink="true">https://simonwillison.net/guides/agentic-engineering-patterns/what-is-agentic-engineering/</guid><pubDate>Tue, 24 Mar 2026 04:17:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Writing code has never been the sole activity of a software engineer. The craft has always been figuring out what code to write. Any given software problem has dozens of potential solutions, each with their own tradeoffs. Our job is to navigate those options and find the ones that are the best fit for our unique set of circumstances and requirements.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>agentic-engineering</category><category>software-engineering</category><category>simon-willison</category></item><item><title>You Might Debate It — If You Could See It - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2026/opacity-of-generative-tools/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2026/opacity-of-generative-tools/</guid><pubDate>Mon, 23 Mar 2026 03:26:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;When you offload your thinking, you might be on-loading someone else’s you’d never agree to — personally or collectively.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>llm</category></item><item><link>https://arpit.blog/notes/2026/03/web-day-out-2026/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/03/web-day-out-2026/</guid><description>&lt;p&gt;I couldn’t make it to &lt;a href=&quot;https://webdayout.com/&quot;&gt;Web Day Out 2026&lt;/a&gt;. Thankfully, &lt;a href=&quot;https://adactio.com/journal/22465&quot;&gt;Jeremy wrote about it&lt;/a&gt; and linked to a bunch of online talk about it. Special shout out to Josh Tumath who live-blogged each talk.&lt;/p&gt;
&lt;p&gt;By all accounts, it was an excellent event. The regret at missing out &lt;a href=&quot;https://adactio.com/journal/22353&quot;&gt;(RAMO)&lt;/a&gt; is real. I remotely attended &lt;a href=&quot;https://2026.stateofthebrowser.com/&quot;&gt;State of the Browser 2026&lt;/a&gt; and I’d love it if more events offered a remote option.&lt;/p&gt;
&lt;p&gt;Many of the speakers were kind enough to share a link to their slides. I haven’t checked out all of them yet, but I liked &lt;a href=&quot;https://noti.st/matuzo/K64nm3/slides&quot;&gt;Manuel Matuzović’s talk ‘Breaking with habits’&lt;/a&gt;. So much so that I feel the urge to redesign my portfolio based on the approach he showed. For now, I’ll dive deep into his &lt;a href=&quot;https://fokus.dev/tools/uaplus/&quot;&gt;UA+ stylesheet&lt;/a&gt; and &lt;a href=&quot;https://olicss.com/&quot;&gt;oli.css&lt;/a&gt; project to get a deeper understanding.&lt;/p&gt;
</description><pubDate>Wed, 18 Mar 2026 06:06:00 GMT</pubDate><category>event</category><category>conference</category></item><item><title>Inherited properties leak through the donut scope</title><link>https://arpit.blog/articles/2026/03/inherited-properties-donut-scope/</link><guid isPermaLink="true">https://arpit.blog/articles/2026/03/inherited-properties-donut-scope/</guid><pubDate>Sat, 14 Mar 2026 10:50:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I learned about a potential pitfall with &lt;code&gt;@scope&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@scope&quot;&gt;MDN&lt;/a&gt; [emphasis mine]:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is important to understand that, while &lt;code&gt;@scope&lt;/code&gt; allows you to isolate the application of selectors to specific DOM subtrees, it does not completely isolate the applied styles to within those subtrees. This is most noticeable with inheritance — &lt;strong&gt;properties that are inherited by children (for example &lt;code&gt;color&lt;/code&gt; or &lt;code&gt;font-family&lt;/code&gt;) will still be inherited, beyond any set scope limit.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, &lt;code&gt;@scope&lt;/code&gt; isolates your selectors, not your styles. Here’s what that looks like in practice.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;card&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;In scope&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;		&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;Outside the scope limit&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (.card) to (.content) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;	:scope&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		font-family&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; Georgia&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; serif&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;	p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		padding&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 1lh&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		outline&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;, the one inside &lt;code&gt;.content&lt;/code&gt;, won’t get the &lt;code&gt;padding&lt;/code&gt; or &lt;code&gt;outline&lt;/code&gt; because those are non-inherited properties in the scope limit. That part works exactly as you’d expect.&lt;/p&gt;
&lt;p&gt;But it will still turn red and render in Georgia because &lt;code&gt;color&lt;/code&gt; and &lt;code&gt;font-family&lt;/code&gt; are inherited properties set on &lt;code&gt;.card&lt;/code&gt; (via &lt;code&gt;:scope&lt;/code&gt;). And as we just learned from MDN, inheritance flows through the DOM regardless of where &lt;code&gt;@scope&lt;/code&gt; sets the scope limit.&lt;/p&gt;
&lt;p&gt;As Miriam mentioned in the &lt;a href=&quot;https://www.youtube.com/watch?v=T-X641Qn-Rc&amp;amp;t=1838s&quot;&gt;Winging It episode on CSS Scope &amp;amp; Mixins&lt;/a&gt;, it has to work this way because if &lt;code&gt;@scope&lt;/code&gt; blocked inheritance at the scope limit, every element beyond the scope limit would receive the initial value for each inherited property.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arpit.blog/notes/2026/02/rollback-css/&quot;&gt;&lt;code&gt;initial&lt;/code&gt;&lt;/a&gt; applies the value as defined in the CSS spec. And that would be far more destructive than letting inheritance flow through.&lt;/p&gt;
&lt;p&gt;If you’re coming from JavaScript, you might expect custom properties to work like scoped variables work in JavaScript. But in CSS, custom properties are inherited properties just like &lt;code&gt;color&lt;/code&gt; or &lt;code&gt;font-family&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (.card) to (.content) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;	:scope&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;		--text-color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		font-family&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; Georgia&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; serif&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;	p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;(--text-color)&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		padding&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 1lh&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		outline&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* This rule exists to show that the inherited value is available beyond the scope limit */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.content&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;(--text-color)&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With the same HTML, the second &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; again loses the &lt;code&gt;padding&lt;/code&gt; and &lt;code&gt;outline&lt;/code&gt;. But &lt;code&gt;--text-color&lt;/code&gt; inherits down from &lt;code&gt;.card&lt;/code&gt; into &lt;code&gt;.content p&lt;/code&gt;. So the second &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; also turns red because its &lt;code&gt;color&lt;/code&gt; property references &lt;code&gt;var(--text-color)&lt;/code&gt; which resolves to &lt;code&gt;red&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For custom properties, if inheritance were blocked at the scope limit and no ancestor outside the scope had also defined it, any &lt;code&gt;var(--text-color)&lt;/code&gt; beyond the scope limit would be undefined and that would just trigger the fallback in the &lt;code&gt;var()&lt;/code&gt; function, or if there’s no fallback, the property using it would behave as &lt;a href=&quot;https://arpit.blog/notes/2026/02/rollback-css/&quot;&gt;&lt;code&gt;unset&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There’s more to what happens when a custom property is undefined, involving the &lt;i&gt;guaranteed-invalid value&lt;/i&gt; and &lt;i&gt;invalid at computed-value time (IACVT)&lt;/i&gt;. I wrote a &lt;a href=&quot;https://arpit.blog/notes/2026/03/undefined-custom-property/&quot;&gt;note on what happens when the CSS function &lt;code&gt;var()&lt;/code&gt; references an undefined custom property&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>scope</category><category>css</category></item><item><link>https://arpit.blog/notes/2026/03/undefined-custom-property/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/03/undefined-custom-property/</guid><description>&lt;p&gt;What happens when the &lt;code&gt;var()&lt;/code&gt; CSS function references a custom property that is undefined or explicitly set to &lt;code&gt;initial&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;In both cases the custom property’s value is the &lt;a href=&quot;https://drafts.csswg.org/css-variables/#guaranteed-invalid-value&quot;&gt;&lt;i&gt;guaranteed-invalid value&lt;/i&gt;&lt;/a&gt;. That’s the initial value of every custom property as defined in the spec. When &lt;code&gt;var()&lt;/code&gt; encounters this value during substitution, here’s what happens:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If a fallback was provided, the fallback value is used.&lt;/li&gt;
&lt;li&gt;If no fallback was provided, the referencing property becomes &lt;a href=&quot;https://www.w3.org/TR/css-variables-1/#invalid-at-computed-value-time&quot;&gt;&lt;i&gt;invalid at computed-value time (IACVT)&lt;/i&gt;&lt;/a&gt;. The property then behaves as if its value had been specified as the &lt;code&gt;unset&lt;/code&gt; keyword.&lt;/li&gt;
&lt;/ol&gt;
</description><pubDate>Sat, 14 Mar 2026 09:13:00 GMT</pubDate><category>css</category><category>custom-properties</category><category>variables</category></item><item><link>https://arpit.blog/notes/2026/03/anchor-positioning-gotchas/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/03/anchor-positioning-gotchas/</guid><description>&lt;p&gt;I just read the latest issue of &lt;a href=&quot;https://blog.codepen.io/2026/03/09/chris-corner-anchors/&quot;&gt;Chris’ Corner on CodePen&lt;/a&gt;. I then read the following articles, all of which Chris links to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chris’ article on &lt;a href=&quot;https://frontendmasters.com/blog/the-big-gotcha-of-anchor-positioning/&quot;&gt;The Big Gotcha of Anchor Positioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Temani Afif’s article on &lt;a href=&quot;https://css-tip.com/anchor-issues/&quot;&gt;Why is Anchor Positioning not working?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;James Stuckey Weber’s article on &lt;a href=&quot;https://www.oddbird.net/2025/01/29/anchor-position-validity/&quot;&gt;CSS Anchor Positioning in Practice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh boy! My mind is completely fried. I had no idea anchor positioning was this complicated. I would be afraid to touch CSS anchor positioning if not for this recommendation from James to make it work reliably.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Make the anchor and the positioned element siblings.&lt;/li&gt;
&lt;li&gt;Put the anchor first in the DOM.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;I also saw the Winging It episode on &lt;a href=&quot;https://www.youtube.com/watch?v=3vwruYb9du4&quot;&gt;‘Debugging CSS Anchor Positioning‘&lt;/a&gt;. It really helped me develop a mental model of how anchor positioning works and why the gotchas exist.&lt;/p&gt;
&lt;p&gt;Also, I totally agree with &lt;a href=&quot;https://bsky.app/profile/tabatkins.com&quot;&gt;Tab Atkins-Bittner&lt;/a&gt; that dev tools really need a way to show the containing block for elements, especially absPos/fixedPos elements.&lt;/p&gt;
</description><pubDate>Wed, 11 Mar 2026 13:22:00 GMT</pubDate><category>anchor-positioning</category><category>css</category></item><item><link>https://arpit.blog/notes/2026/03/slide-in-nav-scroll-triggered-animations/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/03/slide-in-nav-scroll-triggered-animations/</guid><description>&lt;p&gt;I liked &lt;a href=&quot;https://www.youtube.com/watch?v=6LJuWf4ySCI&quot;&gt;Kevin Powell’s video on the slide-in nav&lt;/a&gt;. In the video, Kevin demonstrates how to create a sticky header that initially scrolls away (when the user scrolls the page), then slides back into view as a sticky top bar once the user has scrolled past a certain threshold.&lt;/p&gt;
&lt;p&gt;He achieves the slide-in effect using scroll state queries and a negative &lt;code&gt;inset-block-start&lt;/code&gt; on the sticky positioned element.&lt;/p&gt;
&lt;p&gt;He also recreates the effect using scroll driven animations. But it’s not an ideal solution, since as he puts it speaking about the header, “if I stop at the wrong spot, it’s like halfway there”. That is definitely a usability issue.&lt;/p&gt;
&lt;p&gt;I remembered Bramus sharing his post &lt;a href=&quot;https://developer.chrome.com/blog/scroll-triggered-animations&quot;&gt;on scroll &lt;em&gt;triggered&lt;/em&gt; animations&lt;/a&gt;. As Bramus mentions, scroll triggered animations “trigger when crossing a specific scroll offset”. This is exactly what’s required to avoid the problem Kevin mentioned above.&lt;/p&gt;
&lt;p&gt;Here’s my &lt;a href=&quot;https://codepen.io/editor/arpit-codes/pen/019cd1ee-29b1-717f-8a27-9a37ba5f2c26&quot;&gt;CodePen demo&lt;/a&gt; achieving the slide-in effect using scroll triggered animations.&lt;/p&gt;
&lt;p&gt;I tested it on Chrome Canary v147. No other browser seems to support it yet, not even Chrome v145 even though Bramus’ article says it ships with v145. On browsers that don’t support scroll triggered animations, there is no slide-in effect but the header remains sticky.&lt;/p&gt;
</description><pubDate>Mon, 09 Mar 2026 16:04:00 GMT</pubDate><category>animations</category><category>css</category></item><item><title>Underlining Links With CSS | Always Twisted</title><link>https://www.alwaystwisted.com/articles/underlining-links-with-css</link><guid isPermaLink="true">https://www.alwaystwisted.com/articles/underlining-links-with-css</guid><pubDate>Wed, 25 Feb 2026 11:45:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I learned about the CSS property &lt;code&gt;text-underline-position&lt;/code&gt;. As Stuart mentions, &lt;q&gt;the &lt;code&gt;under&lt;/code&gt; value forces the underline to sit below all the descenders, giving you a consistent baseline.&lt;/q&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	text-underline-position&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; under&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>underline</category><category>text-decoration</category><category>css</category><category>stuart-robson</category></item><item><title>Modular: The Claude C Compiler: What It Reveals About the Future of Software</title><link>https://www.modular.com/blog/the-claude-c-compiler-what-it-reveals-about-the-future-of-software</link><guid isPermaLink="true">https://www.modular.com/blog/the-claude-c-compiler-what-it-reveals-about-the-future-of-software</guid><pubDate>Wed, 25 Feb 2026 08:29:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Good software depends on judgment, communication, and clear abstraction. AI has amplified this.&lt;/li&gt;
&lt;li&gt;AI coding is automation of implementation, so design and stewardship become more important.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</content:encoded><category>claude</category><category>ai</category><category>llm</category><category>software-engineering</category></item><item><link>https://arpit.blog/notes/2026/02/rollback-css/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/02/rollback-css/</guid><description>&lt;p&gt;I keep forgetting how each of the following CSS values rolls back a declaration to a different point in the cascade. It was about time I jotted it down for my future self before it slips my mind again for the 1000th time.&lt;/p&gt;
&lt;dl class=&quot;flow&quot;&gt;
	&lt;div&gt;
		&lt;dt&gt;
			&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/initial&quot;&gt;
				&lt;code&gt;initial&lt;/code&gt;
			&lt;/a&gt;
		&lt;/dt&gt;
		&lt;dd&gt;Applies the initial value as defined in the CSS spec&lt;/dd&gt;
	&lt;/div&gt;
	&lt;div&gt;
		&lt;dt&gt;
			&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/unset&quot;&gt;
				&lt;code&gt;unset&lt;/code&gt;
			&lt;/a&gt;
		&lt;/dt&gt;
		&lt;dd&gt;Inherits or falls back to the initial value&lt;/dd&gt;
	&lt;/div&gt;
	&lt;div&gt;
		&lt;dt&gt;
			&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/revert&quot;&gt;
				&lt;code&gt;revert&lt;/code&gt;
			&lt;/a&gt;
		&lt;/dt&gt;
		&lt;dd&gt;Reverts to the user agent&apos;s default value&lt;/dd&gt;
	&lt;/div&gt;
	&lt;div&gt;
		&lt;dt&gt;
			&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/revert-layer&quot;&gt;
				&lt;code&gt;revert-layer&lt;/code&gt;
			&lt;/a&gt;
		&lt;/dt&gt;
		&lt;dd&gt;Rolls back to the value in a previous cascade layer&lt;/dd&gt;
	&lt;/div&gt;
&lt;/dl&gt;
</description><pubDate>Wed, 25 Feb 2026 04:40:00 GMT</pubDate><category>cascade</category><category>css</category></item><item><link>https://arpit.blog/notes/2026/02/sotb-2026/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/02/sotb-2026/</guid><description>&lt;p&gt;I’ll be attending &lt;a href=&quot;https://2026.stateofthebrowser.com/&quot;&gt;State of the Browser&lt;/a&gt; for the first time, remotely! 💃🏻&lt;/p&gt;
&lt;p&gt;Really looking forward to Bramus’ talk on CSS Anchor Positioning and Zach’s talk on reducing the JS footprint.&lt;/p&gt;
</description><pubDate>Mon, 23 Feb 2026 05:52:00 GMT</pubDate><category>sotb</category><category>conference</category></item><item><title>zachleat’s Twitter Archive—№ 20,184</title><link>https://www.zachleat.com/twitter/982251377010270210/</link><guid isPermaLink="true">https://www.zachleat.com/twitter/982251377010270210/</guid><pubDate>Tue, 10 Feb 2026 22:33:00 GMT</pubDate><content:encoded>&lt;p&gt;Zach Leatherman on frontend architecture and building for longevity amid framework churn:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;👏 Hire someone that’s good at HTML and CSS to build components independent of JS frameworks 👏&lt;/li&gt;
&lt;li&gt;Plug components into a JS framework and layer on behavior later&lt;/li&gt;
&lt;li&gt;Pay HTML/CSS devs what they deserve for giving part of your codebase longer shelf life than unpasteurized milk&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
</content:encoded><category>frontend-architecture</category><category>component-design</category><category>frameworks</category><category>zach-leatherman</category></item><item><link>https://arpit.blog/notes/2026/02/reset-button/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/02/reset-button/</guid><description>&lt;p&gt;Today I learned that setting &lt;code&gt;type=&quot;reset&quot;&lt;/code&gt; on a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; element in HTML creates a reset button that, when activated, immediately clears all form data, resetting it to its initial state.&lt;/p&gt;
&lt;p&gt;This could have been useful in the context of a search form. But &lt;code&gt;&amp;lt;input type=&quot;search&quot;&amp;gt;&lt;/code&gt; already provides a native clear button for that single field.&lt;/p&gt;
</description><pubDate>Mon, 09 Feb 2026 09:55:00 GMT</pubDate><category>button</category><category>input</category><category>html</category></item><item><title>Saying “No” In an Age of Abundance - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2026/saying-no/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2026/saying-no/</guid><pubDate>Wed, 04 Feb 2026 05:05:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;It’s never been a good idea to ship everything you think of. Every addition accretes complexity and comes with a cognitive cost.&lt;/p&gt;
&lt;p&gt;Maybe we need to reframe the concept of scarcity from &lt;em&gt;us&lt;/em&gt;, the makers of software, to &lt;em&gt;them&lt;/em&gt;, the users of software. Their resources are what matter most:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attention (too many features and they can’t all be used, or even tried)&lt;/li&gt;
&lt;li&gt;Stability (too much frequent change is an impediment to learning a product)&lt;/li&gt;
&lt;li&gt;Clarity (too many options creates confusion and paralysis)&lt;/li&gt;
&lt;li&gt;Coherence (too many plots and subplots cannot tell a unified story)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</content:encoded><category>focus</category><category>product-design</category><category>feature-creep</category><category>jim-nielsen</category></item><item><title>Singing the gospel of collective efficacy (Interconnected)</title><link>https://interconnected.org/home/2026/01/30/efficacy</link><guid isPermaLink="true">https://interconnected.org/home/2026/01/30/efficacy</guid><pubDate>Mon, 02 Feb 2026 00:45:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Similarly we all love when the swifts visit (beautiful birds), so somebody started a group to get swift nest boxes made and installed collectively, then applied for subsidy funding, then got everyone to chip in such that people who couldn’t afford it could have their boxes paid for, and now suddenly we’re all writing to MPs and following the legislation to include swift nesting sites in new build houses. Etc.&lt;/p&gt;
&lt;p&gt;It’s called &lt;em&gt;collective efficacy&lt;/em&gt;, the belief that you can make a difference by acting together.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>collective-action</category><category>community</category><category>matt-webb</category></item><item><title>Pedagogy Recommendations</title><link>https://parentheticallyspeaking.org/articles/pedagogy-recommendations/</link><guid isPermaLink="true">https://parentheticallyspeaking.org/articles/pedagogy-recommendations/</guid><pubDate>Fri, 30 Jan 2026 05:23:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Every time you are inclined to use the word “teach”, replace it with “learn”. That is, instead of saying, “I teach”, say “They learn”. It’s very easy to determine what you teach; you can just fill slides with text and claim to have taught. Shift your focus to determining how you know whether they learned what you claim to have taught (or indeed anything at all!). That is much harder, but that is also the real objective of any educator.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>teaching</category><category>learning</category></item><item><title>Web development tip: disable pointer events on link images</title><link>https://lapcatsoftware.com/articles/2025/11/2.html</link><guid isPermaLink="true">https://lapcatsoftware.com/articles/2025/11/2.html</guid><pubDate>Thu, 29 Jan 2026 13:54:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;The problem is that Live Text, “Select text in images to copy or take action,” is enabled by default on iOS devices (Settings → General → Language &amp;amp; Region), which can interfere with the contextual menu in Safari. Pressing down on the above link may select the text inside the image instead of selecting the link URL.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>css</category><category>link</category><category>images</category><category>safari</category></item><item><link>https://arpit.blog/notes/2026/01/okpalette-color-extraction/</link><guid isPermaLink="true">https://arpit.blog/notes/2026/01/okpalette-color-extraction/</guid><description>&lt;p&gt;Just spent some time playing with &lt;a href=&quot;https://okpalette.color.pizza/&quot;&gt;OKpalette&lt;/a&gt;, a color extraction tool by &lt;a href=&quot;https://elastiq.ch/&quot;&gt;David Aerne&lt;/a&gt;, and I’m in awe.&lt;/p&gt;
&lt;p&gt;The 3D spinning text pulled me in immediately. I assumed it was done using JavaScript because it reminded me of the &lt;a href=&quot;https://spacetypegenerator.com/&quot;&gt;Space Type Generator&lt;/a&gt;. Finding out it’s done using CSS genuinely blew my mind. David was kind enough to share a &lt;a href=&quot;https://codepen.io/meodai/pen/ZYOyqBo?editors=0010&quot;&gt;CodePen demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I loved the animations and the subtle use of audio while interacting with the UI. Then I watched &lt;a href=&quot;https://www.youtube.com/watch?v=qkZlgJLGKI4&quot;&gt;David’s walkthrough / demo&lt;/a&gt; and realized the functionality is just as beautiful as the visuals, if not more.&lt;/p&gt;
</description><pubDate>Fri, 23 Jan 2026 03:46:00 GMT</pubDate><category>color</category><category>interaction-design</category><category>design</category><category>css</category><category>tools</category><category>resource</category></item><item><title>Easy Measures Doing, Simple Measures Understanding - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2026/easy-vs-simple/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2026/easy-vs-simple/</guid><pubDate>Thu, 22 Jan 2026 11:12:00 GMT</pubDate><content:encoded>&lt;p&gt;Excellent framing from Jim Nielsen, building on &lt;a href=&quot;https://www.youtube.com/watch?v=eIoohUmYpGI&quot;&gt;Jake Nations’ talk about shipping code we don’t fully understand&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Easy means you can do with little effort.&lt;/p&gt;
&lt;p&gt;Simple means you can understand what you do with little effort.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>jim-nielsen</category><category>complexity</category><category>design</category></item><item><title>Reckoning: Frontend&apos;s Lost Decade | Alex Russell | performance.now() 2024 - YouTube</title><link>https://www.youtube.com/watch?v=0XwWVjQOmyg</link><guid isPermaLink="true">https://www.youtube.com/watch?v=0XwWVjQOmyg</guid><pubDate>Fri, 09 Jan 2026 13:19:00 GMT</pubDate><content:encoded>&lt;p&gt;In this excellent, data-driven talk, Alex Russell explains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What “winning” means for the web and why it’s a vital cause&lt;/li&gt;
&lt;li&gt;How the web is losing the competition today on mobile, despite its success on desktop&lt;/li&gt;
&lt;li&gt;The path forward: Getting things out of frameworks and using the web platform&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>platform</category><category>frameworks</category><category>mobile</category><category>apps</category><category>performance</category><category>alex-russell</category></item><item><title>How to choose your Baseline target  |  Articles  |  web.dev</title><link>https://web.dev/articles/how-to-choose-your-baseline-target</link><guid isPermaLink="true">https://web.dev/articles/how-to-choose-your-baseline-target</guid><pubDate>Mon, 05 Jan 2026 08:22:00 GMT</pubDate><content:encoded>&lt;p&gt;Jeremy Wagner and Rachel Andrew explain how to use analytics to select a Baseline target and what to do when you don’t have any real user data.&lt;/p&gt;
&lt;p&gt;In cases where there isn’t any real user data:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] you can get a general idea of support for different Baseline targets through &lt;a href=&quot;https://rumarchive.com/insights/#baseline&quot;&gt;RUM Archive Insights&lt;/a&gt;, even allowing you to filter down to the country level.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They also address a practical follow-up question: &lt;strong&gt;what to do about features that don’t meet your chosen Baseline target.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Baseline doesn’t prescribe a specific path here, but the authors suggest a useful framework for categorizing features based on their “failure mode”:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enhancement:&lt;/strong&gt; If the feature is used in an unsupported browser, the experience is not broken. The experience could possibly be degraded, but may not likely be noticeable to the user. Example: &lt;code&gt;loading=&quot;lazy&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additive:&lt;/strong&gt; The feature provides some additive benefits that may be noticeable—such as changes in page styling or some functionality. The difference may not be noticeable to users if the feature is unsupported, barring comparison in a browser that does support it. Example: Subgrid&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical:&lt;/strong&gt; If the feature is unsupported, the user will have a negative user experience—possibly even one that’s broken altogether. Example: File System Access API used as a central and necessary feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;They also highlight &lt;a href=&quot;https://browsersupport.clearleft.com/&quot;&gt;Clearleft’s browser support policy&lt;/a&gt;, where they target Baseline Widely available while still evaluating whether newer features can be used as progressive enhancements before ruling them out entirely.&lt;/p&gt;
</content:encoded><category>baseline</category><category>browser-support</category><category>progressive-enhancement</category><category>analytics</category></item><item><title>Jason Pamental - The Life of p - YouTube</title><link>https://www.youtube.com/watch?v=4ggOmfBtWRM</link><guid isPermaLink="true">https://www.youtube.com/watch?v=4ggOmfBtWRM</guid><pubDate>Thu, 01 Jan 2026 16:33:00 GMT</pubDate><content:encoded>&lt;p&gt;I just saw Jason Pamental’s excellent talk on ‘The Life of &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;’. In this talk, Jason traces the evolution of paragraph design in print and shows how those typographic ideas can be applied using CSS.&lt;/p&gt;
&lt;p&gt;There’s one moment during the Q&amp;amp;A where Jason mentions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] you see the page gets small, but they don’t change the scale of the headers. So you end up with like an &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; with one word per line. It’s a really awkward break. So I think proportion with varying screen size is probably the most overlooked thing right now that I’d want to see people think about more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wasn’t a web developer 10 years ago when Jason gave this talk, but with over five years of experience now, it’s striking that I only became aware of proportional type scaling as an idea in the last couple of years. Nowadays, I use &lt;a href=&quot;https://utopia.fyi/&quot;&gt;utopia.fyi&lt;/a&gt; to create fluid type (and space) scales across viewport ranges, which helps address the problem Jason mentioned.&lt;/p&gt;
</content:encoded><category>typography</category><category>design</category><category>paragraph</category><category>css</category></item><item><title>Browser support at Clearleft</title><link>https://browsersupport.clearleft.com/</link><guid isPermaLink="true">https://browsersupport.clearleft.com/</guid><pubDate>Tue, 30 Dec 2025 09:57:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Underlying our browser support policy are two foundational principles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Website content and core functionality should be accessible to everyone.&lt;/li&gt;
&lt;li&gt;It’s okay for websites to look different in different browsers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If content is unreadable in some browsers, that’s a bug that we will fix.&lt;/p&gt;
&lt;p&gt;If content is displayed slightly differently in some browsers, we consider that to be a facet of the web, not a bug. This means that there will sometimes be subtle visual and functional differences from browser to browser. We deem this acceptable provided content and core functionality are unaffected.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>baseline</category><category>browser-support</category><category>progressive-enhancement</category><category>principle</category></item><item><link>https://arpit.blog/notes/2025/12/use-the-product/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/12/use-the-product/</guid><description>&lt;p&gt;Earlier this month, I noted down &lt;a href=&quot;https://arpit.blog/links/2025/12/developer-job-jason-lengstorf/&quot;&gt;Jason’s advice on how to get hired as a developer&lt;/a&gt;. I’d also like to add the following point from &lt;a href=&quot;https://x.com/burcs/status/2002013464387105231&quot;&gt;@brandon&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;use the product&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;this is one of the first questions i ask in the interview anyways, ship and share something you’ve built on top of cloudflare. this alone will set you apart from most of the candidates, and it will show you are genuinely interested.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This complements Jason’s advice well, because it turns “show your work” into something concrete and product-specific.&lt;/p&gt;
</description><pubDate>Mon, 29 Dec 2025 04:22:00 GMT</pubDate><category>job</category><category>hiring</category><category>career</category></item><item><title>Config 2024: Serious play (Andy Allen, Software Designer, !Boring) | Figma - YouTube</title><link>https://www.youtube.com/watch?v=wBnIyD5I8mM</link><guid isPermaLink="true">https://www.youtube.com/watch?v=wBnIyD5I8mM</guid><pubDate>Mon, 22 Dec 2025 16:33:00 GMT</pubDate><content:encoded>&lt;p&gt;Great talk by Andy Allen on how software designers can learn from game designers.&lt;/p&gt;
&lt;p&gt;It reminded me of &lt;a href=&quot;https://chrome.dev/carousel/vertical/wheel/&quot;&gt;the Wheel by Adam Argyle&lt;/a&gt;, inspired by the arcade game Black Emperor. The game feel is so strong that I find myself scrolling up and down again and again just to play with it and experience that delightful bounce effect.&lt;/p&gt;
</content:encoded><category>design</category><category>games</category></item><item><title>do THIS to get a developer job in 2024 - YouTube</title><link>https://www.youtube.com/watch?v=T0deG6OpadM</link><guid isPermaLink="true">https://www.youtube.com/watch?v=T0deG6OpadM</guid><pubDate>Fri, 19 Dec 2025 10:58:00 GMT</pubDate><content:encoded>&lt;p&gt;Jason Lengstorf on how to get hired as a developer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Document what you learn publicly&lt;/strong&gt; — consistency matters more than polish.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show your work&lt;/strong&gt; — CodePen demos, personal projects or tutorials all count.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Participate in communities&lt;/strong&gt; — Bluesky, Mastodon, Discord.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>job</category><category>hiring</category><category>career</category><category>jason-lengstorf</category></item><item><link>https://arpit.blog/notes/2025/12/mac-os-scroll-bars-mouse/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/12/mac-os-scroll-bars-mouse/</guid><description>&lt;p&gt;Today I learned that on macOS, with the default scrollbar setting enabled, classic scrollbars are shown automatically when a mouse is connected. I used to believe that, mouse or not, users needed to explicitly change the scrollbar appearance to get the classic scrollbars.&lt;/p&gt;
&lt;p&gt;This is relevant for everyone who builds websites because when classic scrollbars are shown, the value of &lt;code&gt;100vw&lt;/code&gt; includes the scrollbar width. This can cause an unexpected horizontal overflow if the layout relies on &lt;code&gt;100vw&lt;/code&gt; for full-width elements. Additionally, they affect media queries, which assume scrollbars don’t exist when evaluating viewport width.&lt;/p&gt;
&lt;p&gt;Having said that, these aren’t new issues. Classic scrollbars are shown by default on Windows, where the same behaviours apply.&lt;/p&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/viewport-units&quot;&gt;The large, small, and dynamic viewport units | Blog | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2023/12/new-css-viewport-units-not-solve-classic-scrollbar-problem/&quot;&gt;New CSS Viewport Units Do Not Solve The Classic Scrollbar Problem — Smashing Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tip.com/width-scrollbar/&quot;&gt;Get the scrollbar width using only CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/full-bleed-layout-with-modern-css/&quot;&gt;Full-Bleed Layout with Modern CSS – Frontend Masters Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 18 Dec 2025 15:37:00 GMT</pubDate><category>scrollbars</category><category>layout</category><category>viewport</category><category>media-queries</category><category>css</category><category>mac-os</category></item><item><title>The f*** off contact page - Nic Chan</title><link>https://www.nicchan.me/blog/the-f-off-contact-page/</link><guid isPermaLink="true">https://www.nicchan.me/blog/the-f-off-contact-page/</guid><pubDate>Mon, 08 Dec 2025 10:51:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Instead of seeing us as people who brought valuable knowledge and expertise to the project, they saw us as the hands that would execute their vision.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The above bit from Nic captures a dynamic I want to address upfront with clients, so they never treat me as just a pair of hands.&lt;/p&gt;
&lt;p&gt;Then there’s the this bit, which really resonated with me (because I’ve been there too and it sucks):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While I personally believe in the value of good design, I also believe there are a lot of smoke-and-mirrors in the industry, and I hated the thought that I might have inadvertently contributed to it. Even if the client is happy, it didn’t meet my internal bar for a quality product worth sticking my name on, and I feel like I’ve let down both the client and the end-users.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nic mentions how they hope to avoid similar situations in the future by blogging:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By blogging, I’m putting a body of work out there that communicates my values and ethos. While much of the details of my client work has to remain private, these posts can be public, and hopefully they can help me find people who resonate with what I have to offer. Or you know, just be bold enough to communicate ‘Fuck off’ to those who don’t!&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>design</category><category>client-work</category><category>blogging</category><category>nic-chan</category></item><item><title>Conditional JSX in Astro — Roma’s Unpolished Posts</title><link>https://blog.kizu.dev/conditional-jsx-in-astro/</link><guid isPermaLink="true">https://blog.kizu.dev/conditional-jsx-in-astro/</guid><pubDate>Mon, 08 Dec 2025 07:21:00 GMT</pubDate><content:encoded>&lt;p&gt;Roman Komarov on how they use an &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/IIFE&quot;&gt;IIFE (Immediately Invoked Function Expression)&lt;/a&gt; to handle complex conditional rendering in &lt;code&gt;.astro&lt;/code&gt; components.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;linkText&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; isDiv&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; Astro&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;.props;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	(() &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;		const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; someContent&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;#hello&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;{linkText}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;		return&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;			&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;wrapper&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;				{isDiv &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;					&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;inner&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;{someContent}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;				) &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;					&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;inner&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;{someContent}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;				)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;			&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	})()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>astro</category><category>jsx</category><category>iife</category><category>javascript</category><category>roman-komarov</category></item><item><title>Selector scoping in element.querySelector() and element.querySelectorAll()</title><link>https://arpit.blog/articles/2025/12/selector-scoping-element-query-selector/</link><guid isPermaLink="true">https://arpit.blog/articles/2025/12/selector-scoping-element-query-selector/</guid><pubDate>Tue, 02 Dec 2025 09:27:00 GMT</pubDate><content:encoded>&lt;p&gt;I was reading the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector&quot;&gt;MDN docs for &lt;code&gt;element.querySelector()&lt;/code&gt;&lt;/a&gt; and learnt something totally unexpected about selector scope when this method is called on an element.&lt;/p&gt;
&lt;p&gt;Let’s say I have the following HTML:&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;This is a paragraph and it has a &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;span inside&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt; it.&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;	const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; baseElement&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; document&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.querySelector&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;	// Note: We are querying relative to the &amp;lt;p&amp;gt; element, not the document&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;	const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; matchedSpan&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; baseElement&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.querySelector&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;#39;div span&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	console&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.log&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(matchedSpan);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the above JavaScript is executed, what do you expect to happen?&lt;/p&gt;
&lt;p&gt;I expected it to log &lt;code&gt;null&lt;/code&gt; to the console. My reasoning was simple: I am calling the method on &lt;code&gt;baseElement&lt;/code&gt; (the &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tag), and that paragraph clearly does not contain a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; inside it.&lt;/p&gt;
&lt;p&gt;But here’s what actually gets logged to the console:&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;console&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;span&amp;gt;span inside&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This surprisingly returns the &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; from &lt;em&gt;inside&lt;/em&gt; the &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Why does this happen? MDN explains it like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] &lt;code&gt;selectors&lt;/code&gt; is first applied to the whole document, not the &lt;code&gt;baseElement&lt;/code&gt;, to generate an initial list of potential elements. The resulting elements are then examined to see if they are descendants of &lt;code&gt;baseElement&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note: &lt;code&gt;element.querySelectorAll()&lt;/code&gt; also applies selector scoping in the same manner.&lt;/p&gt;
&lt;p&gt;If we want to restrict the selector to the element on which it is called then we should use the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:scope&quot;&gt;&lt;code&gt;:scope&lt;/code&gt; pseudo-class&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; scopedQuery&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; baseElement&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.querySelector&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;#39;:scope div span&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.log&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(scopedQuery); &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;// Returns null, as expected&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As mentioned in the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:scope&quot;&gt;MDN docs for &lt;code&gt;:scope&lt;/code&gt;&lt;/a&gt;, this works because:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When used within a DOM API call — such as &lt;code&gt;querySelector()&lt;/code&gt;, &lt;code&gt;querySelectorAll()&lt;/code&gt;, &lt;code&gt;matches()&lt;/code&gt;, or &lt;code&gt;Element.closest()&lt;/code&gt; — &lt;code&gt;:scope&lt;/code&gt; matches the element on which the method was called.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><category>dom</category><category>css-selector</category><category>web-api</category><category>javascript</category></item><item><link>https://arpit.blog/notes/2025/11/mindful-design-course/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/11/mindful-design-course/</guid><description>&lt;p&gt;I’m a web designer-developer who has mostly designed &lt;em&gt;and&lt;/em&gt; built marketing websites for small to medium-sized businesses. I started designing because my clients didn’t have a designer and expected me to handle everything. But I’ve always felt like an imposter. It’s not a nice feeling.&lt;/p&gt;
&lt;p&gt;I’m really determined to change that, which is why I just bought &lt;a href=&quot;https://piccalil.li/mindful-design&quot;&gt;Scott Riley’s course, Mindful Design&lt;/a&gt;. &lt;a href=&quot;https://piccalil.li/&quot;&gt;Piccalilli&lt;/a&gt; is running a Black Friday sale on all their courses, including Mindful Design, and I can wholeheartedly recommend them.&lt;/p&gt;
</description><pubDate>Fri, 28 Nov 2025 04:44:00 GMT</pubDate><category>design</category><category>course</category><category>piccalilli</category></item><item><title>HTML and Typescript.</title><link>https://medium.com/@mandy.michael/understanding-why-semantic-html-is-important-as-told-by-typescript-bd71ad41e6c4</link><guid isPermaLink="true">https://medium.com/@mandy.michael/understanding-why-semantic-html-is-important-as-told-by-typescript-bd71ad41e6c4</guid><pubDate>Thu, 20 Nov 2025 05:52:00 GMT</pubDate><content:encoded>&lt;p&gt;Mandy Michael uses a brilliant analogy to explain why developers must get to know the HTML elements available to them and use the appropriate one for their content.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In TypeScript, we have the concept of an &lt;code&gt;any&lt;/code&gt; type. When you assign a type of &lt;code&gt;any&lt;/code&gt; it means the content can be anything. […] But if everything is typed as &lt;code&gt;any&lt;/code&gt; then you lose the benefits of the language.&lt;/p&gt;
&lt;p&gt;This is the same with HTML. If you use the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; everywhere, you aren’t making the most of language. Because of this it’s important that you actively choose what the right element is and don’t just use the default &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This reminded me of the following quote by &lt;a href=&quot;https://www.linkedin.com/learning/html-essential-training-4/the-syntax-of-html-elements&quot;&gt;Jen Simmons from their HTML course&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HTML syntax itself is fairly simple. The trickier part is knowing which tags to use when.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>html</category><category>typescript</category><category>semantics</category></item><item><title>Using responsive images in HTML - HTML | MDN</title><link>https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Responsive_images</link><guid isPermaLink="true">https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Responsive_images</guid><pubDate>Mon, 17 Nov 2025 09:04:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://css-tricks.com/images-are-hard/&quot;&gt;Images on the web are hard&lt;/a&gt;. After trying and failing so many times before, now I finally understand how to configure &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt; attributes to serve differently sized images for different viewports.&lt;/p&gt;
&lt;p&gt;Also worth checking out: &lt;a href=&quot;https://12daysofweb.dev/2021/image-display-elements/&quot;&gt;Image Display Elements&lt;/a&gt; by Stephanie Eckles.&lt;/p&gt;
</content:encoded><category>html</category><category>images</category><category>responsive-web-design</category><category>guide</category></item><item><title>The difference between @ts-ignore and @ts-expect-error | Stefan Judis Web Development</title><link>https://www.stefanjudis.com/today-i-learned/the-difference-ts-ignore-and-ts-expect-error/</link><guid isPermaLink="true">https://www.stefanjudis.com/today-i-learned/the-difference-ts-ignore-and-ts-expect-error/</guid><pubDate>Fri, 14 Nov 2025 12:48:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@ts-expect-error&lt;/code&gt; will let you know when there’s no TypeScript error to silence and when it has become useless. &lt;code&gt;@ts-ignore&lt;/code&gt; will stay put and sit silently wherever you placed it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not only did I not know the difference between &lt;code&gt;@ts-ignore&lt;/code&gt; and &lt;code&gt;@ts-expect-error&lt;/code&gt;, I was totally unaware there was such a directive as &lt;code&gt;@ts-expect-error&lt;/code&gt;.&lt;/p&gt;
</content:encoded><category>typescript</category><category>stefan-judis</category></item><item><title>Safari drops support for the theme-color meta tag</title><link>https://arpit.blog/articles/2025/11/safari-drops-support-theme-color/</link><guid isPermaLink="true">https://arpit.blog/articles/2025/11/safari-drops-support-theme-color/</guid><pubDate>Sun, 09 Nov 2025 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;code&gt;&amp;lt;meta name=&quot;theme-color&quot;&amp;gt;&lt;/code&gt; tag is no longer supported in Safari 26 on macOS and iOS.&lt;/p&gt;
&lt;p&gt;If a fixed or sticky element touches the top or bottom edge of the window, then and only then, Safari extends that element’s background color into the corresponding top or bottom bar. Otherwise, on iOS, the bars remain translucent and have no solid color background.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=301756#c2&quot;&gt;Wenson Hseih explained on WebKit Bugzilla&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A solid background color extension (“top bar tint”) is only needed in cases where there’s a viewport-constrained (fixed or sticky) element near one of the edges of the viewport that borders an obscured content inset (such as the top toolbar on macOS, or compact tab bar on iOS), in order to avoid a gap above or below fixed elements in the page that would otherwise appear when scrolling. This color extension behaviour is more critical on iPhone, where there’s a much “softer” blur effect underneath the browser UI (and so more of the page underneath is otherwise directly visible).&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>theme-color</category><category>html</category><category>safari</category></item><item><title>Every site needs a Links Page / Why linking matters | Melon&apos;s Thoughts</title><link>https://thoughts.melonking.net/thoughts/every-site-needs-a-links-page-why-linking-matters</link><guid isPermaLink="true">https://thoughts.melonking.net/thoughts/every-site-needs-a-links-page-why-linking-matters</guid><pubDate>Fri, 07 Nov 2025 13:05:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;The goal of linking is about building community and creating networks that truly exist to support you and those around you; those networks will persist when social media lets you down.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>links</category><category>community</category><category>web</category></item><item><title>A cartoonist&apos;s review of AI art - The Oatmeal</title><link>https://theoatmeal.com/comics/ai_art</link><guid isPermaLink="true">https://theoatmeal.com/comics/ai_art</guid><pubDate>Tue, 04 Nov 2025 16:34:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;When I consume AI art, it also evokes a feeling. Good, bad, neutral—whatever. Until I find out that it’s AI art. Then I feel deflated, grossed out, and maybe a little bit bored.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>ai</category><category>art</category><category>the-oatmeal</category></item><item><title>View transitions: Handling aspect ratio changes</title><link>https://jakearchibald.com/2024/view-transitions-handling-aspect-ratio-changes/</link><guid isPermaLink="true">https://jakearchibald.com/2024/view-transitions-handling-aspect-ratio-changes/</guid><pubDate>Thu, 30 Oct 2025 03:50:00 GMT</pubDate><content:encoded>&lt;p&gt;To be honest, I had a tough time understanding this article completely. But that is a me problem because I think I don’t have the right mental model for view transitions yet. Nevertheless, I’m sure this article will be super helpful someday in the future.&lt;/p&gt;
</content:encoded><category>view-transitions</category><category>aspect-ratio</category><category>animations</category><category>css</category><category>jake-archibald</category></item><item><title>Enrique Peñalosa: Why buses represent democracy in action - YouTube</title><link>https://www.youtube.com/watch?v=j3YjeARuilI</link><guid isPermaLink="true">https://www.youtube.com/watch?v=j3YjeARuilI</guid><pubDate>Wed, 29 Oct 2025 11:16:00 GMT</pubDate><content:encoded>&lt;p&gt;Enrique Peñalosa on how to build cities that prioritise human beings over cars and guarantee a citizen’s right to safe mobility.&lt;/p&gt;
&lt;p&gt;In my opinion, the following bit at the start of the video certainly holds true for India:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The great inequality in developing countries makes it difficult to see, for example, that in terms of transport, an advanced city is not one where even the poor use cars, but rather one where even the rich use public transport or bicycles.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>mobility</category><category>public-transport</category><category>transport-infrastructure</category></item><item><title>How I used 11ty to power a world-class museum&apos;s digital infrastructure with Nic Chan | 11ty Meetup - YouTube</title><link>https://www.youtube.com/watch?v=RRqnRCXBpzY</link><guid isPermaLink="true">https://www.youtube.com/watch?v=RRqnRCXBpzY</guid><pubDate>Mon, 27 Oct 2025 14:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nic Chan on how they overcame the hurdle of getting the signs to refresh on a page in a signage browser with no JavaScript. The solution was using a &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tag that tells the browser to refresh the page after the given number of seconds.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; http-equiv&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;refresh&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;3600&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>meta</category><category>html</category><category>javascript</category><category>nic-chan</category></item><item><link>https://arpit.blog/notes/2025/10/root-pseudo-class-specificity/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/10/root-pseudo-class-specificity/</guid><description>&lt;p&gt;Today I learned, &lt;code&gt;:root&lt;/code&gt; (0-1-0) has a higher specificity than &lt;code&gt;html&lt;/code&gt; (0-0-1).&lt;/p&gt;
&lt;p&gt;In hindsight, it’s obvious. &lt;code&gt;:root&lt;/code&gt; is a CSS pseudo-class selector and, like most pseudo-class selectors, it has the same specificity as a class selector or an attribute selector.&lt;/p&gt;
</description><pubDate>Thu, 23 Oct 2025 13:13:00 GMT</pubDate><category>pseudo-class</category><category>specificity</category><category>css</category></item><item><title>The Simple Algorithm That Ants Use to Build Bridges | Quanta Magazine</title><link>https://www.quantamagazine.org/the-simple-algorithm-that-ants-use-to-build-bridges-20180226/</link><guid isPermaLink="true">https://www.quantamagazine.org/the-simple-algorithm-that-ants-use-to-build-bridges-20180226/</guid><pubDate>Thu, 16 Oct 2025 13:05:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;To see how this unfolds, take the perspective of an ant on the march. When it comes to a gap in its path, it slows down. The rest of the colony, still barreling along at 12 centimeters per second, comes trampling over its back. At this point, two simple rules kick in.&lt;/p&gt;
&lt;p&gt;The first tells the ant that when it feels other ants walking on its back, it should freeze. “As long as someone walks over you, you stay put,” Garnier said.&lt;/p&gt;
&lt;p&gt;This same process repeats in the other ants: They step over the first ant, but — uh-oh — the gap is still there, so the next ant in line slows, gets trampled and freezes in place. In this way, the ants build a bridge long enough to span whatever gap is in front of them. The trailing ants in the colony then walk over it.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>ants</category><category>algorithm</category><category>rules</category><category>emergence</category></item><item><title>Astro RSS MDX</title><link>https://blog.damato.design/posts/astro-rss-mdx/</link><guid isPermaLink="true">https://blog.damato.design/posts/astro-rss-mdx/</guid><pubDate>Wed, 15 Oct 2025 04:18:00 GMT</pubDate><content:encoded>&lt;p&gt;I love Astro. But for the life of me, I couldn’t figure out how to render the entire post content in my RSS feeds correctly. This article by &lt;a href=&quot;https://donnie.damato.design/&quot;&gt;Donnie D’Amato&lt;/a&gt; has been a lifesaver in this regard.&lt;/p&gt;
</content:encoded><category>astro</category><category>rss</category><category>mdx</category><category>resource</category></item><item><title>An alt Decision Tree | Web Accessibility Initiative (WAI) | W3C</title><link>https://www.w3.org/WAI/tutorials/images/decision-tree/</link><guid isPermaLink="true">https://www.w3.org/WAI/tutorials/images/decision-tree/</guid><pubDate>Mon, 13 Oct 2025 14:27:00 GMT</pubDate><content:encoded>&lt;p&gt;A great resource to understand how to use the &lt;code&gt;alt&lt;/code&gt; attribute in various situations.&lt;/p&gt;
</content:encoded><category>alt</category><category>img</category><category>html</category><category>resource</category><category>guide</category></item><item><link>https://arpit.blog/notes/2025/10/img-alt-attribute/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/10/img-alt-attribute/</guid><description>&lt;p&gt;I keep forgetting, but the &lt;code&gt;alt&lt;/code&gt; attribute of the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element is not just useful for users who are visually impaired. It is also useful when the image is not displayed in the browser for whatever reason. For example: the &lt;code&gt;src&lt;/code&gt; attribute does not contain a valid path to an image.&lt;/p&gt;
</description><pubDate>Mon, 13 Oct 2025 05:02:00 GMT</pubDate><category>alt</category><category>img</category><category>accessibility</category><category>html</category></item><item><link>https://arpit.blog/notes/2025/10/john-mayer-on-being-yourself/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/10/john-mayer-on-being-yourself/</guid><description>&lt;p&gt;&lt;a href=&quot;https://youtube.com/watch?v=_GQbDRGm__o&amp;amp;t=2768&quot;&gt;John Mayer on how trying and not doing it well enough is a wonderful technique for being yourself&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Failing to sound exactly like the person you want to sound like is a wonderful way to sound like yourself. So I’m not necessarily thinking this thing from scratch, going, &lt;i&gt;Okay, I’m gonna, like, do Jerry-esque things, but I’m still gonna sound like me.&lt;/i&gt; No, it’s more like, &lt;i&gt;I want to sound just like Jerry,&lt;/i&gt; and then the way I naturally, obviously don’t — that’s your personality. Music doesn’t let you lie. […] You try to sound like who you want to sound like, and you just will always end up sounding like you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I like this advice. It is an interesting take on the learning by copying method.&lt;/p&gt;
</description><pubDate>Sun, 12 Oct 2025 12:55:00 GMT</pubDate><category>learning</category><category>john-mayer</category></item><item><title>While you’re fixing the fun stuff, fix the important stuff too - Piccalilli</title><link>https://piccalil.li/blog/while-youre-fixing-the-fun-stuff-fix-the-important-stuff-too/</link><guid isPermaLink="true">https://piccalil.li/blog/while-youre-fixing-the-fun-stuff-fix-the-important-stuff-too/</guid><pubDate>Wed, 01 Oct 2025 12:57:00 GMT</pubDate><content:encoded>&lt;p&gt;Initially, I thought this was just an article on how to fix the janky hover state of a card component. But it also goes over the HTML markup for a typical card component in the context of semantics and accessibility.&lt;/p&gt;
</content:encoded><category>accessibility</category><category>hover</category><category>card</category><category>piccalilli</category></item><item><title>Adactio: Journal—Mind set</title><link>https://adactio.com/journal/9688</link><guid isPermaLink="true">https://adactio.com/journal/9688</guid><pubDate>Wed, 01 Oct 2025 09:21:00 GMT</pubDate><content:encoded>&lt;p&gt;Ah! Good old Jeremy Keith, insightful and funny.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I really want to change someone’s mind, then I need to make the effort to first understand their mind. That’s going to be far more productive than declaring that my own mind is made up. After all, if &lt;em&gt;I&lt;/em&gt; show no willingness to consider alternative viewpoints, why should they?&lt;/p&gt;
&lt;p&gt;There’s an old saying that before criticising someone, you should walk a mile in their shoes. I’m going to try to put that into practice, and not for the two obvious reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If we still disagree, now we’re a mile away from each other, and&lt;/li&gt;
&lt;li&gt;I’ve got their shoes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
</content:encoded><category>mindset</category><category>discussion</category><category>debate</category><category>jeremy-keith</category></item><item><link>https://arpit.blog/notes/2025/10/whimsical-animations/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/10/whimsical-animations/</guid><description>&lt;p&gt;I just purchased &lt;a href=&quot;https://whimsy.joshwcomeau.com/&quot;&gt;Josh Comeau’s new course, Whimsical Animations&lt;/a&gt;. The course page itself has some delightful animations.&lt;/p&gt;
&lt;p&gt;PS: I also discovered &lt;a href=&quot;https://fonts.google.com/specimen/Gochi+Hand&quot;&gt;Gochi Hand, a cute handwritten font&lt;/a&gt;, on the course page.&lt;/p&gt;
</description><pubDate>Wed, 01 Oct 2025 05:18:00 GMT</pubDate><category>animations</category><category>course</category><category>fonts</category></item><item><title>Browsing the web - Learn web development | MDN</title><link>https://developer.mozilla.org/en-US/docs/Learn_web_development/Getting_started/Environment_setup/Browsing_the_web#how_the_web_works_the_basics</link><guid isPermaLink="true">https://developer.mozilla.org/en-US/docs/Learn_web_development/Getting_started/Environment_setup/Browsing_the_web#how_the_web_works_the_basics</guid><pubDate>Mon, 22 Sep 2025 06:05:00 GMT</pubDate><content:encoded>&lt;p&gt;I really like this explanation of what happens in between the user entering a web address into the browser and the browser displaying the result.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The web browser requests the resource you want to access from the web server it is stored on.&lt;/li&gt;
&lt;li&gt;If the request is successful, the web server sends a response back to the web browser containing the requested resource.&lt;/li&gt;
&lt;li&gt;In some cases, the requested resource will then fire off more requests, which will result in more responses.&lt;/li&gt;
&lt;li&gt;When all of the resources have been requested, the web browser parses and renders them as required, before displaying the result to the user.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>web</category></item><item><link>https://arpit.blog/notes/2025/09/web-page/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/09/web-page/</guid><description>&lt;p&gt;Just like a word document can be displayed in a word processing application, a web page is simply an HTML document that can be displayed in a web browser. The only difference is that a web page can embed a variety of different types of resources such as styles, fonts, images, scripts, and so on.&lt;/p&gt;
</description><pubDate>Mon, 22 Sep 2025 05:48:00 GMT</pubDate><category>web</category></item><item><link>https://arpit.blog/notes/2025/09/relative-color-syntax-alpha/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/09/relative-color-syntax-alpha/</guid><description>&lt;p&gt;&lt;a href=&quot;https://mastodon.social/@anatudor/115214693132139947&quot;&gt;Ana Tudor wrote on Mastodon&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Stupid #CSS question because I’m losing my mind here: why isn’t calc(.5*a) working? What am I missing? It doesn’t seem to be working in any browser.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ana is trying to use &lt;code&gt;calc(.5 * a)&lt;/code&gt; as a part of the relative color syntax, presumably to create semi transparent outlines. But it is not working because &lt;code&gt;calc(.5 * a)&lt;/code&gt; is an invalid property value. As &lt;a href=&quot;https://fedi.valtlai.fi/@valtlai/115214702277627522&quot;&gt;Valtteri Laitinen replied&lt;/a&gt;, it should actually be &lt;code&gt;alpha&lt;/code&gt; in there instead of &lt;code&gt;a&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	outline-color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; rgb&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;(from currentcolor r g b / &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;calc&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;(0.5 &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; a))&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* ❌ invalid */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	outline-color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; rgb&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		from currentcolor r g b / &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;calc&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;(0.5 &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; alpha)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	)&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* ✅ valid */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Wed, 17 Sep 2025 03:01:00 GMT</pubDate><category>color</category><category>css</category></item><item><link>https://arpit.blog/notes/2025/08/heydon-html-article-element/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/08/heydon-html-article-element/</guid><description>&lt;p&gt;I re-read &lt;a href=&quot;https://heydonworks.com/article/the-article-element/&quot;&gt;Heydon Pickering’s post on the HTML article element&lt;/a&gt; in the middle of writing the markup for a new website.&lt;/p&gt;
&lt;p&gt;Heydon’s writing is so sharp and funny. Unmistakably theirs. No one else writes quite like them, and I’m here for it.&lt;/p&gt;
</description><pubDate>Thu, 14 Aug 2025 02:42:00 GMT</pubDate><category>heydon-pickering</category><category>article-element</category><category>html</category></item><item><link>https://arpit.blog/notes/2025/08/custom-prop-meta-theme-color/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/08/custom-prop-meta-theme-color/</guid><description>&lt;p&gt;I was reading &lt;a href=&quot;https://css-tricks.com/meta-theme-color-and-trickery/#aa-custom-properties&quot;&gt;Manuel Matuzovic’s article on meta theme
color&lt;/a&gt;
and came across this snippet:&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;	:root&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;		--theme&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; blue&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;theme-color&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;var(--theme)&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I wish it was possible to access custom properties outside the &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. It would keep things &lt;i&gt;DRY&lt;/i&gt;.&lt;/p&gt;
</description><pubDate>Wed, 13 Aug 2025 05:03:00 GMT</pubDate><category>theme-color</category><category>html</category><category>css</category></item><item><title>Natural sorting of strings that contain numbers in JavaScript</title><link>https://arpit.blog/articles/2025/04/sorting-strings-that-contain-numbers-in-javascript/</link><guid isPermaLink="true">https://arpit.blog/articles/2025/04/sorting-strings-that-contain-numbers-in-javascript/</guid><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In JavaScript, things get interesting when you need to sort strings that contain numbers in a way that matches human expectations.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; files&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;#39;IMG_2.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;IMG_1.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;IMG_10.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;IMG_20.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.sort&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;// Output: [&amp;#39;IMG_1.png&amp;#39;, &amp;#39;IMG_10.png&amp;#39;, &amp;#39;IMG_2.png&amp;#39;, &amp;#39;IMG_20.png&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This happens because, by default, when no compare function is provided, JavaScript’s array &lt;code&gt;sort()&lt;/code&gt; method converts the elements into strings, then compares their sequences of UTF-16 code unit values.&lt;/p&gt;
&lt;p&gt;This behaviour is well documented on &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort&quot;&gt;MDN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, how do we sort arrays like the ones above in a more accurate, human-friendly order?&lt;/p&gt;
&lt;p&gt;This is where the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator/compare&quot;&gt;&lt;code&gt;compare()&lt;/code&gt; method of the &lt;code&gt;Intl.Collator&lt;/code&gt; API&lt;/a&gt; with the &lt;code&gt;numeric: true&lt;/code&gt; option shines. It provides the natural sorting behaviour that correctly handles numbers alongside other characters.&lt;/p&gt;
&lt;p&gt;When &lt;code&gt;numeric: true&lt;/code&gt; is set, the collator detects numeric substrings inside the strings and parses those substrings as actual numbers, not as sequences of digits. And then it compares the numbers numerically, not character by character.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; naturalOrder&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; Intl&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.Collator&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	numeric&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}).compare;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; files&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;#39;IMG_2.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;IMG_1.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;IMG_10.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &amp;#39;IMG_20.png&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.sort&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;((a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; b) &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; naturalOrder&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; b));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;// Output: [&amp;#39;IMG_1.png&amp;#39;, &amp;#39;IMG_2.png&amp;#39;, &amp;#39;IMG_10.png&amp;#39;, &amp;#39;IMG_20.png&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hat tip to &lt;a href=&quot;https://jan.miksovsky.com/posts/2025/04-17-zero-dependencies&quot;&gt;Jan Miksovsky&lt;/a&gt;, whose &lt;a href=&quot;https://github.com/WebOrigami/pondlife-zero-deps&quot;&gt;zero dependencies SSG project&lt;/a&gt; led me to discover this.&lt;/p&gt;</content:encoded><category>sort</category><category>internationalization</category><category>javascript</category></item><item><title>Missed Connections - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2025/missed-connections/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2025/missed-connections/</guid><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jim Nielsen on the personal connections formed on the internet.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You could search the world and find someone who saw what you see, felt what you feel, went through what you’re going through.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And how these connections are increasingly being lost when we prompt an impersonal LLM instead.&lt;/p&gt;
</content:encoded><category>connections</category><category>ai</category><category>llm</category><category>jim-nielsen</category></item><item><link>https://arpit.blog/notes/2025/02/grid-auto-rows-grid-auto-columns/</link><guid isPermaLink="true">https://arpit.blog/notes/2025/02/grid-auto-rows-grid-auto-columns/</guid><description>&lt;p&gt;Today I learned, &lt;code&gt;grid-auto-columns&lt;/code&gt; and &lt;code&gt;grid-auto-rows&lt;/code&gt; size implicit tracks as well as any explicit tracks that are not explicitly sized by by &lt;code&gt;grid-template-rows&lt;/code&gt; or &lt;code&gt;grid-template-columns&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Until now, I was under the impression that &lt;code&gt;grid-auto-rows&lt;/code&gt; and &lt;code&gt;grid-auto-columns&lt;/code&gt; size only implicit grid tracks.&lt;/p&gt;
</description><pubDate>Wed, 05 Feb 2025 00:00:00 GMT</pubDate><category>grid</category><category>css</category></item><item><title>Why is `grid-row: 1/-1` not working?</title><link>https://arpit.blog/articles/2025/02/why-is-grid-row-1--1-not-working/</link><guid isPermaLink="true">https://arpit.blog/articles/2025/02/why-is-grid-row-1--1-not-working/</guid><pubDate>Wed, 05 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;code&gt;grid-row&lt;/code&gt; grid-placement property is shorthand for &lt;code&gt;grid-row-start&lt;/code&gt; and &lt;code&gt;grid-row-end&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.grid-item&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	grid-row&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 1/-1&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;	/* is equivalent to */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	grid-row-start&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	grid-row-end&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; -1&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the above declaration, we use integers to position and size the grid item by line numbers.&lt;/p&gt;
&lt;p&gt;As per the &lt;a href=&quot;https://www.w3.org/TR/css-grid-1/#:~:text=Numeric,-indexes%20in%20the&quot;&gt;spec&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Numeric indexes in the grid-placement properties count from the edges of the explicit grid. Positive indexes count from the start side (starting from 1 for the start-most explicit line), while negative indexes count from the end side (starting from -1 for the end-most explicit line).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The important bit is the explicit grid. This begs the question …&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-explicit-grid&quot;&gt;What is the explicit grid?&lt;/h2&gt;
&lt;p&gt;As per the &lt;a href=&quot;https://www.w3.org/TR/css-grid-1/#explicit-grids&quot;&gt;spec&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The three properties &lt;code&gt;grid-template-rows&lt;/code&gt;, &lt;code&gt;grid-template-columns&lt;/code&gt;, and &lt;code&gt;grid-template-areas&lt;/code&gt; together define the explicit grid of a grid container by specifying its explicit grid tracks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Simply put, the explicit grid consists of manually defined rows and columns.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The size of the explicit grid is determined by the larger of the number of rows/columns defined by &lt;code&gt;grid-template-areas&lt;/code&gt; and the number of rows/columns sized by &lt;code&gt;grid-template-rows&lt;/code&gt;/&lt;code&gt;grid-template-columns&lt;/code&gt;. Any rows/columns defined by &lt;code&gt;grid-template-areas&lt;/code&gt; but not sized by &lt;code&gt;grid-template-rows&lt;/code&gt;/&lt;code&gt;grid-template-columns&lt;/code&gt; take their size from the &lt;code&gt;grid-auto-rows&lt;/code&gt;/&lt;code&gt;grid-auto-columns&lt;/code&gt; properties. If these properties don’t define any explicit tracks the explicit grid still contains one grid line in each axis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That last bit is what leads to line -1 being the same line as 1 because the explicit grid still contains one grid line in each axis.&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-implicit-grid&quot;&gt;What is the implicit grid?&lt;/h2&gt;
&lt;p&gt;As &lt;a href=&quot;https://css-tricks.com/difference-explicit-implicit-grids/#aa-implicit-grids&quot;&gt;Manuel Matuzovic&lt;/a&gt; puts it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If there are more grid items than cells in the grid or when a grid item is placed outside of the explicit grid, the grid container automatically generates grid tracks by adding grid lines to the grid. The explicit grid together with these additional implicit tracks and lines forms the so called implicit grid.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Paraphrasing &lt;a href=&quot;https://x.com/jensimmons/status/1239587367046037504&quot;&gt;Jen Simmons&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-1 is the last line of the &lt;em&gt;explicit&lt;/em&gt; grid&lt;/li&gt;
&lt;li&gt;If you haven’t defined any explicit rows, then all your rows are implicit&lt;/li&gt;
&lt;li&gt;For implicit rows, -1 is the same line as 1&lt;/li&gt;
&lt;li&gt;Define explicit rows and &lt;code&gt;grid-row: 1/-1&lt;/code&gt; will work as expected&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/63775143/how-does-grid-row-1-1-actually-work-references-needed&quot;&gt;How does grid-row: 1 / -1 actually work?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/73559099/what-defines-an-explicit-grid&quot;&gt;What defines an explicit grid?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>grid</category><category>grid-placement</category><category>css</category></item><item><title>An idea to power your personal brand’s content game | beastoftraal.com</title><link>https://beastoftraal.com/2023/10/19/an-idea-to-power-your-personal-brands-content-game/</link><guid isPermaLink="true">https://beastoftraal.com/2023/10/19/an-idea-to-power-your-personal-brands-content-game/</guid><pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Karthik Srinivasan discusses how to use curation to build a personal brand and shares some steps to get started.&lt;/p&gt;
</content:encoded><category>personal-branding</category><category>curation</category><category>karthik-srinivasan</category></item><item><title>An underrated tip for personal branding | beastoftraal.com</title><link>https://beastoftraal.com/2023/10/05/an-underrated-tip-for-personal-branding/</link><guid isPermaLink="true">https://beastoftraal.com/2023/10/05/an-underrated-tip-for-personal-branding/</guid><pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Karthik Srinivasan uses his experience with running as an analogy to emphasize the importance of consistently showing up in the context of personal branding.&lt;/p&gt;
&lt;p&gt;I found the analogy effective and relatable, as I had a similar experience when I started running.&lt;/p&gt;
</content:encoded><category>personal-branding</category><category>persistence</category><category>karthik-srinivasan</category></item><item><title>Just Build Websites - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2024/just-build-websites/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2024/just-build-websites/</guid><pubDate>Tue, 20 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jim Nielsen uses his experience with golf as a metaphor to explain that the key to success in web development comes from actual practice — building websites — rather than obsessing over what tools, frameworks and technologies others are using.&lt;/p&gt;
</content:encoded><category>build</category><category>golf</category><category>jim-nielsen</category></item><item><title>Personal branding is like your credit score</title><link>https://beastoftraal.com/2024/07/03/personal-branding-is-like-your-credit-score/</link><guid isPermaLink="true">https://beastoftraal.com/2024/07/03/personal-branding-is-like-your-credit-score/</guid><pubDate>Tue, 20 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Personal branding is about bringing focus to your touchpoints with the world (of strangers) so that the right kinds of people can find you and remember you. You make use of the attention when you really need it. But it is good to be in the consideration set.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>personal-branding</category><category>karthik-srinivasan</category></item><item><title>Redesigning Piccalilli: the first part of the design process</title><link>https://piccalil.li/blog/redesigning-piccalilli-the-first-part-of-the-design-process/</link><guid isPermaLink="true">https://piccalil.li/blog/redesigning-piccalilli-the-first-part-of-the-design-process/</guid><pubDate>Mon, 29 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As a freelancer, I’m always eager to learn how other folks work. &lt;a href=&quot;https://piccalil.li/&quot;&gt;Piccalilli’s&lt;/a&gt; behind-the-scenes look at their redesign is extremely useful.&lt;/p&gt;
</content:encoded><category>priority-guides</category><category>design</category></item><item><title>Crowdstruck (Windows Outage) - Computerphile - YouTube</title><link>https://www.youtube.com/watch?v=rlaNMJeA1EA</link><guid isPermaLink="true">https://www.youtube.com/watch?v=rlaNMJeA1EA</guid><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dr. Steve Bagley explains in layman’s terms what an operating system is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] Imagine the difference between a house and a hotel. If you own a house, you can decide how to use the rooms, what color to paint the walls. But if that house becomes a hotel, you might give people the option to change the air conditioning temperature, but you wouldn’t let them fit air conditioning into their room without permission from the building owner. And it’s a bit the same with a computer. The operating system is a bit like the people who run the hotel in that it’s controlling all the resources for the system. So if Microsoft Word crashes, these days it’s not going to take down your computer because the operating system is set up in such a way that it can access resources that have been assigned to it and clean that up, and everything else continues hunky-dory.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And what happens if the operating system crashes and you get the &lt;a href=&quot;https://en.wikipedia.org/wiki/Blue_screen_of_death&quot;&gt;blue screen of death&lt;/a&gt; (BSoD):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At that point, the thing that’s in charge of controlling everything has gone wrong, is corrupted, and can no longer run. So there’s pretty much no option at that point other than to halt the machine, say something’s gone wrong, and let the user reboot and restart.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>operating-system</category><category>computerphile</category></item><item><link>https://arpit.blog/notes/2024/07/css-grid-areas/</link><guid isPermaLink="true">https://arpit.blog/notes/2024/07/css-grid-areas/</guid><description>&lt;p&gt;I got the opportunity to proofread &lt;a href=&quot;https://ishadeed.com/article/css-grid-area/&quot;&gt;Ahmad Shadeed’s latest article on CSS Grid Areas&lt;/a&gt; before its release. It inspired me to refactor the code on my site to use &lt;code&gt;grid-template-areas&lt;/code&gt;.&lt;/p&gt;
</description><pubDate>Mon, 22 Jul 2024 00:00:00 GMT</pubDate><category>grid</category><category>css</category><category>ahmad-shadeed</category></item><item><title>Testing HTML With Modern CSS</title><link>https://heydonworks.com/article/testing-html-with-modern-css/</link><guid isPermaLink="true">https://heydonworks.com/article/testing-html-with-modern-css/</guid><pubDate>Sat, 20 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wow! Who knew you could use modern CSS to test HTML? Well, Heydon certainly did!&lt;/p&gt;
</content:encoded><category>testing</category><category>html</category><category>css</category><category>heydon-pickering</category></item><item><title>Styling Tables the Modern CSS Way - Piccalilli</title><link>https://piccalil.li/blog/styling-tables-the-modern-css-way</link><guid isPermaLink="true">https://piccalil.li/blog/styling-tables-the-modern-css-way</guid><pubDate>Fri, 19 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article by &lt;a href=&quot;https://michellebarker.co.uk/&quot;&gt;Michelle Barker&lt;/a&gt; for Piccalilli is a great read. I learned about a bunch of new CSS properties that I didn’t know existed.&lt;/p&gt;
</content:encoded><category>table</category><category>css</category><category>piccalilli</category></item><item><title>Blinded By the Light DOM  –  Eric’s Archived Thoughts</title><link>https://meyerweb.com/eric/thoughts/2023/11/01/blinded-by-the-light-dom/</link><guid isPermaLink="true">https://meyerweb.com/eric/thoughts/2023/11/01/blinded-by-the-light-dom/</guid><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eric Meyer describes his journey of learning about and implementing fully-Light-DOM web components.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You just take some normal HTML markup, wrap it with a custom element, and then write some JS to add capabilities which you can then style with regular CSS! Everything’s of the Light Side of the Web. No need to pierce the Vale of Shadows or whatever.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>web-components</category><category>custom-elements</category><category>eric-meyer</category></item><item><title>Adactio: Journal—HTML web components</title><link>https://adactio.com/journal/20618</link><guid isPermaLink="true">https://adactio.com/journal/20618</guid><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jeremy Keith discusses what makes a custom element an HTML web component.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your custom element is empty, it’s not an HTML web component. But if you’re using a custom element to extend existing markup, that’s an HTML web component.&lt;/p&gt;
&lt;p&gt;React encouraged a mindset of replacement: “forgot &lt;em&gt;[sic]&lt;/em&gt; what browsers can do; do everything in a React component instead, even if you’re reinventing the wheel.”&lt;/p&gt;
&lt;p&gt;HTML web components encourage a mindset of augmentation instead.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>web-components</category><category>custom-elements</category><category>progressive-enhancement</category><category>jeremy-keith</category></item><item><title>You Want border-color: transparent, Not border: none – Frontend Masters Blog</title><link>https://frontendmasters.com/blog/you-want-border-color-transparent-not-border-none/</link><guid isPermaLink="true">https://frontendmasters.com/blog/you-want-border-color-transparent-not-border-none/</guid><pubDate>Tue, 21 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this article, Dave Rupert explains how testing in forced colors mode improves accessibility for users and reveals design flaws, such as excessive reliance on color cues.&lt;/p&gt;
</content:encoded><category>forced-colors</category><category>testing</category><category>high-contrast-mode</category><category>low-vision</category><category>accessibility</category><category>design</category><category>dave-rupert</category></item><item><title>Digging Into The Display Property: The Two Values Of Display — Smashing Magazine</title><link>https://www.smashingmagazine.com/2019/04/display-two-value/</link><guid isPermaLink="true">https://www.smashingmagazine.com/2019/04/display-two-value/</guid><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.w3.org/TR/css-display-3&quot;&gt;Level 3 of the Display specification&lt;/a&gt;, the value of &lt;code&gt;display&lt;/code&gt; is defined as two keywords. These keywords define the outer value of display, which will be &lt;code&gt;inline&lt;/code&gt; or &lt;code&gt;block&lt;/code&gt; and therefore define how the element behaves in the layout alongside other elements. They also define the inner value of the element — or how the direct children of that element behave.&lt;/p&gt;
&lt;p&gt;This means that when you say &lt;code&gt;display: grid&lt;/code&gt;, what you are really saying is &lt;code&gt;display: block grid&lt;/code&gt;. You are asking for a block level grid container. An element that will have all of the block attributes — you can give it height and width, margin and padding, and it will stretch to fill the container. The children of that container, however, have been given the inner value of &lt;code&gt;grid&lt;/code&gt; so they become grid items. How those grid items behave is defined in the CSS Grid Specification: the &lt;code&gt;display&lt;/code&gt; spec gives us a way to tell the browser that this is the layout method we want to use.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As simply put by Rachel:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you define layout on a box in CSS, you are defining what happens to this box in terms of how it behaves in relation to all of the other boxes in the layout. You are also defining how the children of that box behave.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>display</category><category>layout</category><category>css</category><category>rachel-andrew</category><category>smashing-magazine</category></item><item><title>Transparent borders</title><link>https://arpit.blog/articles/2024/05/transparent-borders/</link><guid isPermaLink="true">https://arpit.blog/articles/2024/05/transparent-borders/</guid><pubDate>Sun, 12 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In web development, small design decisions can have a significant impact on accessibility and user experience. One such decision is how we handle borders on interactive elements.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-with-border-none&quot;&gt;The problem with border: none&lt;/h2&gt;
&lt;p&gt;When styling interactive elements like buttons, it’s common practice to remove default borders using &lt;code&gt;border: none&lt;/code&gt;. However, this approach can lead to accessibility issues, especially in &lt;a href=&quot;https://arpit.blog/blog/testing-in-forced-colors-mode/&quot;&gt;high contrast mode&lt;/a&gt;. As demonstrated in the image below, removing the border entirely can cause buttons to appear as floating text on the page, making it difficult for users with low vision to distinguish interactive elements.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://arpit.blog/_astro/slae-before-after-high-contrast-mode.DZV7xYGL_Z2b3SWO.webp&quot; alt=&quot;Side-by-side comparison of the contact form on Slae.app. The left image shows the contact form with forced colors disabled, displaying the default color scheme. The right image shows the contact form with forced colors enabled. In the right image, the submit button appears as floating text on the page.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;596&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://frontendmasters.com/blog/you-want-border-color-transparent-not-border-none/&quot;&gt;Dave Rupert&lt;/a&gt; explains the importance of the default border and why it exists:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the case of interactive form controls (inputs, textareas, buttons, etc.), those pesky borders were put there because they have an accessibility benefit when using High Contrast Mode, a feature &lt;a href=&quot;https://webaim.org/projects/lowvisionsurvey2/#at&quot;&gt;used by 30.6% of low-vision users&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-transparent-border-solution&quot;&gt;The transparent border solution&lt;/h2&gt;
&lt;p&gt;To address this issue, Dave recommends making the border or outline transparent instead of removing it entirely. This can be achieved with the following CSS:&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	border-color&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; transparent&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As demonstrated in the image below, this approach is effective for several reasons. First, sighted users will not notice the difference. Second, as &lt;a href=&quot;https://polypane.app/blog/forced-colors-explained-a-practical-guide/&quot;&gt;Kilian Valkhof&lt;/a&gt; explains, in forced color mode, the border color or outline color “will be overwritten with the current text color, making it nicely visible again without needing any special adaption or re-styling for forced color mode.”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://arpit.blog/_astro/slae-before-after-transparent-border.sJpjMR8c_Z1FuV5Y.webp&quot; alt=&quot;Side-by-side comparison of the contact form on Slae.app with the transparent border solution applied. The left image shows the contact form with forced colors disabled, displaying the default color scheme. The right image shows the contact form with forced colors enabled. In the right image, the submit button appears as a button.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;959&quot; height=&quot;596&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;user-experience-benefits&quot;&gt;User experience benefits&lt;/h2&gt;
&lt;p&gt;Using transparent borders offers additional benefits for user experience. Consider hover effects, for example.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	border&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; none&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;:hover&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	border&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; solid navy&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In such situations, applying a visible border on hover can inadvertently change the element’s dimensions. This change in size can result in a jarring visual effect.&lt;/p&gt;
&lt;p&gt;By setting a transparent border in the default state, we ensure smooth transitions and consistent element sizes across different states.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;quot;no-border-btn&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;Button with no border&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;quot;transparent-border-btn&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;Button with transparent border&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground);overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.no-border-btn&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	border&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; none&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;hover {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		border: 2&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; solid navy&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.transparent-border-btn&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	border&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; solid transparent&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;hover {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;		border-color: navy&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;implications-for-design-systems&quot;&gt;Implications for design systems&lt;/h2&gt;
&lt;p&gt;Transparent borders are also valuable in the context of themeable design systems. &lt;a href=&quot;https://bradfrost.com/blog/post/transparent-borders/&quot;&gt;Brad Frost&lt;/a&gt; elaborates:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When supporting multiple theme, it can be common for some themes to use borders while others don’t. This flexibility is great! Each brand is able to express themselves how they see fit. But if implemented using different border widths, shifts in the box model happen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By using &lt;code&gt;border-color: transparent&lt;/code&gt; for themes without visible borders, designers and developers can maintain consistent element sizes across different variants and themes. This approach provides the flexibility to adapt the visual design while preserving the underlying structure and layout of the components.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Implementing transparent borders in your CSS addresses crucial accessibility concerns, enhances user experience across different display modes, and provides the flexibility needed for robust, adaptable design systems.&lt;/p&gt;</content:encoded><category>accessibility</category><category>high-contrast-mode</category><category>design-systems</category><category>css</category><category>dave-rupert</category><category>brad-frost</category></item><item><title>Embrace the Platform – Bram.us</title><link>https://www.bram.us/2023/12/12/embrace-the-platform-article/</link><guid isPermaLink="true">https://www.bram.us/2023/12/12/embrace-the-platform-article/</guid><pubDate>Thu, 09 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;If there’s one thing you can do to make your websites better, it is to embrace what the web platform gives you: HTML, CSS, and JavaScript — in that order. Apply the Rule of Least Power. Build with progressive enhancement in mind. You’ll be a happier developer. Your visitors will be happier, too, as things work as expected.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>web-platform</category><category>bramus</category></item><item><title>The Case For Design Engineers, Pt. II - Jim Nielsen’s Blog</title><link>https://blog.jim-nielsen.com/2024/the-case-for-design-engineers-pt-ii/</link><guid isPermaLink="true">https://blog.jim-nielsen.com/2024/the-case-for-design-engineers-pt-ii/</guid><pubDate>Tue, 02 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jim Nielsen makes the case for design engineers as professionals who do design work with code. He also emphasizes the limitations of traditional design tools, which often produce static images that don’t fully capture the dynamic nature of web interactions, and advocates for designing in the browser instead.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You need someone who can do design work with code.&lt;/p&gt;
&lt;p&gt;That’s right: design work with code.&lt;/p&gt;
&lt;p&gt;Pixels of an interface from a GUI tool are a static representations of a dynamic form. It’s the difference between a picture of me and the living, breathing, moving me.&lt;/p&gt;
&lt;p&gt;Design engineers don’t just push pixels around in a GUI tool, they do it in a web browser — the medium of delivery — designing not just the visuals but the interactions that make sense for a living, breathing, moving interface.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>design</category><category>designing-in-the-browser</category><category>design-engineers</category><category>jim-nielsen</category></item><item><link>https://arpit.blog/notes/2024/01/text-underline-offset/</link><guid isPermaLink="true">https://arpit.blog/notes/2024/01/text-underline-offset/</guid><description>&lt;p&gt;Thanks to &lt;a href=&quot;https://youtube.com/watch?v=x3MTfp3HDLc&amp;amp;t=506&quot;&gt;Kevin Powell&lt;/a&gt;, today I learned that the &lt;code&gt;text-underline-offset&lt;/code&gt; property is named so because it &lt;em&gt;only&lt;/em&gt; applies to underlines and not other &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/text-decoration-line&quot;&gt;&lt;code&gt;text-decoration-line&lt;/code&gt;&lt;/a&gt; values like &lt;code&gt;overline&lt;/code&gt; and &lt;code&gt;line-through&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;Example&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	text-decoration-line&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; underline overline&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* We can set multiple line-decoration properties at once */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;	text-underline-offset&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 16&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;/* Only impacts underline */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Fri, 19 Jan 2024 01:30:00 GMT</pubDate><category>underline</category><category>text-decoration</category><category>kevin-powell</category><category>css</category></item></channel></rss>