<?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: Mía Salazar</title>
    <description>The latest articles on DEV Community by Mía Salazar (@miasalazar).</description>
    <link>https://dev.to/miasalazar</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F708072%2Fe084321a-e4bb-48d7-a464-5a3b114e1973.jpg</url>
      <title>DEV Community: Mía Salazar</title>
      <link>https://dev.to/miasalazar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miasalazar"/>
    <language>en</language>
    <item>
      <title>From Zero to Hero in TypeScript</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Sat, 20 Jun 2026 08:55:48 +0000</pubDate>
      <link>https://dev.to/miasalazar/from-zero-to-hero-in-typescript-425j</link>
      <guid>https://dev.to/miasalazar/from-zero-to-hero-in-typescript-425j</guid>
      <description>&lt;p&gt;TypeScript has become the go-to language for writing scalable, safer JavaScript in large applications. With its powerful static typing and developer tooling, it allows you to catch bugs earlier and write more expressive code.&lt;/p&gt;

&lt;p&gt;This guide walks you through the journey, starting from the very basics and gradually moving toward intermediate and advanced TypeScript concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is TypeScript?
&lt;/h2&gt;

&lt;p&gt;TypeScript is a superset of JavaScript that adds static typing. It compiles down to plain JavaScript, but offers better tooling, type safety, and developer confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Basics: Understanding the Type System
&lt;/h3&gt;

&lt;p&gt;The basic types of Typescript are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;number: whole and floating numbers&lt;/li&gt;
&lt;li&gt;boolean:true or false values&lt;/li&gt;
&lt;li&gt;string: text values&lt;/li&gt;
&lt;li&gt;symbol: globally unique identifier.&lt;/li&gt;
&lt;li&gt;bigint: whole numbers allowing larger negative and positive numbers than the standard number type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Type Annotations&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;isOnline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Any&lt;/strong&gt;&lt;br&gt;
any disables type checking and  allows all types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Taylor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Arrays and Objects&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;apple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;banana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Functions&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;&lt;strong&gt;void&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;void&lt;/code&gt; indicates that a function doesn't return any value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;someFunction&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is an article&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Intermediate Features: Making Your Types Smarter
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Type Aliases and Interfaces&lt;/strong&gt;&lt;br&gt;
Interfaces and type aliases are similar, but interfaces are generally used for objects and support declaration merging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;&lt;strong&gt;Optional and Readonly Properties&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// optional&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;&lt;strong&gt;Enum&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Right&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tuples&lt;/strong&gt;&lt;br&gt;
A tuple is an array with a pre-defined types and length.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;tuple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello", true, 22];
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Literal Types &amp;amp; Narrowing&lt;/strong&gt;&lt;br&gt;
Literal types allow you to specify the exact value a variable can hold.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scroll&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Union and Intersection Types&lt;/strong&gt;&lt;br&gt;
Union types let a variable be one of several types, while intersection types combine multiple types into one that must satisfy all of them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;WithTimestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;LogEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UserState&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;WithTimestamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// Ahora LogEntry tiene tanto 'status' como 'timestamp'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Advanced &amp;amp; Practical Techniques
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Generics&lt;/strong&gt;&lt;br&gt;
Generics allow you to write reusable code with type flexibility&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&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;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&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;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&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;&lt;strong&gt;Utility Types&lt;/strong&gt;&lt;br&gt;
TypeScript provides built-in utilities like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;       &lt;span class="c1"&gt;// Makes all properties optional&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;       &lt;span class="c1"&gt;// Picks a subset of properties&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;     &lt;span class="c1"&gt;// Builds object types from keys and values&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;Exclude&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="c1"&gt;// Removes a type from a union&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Discriminated Unions&lt;/strong&gt;&lt;br&gt;
Useful for handling different types with shared structure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;circle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;square&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Type Guards&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Casting with as&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;as&lt;/code&gt; informs the compiler to treat a variable as a specific type, without altering the actual runtime object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tips &amp;amp; Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prefer &lt;code&gt;type&lt;/code&gt; for aliases and primitives, and interface for object shapes and components.&lt;/li&gt;
&lt;li&gt;Don’t overuse &lt;code&gt;any&lt;/code&gt;, it defeats the purpose of TypeScript.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;unknown&lt;/code&gt; instead of &lt;code&gt;any&lt;/code&gt; when input type is truly uncertain.&lt;/li&gt;
&lt;li&gt;Let the compiler infer where possible, but annotate for clarity in APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;TypeScript offers a powerful type system on top of JavaScript that makes your codebase safer, clearer, and more maintainable. By starting with the basics and gradually adopting more advanced features like generics, utility types, and type guards, you’ll gain confidence in architecting scalable front-end and back-end solutions.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Accesibilidad y neurodivergencia: no todo el mundo navega igual</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Sun, 07 Jun 2026 17:47:40 +0000</pubDate>
      <link>https://dev.to/miasalazar/accesibilidad-y-neurodivergencia-no-todo-el-mundo-navega-igual-3kmj</link>
      <guid>https://dev.to/miasalazar/accesibilidad-y-neurodivergencia-no-todo-el-mundo-navega-igual-3kmj</guid>
      <description>&lt;h2&gt;
  
  
  Fuentes y referencias de la charla
&lt;/h2&gt;

&lt;p&gt;Después de la charla que di para la &lt;a href="https://commit-conf.com/" rel="noopener noreferrer"&gt;Commit Conf&lt;/a&gt; titulada "Accesibilidad y neurodivergencia: no todo el mundo navega igual", varias personas me pidieron las referencias y artículos que utilicé para preparar la sesión sobre accesibilidad y neurodivergencia.&lt;/p&gt;

&lt;p&gt;Aquí dejo una recopilación de estudios, artículos, guías y recursos que me ayudaron a construir la charla. He añadido una pequeña explicación de cada uno por si alguien quiere profundizar en un tema concreto.&lt;/p&gt;




