<?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: Miguel Ángel Durán 👨‍💻</title>
    <description>The latest articles on DEV Community by Miguel Ángel Durán 👨‍💻 (@midudev).</description>
    <link>https://dev.to/midudev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F181531%2F13c4a2d2-6bf6-4474-8222-d706244331fd.jpg</url>
      <title>DEV Community: Miguel Ángel Durán 👨‍💻</title>
      <link>https://dev.to/midudev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/midudev"/>
    <language>en</language>
    <item>
      <title>Sharpen Your Coding Skills with 25 Daily JavaScript and Python Challenges 🎅 AdventJS 2025</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Wed, 03 Dec 2025 23:43:40 +0000</pubDate>
      <link>https://dev.to/midudev/sharpen-your-coding-skills-with-25-daily-javascript-and-python-challenges-adventjs-2025-dhk</link>
      <guid>https://dev.to/midudev/sharpen-your-coding-skills-with-25-daily-javascript-and-python-challenges-adventjs-2025-dhk</guid>
      <description>&lt;p&gt;&lt;strong&gt;The new edition of AdventJS is live&lt;/strong&gt;, and this year it is bigger, cleaner, and more fun than ever.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;https://adventjs.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are new to AdventJS, it is a &lt;strong&gt;daily coding challenge series that runs from December 1 to December 25&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each day unlocks a new puzzle that you can solve with code right in your browser with real tests, instant feedback, and a growing leaderboard full of friendly competition.&lt;/p&gt;

&lt;p&gt;The coding challenges can be solved with &lt;strong&gt;JavaScript&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, and &lt;strong&gt;TypeScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This edition introduces several improvements and a stronger focus on learning through practice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvlbqxj33b7r0z8vg5kz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvlbqxj33b7r0z8vg5kz.jpg" alt="Example of challenge in AdventJS" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is New This Year?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✓ Cleaner and faster interface
&lt;/h3&gt;

&lt;p&gt;The platform has been redesigned to load faster, feel more minimal, and remove distractions so that you focus entirely on problem solving.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✓ A more accessible difficulty curve
&lt;/h3&gt;

&lt;p&gt;Challenges now increase difficulty more gradually. The early tasks help beginners warm up, while the later ones push experienced developers to think creatively.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✓ Secret tests and improved validation
&lt;/h3&gt;

&lt;p&gt;Each challenge includes hidden tests that prevent hardcoded or brittle solutions. Passing the tests means your code actually works. Also, you could check the console in each test.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✓ Achievements and progress tracking
&lt;/h3&gt;

&lt;p&gt;Solving challenges unlocks achievements that you can proudly share. You also keep a full history of your attempts to revisit later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjrtaxbd41z82rju0oduv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjrtaxbd41z82rju0oduv.jpg" alt="AdventJS achievements" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is AdventJS For?
&lt;/h2&gt;

&lt;p&gt;AdventJS is designed for everyone who wants to sharpen their algorithmic thinking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beginners who want to learn problem solving with instant feedback
&lt;/li&gt;
&lt;li&gt;Frontend and backend developers who want to train daily
&lt;/li&gt;
&lt;li&gt;People preparing interviews or coding tests
&lt;/li&gt;
&lt;li&gt;Anyone who enjoys a good puzzle with a festive twist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No configuration, no toolchain, no environment setup. Just open the challenge and start coding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Join AdventJS 2025?
&lt;/h2&gt;

&lt;p&gt;Daily practice builds consistency and confidence. Even a five minute attempt can dramatically improve how you think about code.&lt;br&gt;&lt;br&gt;
But the best part is the community. Thousands of developers worldwide participate each year, compare solutions, discuss strategies, and help each other grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Start
&lt;/h2&gt;

&lt;p&gt;Go to &lt;strong&gt;&lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;https://adventjs.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Log In with your GitHub account, select the available challenge for the day, write your solution, run the tests, and submit. That is it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Final Note
&lt;/h2&gt;

&lt;p&gt;This project is built to encourage learning, curiosity, and experimentation. Whether you finish all 25 challenges or just try a few, the important part is enjoying the experience and learning something new each day.&lt;/p&gt;

&lt;p&gt;Happy coding and welcome to AdventJS 2025.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>python</category>
    </item>
    <item>
      <title>AdventJS: 25 Programming Challenges in JavaScript and Python! [Free]</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Fri, 13 Dec 2024 13:10:24 +0000</pubDate>
      <link>https://dev.to/midudev/adventjs-25-programming-challenges-in-javascript-and-python-free-29bi</link>
      <guid>https://dev.to/midudev/adventjs-25-programming-challenges-in-javascript-and-python-free-29bi</guid>
      <description>&lt;p&gt;I’m very excited to announce &lt;strong&gt;&lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS 2024&lt;/a&gt;&lt;/strong&gt;! Bigger, better than ever, and now with support for &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you love programming, enjoy solving problems, or simply want to improve your skills while having fun, this is your moment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08co88u6wdlbxim4z3jw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08co88u6wdlbxim4z3jw.png" alt="Screenshot of AdventJS challenges" width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Go to &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;adventjs.dev&lt;/a&gt; to start participating—it's free.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AdventJS? 🎄
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; is a series of &lt;strong&gt;daily programming challenges&lt;/strong&gt; unlocked throughout December. From December 1 to December 25, each day you'll get a new challenge to test your knowledge and creativity. This year, in addition to the languages you already know—&lt;strong&gt;JavaScript&lt;/strong&gt; and &lt;strong&gt;TypeScript&lt;/strong&gt;—we’ve added support for &lt;strong&gt;Python&lt;/strong&gt;. 🐍  &lt;/p&gt;

