<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexander Pershin</title>
    <description>The latest articles on DEV Community by Alexander Pershin (@polyuretanio).</description>
    <link>https://dev.to/polyuretanio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3661057%2F034e0097-3688-4d04-bf7d-bddcbb79a70f.jpeg</url>
      <title>DEV Community: Alexander Pershin</title>
      <link>https://dev.to/polyuretanio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/polyuretanio"/>
    <language>en</language>
    <item>
      <title>Rethinking UI State: CSS Range Syntax vs Class Toggling</title>
      <dc:creator>Alexander Pershin</dc:creator>
      <pubDate>Thu, 26 Feb 2026 17:05:40 +0000</pubDate>
      <link>https://dev.to/polyuretanio/rethinking-ui-state-css-range-syntax-vs-class-toggling-2c75</link>
      <guid>https://dev.to/polyuretanio/rethinking-ui-state-css-range-syntax-vs-class-toggling-2c75</guid>
      <description>&lt;p&gt;For years, we've handled UI state by toggling classes in JavaScript.&lt;/p&gt;

&lt;p&gt;User selects a date range? Loop through elements → add/remove classes.&lt;/p&gt;

&lt;p&gt;It works. But it tightly couples visual state to DOM manipulation.&lt;/p&gt;

&lt;p&gt;With the emerging CSS Range Syntax, we can rethink that pattern.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which classes should JS toggle?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What if CSS evaluates the condition itself?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's walk through a concrete example.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Traditional Pattern: JavaScript Controls Visual State
&lt;/h2&gt;

&lt;p&gt;Imagine a calendar where users select a start and end date.&lt;/p&gt;

&lt;p&gt;A typical implementation looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;days&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;day&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;in-range&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;in-range&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  reads values from the DOM&lt;/li&gt;
&lt;li&gt;  performs the comparison&lt;/li&gt;
&lt;li&gt;  mutates classes&lt;/li&gt;
&lt;li&gt;  controls visual state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problems?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  JS depends on DOM structure&lt;/li&gt;
&lt;li&gt;  Refactoring markup can break logic&lt;/li&gt;
&lt;li&gt;  State and presentation are coupled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s nothing inherently wrong with this approach — it’s simply imperative.&lt;/p&gt;




&lt;h2&gt;
  
  
  A CSS-First Alternative
&lt;/h2&gt;

&lt;p&gt;What if JavaScript only updated state values?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--day-start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--day-end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each day exposes its numeric value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"day day-now"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--day: 12"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;12&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now CSS performs the comparison.&lt;/p&gt;

&lt;p&gt;With Range Syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.day-now&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--day-start&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;--day&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;--day-end&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="m"&gt;#8b0000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="err"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No loops, no class toggling, no DOM mutation.&lt;/p&gt;

&lt;p&gt;JavaScript updates state. CSS evaluates presentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Live Demo (CSS Range Syntax)
&lt;/h2&gt;

&lt;p&gt;In this version, JavaScript only updates state values. CSS evaluates the range condition directly. Requires Chrome 142+ (experimental support).&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/pershin-zan/embed/zxKxjqg?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Try changing the &lt;code&gt;start&lt;/code&gt; and &lt;code&gt;end&lt;/code&gt; values in the JS panel and see how the UI responds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is Architecturally Interesting
&lt;/h2&gt;

&lt;p&gt;This shifts how we divide concerns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;handles interaction&lt;/li&gt;
&lt;li&gt;updates state values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;evaluates visual conditions&lt;/li&gt;
&lt;li&gt;renders based on state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The logic that determines &lt;em&gt;how something looks&lt;/em&gt; lives where it belongs – in CSS.&lt;/p&gt;




&lt;h2&gt;
  
  
  DOM Refactors Become Less Fragile
&lt;/h2&gt;

&lt;p&gt;In the traditional approach, JS might depend on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.calendar .row .day&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restructure the DOM, and your logic may break.&lt;/p&gt;

&lt;p&gt;In the CSS-driven model, JS doesn't care about structure. It only sets &lt;code&gt;--day-start&lt;/code&gt; and &lt;code&gt;--day-end&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As long as each day exposes &lt;code&gt;--day&lt;/code&gt;, styling works.&lt;/p&gt;

&lt;p&gt;This reduces structural coupling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Browser Support – And a Practical Fallback
&lt;/h2&gt;

&lt;p&gt;Range Syntax is still emerging and not fully supported in stable&lt;br&gt;
browsers yet.&lt;/p&gt;

&lt;p&gt;But the architectural pattern doesn't depend on it.&lt;/p&gt;

&lt;p&gt;Today, we can emulate similar logic using &lt;code&gt;clamp()&lt;/code&gt; and arithmetic with custom properties.&lt;/p&gt;

&lt;p&gt;Example fallback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.day-now&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--gte-start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--day-start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--lte-end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--day-end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--in-range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--gte-start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--lte-end&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;139&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--in-range&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;139&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--in-range&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What's happening:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Values below zero clamp to &lt;code&gt;0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Values above one clamp to &lt;code&gt;1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Multiplication simulates a logical AND&lt;/li&gt;
&lt;li&gt;  The result controls opacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's more verbose than Range Syntax – but fully workable today.&lt;/p&gt;

&lt;p&gt;Range Syntax mainly improves clarity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Live Demo (Clamp Fallback)
&lt;/h2&gt;

&lt;p&gt;Same architectural pattern — implemented today using &lt;code&gt;clamp()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/pershin-zan/embed/azmzGKN?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Notice that JavaScript still only updates state values.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trade-Offs and Constraints
&lt;/h2&gt;

&lt;p&gt;This pattern isn't universally better.&lt;/p&gt;

&lt;p&gt;Things to consider:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Readability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some teams may find class toggling clearer than CSS arithmetic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Conditional logic inside CSS may be less familiar to developers used to imperative control flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large-scale state&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If UI state becomes deeply interdependent or complex, JavaScript may&lt;br&gt;
still be the better coordination layer.&lt;/p&gt;

&lt;p&gt;The key isn’t “replace JS with CSS.” It's redefining which layer owns what.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Broader Direction
&lt;/h2&gt;

&lt;p&gt;Custom properties, container queries, &lt;code&gt;:has()&lt;/code&gt;, scroll-driven animations, advanced &lt;code&gt;attr()&lt;/code&gt; – CSS keeps gaining expressive power.&lt;/p&gt;

&lt;p&gt;Range Syntax fits into that trajectory.&lt;/p&gt;

&lt;p&gt;It doesn't eliminate JavaScript.&lt;/p&gt;

&lt;p&gt;But it reduces how often we need it for visual state management.&lt;/p&gt;

&lt;p&gt;And that's worth rethinking.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>One-Line Inverted Border Radius (Pure CSS)</title>
      <dc:creator>Alexander Pershin</dc:creator>
      <pubDate>Sun, 14 Dec 2025 09:15:32 +0000</pubDate>
      <link>https://dev.to/polyuretanio/one-line-inverted-border-radius-pure-css-1dhi</link>
      <guid>https://dev.to/polyuretanio/one-line-inverted-border-radius-pure-css-1dhi</guid>
      <description>&lt;p&gt;Inverted border-radius in one line of pure CSS. Customizable through 3+6 CSS variables and compatible with non-uniform backgrounds by default.&lt;/p&gt;

&lt;p&gt;Explore the full interactive tutorial:
&lt;a href="https://htmlacademy.org/tutorials/21#1" rel="noopener noreferrer"&gt;https://htmlacademy.org/tutorials/21#1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/pershin-zan/embed/EaKGZgW?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

</description>
      <category>codepen</category>
    </item>
  </channel>
</rss>