&lt;h1&gt;
  
  
  Neurodivergencia y diversidad cognitiva
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://imk.global/que-es-la-neurodivergencia-esto-es-lo-que-necesitas-saber/" rel="noopener noreferrer"&gt;https://imk.global/que-es-la-neurodivergencia-esto-es-lo-que-necesitas-saber/&lt;/a&gt;&lt;br&gt;
Introducción sencilla al concepto de neurodivergencia y cómo afecta a la vida cotidiana.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://thendalliance.org/what-is-neurodiversity/" rel="noopener noreferrer"&gt;https://thendalliance.org/what-is-neurodiversity/&lt;/a&gt;&lt;br&gt;
Explica la neurodiversidad desde una perspectiva social y de inclusión.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.ags-psicologosmadrid.com/ansiedad/neurodivergencia-que-es-tipos-causas-e-impacto-en-la-vida-cotidiana/" rel="noopener noreferrer"&gt;https://www.ags-psicologosmadrid.com/ansiedad/neurodivergencia-que-es-tipos-causas-e-impacto-en-la-vida-cotidiana/&lt;/a&gt;&lt;br&gt;
Un resumen bastante completo sobre tipos de neurodivergencia y su impacto diario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://neuroqueer.com/neurodiversity-terms-and-definitions/" rel="noopener noreferrer"&gt;https://neuroqueer.com/neurodiversity-terms-and-definitions/&lt;/a&gt;&lt;br&gt;
Glosario muy útil para entender terminología relacionada con neurodiversidad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://viqu.co.uk/news/neurodiversity-in-tech/" rel="noopener noreferrer"&gt;https://viqu.co.uk/news/neurodiversity-in-tech/&lt;/a&gt;&lt;br&gt;
Reflexiona sobre cómo la industria tecnológica se adapta (o no) a personas neurodivergentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.techtalentcharter.co.uk/wp-content/uploads/diversity-in-tech-report-2024.pdf" rel="noopener noreferrer"&gt;https://www.techtalentcharter.co.uk/wp-content/uploads/diversity-in-tech-report-2024.pdf&lt;/a&gt;&lt;br&gt;
Informe sobre diversidad en tecnología y representación neurodivergente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Autismo, TDAH y procesamiento sensorial
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.cdc.gov/autism/data-research/index.html" rel="noopener noreferrer"&gt;https://www.cdc.gov/autism/data-research/index.html&lt;/a&gt;&lt;br&gt;
Datos y estadísticas oficiales sobre autismo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://riseupforautism.com/es/blog/autism-obsessions" rel="noopener noreferrer"&gt;https://riseupforautism.com/es/blog/autism-obsessions&lt;/a&gt;&lt;br&gt;
Explica intereses intensos y patrones comunes en personas autistas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://autism.org/auditory-processing-asd/" rel="noopener noreferrer"&gt;https://autism.org/auditory-processing-asd/&lt;/a&gt;&lt;br&gt;
Relación entre autismo y dificultades de procesamiento auditivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://add.org/adhd-and-auditory-processing/" rel="noopener noreferrer"&gt;https://add.org/adhd-and-auditory-processing/&lt;/a&gt;&lt;br&gt;
Cómo el TDAH puede afectar al procesamiento de sonidos e instrucciones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://add.org/sensory-overload-adhd/" rel="noopener noreferrer"&gt;https://add.org/sensory-overload-adhd/&lt;/a&gt;&lt;br&gt;
Introducción a la sobrecarga sensorial en personas con TDAH.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.getinflow.io/post/accident-prone-clumsy-adhd-cause" rel="noopener noreferrer"&gt;https://www.getinflow.io/post/accident-prone-clumsy-adhd-cause&lt;/a&gt;&lt;br&gt;
Habla sobre torpeza motora y coordinación en personas con TDAH.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gam-medical.es/el-stimming-para-regular-el-tdah/" rel="noopener noreferrer"&gt;https://gam-medical.es/el-stimming-para-regular-el-tdah/&lt;/a&gt;&lt;br&gt;
Explica el stimming como mecanismo de regulación emocional y sensorial.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.autismparentingmagazine.com/is-it-oversharing-or-autism/?srsltid=AfmBOoqBQ0GZ95kXhfzsUeNroWYSSAM00KYv7WPT5u4I-r_ksNU3pHqa" rel="noopener noreferrer"&gt;https://www.autismparentingmagazine.com/is-it-oversharing-or-autism/?srsltid=AfmBOoqBQ0GZ95kXhfzsUeNroWYSSAM00KYv7WPT5u4I-r_ksNU3pHqa&lt;/a&gt;&lt;br&gt;
Analiza por qué algunas personas autistas pueden compartir información de forma diferente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.understood.org/es-mx/articles/adhd-and-oversharing-what-you-need-to-know" rel="noopener noreferrer"&gt;https://www.understood.org/es-mx/articles/adhd-and-oversharing-what-you-need-to-know&lt;/a&gt;&lt;br&gt;
Relaciona impulsividad y oversharing en personas con TDAH.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.dyslexia.com/auditory-processing-disorientation/" rel="noopener noreferrer"&gt;https://blog.dyslexia.com/auditory-processing-disorientation/&lt;/a&gt;&lt;br&gt;
Conexión entre dislexia y dificultades de procesamiento auditivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.calmclinic.com/anxiety/symptoms/hypersensitivity-to-sound" rel="noopener noreferrer"&gt;https://www.calmclinic.com/anxiety/symptoms/hypersensitivity-to-sound&lt;/a&gt;&lt;br&gt;
Cómo la ansiedad puede aumentar la sensibilidad al sonido.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Ansiedad, depresión y salud mental
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.who.int/es/news-room/fact-sheets/detail/anxiety-disorders" rel="noopener noreferrer"&gt;https://www.who.int/es/news-room/fact-sheets/detail/anxiety-disorders&lt;/a&gt;&lt;br&gt;
Datos oficiales de la OMS sobre trastornos de ansiedad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mayoclinic.org/es/diseases-conditions/anxiety/symptoms-causes/syc-20350961" rel="noopener noreferrer"&gt;https://www.mayoclinic.org/es/diseases-conditions/anxiety/symptoms-causes/syc-20350961&lt;/a&gt;&lt;br&gt;
Síntomas y causas frecuentes de ansiedad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.who.int/es/news-room/fact-sheets/detail/depression" rel="noopener noreferrer"&gt;https://www.who.int/es/news-room/fact-sheets/detail/depression&lt;/a&gt;&lt;br&gt;
Información general y cifras sobre depresión.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.webmd.com/depression/depression-physical-effects-brain" rel="noopener noreferrer"&gt;https://www.webmd.com/depression/depression-physical-effects-brain&lt;/a&gt;&lt;br&gt;
Explica cómo la depresión puede afectar al cerebro y al cuerpo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.cliffordtaylormd.com/the-benefits-of-psychiatric-care/signs-and-symptoms-of-major-depression/" rel="noopener noreferrer"&gt;https://www.cliffordtaylormd.com/the-benefits-of-psychiatric-care/signs-and-symptoms-of-major-depression/&lt;/a&gt;&lt;br&gt;
Señales comunes asociadas a la depresión mayor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.calmclinic.com/anxiety/symptoms/extreme-clumsiness" rel="noopener noreferrer"&gt;https://www.calmclinic.com/anxiety/symptoms/extreme-clumsiness&lt;/a&gt;&lt;br&gt;
Relación entre ansiedad, estrés y coordinación motora.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Dislexia, discalculia y comprensión
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/publication/321807876_La_discalculia_un_reto_para_la_ensenanza_de_la_matematica_Discalculia_a_challenge_in_teaching_mathematics" rel="noopener noreferrer"&gt;https://www.researchgate.net/publication/321807876_La_discalculia_un_reto_para_la_ensenanza_de_la_matematica_Discalculia_a_challenge_in_teaching_mathematics&lt;/a&gt;&lt;br&gt;
Investigación sobre discalculia y aprendizaje matemático.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.spldhub.com/post/dyscalculia-and-money-supporting-practical-maths-skills" rel="noopener noreferrer"&gt;https://www.spldhub.com/post/dyscalculia-and-money-supporting-practical-maths-skills&lt;/a&gt;&lt;br&gt;
Cómo la discalculia afecta a tareas cotidianas relacionadas con números y dinero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://uxdesign.cc/software-accessibility-for-users-with-dyslexia-a506698af4d6" rel="noopener noreferrer"&gt;https://uxdesign.cc/software-accessibility-for-users-with-dyslexia-a506698af4d6&lt;/a&gt;&lt;br&gt;
Buenas prácticas de UX para personas con dislexia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dyslexiascotland.org.uk/contrasting-advice-what-colours-are-best-for-accessibility/#:%7E:text=Accessible%20text%20contrast&amp;amp;text=In%20fact%2C%20The%20British%20Dyslexia,%2C%20such%20as%20cream-black" rel="noopener noreferrer"&gt;https://dyslexiascotland.org.uk/contrasting-advice-what-colours-are-best-for-accessibility/#:~:text=Accessible%20text%20contrast&amp;amp;text=In%20fact%2C%20The%20British%20Dyslexia,%2C%20such%20as%20cream-black&lt;/a&gt;.&lt;br&gt;
Explica por qué algunos contrastes funcionan mejor para personas con dislexia.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Diseño accesible y experiencia de usuario
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://leedsautismaim.org.uk/resources/guide-to-making-information-accessible-for-neurodivergent-people/" rel="noopener noreferrer"&gt;https://leedsautismaim.org.uk/resources/guide-to-making-information-accessible-for-neurodivergent-people/&lt;/a&gt;&lt;br&gt;
Guía práctica para crear contenido accesible para personas neurodivergentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mikebifulco.com/posts/dont-center-paragraph-text" rel="noopener noreferrer"&gt;https://mikebifulco.com/posts/dont-center-paragraph-text&lt;/a&gt;&lt;br&gt;
Explica por qué centrar párrafos dificulta la lectura.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.easy-read-online.co.uk/post/accessible-information-for-neurodiverse-people" rel="noopener noreferrer"&gt;https://www.easy-read-online.co.uk/post/accessible-information-for-neurodiverse-people&lt;/a&gt;&lt;br&gt;
Consejos para simplificar contenido e información compleja.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://thecontentlab.ie/how-to-make-your-website-accessible-for-neurodivergent-people/" rel="noopener noreferrer"&gt;https://thecontentlab.ie/how-to-make-your-website-accessible-for-neurodivergent-people/&lt;/a&gt;&lt;br&gt;
Recomendaciones para diseñar webs más inclusivas cognitivamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.continualengine.com/blog/neurodiversity-and-digital-accessibility/" rel="noopener noreferrer"&gt;https://www.continualengine.com/blog/neurodiversity-and-digital-accessibility/&lt;/a&gt;&lt;br&gt;
Relación entre accesibilidad digital y neurodiversidad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.wypartnership.co.uk/application/files/3716/4735/6437/making-information-accessible-for-neurodivergent-people-final-v2-20.04.21.pdf" rel="noopener noreferrer"&gt;https://www.wypartnership.co.uk/application/files/3716/4735/6437/making-information-accessible-for-neurodivergent-people-final-v2-20.04.21.pdf&lt;/a&gt;&lt;br&gt;
Documento muy completo sobre comunicación accesible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.ronins.co.uk/hub/accessible-design-for-neurodiversity/" rel="noopener noreferrer"&gt;https://www.ronins.co.uk/hub/accessible-design-for-neurodiversity/&lt;/a&gt;&lt;br&gt;
Casos y recomendaciones de diseño accesible para neurodiversidad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://heynova.io/blog/2023-10-designing-for-people-with-adhd/" rel="noopener noreferrer"&gt;https://heynova.io/blog/2023-10-designing-for-people-with-adhd/&lt;/a&gt;&lt;br&gt;
Ideas prácticas para diseñar pensando en personas con TDAH.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dwpdigital.blog.gov.uk/2022/06/30/designing-accessible-services-dont-exclude-the-neurodiverse/" rel="noopener noreferrer"&gt;https://dwpdigital.blog.gov.uk/2022/06/30/designing-accessible-services-dont-exclude-the-neurodiverse/&lt;/a&gt;&lt;br&gt;
Cómo evitar excluir a personas neurodivergentes en servicios digitales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://theweco.com/it-accessibility-living-with-autism/" rel="noopener noreferrer"&gt;https://theweco.com/it-accessibility-living-with-autism/&lt;/a&gt;&lt;br&gt;
Reflexión sobre accesibilidad digital desde la experiencia autista.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stephaniewalter.design/blog/neurodiversity-and-ux-essential-resources-for-cognitive-accessibility/" rel="noopener noreferrer"&gt;https://stephaniewalter.design/blog/neurodiversity-and-ux-essential-resources-for-cognitive-accessibility/&lt;/a&gt;&lt;br&gt;
Recopilación excelente de recursos sobre accesibilidad cognitiva.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://uxdesign.cc/inclusive-design-guide-7-principles-of-designing-for-the-autistic-community-1e6dcd4bae85" rel="noopener noreferrer"&gt;https://uxdesign.cc/inclusive-design-guide-7-principles-of-designing-for-the-autistic-community-1e6dcd4bae85&lt;/a&gt;&lt;br&gt;
Principios de diseño inclusivo enfocados en la comunidad autista.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://uxdesign.cc/software-accessibility-for-users-with-attention-deficit-disorder-adhd-f32226e6037c" rel="noopener noreferrer"&gt;https://uxdesign.cc/software-accessibility-for-users-with-attention-deficit-disorder-adhd-f32226e6037c&lt;/a&gt;&lt;br&gt;
Cómo adaptar interfaces para personas con déficit de atención.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  WCAG y estándares de accesibilidad
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.w3.org/WAI/WCAG21/Understanding/unusual-words.html" rel="noopener noreferrer"&gt;https://www.w3.org/WAI/WCAG21/Understanding/unusual-words.html&lt;/a&gt;&lt;br&gt;
Importancia de explicar términos poco comunes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.w3.org/WAI/WCAG21/Understanding/abbreviations.html" rel="noopener noreferrer"&gt;https://www.w3.org/WAI/WCAG21/Understanding/abbreviations.html&lt;/a&gt;&lt;br&gt;
Por qué las abreviaturas pueden dificultar la comprensión.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions" rel="noopener noreferrer"&gt;https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions&lt;/a&gt;&lt;br&gt;
Recomendaciones sobre animaciones y movimiento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://readabilityguidelines.co.uk/grammar-points/capital-letters/" rel="noopener noreferrer"&gt;https://readabilityguidelines.co.uk/grammar-points/capital-letters/&lt;/a&gt;&lt;br&gt;
Cómo el abuso de mayúsculas afecta a la legibilidad.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Colores, percepción y sobrecarga sensorial
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://joyrealtoys.com/blogs/news/how-do-different-colors-affect-sensory-overload-in-autistic-children?srsltid=AfmBOoqQloUVtF4EAFpZ8j6VOFLYQkUiVcQtNeriXxx5CzewCCGICIRL" rel="noopener noreferrer"&gt;https://joyrealtoys.com/blogs/news/how-do-different-colors-affect-sensory-overload-in-autistic-children?srsltid=AfmBOoqQloUVtF4EAFpZ8j6VOFLYQkUiVcQtNeriXxx5CzewCCGICIRL&lt;/a&gt;&lt;br&gt;
Relación entre color y sobrecarga sensorial.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mintops.ca/2024/10/21/the-importance-of-color-in-a-clinic-and-the-impact-it-has-on-patient-anxiety/" rel="noopener noreferrer"&gt;https://mintops.ca/2024/10/21/the-importance-of-color-in-a-clinic-and-the-impact-it-has-on-patient-anxiety/&lt;/a&gt;&lt;br&gt;
Cómo el color puede influir en ansiedad y percepción emocional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.elimparcial.com/locurioso/2025/10/23/cuales-son-los-colores-que-usan-las-personas-ansiosas-segun-los-expertos/" rel="noopener noreferrer"&gt;https://www.elimparcial.com/locurioso/2025/10/23/cuales-son-los-colores-que-usan-las-personas-ansiosas-segun-los-expertos/&lt;/a&gt;&lt;br&gt;
Artículo divulgativo sobre colores y estados emocionales.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Tourette, dispraxia y coordinación
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://tourette.org/about-tourette/overview/" rel="noopener noreferrer"&gt;https://tourette.org/about-tourette/overview/&lt;/a&gt;&lt;br&gt;
Introducción al síndrome de Tourette y sus características.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://disabilitytogether.org.uk/information-and-resources/tourette-syndrome/" rel="noopener noreferrer"&gt;https://disabilitytogether.org.uk/information-and-resources/tourette-syndrome/&lt;/a&gt;&lt;br&gt;
Impacto cotidiano y social del Tourette.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.salud.mapfre.es/salud-familiar/ninos/enfermedades-del-nino/dispraxia-realizar-ciertas-tareas-resulta-dificil/" rel="noopener noreferrer"&gt;https://www.salud.mapfre.es/salud-familiar/ninos/enfermedades-del-nino/dispraxia-realizar-ciertas-tareas-resulta-dificil/&lt;/a&gt;&lt;br&gt;
Explicación sencilla sobre dispraxia y coordinación motora.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://escolasalut.sjdhospitalbarcelona.org/es/consejos-salud/deporte/nino-patoso-algunos-ninos-muestran-mas-torpeza-otros" rel="noopener noreferrer"&gt;https://escolasalut.sjdhospitalbarcelona.org/es/consejos-salud/deporte/nino-patoso-algunos-ninos-muestran-mas-torpeza-otros&lt;/a&gt;&lt;br&gt;
Habla sobre torpeza motriz y desarrollo infantil.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Estudios académicos y papers
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.sciencedirect.com/science/article/pii/S014976342100049X" rel="noopener noreferrer"&gt;https://www.sciencedirect.com/science/article/pii/S014976342100049X&lt;/a&gt;&lt;br&gt;
Revisión científica relacionada con neurodesarrollo y procesamiento cognitivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC4873188/" rel="noopener noreferrer"&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC4873188/&lt;/a&gt;&lt;br&gt;
Investigación sobre accesibilidad cognitiva y procesamiento de información.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC11745029/" rel="noopener noreferrer"&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC11745029/&lt;/a&gt;&lt;br&gt;
Estudio reciente sobre neurodivergencia y experiencia digital.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.frontiersin.org/journals/psychiatry/articles/10.3389/fpsyt.2022.837424/full" rel="noopener noreferrer"&gt;https://www.frontiersin.org/journals/psychiatry/articles/10.3389/fpsyt.2022.837424/full&lt;/a&gt;&lt;br&gt;
Investigación sobre salud mental y neurodivergencia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC3620841" rel="noopener noreferrer"&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC3620841&lt;/a&gt;&lt;br&gt;
Estudio relacionado con percepción sensorial y atención.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2025.1499390/full" rel="noopener noreferrer"&gt;https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2025.1499390/full&lt;/a&gt;&lt;br&gt;
Investigación reciente sobre experiencia cognitiva y comportamiento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12145479/" rel="noopener noreferrer"&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC12145479/&lt;/a&gt;&lt;br&gt;
Paper reciente relacionado con accesibilidad y neurodiversidad.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Recursos visuales y ejemplos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/UKHomeOffice/posters/blob/master/accessibility/dos-donts/posters_en-UK/svg/anxiety.svg" rel="noopener noreferrer"&gt;https://github.com/UKHomeOffice/posters/blob/master/accessibility/dos-donts/posters_en-UK/svg/anxiety.svg&lt;/a&gt;&lt;br&gt;
Ejemplo visual de buenas prácticas de accesibilidad relacionadas con ansiedad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=cBBl3zaheYI" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=cBBl3zaheYI&lt;/a&gt;&lt;br&gt;
Vídeo divulgativo útil para entender accesibilidad cognitiva y experiencia neurodivergente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Preparar esta charla me recordó algo importante: la accesibilidad no consiste únicamente en cumplir una checklist. Consiste en entender que cada persona procesa, siente y navega de forma diferente.&lt;/p&gt;