&lt;p&gt;So, whether you’re a front-end lover, a back-end master, or just a programming enthusiast, there’s something for everyone!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should you participate? 🤔
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improve your skills&lt;/strong&gt;: Solving daily challenges is an amazing way to practice and enhance your programming skills.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Achievements and scoring&lt;/strong&gt;: Earn achievements and track your progress. It’s like a video game, but instead of collecting coins, you level up as a developer. 🎮👨‍💻
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A global community&lt;/strong&gt;: AdventJS is available in &lt;strong&gt;Spanish 🇪🇸&lt;/strong&gt;, &lt;strong&gt;English 🇺🇸&lt;/strong&gt;, and &lt;strong&gt;Portuguese 🇧🇷&lt;/strong&gt;, meaning you’ll be participating alongside thousands of programmers worldwide.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guaranteed fun&lt;/strong&gt;: Each challenge is designed to be entertaining and challenging. Nothing beats that feeling of victory when you crack the solution!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pcl92tetkxzh176cyck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pcl92tetkxzh176cyck.png" alt="Screenshot of AdventJS challenges" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This year, we’ve added challenges and trophies to make it even more fun. 🏆 &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What do you need to get started? 🛠️
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;An account on &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; (it’s free!).
&lt;/li&gt;
&lt;li&gt;Basic knowledge of &lt;strong&gt;JavaScript&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt;, or &lt;strong&gt;Python&lt;/strong&gt;. Whether you’re a beginner or an expert, the challenges are designed for all skill levels.
&lt;/li&gt;
&lt;li&gt;A desire to learn and have fun!
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How does it work? 🕹️
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Daily challenges&lt;/strong&gt;: A new challenge unlocks every day. You can solve them in any order, but you can’t skip ahead.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solve in your favorite language&lt;/strong&gt;: With the addition of &lt;strong&gt;Python&lt;/strong&gt;, you can now choose the language you’re most comfortable with for each challenge.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share and learn&lt;/strong&gt;: Once you complete a challenge, you can see how other developers solved it. It’s a unique opportunity to learn different approaches and improve your code.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Join me on this adventure! 🚀
&lt;/h2&gt;

&lt;p&gt;In 2024, we want more programmers to take on the challenge. This year, we’ve worked hard to make &lt;strong&gt;AdventJS&lt;/strong&gt; more accessible and exciting. Plus, you’ll find me on my social media sharing tips and solutions for some of the challenges (no spoilers, though! 😜).  &lt;/p&gt;

&lt;p&gt;Sign up now at &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; and be part of this unique experience. See you in the challenges!  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy coding and let the magic of December begin! 🎅🎄&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;If you have questions or just want to share your progress, join the conversation on &lt;strong&gt;X&lt;/strong&gt; with the hashtag &lt;strong&gt;#AdventJS&lt;/strong&gt;, or stop by my &lt;strong&gt;Twitch channel&lt;/strong&gt;. I’ll be streaming AdventJS content throughout December!  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>python</category>
    </item>
    <item>
      <title>25 retos de Programación de JavaScript y Python: AdventJS</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Sat, 07 Dec 2024 21:18:11 +0000</pubDate>
      <link>https://dev.to/midudev/25-retos-de-programacion-de-javascript-y-python-adventjs-2gj0</link>
      <guid>https://dev.to/midudev/25-retos-de-programacion-de-javascript-y-python-adventjs-2gj0</guid>
      <description>&lt;p&gt;¡Estoy muy emocionado de anunciar &lt;strong&gt;&lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS 2024&lt;/a&gt;&lt;/strong&gt;! Más grande, mejor que nunca y con compatibilidad para &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si eres amante de la programación, te encanta resolver problemas o simplemente quieres mejorar tus habilidades mientras te diviertes, este es tu momento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08co88u6wdlbxim4z3jw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08co88u6wdlbxim4z3jw.png" alt="Captura de pantalla de los retos de AdventJS" width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Entra a &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;adventjs.dev&lt;/a&gt; para empezar a participar, es gratis.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es AdventJS? 🎄
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; es una serie de &lt;strong&gt;retos diarios de programación&lt;/strong&gt; que se desbloquean a lo largo de diciembre. Desde el 1 hasta el 25 de diciembre, cada día tendrás un nuevo desafío que pondrá a prueba tus conocimientos y creatividad. Este año, además de los lenguajes que ya conoces, &lt;strong&gt;JavaScript&lt;/strong&gt; y &lt;strong&gt;TypeScript&lt;/strong&gt;, hemos agregado soporte para &lt;strong&gt;Python&lt;/strong&gt;. 🐍  &lt;/p&gt;

&lt;p&gt;Así que, seas un amante del front-end, un maestro del back-end o un entusiasta del mundo de la programación, ¡hay algo para todos!&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué deberías participar? 🤔
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mejorar tus habilidades&lt;/strong&gt;: Resolver desafíos diarios es una forma increíble de practicar y mejorar tus habilidades de programación.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logros y puntuación&lt;/strong&gt;: Obtén logros y lleva un seguimiento de tu progreso. Es como un videojuego, pero en lugar de acumular monedas, mejoras como desarrollador. 🎮👨‍💻
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Una comunidad global&lt;/strong&gt;: AdventJS está disponible en &lt;strong&gt;español 🇪🇸&lt;/strong&gt;, &lt;strong&gt;inglés 🇺🇸&lt;/strong&gt; y &lt;strong&gt;portugués 🇧🇷&lt;/strong&gt;, lo que significa que estarás participando junto a miles de programadores de todo el mundo.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diversión garantizada&lt;/strong&gt;: Cada reto está diseñado para ser entretenido y desafiante. ¡Nada mejor que esa sensación de victoria cuando encuentras la solución correcta!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pcl92tetkxzh176cyck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pcl92tetkxzh176cyck.png" alt="Captura de pantalla de los retos del AdventJS" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Este año hemos añadido retos y trofeos para que te diviertas más. 🏆 &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ¿Qué necesitas para empezar? 🛠️
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Una cuenta en &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; (¡es gratis!).
&lt;/li&gt;
&lt;li&gt;Tener conocimientos básicos en &lt;strong&gt;JavaScript&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt; o &lt;strong&gt;Python&lt;/strong&gt;. No importa si eres principiante o experto, los retos están pensados para todos los niveles.
&lt;/li&gt;
&lt;li&gt;¡Ganas de aprender y divertirte!
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ¿Cómo funciona? 🕹️
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Retos diarios&lt;/strong&gt;: Cada día se desbloquea un nuevo reto. Puedes resolverlos en el orden que quieras, pero no puedes adelantarte.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resuelve en tu lenguaje favorito&lt;/strong&gt;: Este año, con la incorporación de &lt;strong&gt;Python&lt;/strong&gt;, puedes elegir el lenguaje que más te acomode para resolver cada desafío.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparte y aprende&lt;/strong&gt;: Una vez que completes un reto, puedes ver cómo lo resolvieron otros desarrolladores. Es una oportunidad única para aprender diferentes enfoques y mejorar tu código.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ¡Acompáñame en esta aventura! 🚀
&lt;/h2&gt;

&lt;p&gt;En 2024, queremos que más programadores se unan al desafío. Este año hemos puesto mucho esfuerzo para que &lt;strong&gt;AdventJS&lt;/strong&gt; sea más accesible y emocionante. Además, podrás encontrarme en mis redes compartiendo tips y soluciones para algunos de los retos (¡pero no spoilers, eh! 😜).  &lt;/p&gt;

&lt;p&gt;Regístrate ya en &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; y sé parte de esta experiencia única. ¡Nos vemos en los retos!  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¡Feliz programación y que comience la magia de diciembre! 🎅🎄&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Si tienes dudas o simplemente quieres compartir tu progreso, únete a la conversación en &lt;strong&gt;X&lt;/strong&gt; con el hashtag &lt;strong&gt;#AdventJS&lt;/strong&gt; o pásate por mi &lt;strong&gt;canal de Twitch&lt;/strong&gt;. ¡Estaré haciendo streams dedicados a AdventJS durante todo diciembre!  &lt;/p&gt;

</description>
      <category>adventjs</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>python</category>
    </item>
    <item>
      <title>Halloween.dev 🎃 JavaScript Programming Challenges</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Thu, 31 Oct 2024 00:43:29 +0000</pubDate>
      <link>https://dev.to/midudev/halloweendev-javascript-programming-challenges-3n0</link>
      <guid>https://dev.to/midudev/halloweendev-javascript-programming-challenges-3n0</guid>
      <description>&lt;p&gt;I'm thrilled to introduce &lt;strong&gt;&lt;a href="https://halloween.dev" rel="noopener noreferrer"&gt;halloween.dev&lt;/a&gt;&lt;/strong&gt;—a platform where you can tackle programming challenges with a haunted twist. If you enjoy coding and have a passion for the spooky, then this site is for you! 🎃👻&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Halloween.dev?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://halloween.dev" rel="noopener noreferrer"&gt;Halloween.dev&lt;/a&gt;&lt;/strong&gt; is a site featuring horror-themed programming challenges that you can solve using &lt;strong&gt;JavaScript&lt;/strong&gt; and &lt;strong&gt;TypeScript&lt;/strong&gt;. Each challenge is crafted to give you a fun, spooky experience while putting your coding skills to the test. From pumpkins to ghosts, every challenge incorporates Halloween elements that make coding feel just a bit... scarier. 🕸️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdelwrqg4dmccnkpsq2xc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdelwrqg4dmccnkpsq2xc.jpg" alt="Halloween.dev preview" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The platform is completely free and is available in English, Spanish, Portuguese, and Japanese.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works 🎲