&lt;p&gt;Diseñar para la diversidad cognitiva no beneficia solo a personas neurodivergentes. Hace que los productos sean más claros, más humanos y mejores para todo el mundo.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>neurodiversity</category>
      <category>frontend</category>
      <category>design</category>
    </item>
    <item>
      <title>Server-Side Rendering vs Client-Side Rendering: What Developers Should Know</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Mon, 01 Jun 2026 09:50:41 +0000</pubDate>
      <link>https://dev.to/miasalazar/server-side-rendering-vs-client-side-rendering-what-developers-should-know-2big</link>
      <guid>https://dev.to/miasalazar/server-side-rendering-vs-client-side-rendering-what-developers-should-know-2big</guid>
      <description>&lt;p&gt;As the web has evolved, so have the strategies for rendering content in browsers. Two of the most widely used approaches today are Server-Side Rendering (SSR) and Client-Side Rendering (CSR). Each has its strengths and trade-offs, and understanding when to use one over the other is key to building fast, scalable, and user-friendly applications.&lt;/p&gt;

&lt;p&gt;This article explores the key differences, benefits, and common use cases of SSR and CSR, with practical examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Client-Side Rendering (CSR)?
&lt;/h2&gt;

&lt;p&gt;Client-Side Rendering means that the browser downloads a minimal HTML shell and renders the content using JavaScript. Most of the work, fetching data, templating, and updating the DOM, happens in the user's browser after the page loads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rich interactivity: Ideal for dynamic single-page applications (SPAs).&lt;/li&gt;
&lt;li&gt;Fast navigation after initial load: Once loaded, switching between views is instantaneous.&lt;/li&gt;
&lt;li&gt;Great for app-like experiences: Think dashboards, SaaS tools, or email clients.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Drawbacks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Slower initial page load: The user sees a blank screen until JavaScript loads and executes.&lt;/li&gt;
&lt;li&gt;SEO challenges: Search engines may struggle to index dynamic content, unless SSR or prerendering is used.&lt;/li&gt;
&lt;li&gt;Poor performance on slow devices: All rendering logic happens in the browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Server-Side Rendering (SSR)?
&lt;/h2&gt;

&lt;p&gt;Server-Side Rendering generates the full HTML on the server for each request. When a user visits a page, the server fetches the data, compiles the HTML, and sends it to the browser, which then hydrates the app into an interactive component.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of SSR:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fast time-to-first-byte (TTFB): HTML is ready and shows up immediately.&lt;/li&gt;
&lt;li&gt;Better SEO: Search engines receive fully rendered pages.&lt;/li&gt;
&lt;li&gt;Good for public-facing content: Blogs, marketing sites, e-commerce pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Drawbacks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Increased server load: Every page request triggers rendering logic.&lt;/li&gt;
&lt;li&gt;Longer time to interactivity: HTML loads quickly, but hydration takes extra time.&lt;/li&gt;
&lt;li&gt;Requires server infrastructure: Cannot be purely deployed as static files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Use SSR vs CSR?
&lt;/h2&gt;

&lt;p&gt;Choosing between Server-Side Rendering (SSR) and Client-Side Rendering (CSR) isn’t always straightforward. The decision should be guided by several key factors: SEO requirements, load performance, content dynamism, and the user experience you're trying to build.&lt;/p&gt;