&lt;/h2&gt;

&lt;p&gt;On Halloween.dev, you’ll find a collection of spooky programming challenges waiting for you to solve. Here’s how it all works:&lt;/p&gt;

&lt;p&gt;1- &lt;strong&gt;Pick Your Challenge&lt;/strong&gt;: Start by selecting the first challenge. Each task comes with a brief, eerie story or hint, giving you a feel for the puzzle you’re about to solve.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tecrs6d7jalg3mwknjj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tecrs6d7jalg3mwknjj.jpg" alt="Challenge selection preview" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2- &lt;strong&gt;Solve Using JavaScript or TypeScript&lt;/strong&gt;: Tackle the challenges using JavaScript or TypeScript. These tasks range in complexity, from beginner-friendly logic puzzles to more intricate problems that will test your coding skills and creativity.&lt;/p&gt;

&lt;p&gt;3- &lt;strong&gt;Test Your Solution&lt;/strong&gt;: Each challenge includes a real-time test suite. As you code, the platform checks your solution, providing immediate feedback on whether it meets the challenge criteria. This helps you refine your approach and know when you’ve cracked the puzzle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahwvgyddpll9615d68db.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahwvgyddpll9615d68db.jpg" alt="Testing solutions preview" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4- &lt;strong&gt;Unlock the Next Challenge&lt;/strong&gt;: Once you successfully complete a challenge, the next one becomes available. Each new challenge is a bit more difficult than the last, gradually intensifying your coding adventure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://halloween.dev" rel="noopener noreferrer"&gt;Halloween.dev&lt;/a&gt;&lt;/strong&gt; is designed to make learning and honing your JavaScript and TypeScript skills thrilling and fun. Each challenge adds a unique twist, keeping you engaged as you move through this haunted coding journey.&lt;/p&gt;

&lt;p&gt;Good luck, and let’s see if you can conquer every spooky challenge! 👻&lt;/p&gt;

</description>
      <category>halloween</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AdventJS, JavaScript/TypeScript challenges for Xmas 🎅</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Thu, 14 Dec 2023 14:06:42 +0000</pubDate>
      <link>https://dev.to/midudev/adventjs-javascripttypescript-challenges-for-xmas-2cbd</link>
      <guid>https://dev.to/midudev/adventjs-javascripttypescript-challenges-for-xmas-2cbd</guid>
      <description>&lt;p&gt;As the creator of &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt;, I'm thrilled to share with you the journey and inspiration behind this festive &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;coding challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Each December, &lt;strong&gt;&lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; becomes a playground for JavaScript developers, from beginners to veterans&lt;/strong&gt;, offering a unique problem to solve every day leading up to Christmas.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; is an annual 25-day coding challenge&lt;/strong&gt;, starting on December 1st and ending on the 25th. Each day, a new JavaScript problem is released on the platform, designed to test and improve your coding skills in a fun and festive way.&lt;/p&gt;

&lt;p&gt;It's available in English 🇬🇧, Spanish 🇪🇸 and Portuguese 🇧🇷.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenges
&lt;/h2&gt;

&lt;p&gt;The challenges in &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; range from simple tasks suitable for beginners to more complex problems that will make even seasoned developers scratch their heads. These problems are not just puzzles but practical scenarios that you might encounter in real-world programming.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknj1nyrfhicx0iicopf2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknj1nyrfhicx0iicopf2.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Community and Learning
&lt;/h2&gt;

&lt;p&gt;One of the most rewarding aspects of AdventJS is the community engagement. Developers share their solutions, learn from each other, and even collaborate. It's a fantastic way to learn new JavaScript techniques and best practices!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why JavaScript?
&lt;/h2&gt;

&lt;p&gt;JavaScript was chosen for its versatility and popularity. It's a language that many are familiar with, and it's used in a wide range of applications, making AdventJS accessible to a large audience.&lt;/p&gt;

&lt;p&gt;Also, you can use TypeScript to solve the challenges!&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the Fun!
&lt;/h2&gt;

&lt;p&gt;Whether you're a JavaScript newbie or a guru, AdventJS has something for you. It's more than just coding challenges; it's a celebration of the joy of coding and the warmth of the developer community during the festive season.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;https://adventjs.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding, and let the countdown begin!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your feedback and experiences with AdventJS are invaluable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Share your stories and solutions in the comments, or reach out to me directly. Let's make this December a memorable one for coding!&lt;/p&gt;

&lt;h1&gt;
  
  
  JavaScript #CodingChallenge #AdventJS #DevCommunity
&lt;/h1&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>AdventJS, JavaScript/TypeScript coding challenges</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Sun, 04 Dec 2022 18:13:46 +0000</pubDate>
      <link>https://dev.to/midudev/adventjs-javascripttypescript-coding-challenges-3l13</link>
      <guid>https://dev.to/midudev/adventjs-javascripttypescript-coding-challenges-3l13</guid>
      <description>&lt;p&gt;AdventJS is a programming challenge website that offers a unique and challenging experience for code lovers. Inspired by the traditional advent calendar, AdventJS reveals a new &lt;a href="https://adventjs.dev/" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; is a &lt;strong&gt;programming challenge website that offers a unique and challenging experience for code lovers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Inspired by the traditional advent calendar, &lt;a href="https://adventjs.dev/" rel="noopener noreferrer"&gt;AdventJS&lt;/a&gt; reveals a new JavaScript or TypeScript programming challenge every day from December 1st to 24th.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxt8sz895pumfwwtcdjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxt8sz895pumfwwtcdjy.png" alt="The platform has an integrated editor and tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Each AdventJS challenge is scored based on its complexity&lt;/strong&gt;, best practices, and maintainability. This way, you can track your progress and compete against other programmers to see who gets the highest score on each challenge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AdventJS is available in English and Spanish&lt;/strong&gt; and it’s completely free to use. Plus, you can share your solutions with the community and see how others have tackled the challenges.&lt;/p&gt;

&lt;p&gt;Don’t miss out on this unique opportunity to improve your JavaScript and TypeScript skills and have a blast doing it.&lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://adventjs.dev" rel="noopener noreferrer"&gt;https://adventjs.dev&lt;/a&gt; and start your journey towards programming excellence. I&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqj72oizwx0uj1s193i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqj72oizwx0uj1s193i3.png" alt="Image description"&gt;&lt;/a&gt;’ll see you there!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>adventjs</category>
      <category>adventofcode</category>
    </item>
    <item>
      <title>Building a common frontend tech platform at Adevinta Spain</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Thu, 29 Apr 2021 08:50:00 +0000</pubDate>
      <link>https://dev.to/adevintaspain/building-a-common-frontend-tech-platform-at-adevinta-spain-2ab5</link>
      <guid>https://dev.to/adevintaspain/building-a-common-frontend-tech-platform-at-adevinta-spain-2ab5</guid>
      <description>&lt;p&gt;Let me explain how we have achieved at &lt;strong&gt;Adevinta&lt;/strong&gt;, with hundreds of frontend developers, to work with the same set of tools to build our products.&lt;/p&gt;

&lt;h2&gt;
  
  
   A little bit of background: what's Adevinta?
&lt;/h2&gt;

&lt;p&gt;Adevinta is one of the world’s leading online classified ads businesses, active in 11 countries around the world and reaching &lt;strong&gt;more than 1.3 billion average monthly visits worldwide&lt;/strong&gt;. One of those countries is Spain 🇪🇸 where, as &lt;a href="https://adevinta.es/" rel="noopener noreferrer"&gt;Adevinta Spain&lt;/a&gt;, we have different marketplaces. For Real Estate we have &lt;a href="https://fotocasa.es" rel="noopener noreferrer"&gt;Fotocasa&lt;/a&gt;, &lt;a href="https://habitaclia.com" rel="noopener noreferrer"&gt;Habitaclia&lt;/a&gt;, for jobs &lt;a href="https://infojobs.net" rel="noopener noreferrer"&gt;InfoJobs&lt;/a&gt;, cars and motos in &lt;a href="https://coches.net" rel="noopener noreferrer"&gt;Coches.net&lt;/a&gt;, &lt;a href="https://motos.net" rel="noopener noreferrer"&gt;Motos.net&lt;/a&gt;. For generalist stuff, you could find &lt;a href="https://milanuncios.com" rel="noopener noreferrer"&gt;Milanuncios&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All these marketplaces are, in fact, different products with different teams and, yeah, &lt;strong&gt;different developers with different opinions&lt;/strong&gt; but, yet, very similar needs. We had spread the same company a dozen different tools to create bundles (Browserify, Webpack, manual systems…), for each we had different versions in many different repositories. And, imagine that, everyone with different configurations that supported different files in so many different ways. In one word: &lt;strong&gt;chaos.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The starting point
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9udk39n8wsn49y2ohec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9udk39n8wsn49y2ohec.png" alt="1_HW7nMa9LtQRW-L_JrWJZfw"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example of the old days. A single React component in Adevinta Spain. With a bunch of files starting with a dot for config and its own Webpack configuration for creating a demo for it. Still available at &lt;a href="https://github.com/SUI-Components/sui-autocompleted" rel="noopener noreferrer"&gt;https://github.com/SUI-Components/sui-autocompleted&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One year ago we decided to solve this and move forward. To do so, we iterated over the team called Enablers Frontend. This team's main objective was to &lt;strong&gt;grow a common frontend architecture&lt;/strong&gt;, giving a response to all products needs while focusing on making it scalable, resilient, replicable, robust, and as much cutting-edge technology as possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fospzcyl3sbinfwc02l5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fospzcyl3sbinfwc02l5w.png" alt="1_68vEaIAr_3Wa2ZQLmLunvw"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Relying on Compatible Versioning. So developers always get the latest fixes and features for free using the major.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For this, we started creating a &lt;a href="https://github.com/SUI-Components/sui" rel="noopener noreferrer"&gt;set of tools called SUI (Simple User Interface)&lt;/a&gt; to extract core functionality and tools for packages. We saw these tools like our &lt;strong&gt;AAAS (Architecture as a Software)&lt;/strong&gt; and focused on following the Unix rules to make the tools as modular, independent and, replaceable as possible. We could change a whole tool always that the entry parameters and the output remained the same.&lt;/p&gt;