&lt;p&gt;Below is a deeper dive into scenarios where one might be preferable over the other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use SSR when:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You need excellent SEO and fast initial rendering&lt;/strong&gt;&lt;br&gt;
SSR is ideal for websites where content must be indexed by search engines or previewed accurately on social platforms. For instance, blogs, news sites, product pages, or landing pages all benefit from pre-rendered HTML, which bots and crawlers can read instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want better performance on low-powered devices&lt;/strong&gt;&lt;br&gt;
Since the HTML is pre-rendered, SSR reduces the burden on the client’s browser. This is particularly useful for users on older mobile devices or slower connections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time to First Paint (TTFP) matters&lt;/strong&gt;&lt;br&gt;
If you're targeting users with slow networks and you want content to appear fast (even before JavaScript has hydrated the page), SSR gives you a meaningful performance advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use CSR when:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Your app requires heavy user interaction post-load&lt;/strong&gt;&lt;br&gt;
CSR is great for Single Page Applications (SPAs), where the user stays on one page and interacts frequently (e.g., filtering data, submitting forms, navigating within the app). Once loaded, CSR apps can be incredibly fast and responsive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your content is highly personalised or session-based&lt;/strong&gt;&lt;br&gt;
If almost every user sees different data (e.g., based on login, preferences, roles), it often makes sense to use CSR. Fetching data on the client allows full control over what’s displayed without needing server logic to differentiate every request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your site doesn’t need search engine indexing&lt;/strong&gt;&lt;br&gt;
Admin dashboards, internal tools, and private platforms don’t usually need SEO. CSR reduces complexity by keeping rendering logic on the client side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want to offload server responsibility&lt;/strong&gt;&lt;br&gt;
With CSR, the server mainly delivers static assets (JS, HTML, CSS). This architecture scales easily via CDNs and serverless environments with minimal infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Choosing between Server-Side Rendering (SSR) and Client-Side Rendering (CSR) depends on your application's goals and the expectations of your users. SSR is ideal for content-heavy sites where fast initial load, SEO, and visibility across devices and search engines are vital. By serving fully rendered HTML from the server, it improves indexing, speeds up first paint, and reduces the load on client devices.&lt;/p&gt;

&lt;p&gt;CSR, on the other hand, is best suited for dynamic, interactive web applications such as dashboards, user portals, or tools that rely heavily on client-side state and behaviour. It enables richer, more responsive interfaces after the initial load and supports personalised content without extra server complexity. &lt;/p&gt;

&lt;p&gt;Ultimately, the decision isn't about which is better, but about which best fits the structure, purpose, and performance priorities of your project.&lt;/p&gt;

</description>
      <category>ssr</category>
      <category>frontend</category>
      <category>cleancode</category>
      <category>csr</category>
    </item>
    <item>
      <title>Cross-Browser Considerations for Front-End Development</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:31:22 +0000</pubDate>
      <link>https://dev.to/miasalazar/cross-browser-considerations-for-front-end-development-47a3</link>
      <guid>https://dev.to/miasalazar/cross-browser-considerations-for-front-end-development-47a3</guid>
      <description>&lt;p&gt;Building a website that works only in your development browser is like hosting a party and only giving the address to one friend. Users will arrive using Chrome, Firefox, Edge, Safari, Opera, and a variety of mobile browsers, each powered by different rendering engines and each with its own quirks. While the modern web is far more standardised than a decade ago, browser differences remain a challenge.&lt;/p&gt;

&lt;p&gt;The goal isn’t to make the site pixel-perfect in every environment, but to ensure it is usable, functional, and accessible everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand Rendering Engine Differences
&lt;/h2&gt;

&lt;p&gt;Every browser relies on a rendering engine to process HTML, CSS, and JavaScript and turn it into what you see on screen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome &amp;amp; Edge (Chromium-based) → Blink&lt;/li&gt;
&lt;li&gt;Firefox → Gecko&lt;/li&gt;
&lt;li&gt;Safari → WebKit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These engines follow web standards but can interpret specifications slightly differently.&lt;/p&gt;

&lt;p&gt;For instance, form controls and native input widgets can look drastically different between Blink and Gecko, which can break a carefully designed UI if not tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stick to Standards-Compliant HTML and CSS
&lt;/h2&gt;

&lt;p&gt;Browsers are surprisingly forgiving of sloppy markup, but that forgiveness is inconsistent. One may “guess” your intention and display correctly, while another may break the layout.&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="c"&gt;&amp;lt;!-- Invalid HTML (missing closing tag) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is a paragraph
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is another paragraph&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chrome might auto-close the first &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; correctly. Firefox could nest them incorrectly, causing spacing issues. To reduce the risk of unpredictable browser behaviour you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate your code with the &lt;a href="https://validator.w3.org/" rel="noopener noreferrer"&gt;W3C Validator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Use semantic tags (, , ) for better rendering and accessibility.&lt;/li&gt;
&lt;li&gt;Avoid deprecated tags and attributes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check CSS Feature Support Before Using
&lt;/h2&gt;

&lt;p&gt;The pace of CSS innovation is fast. Features like &lt;code&gt;subgrid&lt;/code&gt;, &lt;code&gt;:has()&lt;/code&gt;, and &lt;code&gt;container queries&lt;/code&gt; are powerful but not universally supported.&lt;/p&gt;

&lt;p&gt;To prevent these situations, you can use &lt;a href="https://caniuse.com/" rel="noopener noreferrer"&gt;Can I Use&lt;/a&gt; before adding cutting-edge features, and you should always provide a fallback style.&lt;/p&gt;

&lt;p&gt;For example, using &lt;code&gt;:has&lt;/code&gt; may not always be effective.&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;.card&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;green&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;However, using a less elegant way of styling elements is universal.&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;.card&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;green&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;h2&gt;
  
  
  Manage JavaScript Compatibility Carefully
&lt;/h2&gt;

&lt;p&gt;As Javascript evolves rapidly, not all features are immediately supported across browsers. For instance, syntax introduced in recent ECMAScript versions (such as optional chaining, nullish coalescing, or private class fields) may work flawlessly in the latest versions of Chrome or Edge, but can cause silent failures or syntax errors in older versions of Firefox or mobile browsers that haven’t updated.&lt;/p&gt;

&lt;p&gt;More critically, browser APIs, such as &lt;code&gt;ResizeObserver&lt;/code&gt;, &lt;code&gt;IntersectionObserver&lt;/code&gt;, or &lt;code&gt;navigator.clipboard&lt;/code&gt;, may behave inconsistently or not exist at all. Writing robust front-end code requires the habit of checking for the presence of an API before using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare for Browser-Specific Bugs
&lt;/h2&gt;

&lt;p&gt;Even when your code is technically correct and standards-compliant, browser-specific bugs and inconsistencies can still derail your layout or behaviour. This can be especially frustrating when something that works perfectly in one browser looks broken or behaves unexpectedly in another. &lt;/p&gt;

&lt;p&gt;These issues often stem from differences in how the rendering engines interpret the standards, partial implementations of specifications, or simply long-standing bugs that have yet to be fixed.&lt;/p&gt;

&lt;p&gt;For example, flexbox gap doesn't work in older versions of Firefox.&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;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&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;So, if you need your app to work smoothly in older versions of Firefox, it's better not to use it.&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;.container&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;:last-child&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin-right&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cross-Platform Testing
&lt;/h2&gt;

&lt;p&gt;Testing is where all cross-browser efforts come together. It’s not enough to assume that your site works everywhere because it functions well in your main development browser.&lt;/p&gt;

&lt;p&gt;Users interact with the web on a vast range of devices: desktop computers, tablets, smartphones, smart TVs, and more. Each comes with its own OS-level quirks, hardware limitations, and browser-specific behaviour.&lt;/p&gt;

&lt;p&gt;For example, Chrome on Android and Chrome on desktop do not behave identically. Safari on iOS has its own rendering engine (WebKit) that behaves differently than Safari on macOS. Edge on Windows may support APIs that its Android counterpart does not. Only by testing in these different environments can you catch layout shifts, unresponsive components, or missing UI elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility Across Browsers
&lt;/h2&gt;

&lt;p&gt;While accessibility is defined by standards, its real-world behaviour varies across browsers and assistive technologies. A feature that works perfectly in Chrome with a screen reader like NVDA may behave differently in Safari with VoiceOver, or even fail silently in Firefox. For this reason, accessibility must be tested across multiple browser–screen reader combinations, not assumed from a single environment.&lt;/p&gt;

&lt;p&gt;One key area where this shows is in how browsers handle dynamic content updates with ARIA live regions. These are often used to announce changes to users without moving focus, such as loading messages or form feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Cross-browser development remains a nuanced and evolving challenge, even in 2025. Despite increasing standardisation, differences in rendering engines, partial implementations of features, and inconsistent API support continue to impact how users experience your website. &lt;/p&gt;

&lt;p&gt;Building for the modern web means accepting that not all browsers behave identically, but they must all behave acceptably.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>development</category>
    </item>
    <item>
      <title>How to Improve Performance in React Applications</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Fri, 27 Mar 2026 12:22:38 +0000</pubDate>
      <link>https://dev.to/miasalazar/how-to-improve-performance-in-react-applications-4f40</link>
      <guid>https://dev.to/miasalazar/how-to-improve-performance-in-react-applications-4f40</guid>
      <description>&lt;p&gt;Optimizing performance in React applications is essential to create smooth, fast, and responsive user experiences. React’s flexibility and component-based architecture allow developers to implement various strategies to enhance performance.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore key techniques such as dynamic imports, list virtualization, and others to help you boost your app’s speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic Imports: Code Splitting for Faster Load Times
&lt;/h2&gt;

&lt;p&gt;One of the most effective performance optimizations in React is code splitting, which allows you to load JavaScript files only when needed. This can drastically reduce the initial load time, especially for large applications. React’s dynamic imports enable you to load components and modules on demand, which means users only download the code they need.&lt;/p&gt;

&lt;p&gt;With dynamic imports, you can split your application into smaller chunks and only load parts of the app when required. For example, you might load a component for a specific route only when the user navigates to it, rather than including it in the initial bundle.&lt;/p&gt;

&lt;p&gt;By implementing dynamic imports, you improve your app’s initial loading time and reduce the amount of unnecessary code loaded upfront.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { Suspense } from 'react';

const LazyLoadedComponent = React.lazy(() =&amp;gt; import('./LazyLoadedComponent'));

function App() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;Suspense fallback={&amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;}&amp;gt;
        &amp;lt;LazyLoadedComponent /&amp;gt;
      &amp;lt;/Suspense&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  List Virtualization: Rendering Only What’s Visible
&lt;/h2&gt;

&lt;p&gt;In applications that display large lists of data, rendering every single item at once can be a performance bottleneck. List virtualization solves this problem by only rendering the items visible on the screen at any given time, drastically reducing the number of DOM elements.&lt;/p&gt;

&lt;p&gt;Libraries like &lt;a href="https://www.npmjs.com/package/react-window" rel="noopener noreferrer"&gt;react-window&lt;/a&gt; help implement list virtualization by rendering a small subset of items based on the visible area, improving rendering speed and reducing memory usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memoize Expensive Calculations with useMemo
&lt;/h2&gt;

&lt;p&gt;If you perform heavy calculations or transformations (like sorting, filtering, or mapping large arrays), memoize the result with useMemo so it's only recalculated when the inputs change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const sortedList = useMemo(() =&amp;gt; {
  return items.sort((a, b) =&amp;gt; a.name.localeCompare(b.name));
}, [items]);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids unnecessary recalculations on every render.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preload Critical Resources
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;&amp;lt;link rel="preload"&amp;gt;&lt;/code&gt; or tools like &lt;code&gt;React Helmet&lt;/code&gt; to preload fonts, critical images, or even API data you know the user will need immediately. This can significantly reduce LCP and improve perceived performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smart Data Fetching with React Query
&lt;/h2&gt;

&lt;p&gt;Managing server state efficiently is key to performance. Instead of manually fetching and storing data in state variables, libraries like React Query handle caching, background refetching, and request deduplication out of the box.&lt;/p&gt;

&lt;p&gt;React Query can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache requests and avoid redundant fetches.&lt;/li&gt;
&lt;li&gt;Refetch data in the background without blocking the UI.&lt;/li&gt;
&lt;li&gt;Handle loading, error, and success states automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Optimize Images and Assets
&lt;/h2&gt;

&lt;p&gt;Large or unoptimized images are one of the most common causes of slow-loading apps. To avoid this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use modern formats like WebP or AVIF&lt;/li&gt;
&lt;li&gt;Compress images before loading&lt;/li&gt;
&lt;li&gt;Use lazy loading (&lt;code&gt;&amp;lt;img loading="lazy" /&amp;gt;&lt;/code&gt;) for below-the-fold images&lt;/li&gt;
&lt;li&gt;Leverage responsive images with srcSet for different screen sizes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;picture&amp;gt;
  &amp;lt;source media="(min-width:768px)" srcset="flowers-tablet.jpg"&amp;gt;
  &amp;lt;img src="ppizza.jpg" alt="Pozza" style="width:auto;"&amp;gt;
&amp;lt;/picture&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Keep Components Small and Focused
&lt;/h2&gt;

&lt;p&gt;Smaller components are easier to optimize, understand, and reuse. If a component does too many things, it’s more likely to re-render often. Split logic-heavy components into smaller children where only relevant parts update.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analyze and Monitor with Performance Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Lighthouse (via Chrome DevTools or CI)&lt;/li&gt;
&lt;li&gt;Web Vitals extension&lt;/li&gt;
&lt;li&gt;React Profiler&lt;/li&gt;
&lt;li&gt;Sentry/Datadog for performance monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measure, benchmark, and monitor performance to track regressions over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use useEffect and useCallback Wisely
&lt;/h2&gt;

&lt;p&gt;React’s &lt;code&gt;useEffect&lt;/code&gt; and &lt;code&gt;useCallback&lt;/code&gt; hooks are powerful, but they can easily become sources of performance issues if not used thoughtfully. &lt;/p&gt;

&lt;p&gt;With useEffect, it's important to limit side effects to what’s necessary and avoid including unstable dependencies (like inline functions or objects) unless absolutely required. This reduces the risk of unnecessary re-renders or even infinite loops. Also, always clean up subscriptions or event listeners inside effects to prevent memory leaks.&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;code&gt;useCallback&lt;/code&gt; helps memoize functions so they retain a stable reference between renders, useful when passing callbacks to memoized child components or when including functions as dependencies in useEffect. However, overusing &lt;code&gt;useCallback&lt;/code&gt; can clutter your code and offer little benefit if the function isn’t passed as a prop or used in dependency arrays.&lt;/p&gt;

&lt;p&gt;In short, use &lt;code&gt;useEffect&lt;/code&gt; to manage external interactions and side effects with minimal, clear logic, and reserve &lt;code&gt;useCallback&lt;/code&gt; for stabilizing functions that really need it. Used wisely, these hooks help you keep your components performant and predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Performance optimization in React is not just about writing faster code. It's about making thoughtful architectural choices, leveraging the right tools, and reducing unnecessary work for the browser.&lt;/p&gt;

&lt;p&gt;Focus on rendering only what’s needed, when it’s needed, and keep an eye on the network, re-renders, and the structure of your components. With these strategies in place, you’ll create React apps that are not only functional but delightfully fast.&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Writing Scalable and Maintainable CSS: BEM, SMACSS and OOCSS</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Thu, 12 Mar 2026 10:27:09 +0000</pubDate>
      <link>https://dev.to/miasalazar/writing-scalable-and-maintainable-css-bem-smacss-and-oocss-omj</link>
      <guid>https://dev.to/miasalazar/writing-scalable-and-maintainable-css-bem-smacss-and-oocss-omj</guid>
      <description>&lt;p&gt;Managing CSS at scale is one of the hardest challenges in front-end development. As projects grow, CSS can easily become brittle, hard to maintain, and prone to unintended side effects due to excessive inheritance and uncontrolled specificity. &lt;/p&gt;

&lt;p&gt;This article introduces some popular methodologies: BEM, SMACSS, and OOCSS, and explains how they help create scalable, modular CSS architectures with clear naming conventions, low specificity, and better separation of concerns.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Cascading and Specificity
&lt;/h2&gt;

&lt;p&gt;CSS was designed to cascade, but uncontrolled cascading often leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep selector chains (.header .menu ul li a span { ... })&lt;/li&gt;
&lt;li&gt;Overuse of !important&lt;/li&gt;
&lt;li&gt;Inheritance leaks causing unintended style changes&lt;/li&gt;
&lt;li&gt;Difficulty overriding styles without breaking existing layouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When stylesheets become difficult to predict or extend, developers start fearing changes. The key is to avoid deeply nested selectors and manage specificity explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Modular CSS Architecture
&lt;/h2&gt;

&lt;p&gt;A modular CSS approach aims to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create independent, reusable components&lt;/li&gt;
&lt;li&gt;Minimise selector specificity&lt;/li&gt;
&lt;li&gt;Clearly separate structure (layout, positioning) from skin (visual appearance)&lt;/li&gt;
&lt;li&gt;Use consistent naming conventions&lt;/li&gt;
&lt;li&gt;Avoid over-reliance on inheritance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s explore some well-known methodologies that encourage this.&lt;/p&gt;

&lt;h2&gt;
  
  
  BEM
&lt;/h2&gt;