&lt;p&gt;We also embraced other things: &lt;strong&gt;zero-config Javascript (#0CJS)&lt;/strong&gt;, to avoid dot points and config files in our projects and repositories; and &lt;a href="https://gitlab.com/staltz/comver" rel="noopener noreferrer"&gt;Compatible Versioning&lt;/a&gt; to rely always on the major version, get the new features and fixes for free and be as less disruptive as possible. Both characteristics forced us to be very careful about our decisions but, &lt;strong&gt;after several years, I could say that it was a success.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslks97wxrolv0pm9ifh0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslks97wxrolv0pm9ifh0.png" alt="1__Ee6iWvm9y0CfLD-n2XOdQ"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;Sean Larkin talking at the JSCamp about what zero-config means in terms of Developer Experience&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  @s-ui/bundler, using Webpack as the building platform
&lt;/h2&gt;

&lt;p&gt;So, one of the most important things that all our projects had in common was a way to create the bundles. While some used Browserify, some used Gulp, and others started to use Webpack. &lt;strong&gt;We created a new tool called &lt;a href="https://github.com/SUI-Components/sui/tree/master/packages/sui-bundler" rel="noopener noreferrer"&gt;@s-ui/bundler&lt;/a&gt;&lt;/strong&gt; to unify the way of creating it based on Webpack, as it was the de-facto way of bundling apps in the frontend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyigpdebtk09xmx6t0bq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyigpdebtk09xmx6t0bq1.png" alt="1_H2vGKvwMhTZvxpNnajL_1g"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;“What if it means that you could take just by defining this tiniest package […] and instantly, without needing configuration you automatically have those setups or specifications that you need for your build systems.” — Sean T. Larkin at JsCamp 2018&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This offers a set of rules based on the minimal assumptions possible. For example, support SASS and ES6 files using Babel with a &lt;a href="https://github.com/SUI-Components/sui/tree/master/packages/babel-preset-sui" rel="noopener noreferrer"&gt;babel-preset-sui&lt;/a&gt;. We tried to keep these assumptions as little as possible to be able to iterate fast and evolve quickly our dependencies. For example, &lt;strong&gt;from Webpack 1 to the actual Webpack 5 we haven’t had to do great changes and we haven’t had to create many majors of @s-ui/bundler for the users to adopt it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But, as you would see, @s-ui/bundler is just a simple wrapper over Webpack that provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero configuration&lt;/strong&gt; to get started with the basic config for all our products. &lt;a href="https://github.com/SUI-Components/sui/tree/master/packages/sui-bundler#folder-structure" rel="noopener noreferrer"&gt;Just put an index.html and app.js and you ready to go.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Development mode with some goodies&lt;/strong&gt; like Hot Reloading, screen errors, and, where you could easily link external packages with a &lt;strong&gt;link-package&lt;/strong&gt; parameter. The main difference with &lt;code&gt;npm link&lt;/code&gt;, is that the files are compiled on the fly with babel which results in the fastest hot reloading. Compatible with SASS files as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;App Bundle, Lib mode, and Server compilations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built-in CLI for all the commands&lt;/strong&gt; and also a way to analyze the bundle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A set of optimizations for CSS and chunks.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37rvu7sx9pb2nj2fkm7n.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37rvu7sx9pb2nj2fkm7n.gif" alt="1_EwFx7mYupnvacKATrIrlLw"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;If you’ve got the expected project structure, you’ll be able to start a development environment with a single command&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, @s-ui/bundler gives you the possibility of creating your web app in a few seconds &lt;strong&gt;with the minimal boilerplate but with the desired structure and technology&lt;/strong&gt; that we want to follow in Adevinta Spain across all the projects. But, still, there’s more…&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolving the platform, building on top of it
&lt;/h2&gt;

&lt;p&gt;In Adevinta Spain we decided to embrace React and use it to build all our UI so, as you could imagine, building your app with @s-ui/bundler lets you use React as well from scratch. &lt;strong&gt;You just install the dependency and you’re ready to go.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All our projects are aimed to be SPAs. Also, we wanted to offer our developers a very easy way to create a Server-side rendering experience for their products. For that, we created two separated tools: &lt;a href="https://github.com/SUI-Components/sui/tree/master/packages/sui-react-initial-props" rel="noopener noreferrer"&gt;@s-ui/react-initial-props&lt;/a&gt; and &lt;a href="https://github.com/SUI-Components/sui/tree/master/packages/sui-ssr" rel="noopener noreferrer"&gt;@s-ui/ssr&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  @s-ui/react-initial-props, the first stone for universal apps
&lt;/h3&gt;

&lt;p&gt;If you’re creating a SPA in React you might be tempted to fetch the data for your app in the &lt;code&gt;useEffect&lt;/code&gt;hook. So, you could control when the data is available to show a placeholder.&lt;/p&gt;

&lt;p&gt;This means that your app will have the needed data on the client but not on the server. That means that your app might not be easily crawlable by bots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@s-ui/react-initial-props package offers a way to make your easily your app isomorphic&lt;/strong&gt;. It let you create a static method called getInitialProps for your page component. This method, which returns a Promise, will be loading the chunk of your app as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foviawtk37hr3o7bj403u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foviawtk37hr3o7bj403u.png" alt="1_Jo5MilZKkLVqxE-24X86Ig"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;You could pass a contextFactory to create the needed context for your page. The contextFactory should be universal. loadPage will execute the &lt;code&gt;getInitialProps&lt;/code&gt; static method for you and deal with the async chunk.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon0po6j0g5rbu1qn1su9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon0po6j0g5rbu1qn1su9.png" alt="1_wefN8lQDCmlAPV18yDPhqg"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;loadHomePage has a component that will deal with the asynchronicity for you. You could even add a renderLoading to render a component while fetching the data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As you can imagine, the method getInitialProps needs to be universal, the code should be executable in the server and the client. For that, getInitialProps receives the same parameters in both environments.&lt;/p&gt;

&lt;p&gt;This approach is convenient as it avoids re-renders as other options like React-Transmit that caused a long time to respond, especially in the server.&lt;/p&gt;

&lt;p&gt;Next.js has something very similar called &lt;code&gt;getServerSideProps&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  @s-ui/ssr, transform your SPA in a Server-Side Rendering App
&lt;/h3&gt;

&lt;p&gt;If you were using @s-ui/bundler and @s-ui/react-initial-props… what would you think if I say to you that &lt;strong&gt;you could have for free a server-side rendering app without writing a single line of code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F470n3g8cu3d3cbqiynjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F470n3g8cu3d3cbqiynjk.png" alt="1_rnYyFRXLXT_wGYxXAkvN6A"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;@s-ui/bundler is a big piece of our Lego. It connects well with @s-ui/react-initial-props and, if you do so, you’ll be able to connect with @s-ui/ssr to get Server-Side Rendering by writing zero lines of code&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@s-ui/ssr&lt;/strong&gt; package essentially relies on the convention used in @s-ui/react-initial-props so you don’t have to write a line of code to transform your SPA in a full app with SSR. Also, it doesn’t only generates the code but create a Docker container ready to be deployed and add some interesting features like the proposition of Google to &lt;a href="https://developers.google.com/search/docs/guides/dynamic-rendering" rel="noopener noreferrer"&gt;perform dynamic rendering to do SSR for the bots and fetch the data in the client for your users.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This kind of tool wasn’t easy to create if it wasn’t built on top of a common platform. Now, &lt;strong&gt;you should think about them like Lego pieces&lt;/strong&gt; that let you the possibility of building within the base a greater app by using this modular approach thanks for following some foundations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some frequently asked questions 🤔 and comments…
&lt;/h2&gt;

&lt;h3&gt;
  
  
   🗣 Isn’t this a simple wrapper?
&lt;/h3&gt;

&lt;p&gt;Yes and no. Yes, as we’re wrapping a bunch of tools to provide it with a custom config and still, no, as they not only could have a config that would be reusable but also it has some nice additions (like some CLI interfaces to get the most of it). For example, &lt;strong&gt;isn’t create-react-app or standard a wrapper of tools&lt;/strong&gt;? And yet, they're pretty powerful. Wrapping tools give a simple way of creating a project from scratch, reusing the choices, sharing the benefits of some decisions, and converging to follow the same rules across different projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  🗣 Doesn’t this bother developer opinions about what tools to use?
&lt;/h3&gt;

&lt;p&gt;I understand this question. Not every developer has this concern but, usually, seniors with plenty of years of experience don’t want others to decide the tools or architecture to use in their projects. I could empathize with this feeling. However, one of the mottos of Adevinta is &lt;em&gt;“One team”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let me say that working as &lt;em&gt;“One team”&lt;/em&gt; in the frontend is not easy. If the debate about “&lt;em&gt;semicolons or not in Javascript&lt;/em&gt;” could unleash a war, imagine the limitless discussions about UI libraries, frameworks, and different architecture approaches. We try to listen and collect all the feedback before making decisions but, in the end, a decision should be made.&lt;/p&gt;

&lt;p&gt;Also, we’re far from perfection and we’re still improving this to get the most of the developers comfortable but, still, some people could not just accept a different&lt;/p&gt;

&lt;h3&gt;
  
  
  🗣 But I think is better if everyone is free to choose whatever they want!
&lt;/h3&gt;

&lt;p&gt;I wouldn’t like to start a discussion about convergence vs. divergence. From my point of view, both have advantages and drawbacks. In my experience in Adevinta Spain, converging in a set of tools has accelerated the development, improving the DX and the TTM (Time to Market) of features and new products. The start was not easy but the cost we assumed at the beginning has been more than compensated.&lt;/p&gt;

&lt;p&gt;Now, &lt;strong&gt;this doesn’t mean this strategy could work in every company&lt;/strong&gt;. As I explained in the beginning, Adevinta Spain has different products that are essentially the same structure: a marketplace. The main objective is to let developers focus on creating the best product possible without having to lose time in dealing with tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  🗣 Still, there are better solutions out there!
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;create-react-app&lt;/em&gt; and &lt;em&gt;Next.js&lt;/em&gt; would be the most similar solutions that we could adopt. Still, there’re some important differences. We needed the build our platform to be as modular as possible to be adopted by all the products step by step.&lt;/p&gt;

&lt;p&gt;For example, we could maintain all the codebases of the old project but start using the linter, later just use the tool for testing and, maybe as the last one, use the bundler. Or maybe try to use just the react-initial-props that could give a lot of value to the user if the project already used a custom Webpack config.&lt;/p&gt;

&lt;p&gt;NextJS, for example, provides you with a whole framework in a single piece that requires to be adopted at once. Don’t get me wrong, I love ❤️ NextJS and Vercel team but, for us, we had to build a platform for several projects at once, and being able to adopt progressively the platform was a must.&lt;/p&gt;

&lt;p&gt;Also, when we started this journey, &lt;strong&gt;Next.js didn't provide as many features as it does now.&lt;/strong&gt;. Maybe if we started now, things were would go different.&lt;/p&gt;

&lt;h3&gt;
  
  
   🗣 I want to discuss more of this!
&lt;/h3&gt;

&lt;p&gt;Well, you’re more than invited to do so. &lt;strong&gt;sui-bundler and the other tools are open source&lt;/strong&gt;. Also, just post your comment or follow the conversation on Twitter. 😊 We will be happy to hear feedback to iterate or improve the platform as every improvement we perform will be shared across all our projects. Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://careers.adevinta.es/ofertas/?search=frontend&amp;amp;stc=aff-blog%20dev.to-building%20a%20common%20frontend%20tech%20platform%20at%20adevinta%20spain"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9akue98pbtqin1jgjnaw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webpack</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Cómo crear un spinner loader con CSS</title>
      <dc:creator>Miguel Ángel Durán 👨‍💻</dc:creator>
      <pubDate>Sun, 18 Apr 2021 12:42:26 +0000</pubDate>
      <link>https://dev.to/midudev/como-crear-un-spinner-loader-con-css-4cdj</link>
      <guid>https://dev.to/midudev/como-crear-un-spinner-loader-con-css-4cdj</guid>
      <description>&lt;p&gt;Un spinner loader, o donut spinner, es un elemento muy típico en nuestras aplicaciones ya que le &lt;strong&gt;indica al usuario que un contenido se está cargando.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos a ver &lt;strong&gt;cómo puedes crear el tuyo con HTML y CSS&lt;/strong&gt; en muy pocas líneas de código. Si quieres, puedes ver el vídeo donde lo hago paso a paso:&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8nm9WPptL0c"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo queda el spinner?
&lt;/h2&gt;

&lt;p&gt;Si quieres ver el resultado final, te dejo aquí un Codepen para que veas cómo quedaría nuestro spinner: &lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/miduga/embed/RwGxpyJ?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Creando el spinner con HTML y CSS desde cero
&lt;/h2&gt;

&lt;p&gt;Lo primero que tenemos que hacer es el HTML de nuestro spinner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'spinner'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y a partir de aquí estilamos esta clase con CSS. ¡Vamos por partes!&lt;/p&gt;

&lt;p&gt;Primero le añadimos un borde, con &lt;strong&gt;4 píxeles de borde&lt;/strong&gt; y lo hacemos con un color negro pero con mucha transparencia. Pero hacemos que uno de los lados no tenga color, que sea transparente. Y también hacemos que use el border-radius, para curvar este nuevo borde.&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;.spinner&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;4px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border-left-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50%&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;Para las medidas, usamos una forma cuadrada con un &lt;strong&gt;alto y ancho de 36px.&lt;/strong&gt;&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;.spinner&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;4px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border-left-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;36px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;36px&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;Y finalmente vamos a añadir nuestra animación. Vamos a llamar a esta animación &lt;code&gt;spin&lt;/code&gt;, que dure un segundo y el tipo de animación sea &lt;code&gt;linear&lt;/code&gt; que es lineal. Puedes usar la que quieras en este punto.&lt;/p&gt;

&lt;p&gt;Lo importante es que pongas que se tiene que hacer de forma &lt;code&gt;infinite&lt;/code&gt;, para que se haga repetidas veces la animación.&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;.spinner&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;4px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border-left-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;36px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;36px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;spin&lt;/span&gt; &lt;span class="m"&gt;1s&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt; &lt;span class="n"&gt;infinite&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;Ahora creamos la animación usando &lt;code&gt;@keyframes&lt;/code&gt; de forma que empezamos en un punto (el punto de inicio es 0%) y, al final, habremos rotado el spinner completamente (100%):&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="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;spin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="err"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;360deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Y ya lo tenemos! Puedes ver el &lt;strong&gt;resultado final&lt;/strong&gt; en este enlace: &lt;a href="https://codepen.io/miduga/pen/RwGxpyJ?editors=1100"&gt;https://codepen.io/miduga/pen/RwGxpyJ?editors=1100&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y si prefieres verlo en vídeo, lo tienes aquí:&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8nm9WPptL0c"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

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