&lt;p&gt;BEM stands for Block Element Modifier, and it works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block: the standalone entity (e.g. &lt;code&gt;card&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Element: a part of the block (e.g. &lt;code&gt;card__header&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Modifier: a variant or state (e.g. &lt;code&gt;card--highlighted&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BEM creates predictable class names with low specificity and no dependence on DOM structure or nesting. Besides, the low specificity makes these class names easy to override and compose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="card card--highlighted"&amp;gt;
  &amp;lt;div class="card__header"&amp;gt;Title&amp;lt;/div&amp;gt;
  &amp;lt;div class="card__content"&amp;gt;Content here&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SMACSS
&lt;/h2&gt;

&lt;p&gt;Scalable and Modular Architecture for CSS (SMACSS) categorises CSS rules into five types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base: default browser styles (typography, resets).&lt;/li&gt;
&lt;li&gt;Layout: large structural areas (grid, header, footer).&lt;/li&gt;
&lt;li&gt;Module: reusable components (cards, buttons, forms).&lt;/li&gt;
&lt;li&gt;State: UI states (.is-active, .is-hidden).&lt;/li&gt;
&lt;li&gt;Theme: visual skins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SMACSS encourages separation of concerns, promoting reusability and scalability, and it helps organise large codebases logically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* layout/_header.scss */
.header { ... }

/* module/_card.scss */
.card { ... }

/* state/_visibility.scss */
.is-hidden { display: none; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  OOCSS
&lt;/h2&gt;

&lt;p&gt;Object-Oriented CSS (OOCSS) promotes splitting styles into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structure (object): layout and positioning.&lt;/li&gt;
&lt;li&gt;Skin: colours, fonts, shadows, borders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OOCSS encourages thinking of UI as reusable "objects" that can be extended visually through skins. It creates highly reusable elements, separating layout and appearance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* structure */
.box { display: block; padding: 1rem; }

/* skin */
.box--primary { background-color: blue; color: white; }
.box--secondary { background-color: grey; color: black; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Managing Specificity and Avoiding Excessive Inheritance
&lt;/h2&gt;

&lt;p&gt;All these methodologies share common goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limit specificity: Prefer simple class selectors over IDs or long chains.&lt;/li&gt;
&lt;li&gt;Avoid deep nesting: Don’t rely on parent-child structures (.nav .list .item .link), flat selectors are easier to override.&lt;/li&gt;
&lt;li&gt;Use consistent naming: BEM-style or SMACSS naming conventions make styles easy to locate and modify.&lt;/li&gt;
&lt;li&gt;Separate structure and skin: Keep layout and visual design decoupled.&lt;/li&gt;
&lt;li&gt;Use utility classes for global states: e.g. &lt;code&gt;.is-disabled&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;BEM, SMACSS, and OOCSS are not mutually exclusive: they share complementary principles that help you write predictable, maintainable, and scalable CSS. By embracing flat class-based selectors, separating concerns, and managing specificity, your front-end code will remain robust even as your project grows.&lt;/p&gt;

&lt;p&gt;A clear modular architecture with naming conventions not only improves maintainability but also fosters team collaboration and confidence in styling changes.&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>Multiple header, footer, and h1 Elements: What Is Actually Accessible?</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Fri, 20 Feb 2026 15:18:07 +0000</pubDate>
      <link>https://dev.to/miasalazar/multiple-header-footer-and-h1-elements-what-is-actually-accessible-5c2e</link>
      <guid>https://dev.to/miasalazar/multiple-header-footer-and-h1-elements-what-is-actually-accessible-5c2e</guid>
      <description>&lt;p&gt;Questions about how many &lt;code&gt;header&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, or &lt;code&gt;h1&lt;/code&gt; elements are allowed in a page are extremely common in web development, and they are often framed as strict accessibility rules. In reality, accessibility is less about counting elements and more about &lt;strong&gt;meaning, structure, and relationships&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article clarifies what is valid, what is accessible, and what actually matters when using &lt;code&gt;header&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, and &lt;code&gt;h1&lt;/code&gt; elements in a single document.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Principle: Semantics Over Superstition
&lt;/h2&gt;

&lt;p&gt;HTML is not a set of fragile rules that break accessibility when slightly bent. It is a semantic language designed to describe the structure of a document.&lt;/p&gt;

&lt;p&gt;The key question is not "how many of these elements am I allowed to use?",  but rather "Do these elements accurately describe the structure of the content?".&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple &lt;code&gt;header&lt;/code&gt; Elements
&lt;/h2&gt;

&lt;p&gt;Is it allowed? Yes. You can have &lt;strong&gt;multiple &lt;code&gt;header&lt;/code&gt; elements&lt;/strong&gt; in a single document. A &lt;code&gt;header&lt;/code&gt; represents introductory content for its nearest sectioning ancestor, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;body&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;article&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;section&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nav&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&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;header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Site name&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Article title&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Article content…&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure is both valid HTML and accessible. Each &lt;code&gt;header&lt;/code&gt; introduces its own section. Screen readers expose headers as structural landmarks tied to their sections. Multiple headers are not confusing when the hierarchy is clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple &lt;code&gt;footer&lt;/code&gt; Elements
&lt;/h2&gt;

&lt;p&gt;Is it allowed? Also yes. Like &lt;code&gt;header&lt;/code&gt;, the &lt;code&gt;footer&lt;/code&gt; element is &lt;strong&gt;section-scoped&lt;/strong&gt;. A &lt;code&gt;footer&lt;/code&gt; contains information related to its nearest ancestor section, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author information&lt;/li&gt;
&lt;li&gt;Related links&lt;/li&gt;
&lt;li&gt;Metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&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;article&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Post content…&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Written by Alex&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;© 2026 Example site&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Screen readers announce footers as landmarks only when they are top-level. Nested footers are treated as part of their section, which is expected behaviour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple &lt;code&gt;h1&lt;/code&gt; Elements
&lt;/h2&gt;

&lt;p&gt;Is it allowed? A really strong yes. HTML5 explicitly allows &lt;strong&gt;multiple &lt;code&gt;h1&lt;/code&gt; elements&lt;/strong&gt;. Each &lt;code&gt;h1&lt;/code&gt; represents the top heading of its &lt;strong&gt;sectioning context&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&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;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Article title&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Introduction&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Another article&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Overview&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Real Accessibility Question About Headings
&lt;/h2&gt;

&lt;p&gt;The real issue is not the number of &lt;code&gt;h1&lt;/code&gt;s, but whether the &lt;strong&gt;heading hierarchy makes sense&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A good heading structure involves headings that reflect the content structure, that levels are not skipped arbitrarily, and sections are clearly defined&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Poor Heading Structure

&amp;lt;h1&amp;gt;Main title&amp;lt;/h1&amp;gt;
&amp;lt;h4&amp;gt;Subsection&amp;lt;/h4&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skipping levels creates confusion for screen reader users who navigate by headings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screen Readers and Navigation
&lt;/h2&gt;

&lt;p&gt;Many assistive technology users navigate pages by headings, landmarks or regions. Proper use of &lt;code&gt;header&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, and heading levels enables faster navigation, clear mental models of the page and predictable reading order&lt;/p&gt;

&lt;p&gt;The problem is not multiplicity: it is &lt;strong&gt;misrepresentation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Guidelines
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;header&lt;/code&gt; and &lt;code&gt;footer&lt;/code&gt; elements should be used to introduce or conclude meaningful sections of content, not as generic wrappers. Headings should reflect the real structure of the page rather than visual styling choices, helping users understand how content is organised. &lt;/p&gt;

&lt;p&gt;Clarity should always be prioritised over rigid or outdated rules, and heading navigation should be tested with a screen reader to ensure the structure works in practice.&lt;/p&gt;

&lt;p&gt;If the structure makes sense to a human, it usually makes sense to assistive technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Using multiple &lt;code&gt;header&lt;/code&gt; and &lt;code&gt;footer&lt;/code&gt; elements in a document is both valid and accessible when they correctly describe their respective sections. Multiple &lt;code&gt;h1&lt;/code&gt; elements are also allowed and often appropriate, particularly in documents composed of distinct articles or regions.&lt;/p&gt;

&lt;p&gt;Accessibility does not depend on counting elements, but on providing a clear and logical hierarchy that accurately represents the content.&lt;/p&gt;

&lt;p&gt;HTML accessibility is ultimately about expressing meaning rather than following myths or arbitrary conventions.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>When Does a Component Re-render in React?</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Sun, 01 Feb 2026 19:53:25 +0000</pubDate>
      <link>https://dev.to/miasalazar/when-does-a-component-re-render-in-react-lnb</link>
      <guid>https://dev.to/miasalazar/when-does-a-component-re-render-in-react-lnb</guid>
      <description>&lt;p&gt;React's declarative nature and virtual DOM abstraction make it deceptively easy to build complex UIs. However, understanding when and why a component re-renders is essential for performance, especially in larger applications. Re-renders can be cheap, but unnecessary ones add up.&lt;/p&gt;

&lt;p&gt;This article explains the most common triggers of component re-renders and offers strategies for controlling them effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Triggers a Re-render?
&lt;/h2&gt;

&lt;p&gt;When a component’s state changes using useState, React schedules a re-render of that component.&lt;/p&gt;

&lt;p&gt;Every call to setCount with a different value will cause the component to re-render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [count, setCount] = useState(0);

const increment = () =&amp;gt; setCount(count + 1);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prop Changes
&lt;/h3&gt;

&lt;p&gt;If a component receives new props (i.e., if the parent re-renders and passes new values), the child will also re-render by default.&lt;/p&gt;

&lt;p&gt;If someValue changes (even if it’s deeply equal but a new reference), MyComponent will re-render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;MyComponent data={someValue} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Context Changes
&lt;/h3&gt;

&lt;p&gt;React Contexts provide a way to share values across the component tree. Any update to a context value will re-render all consuming components.&lt;/p&gt;

&lt;p&gt;When theme changes, ChildComponent and all others using useContext(MyContext) re-render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;MyContext.Provider value={theme}&amp;gt;
  &amp;lt;ChildComponent /&amp;gt;
&amp;lt;/MyContext.Provider&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parent Re-renders
&lt;/h3&gt;

&lt;p&gt;Even if a child’s props didn’t change, it can re-render if its parent re-renders unless it’s memoised with React.memo.&lt;/p&gt;

&lt;h2&gt;
  
  
  React Reconciliation: How React Decides to Re-render
&lt;/h2&gt;

&lt;p&gt;React uses referential equality (===) to compare props and state. If something changes, a new object, array, or primitive, it assumes the UI might need to update.&lt;/p&gt;

&lt;p&gt;This is why using immutable patterns is crucial. Mutating objects without changing their reference can lead to bugs or skipped renders.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Prevent Unnecessary Re-renders
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use React.memo for Pure Functional Components
&lt;/h3&gt;

&lt;p&gt;Only re-renders if name changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MyComponent = React.memo(({ name }) =&amp;gt; {
  console.log("Rendered!");
  return &amp;lt;div&amp;gt;{name}&amp;lt;/div&amp;gt;;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use useCallback and useMemo to Stabilise Functions and Values
&lt;/h3&gt;

&lt;p&gt;Without useCallback, the function is recreated on every render and may cause children to re-render unnecessarily.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const handleClick = useCallback(() =&amp;gt; {
  // Do something
}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Avoid Inline Objects and Arrays in Props
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Causes re-render
&amp;lt;Component data={{ a: 1 }} /&amp;gt;

// Use useMemo
const data = useMemo(() =&amp;gt; ({ a: 1 }), []);
&amp;lt;Component data={data} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Keep State Local Where Possible
&lt;/h3&gt;

&lt;p&gt;Lifting state up or storing too much in global context can lead to unnecessary tree-wide re-renders. Keep state close to where it’s used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Understanding when React re-renders a component is vital to building performant and predictable interfaces. State, props, context, and parent updates are the primary causes. By embracing immutable patterns and using tools like React.memo, useCallback, and useMemo, you can significantly reduce unnecessary rendering and boost the responsiveness of your application.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>performance</category>
    </item>
    <item>
      <title>Regular Functions vs Arrow Functions in JavaScript</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Mon, 26 Jan 2026 08:34:50 +0000</pubDate>
      <link>https://dev.to/miasalazar/regular-functions-vs-arrow-functions-in-javascript-528n</link>
      <guid>https://dev.to/miasalazar/regular-functions-vs-arrow-functions-in-javascript-528n</guid>
      <description>&lt;p&gt;JavaScript offers two main ways to declare functions: regular functions and arrow functions. While both can perform the same tasks, they behave differently in key areas, especially regarding this, arguments, and how they’re used in front-end development.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;this&lt;/code&gt; Binding
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Regular functions get their own &lt;code&gt;this&lt;/code&gt; depending on how they’re called. &lt;code&gt;this&lt;/code&gt; changes based on who calls the function.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const button = document.querySelector('#myButton');

button.addEventListener('click', function () {
  console.log(this); // 'this' = the button
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, this refers to the button that was clicked&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arrow functions don’t have their own this; they inherit it from their surrounding scope. &lt;code&gt;this&lt;/code&gt; comes from where the function is written.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes arrow functions ideal in situations where you want to keep the context&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const button = document.querySelector('#myButton');

button.addEventListener('click', () =&amp;gt; {
  console.log(this); // 'this' = window or outer scope
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, this does not refer to the button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arguments Object
&lt;/h2&gt;

&lt;p&gt;The arguments object is a built-in feature in regular functions in JavaScript. It contains an array-like list of all the values passed to that function, even if they weren’t defined as parameters.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regular functions have access to the arguments object, an array-like list of arguments passed to the function.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function showArguments() {
  console.log(arguments);
}

showArguments('Hello', 42, true);
// Output: ['Hello', 42, true] (in modern browsers)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Arrow functions do not have their own arguments. You need to use rest parameters instead (...args).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try to use arguments inside an arrow function, it won’t work the way you might expect. If you need to collect arguments in an arrow function, use the rest parameter syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const showArguments = (...args) =&amp;gt; {
  console.log(args);
};

showArguments('Hello', 42, true);
// Output: ['Hello', 42, true]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Constructors
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Regular functions can be used as constructors with new.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Person(name) {
  this.name = name;
  this.sayHello = function () {
    console.log(`Hello, I'm ${this.name}`);
  };
}

const user = new Person('Alice');
user.sayHello(); // Hello, I'm Alice

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Arrow functions cannot be used that way. They’re not constructors.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Person = (name) =&amp;gt; {
  this.name = name;
  this.sayHello = () =&amp;gt; {
    console.log(`Hello, I'm ${this.name}`);
  };
};

const user = new Person('Alice'); // ❌ TypeError: Person is not a constructor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Syntax
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Arrow functions are more concise, especially for one-liners or callbacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Arrow functions and regular functions both allow you to define reusable blocks of code. However, they serve slightly different purposes in modern JavaScript.&lt;/p&gt;

&lt;p&gt;Arrow functions are shorter, cleaner, and automatically bind this and arguments from their surrounding context. This makes them ideal for callbacks, array methods, and React components, where you want predictable scope and no surprises with this.&lt;/p&gt;

&lt;p&gt;On the other hand, regular functions are more flexible when you need your function to have its own this, use the built-in arguments object, or act as a constructor with new. They are better suited for event handlers on the DOM, older codebases, or where full control over the function context is required.&lt;/p&gt;

&lt;p&gt;Understanding when to use each helps keep your code readable, efficient, and bug-free, especially in front-end development where scope confusion is a common issue.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>frontend</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>Human‑Driven vs AI‑Driven IDEs</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Fri, 09 Jan 2026 09:29:09 +0000</pubDate>
      <link>https://dev.to/miasalazar/human-driven-vs-ai-driven-ides-52ha</link>
      <guid>https://dev.to/miasalazar/human-driven-vs-ai-driven-ides-52ha</guid>
      <description>&lt;p&gt;AI‑powered IDEs such as Cursor, VS Code with Copilot, and WebStorm AI Assistant are rapidly becoming part of everyday development. They can autocomplete code, refactor components, generate tests, and explain unfamiliar APIs.&lt;/p&gt;

&lt;p&gt;There is, however, a crucial distinction in how these tools are used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI‑driven development: the IDE leads, the human reacts.&lt;/li&gt;
&lt;li&gt;Human‑driven development: the human leads, the AI assists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article explains that distinction, why human‑driven workflows matter for teams, and how to configure AI‑enabled IDEs (with Cursor as a concrete example) to support that approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Do We Mean by AI‑Driven?
&lt;/h2&gt;

&lt;p&gt;An AI-driven workflow is one in which the developer accepts large AI-generated blocks of code with little or no critical review, allows the AI to make decisions about architecture, naming, and patterns, and increasingly relies on the tool to “solve” problems instead of reasoning through them. In this model, the AI effectively leads the development process, while the human mainly reacts to its output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Prompt: "Create a responsive navbar in React"

export default function Navbar() {
 return (
  &amp;lt;nav&amp;gt;
   &amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;Home&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;About&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;Contact&amp;lt;/li&amp;gt;
   &amp;lt;/ul&amp;gt;
  &amp;lt;/nav&amp;gt;
 );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code works, but the AI has implicitly made design decisions on behalf of the team, without considering accessibility, responsiveness, design‑system conventions, or state management. These omissions are subtle, but they accumulate quickly in real codebases.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Human‑Driven Development?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Human‑driven development&lt;/strong&gt; keeps intent, judgement, and responsibility firmly with the developer.&lt;/p&gt;

&lt;p&gt;In a human-driven approach, the AI is treated as a fast typist, a refactoring assistant, and a source of suggestions rather than a decision-maker. The human developer defines what needs to be built and why, while the AI helps with how to implement it, and all generated code is carefully reviewed, understood, and adapted to fit the wider system and context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface NavItem {
 label: string;
 href: string;
}

const navItems: NavItem[] = [
 { label: 'Home', href: '/' },
 { label: 'About', href: '/about' },
 { label: 'Contact', href: '/contact' },
];

export function Navbar() {
 return (
  &amp;lt;nav aria-label="Main navigation"&amp;gt;
   &amp;lt;ul className="nav-list"&amp;gt;
    {navItems.map(item =&amp;gt; (
     &amp;lt;li key={item.href}&amp;gt;
      &amp;lt;a href={item.href}&amp;gt;{item.label}&amp;lt;/a&amp;gt;
     &amp;lt;/li&amp;gt;
    ))}
   &amp;lt;/ul&amp;gt;
  &amp;lt;/nav&amp;gt;
 );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the AI may have helped with typing or mapping logic, but the structure is intentional, accessibility is explicit, and data is separated from presentation&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Cursor as a Human‑Driven IDE
&lt;/h2&gt;

&lt;p&gt;Using Cursor effectively requires deliberate constraints. Its deep AI integration can easily shift control away from the developer if left unchecked.&lt;/p&gt;

&lt;p&gt;A human‑driven setup starts by making intent explicit before invoking AI, through comments, partial implementations, type definitions, or clearly stated constraints. This anchors suggestions in the developer’s reasoning and ensures that the tool responds to existing context rather than introducing unsolicited structure or assumptions.&lt;/p&gt;

&lt;p&gt;In practice, Cursor works best when used incrementally. Inline completions and small, reviewable changes encourage understanding and ownership. Conservative configuration helps prevent large, unexamined rewrites. Treated this way, Cursor becomes an accelerator for well‑defined ideas rather than a substitute for architectural thinking or judgement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Files for a Human‑Driven Cursor Setup
&lt;/h2&gt;

&lt;p&gt;A key part of keeping Cursor &lt;em&gt;human‑driven&lt;/em&gt; is making your preferences explicit in configuration files. This reduces accidental AI overreach and aligns the tool with team standards.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Project‑Level Rules (&lt;code&gt;.cursor/rules.md&lt;/code&gt; or similar)
&lt;/h3&gt;

&lt;p&gt;Use a project‑local rules file to describe &lt;em&gt;how the AI should behave&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# AI Usage Rules

- Do not introduce new libraries without asking
- Prefer existing project patterns over generic best practices
- Optimise for readability over cleverness
- Always respect accessibility (WCAG) concerns
- Never change public APIs unless explicitly requested
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works especially well in teams, as it makes expectations explicit and repeatable.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Editor Settings (&lt;code&gt;settings.json&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Cursor builds on VS Code, so editor configuration still matters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "editor.inlineSuggest.enabled": true,
  "editor.suggest.preview": true,
  "editor.acceptSuggestionOnEnter": "off",
  "cursor.ai.autoGenerate": false,
  "cursor.ai.inlineSuggestions": true,
  "cursor.ai.confirmLargeChanges": true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These settings bias toward small, intentional interactions rather than wholesale generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Repository Documentation (&lt;code&gt;CONTRIBUTING.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Document &lt;em&gt;how AI is expected to be used&lt;/em&gt; in the repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## AI‑Assisted Development&lt;/span&gt;

AI tools may be used for:
&lt;span class="p"&gt;-&lt;/span&gt; Refactoring
&lt;span class="p"&gt;-&lt;/span&gt; Test generation
&lt;span class="p"&gt;-&lt;/span&gt; Documentation improvements

AI tools should not be used for:
&lt;span class="p"&gt;-&lt;/span&gt; Designing core architecture
&lt;span class="p"&gt;-&lt;/span&gt; Introducing new patterns without review
&lt;span class="p"&gt;-&lt;/span&gt; Replacing code reviews
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes AI usage part of the team’s social contract, not an implicit or ad‑hoc practice&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Optional: Prompt Templates
&lt;/h3&gt;

&lt;p&gt;Some teams keep prompt snippets in the repo for consistency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Refactoring Prompt

Refactor the selected code:
- Keep the public API unchanged
- Do not introduce new dependencies
- Prefer clarity over abstraction
- Explain the changes briefly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces vague prompts and improves output quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human‑Driven Prompting Patterns
&lt;/h2&gt;

&lt;p&gt;Instead of vague prompts like "Build this component", use constrained prompts such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Refactor this function to be more readable, keep the API unchanged"&lt;/li&gt;
&lt;li&gt;"Suggest accessibility improvements only, no visual changes"&lt;/li&gt;
&lt;li&gt;"Explain this code rather than rewriting it"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One effective pattern is using AI for &lt;em&gt;review&lt;/em&gt;, not creation. The AI becomes a second pair of eyes, not the primary author.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ask the AI:&lt;/span&gt;
&lt;span class="c1"&gt;// "What edge cases am I missing here?"&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;formatPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`£&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&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;h2&gt;
  
  
  Why Human‑Driven Matters in Front‑End
&lt;/h2&gt;

&lt;p&gt;Front‑end code is not just about logic; it directly shapes user experience, accessibility, performance, and visual consistency. Every component encodes product decisions and design intent.&lt;/p&gt;

&lt;p&gt;AI models have no real understanding of your users, business goals, regulatory constraints, or design system nuances. When they lead, those concerns are flattened or ignored.&lt;/p&gt;

&lt;p&gt;Human‑driven workflows help teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid fragmented UI patterns&lt;/li&gt;
&lt;li&gt;Preserve long‑term code quality&lt;/li&gt;
&lt;li&gt;Reduce hidden technical debt&lt;/li&gt;
&lt;li&gt;Improve readability and onboarding&lt;/li&gt;
&lt;li&gt;Maintain shared understanding across the codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By keeping intent and judgement with developers, teams gain speed without sacrificing coherence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;AI‑enabled IDEs are not inherently good or bad; the real risk lies in ceding intent.&lt;/p&gt;

&lt;p&gt;By defining goals clearly, configuring tools conservatively, and treating AI as an assistant rather than an architect, developers can benefit from increased velocity without losing understanding or ownership.&lt;/p&gt;

&lt;p&gt;Human‑driven development is not slower: it is deliberate. And in UI‑centric codebases, that deliberation is a feature, not a bug.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Replacing Toasts with Accessible User Feedback Patterns</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Tue, 18 Nov 2025 18:43:49 +0000</pubDate>
      <link>https://dev.to/miasalazar/replacing-toasts-with-accessible-user-feedback-patterns-1p8l</link>
      <guid>https://dev.to/miasalazar/replacing-toasts-with-accessible-user-feedback-patterns-1p8l</guid>
      <description>&lt;p&gt;Providing users with timely and meaningful feedback is essential for a usable digital experience. However, one of the most common UI patterns, toast notifications, often introduces serious accessibility barriers. Toasts tend to appear unpredictably, disappear too quickly, lack keyboard accessibility, and are rarely announced properly by assistive technologies.&lt;/p&gt;

&lt;p&gt;This article explores why toast notifications often fail to meet WCAG guidelines, and proposes accessible alternatives, complete with example code snippets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Toasts Are Problematic
&lt;/h2&gt;

&lt;p&gt;Toasts typically violate several WCAG 2.2 success criteria &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-interruptive timing issues: Toasts frequently appear for only a few seconds, preventing some users from perceiving them.&lt;/li&gt;
&lt;li&gt;Lack of screen reader announcement: Many toasts are not implemented as live regions, meaning assistive technology users may never know they were there.&lt;/li&gt;
&lt;li&gt;Keyboard inaccessibility: If the toast contains actionable elements (e.g., an “Undo” button), users often cannot tab into it before it vanishes.&lt;/li&gt;
&lt;li&gt;Unexpected appearance on screen: Toasts that slide into view can cause layout shifts or distract users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Accessible Alternatives to Toast Notifications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use Persistent Status Message Regions
&lt;/h3&gt;

&lt;p&gt;Avoid transient pop-ups and instead display status messages in a consistent, easily discoverable location, typically above the main content or directly beside the component that has changed.&lt;/p&gt;

&lt;p&gt;This ensures the message:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is always in a predictable location (WCAG 3.2.3 Consistent Navigation)&lt;/li&gt;
&lt;li&gt;Can remain visible until dismissed (WCAG 2.2.1 Timing Adjustable)&lt;/li&gt;
&lt;li&gt;Can be announced with aria-live (WCAG 4.1.3 Status Messages)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div 
  aria-live="polite"
  aria-atomic="true"
  id="status-message"&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Inline Feedback Near the Trigger
&lt;/h3&gt;

&lt;p&gt;For actions such as form submissions or toggles, providing feedback next to the interactive element can help users immediately associate the message with the action they performed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;button id="save-btn"&amp;gt;
  Save
&amp;lt;/button&amp;gt;
&amp;lt;span 
  id="save-feedback"
  class="visually-hidden"
  aria-live="assertive"
&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use a Non-modal, Dismissible Alert Component
&lt;/h3&gt;

&lt;p&gt;If a notification must stand out, consider an alert component fixed to the top of the page or container. Ensure it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stays visible until user dismissal (WCAG 2.2.1 Timing Adjustable)&lt;/li&gt;
&lt;li&gt;Is reachable via keyboard (WCAG 2.1.1 Keyboard)&lt;/li&gt;
&lt;li&gt;Is properly announced (WCAG 4.1.3 Status Messages)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div
  id="alert"
  class="alert"
  role="alert"
  tabindex="-1"
  hidden
&amp;gt;
  &amp;lt;p id="alert-text"&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;button aria-label="Dismiss alert" id="alert-dismiss"&amp;gt;×&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Keep Animations Minimal and Optional
&lt;/h3&gt;

&lt;p&gt;Some users may experience distraction or discomfort from motion. It is recommended to avoid unnecessary motion unless essential to functionality (WCAG 2.3.3 – Animation from Interactions) and respect the user’s “prefers-reduced-motion”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@media (prefers-reduced-motion: reduce) {
  .alert {
    transition: none;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Toasts may be familiar and visually appealing, but they often create accessibility barriers. By using persistent status areas, inline messages, or properly implemented alert components, designers and developers can ensure all users, including those with assistive technologies, can perceive, understand, and respond to important feedback.&lt;/p&gt;

&lt;p&gt;Replacing toasts with more accessible patterns not only improves compliance with WCAG but also leads to clearer, more reliable communication across your interface.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Why Skipping Frontend Tests Always Backfires</title>
      <dc:creator>Mía Salazar</dc:creator>
      <pubDate>Wed, 22 Oct 2025 07:05:38 +0000</pubDate>
      <link>https://dev.to/miasalazar/why-skipping-frontend-tests-always-backfires-2527</link>
      <guid>https://dev.to/miasalazar/why-skipping-frontend-tests-always-backfires-2527</guid>
      <description>&lt;p&gt;Every team has that one person, or two, who insists that “frontend tests are a waste of time.”&lt;/p&gt;

&lt;p&gt;They might say E2E tests are flaky, or that QA already does the job. But deep down, skipping tests isn’t a bold time-saving move; it’s a long-term productivity trap.&lt;/p&gt;

&lt;p&gt;Here’s how to win the argument (and save your project from endless regressions).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Testing Matters, even on the Frontend
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.Tests catch regressions before your users do
&lt;/h3&gt;

&lt;p&gt;Frontend changes are deceptively simple. You tweak a component or update an API call, and suddenly the login form stops working.&lt;/p&gt;

&lt;p&gt;Having automated tests for critical flows (login, checkout...) ensures that your app’s core functionality never silently breaks. Without tests, the real testers are your users, and they’re the worst kind of testers.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.They actually save time
&lt;/h3&gt;

&lt;p&gt;Fixing a bug found in production takes exponentially more time than catching it during development. Manual QA can’t rerun every scenario on every release, but a test suite can, in seconds.&lt;/p&gt;

&lt;p&gt;So while writing tests feels slow upfront, it pays off every sprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.They make refactoring safe
&lt;/h3&gt;

&lt;p&gt;When your codebase grows, refactors are inevitable. Without tests, developers fear touching anything. With tests, you can confidently restructure, optimize, or modernize your code, knowing that your safety net will catch regressions instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.They force better code design
&lt;/h3&gt;

&lt;p&gt;Writing testable code means separating responsibilities and avoiding hidden side effects. Tests naturally lead to cleaner, more modular, and easier-to-understand components.&lt;/p&gt;

&lt;p&gt;In the long run, this reduces onboarding time for new developers and increases overall code health.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.You don’t need 100% coverage
&lt;/h3&gt;

&lt;p&gt;Nobody’s asking for full-blown test coverage. Start small: Cover only the key integration flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Objections, and How to Defeat Them
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Tests are too fragile": Badly written tests can be unstable, but using modern tools, and using them well, makes them reliable and maintainable.&lt;/li&gt;
&lt;li&gt;"We don’t have time": Skipping tests saves time only in the short term. Bugs found later cost far more to fix and slow development over time.&lt;/li&gt;
&lt;li&gt;"QA already checks that": QA should focus on exploratory and edge-case testing, not on repeating the same core flows every release.&lt;/li&gt;
&lt;li&gt;"Our app changes too often": Frequent changes increase the risk of regressions. Well-structured tests provide confidence and prevent hidden breakages.&lt;/li&gt;
&lt;li&gt;"Tests slow us down": Full E2E coverage can be slow, but a balanced strategy, focusing E2E on key user flows and using faster integration or unit tests elsewhere, keeps feedback loops quick and efficient.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why End-to-End tests alone aren’t enough
&lt;/h2&gt;

&lt;p&gt;E2E tests are fantastic, they simulate real user behavior and verify that everything works together. But relying only on E2E tests is like checking if your car drives without ever opening the hood.&lt;/p&gt;

&lt;p&gt;Here’s why that’s risky:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;E2E tests are heavy and slow: They take longer to run and are more brittle because they depend on the full stack being up and stable.&lt;/li&gt;
&lt;li&gt;When they fail, it’s hard to know why: A single failing E2E might mean a backend bug, a frontend change... Debugging takes longer than if you had smaller, faster integration or unit tests.&lt;/li&gt;
&lt;li&gt;You lose granularity: Without lower-level tests, you can’t easily isolate where a bug originates.&lt;/li&gt;
&lt;li&gt;They don’t scale well: Large teams need fast feedback loops. Having only E2E tests means waiting minutes (or hours) for CI runs instead of seconds for unit tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclussions
&lt;/h2&gt;

&lt;p&gt;Convincing someone to write tests isn’t about dogma: it’s about pragmatism. It’s insurance against chaos. Start small, show quick wins, and let the results speak for themselves. Before long, your once-skeptical teammate will be willing to create more tests.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
