<?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: Rohrig</title>
    <description>The latest articles on DEV Community by Rohrig (@rohrig).</description>
    <link>https://dev.to/rohrig</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%2F206408%2F13d72d6c-b058-4275-af8b-3fed30ca1ead.jpg</url>
      <title>DEV Community: Rohrig</title>
      <link>https://dev.to/rohrig</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rohrig"/>
    <language>en</language>
    <item>
      <title>Everyday Challenges of Responsive Web Design</title>
      <dc:creator>Rohrig</dc:creator>
      <pubDate>Tue, 21 Nov 2023 16:44:02 +0000</pubDate>
      <link>https://dev.to/vue-storefront/everyday-challenges-of-responsive-web-design-5e3j</link>
      <guid>https://dev.to/vue-storefront/everyday-challenges-of-responsive-web-design-5e3j</guid>
      <description>&lt;p&gt;Part 1: The Right Image for the Device&lt;/p&gt;

&lt;p&gt;Responsive Web Design (RWD) is essential in today's multi-device world. A key challenge in RWD is choosing and loading the right image size based on the device's screen size. This ensures both the quality of the image and the performance of the website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element example
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VRm-yc6x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/rohrig/carosel-multisize-image-example/assets/45824492/5617d5d2-e37d-454c-8331-207b556bcdda" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VRm-yc6x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/rohrig/carosel-multisize-image-example/assets/45824492/5617d5d2-e37d-454c-8331-207b556bcdda" alt="Optimize" width="600" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Role of the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; Element in RWD
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Understanding the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; Tag
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element in HTML allows for more control over image resources in different scenarios.&lt;/li&gt;
&lt;li&gt;It contains one or more &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; elements and a single &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element.&lt;/li&gt;
&lt;li&gt;The browser evaluates each &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; to find the best match for the current display and if none matches, or if the browser doesn't support &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;, it falls back to the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element's &lt;code&gt;src&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  The Code in Action
&lt;/h4&gt;

&lt;p&gt;Consider this Vue.js code snippet:&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;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 768px)"&lt;/span&gt; &lt;span class="na"&gt;:srcset=&lt;/span&gt;&lt;span class="s"&gt;"item.largeImage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 767px)"&lt;/span&gt; &lt;span class="na"&gt;:srcset=&lt;/span&gt;&lt;span class="s"&gt;"item.smallImage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;:src=&lt;/span&gt;&lt;span class="s"&gt;"item.defaultImage"&lt;/span&gt; &lt;span class="na"&gt;:alt=&lt;/span&gt;&lt;span class="s"&gt;"item.altText"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Image Selection&lt;/strong&gt;: Different images are loaded depending on the screen width. Larger images for screens wider than 768 pixels, and smaller ones for narrower screens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency and Speed&lt;/strong&gt;: This technique optimizes bandwidth usage and improves page load times by loading images best suited to the viewer’s display.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback Mechanism&lt;/strong&gt;: The &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element is a backup if no &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; elements match.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices for Using the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; Element
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Art Direction&lt;/strong&gt;: Use &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; to modify images for different conditions, like loading a simpler image with fewer details on smaller screens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Format Flexibility&lt;/strong&gt;: Offer alternative image formats, such as AVIF or WEBP, which may not be supported by all browsers, alongside more universal formats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimized Bandwidth Use&lt;/strong&gt;: Save bandwidth and improve page load times by loading the most appropriate image for the viewer's display.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-DPI Displays&lt;/strong&gt;: Use &lt;code&gt;srcset&lt;/code&gt; on the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element for high-DPI displays. This allows browsers to choose lower-density versions in data-saving modes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Positioning and Sizing&lt;/strong&gt;: Utilize &lt;code&gt;object-fit&lt;/code&gt; and &lt;code&gt;object-position&lt;/code&gt; properties on the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element to adjust the positioning and sizing of the image within the frame.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The why
&lt;/h3&gt;

&lt;p&gt;In responsive web design, effectively managing images is crucial. The &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element is a powerful tool that helps in loading the right image for the right device, enhancing both the user experience and the website’s performance. As we continue to navigate the challenges of RWD, understanding and utilizing these elements will be key to creating versatile and efficient web designs. Stay tuned for more insights in this series on responsive web design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considering alternative approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why not just load images based on device detection?
&lt;/h3&gt;

&lt;p&gt;Choosing the right method to load images on a website, especially in a responsive design context, involves considering both efficiency and user experience. While detecting the user's device server-side and then serving appropriate images based on that information is a possible approach, there are several reasons why using HTML's &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element or CSS media queries might be more advantageous:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Device Diversity&lt;/strong&gt;: The range of devices used to access the web is vast and constantly evolving. It's not just about differentiating between a desktop and a mobile device; there are various screen sizes, resolutions, and even connection speeds to consider. Using the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element or CSS media queries allows the browser to make real-time decisions based on the actual device characteristics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client-Side Flexibility&lt;/strong&gt;: By using the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element or CSS, the decision about which image to load is made client-side, based on the actual conditions at the moment the page is rendered. This includes not only the screen size but also the type of connection (e.g., Wi-Fi or cellular data), which can change even during a single session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance and Bandwidth Optimization&lt;/strong&gt;: Detecting the device server-side and serving different images based on this can lead to unnecessary overhead. The &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element allows for more efficient loading of images, as it can select the most appropriate image based on the current viewport and pixel density, potentially saving bandwidth and improving load times.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability and Maintenance&lt;/strong&gt;: Maintaining a server-side device detection system can be complex and require constant updates as new devices enter the market. In contrast, using the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element or CSS media queries offloads this responsibility to the browser, which is regularly updated to handle new devices and screen sizes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Future-Proofing&lt;/strong&gt;: The web is continuously evolving, and so are web standards and browsers. Relying on current standards like the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element ensures that your website is more likely to remain compatible with future devices and browsers without requiring significant rework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SEO and Accessibility&lt;/strong&gt;: Search engines prefer websites that use standard, semantic HTML. Using the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element is in line with HTML standards and can be more easily interpreted by search engines, potentially improving SEO. It's also more straightforward for screen readers and other assistive technologies to interpret, improving accessibility.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While server-side device detection has its uses, for image loading in a responsive design, client-side methods like the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element or CSS media queries generally offer greater flexibility, efficiency, and forward compatibility. These methods align better with the principles of responsive web design, focusing on the actual capabilities and conditions of the user's device at the time of access.&lt;/p&gt;

&lt;h2&gt;
  
  
  A more complex example
&lt;/h2&gt;

&lt;p&gt;For this example, I'm using a Nuxt 3 project along with my favorite eCommerce UI library, &lt;a href="https://docs.storefrontui.io/v2/"&gt;Storefront UI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Challenge
&lt;/h3&gt;

&lt;p&gt;What if I need to create something more than just a static image, what about something as complex as a carousel? And to boot, what if we want to load different images into that carousel based on the size of the browser window?&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; approach works quite well in this scenario. Let's use a Nuxt 3 App for example. We can create a component that will load the images based on the size of the browser window. There are many edge cases we're ignoring here so we can focus on the topic at hand. &lt;/p&gt;

&lt;p&gt;Let's focus on the carousel: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/components/Carousel.vue&lt;/code&gt;&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;template&amp;gt;&lt;/span&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;"carousel"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&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;"carousel-track"&lt;/span&gt; &lt;span class="na"&gt;:style=&lt;/span&gt;&lt;span class="s"&gt;"{ transform: `translateX(-${currentIndex * 100}%)` }"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&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;"carousel-item"&lt;/span&gt; &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"(item, index) in items"&lt;/span&gt; &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 768px)"&lt;/span&gt; &lt;span class="na"&gt;:srcset=&lt;/span&gt;&lt;span class="s"&gt;"item.largeImage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 767px)"&lt;/span&gt; &lt;span class="na"&gt;:srcset=&lt;/span&gt;&lt;span class="s"&gt;"item.smallImage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full h-auto md:w-auto"&lt;/span&gt; &lt;span class="na"&gt;:src=&lt;/span&gt;&lt;span class="s"&gt;"item.defaultImage"&lt;/span&gt; &lt;span class="na"&gt;:alt=&lt;/span&gt;&lt;span class="s"&gt;"item.altText"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&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;"carousel-dots"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"dot"&lt;/span&gt; &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"(item, index) in items"&lt;/span&gt; &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt; &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"{ 'active': index === currentIndex }"&lt;/span&gt;
        &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"goToItem(index)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&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;currentIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;largeImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/large1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;smallImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/small1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;defaultImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/large1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;altText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;largeImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/large2.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;smallImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/small2.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;defaultImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/large2.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;altText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;largeImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/large3.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;smallImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/small3.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;defaultImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/large3.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;altText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image 3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;autoSlideInterval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&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;startAutoSlide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;stopAutoSlide&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;autoSlideInterval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;nextItem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&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;stopAutoSlide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;autoSlideInterval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;autoSlideInterval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;autoSlideInterval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&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;span class="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;startAutoSlide&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;nextItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&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;currentIndex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;items&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;length&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;goToItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;stopAutoSlide&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.carousel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.carousel-track&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="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="m"&gt;0.5s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/* Smooth transition for sliding */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.carousel-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/* Each item takes full width of the carousel */&lt;/span&gt;
  &lt;span class="c"&gt;/* Other styles for the item */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Enter and leave transitions */&lt;/span&gt;
&lt;span class="nc"&gt;.slide-enter-active&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.slide-leave-active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="m"&gt;0.5s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.slide-enter&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.slide-leave-to&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;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c"&gt;/* Start and end state for sliding */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.slide-enter-to&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.slide-leave&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;translateX&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="c"&gt;/* End and start state for sliding */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.carousel-dots&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;left&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="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateX&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="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="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.dot&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;10px&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;10px&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="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&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="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;0.3s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.dot.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&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="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;This carousel will fit nicely with the rest of my UI:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/pages/index.vue&lt;/code&gt;&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;template&amp;gt;&lt;/span&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;"flex-col align-middle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Carousel&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;NewsLetterForm&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&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;" flex justify-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Banner&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can get your hands on the code here: &lt;a href="https://github.com/rohrig/carosel-multisize-image-example"&gt;https://github.com/rohrig/carosel-multisize-image-example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While it might be tempting to create components based on the device, it's more efficient and future-proof to design them responsively, allowing for seamless adaptation to different screen sizes and resolutions. This approach ensures a consistent user experience across all devices and reduces the need for device-specific code maintenance.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ecomm</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Build Frontend Integrations with Framework-Agnostic SDK Boilerplate</title>
      <dc:creator>Rohrig</dc:creator>
      <pubDate>Wed, 14 Jun 2023 10:34:42 +0000</pubDate>
      <link>https://dev.to/rohrig/build-frontend-integrations-with-framework-agnostic-sdk-boilerplate-1m3c</link>
      <guid>https://dev.to/rohrig/build-frontend-integrations-with-framework-agnostic-sdk-boilerplate-1m3c</guid>
      <description>&lt;p&gt;We're thrilled to announce the release of our SDK Based Integration Boilerplate for Vue Storefront. Emphasizing agility and flexibility, this boilerplate stands as an optimal starting point for creating your frontend integration.&lt;/p&gt;

&lt;p&gt;This new architecture empowers you to construct an integration for your headless backend that is not bound to any specific framework. This SDK can then be utilized across any frontend framework. Thus, if you have clients who are confined to a particular framework, you can conveniently adapt to their needs and preferences. &lt;/p&gt;

&lt;p&gt;Vue Storefront is renowned for its capacity to provide the critical building blocks for integrations. Now, with the introduction of our SDK Based Integration Boilerplate, we've made it even easier for frontend integrators to quickly lay the groundwork for their projects, enhancing efficiency and adaptability across the board.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get started
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/QdNRrZ6R-mI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;To kickstart your project, simply make use of our intuitive Command Line Interface (CLI) to generate a new integration boilerplate. Just execute the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx @vue-storefront/cli create integration&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The CLI will guide you through a series of tailored questions, crafting a customized integration boilerplate that caters to your specific needs and requirements. The create integration command even creates a playground in either Nuxt or Next so you can see your integration working in a live application from the start. &lt;/p&gt;

&lt;p&gt;For a more detailed walkthrough on creating custom integrations using the VSF SDK, we recommend visiting our comprehensive &lt;a href="https://docs.vuestorefront.io/sdk/sdk/"&gt;SDK documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After your boilerplate is established, you can rapidly launch the development server and middleware server from your project root. Depending on your preferred package manager, choose one of the following commands:&lt;/p&gt;

&lt;p&gt;cd into your project&lt;/p&gt;

&lt;p&gt;run the build command (you can also use npm)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn build&lt;/code&gt;&lt;br&gt;
&lt;code&gt;yarn dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;These commands will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start the development server for the playground/app application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the middleware server for the playground/middleware application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adding new endpoints to your project is also streamlined with our CLI. Simply run:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;npx @vue-storefront/cli add endpoint getSomething&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Add a new endpoint to the api-client package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new method to the sdk package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new route to the playground/middleware application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new route to the playground/app application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Make sure you run yarn build after adding to or changing endpoints. &lt;/p&gt;

&lt;p&gt;Our SDK Based Integration Boilerplate for Vue Storefront is your fastest route to launching successful integrations. It's designed to save you time and effort, enabling you to focus on crafting unique and engaging features for your project.&lt;/p&gt;

&lt;p&gt;If you’d like to see the code behind the boilerplate you can check out the repository &lt;a href="https://github.com/vuestorefront/integration-boilerplate"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>agnostic</category>
      <category>headless</category>
    </item>
    <item>
      <title>A Framework-Agnostic Magento 2 Integration: The Next Step in eCommerce Frontend Development:</title>
      <dc:creator>Rohrig</dc:creator>
      <pubDate>Mon, 12 Jun 2023 11:50:00 +0000</pubDate>
      <link>https://dev.to/vue-storefront/the-next-step-in-ecommerce-frontend-development-a-framework-agnostic-magento-2-integration-5g5e</link>
      <guid>https://dev.to/vue-storefront/the-next-step-in-ecommerce-frontend-development-a-framework-agnostic-magento-2-integration-5g5e</guid>
      <description>&lt;p&gt;We're happy to introduce the latest Magento 2 Integration from Vue Storefront. This integration connects your frontend application smoothly with a Magento 2 backend, ensuring a seamless bridge between the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework-Agnostic Design
&lt;/h2&gt;

&lt;p&gt;A highlight of this Magento 2 Integration is its framework-agnostic design. This design includes an SDK and middleware that are framework-agnostic. What does that mean for you? It means you have the flexibility to use popular frameworks such as Nuxt and Next.js. If you choose, you can work without any framework at all. The SDK, built using TypeScript, is adaptable and can be installed in any application developed in JavaScript or TypeScript.&lt;/p&gt;

&lt;p&gt;If your project could benefit from a UI library made with eCommerce in mind, Storefront UI may be a good fit. You can find more details via this link: Storefront UI &lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;The Journey to Build the Next Storefront Boilerplate&lt;br&gt;
We're proud of the SDK and see it as a significant step forward. It is particularly useful if you're aiming to create a new frontend application that pairs with your existing Magento 2 headless store. However, we're always looking for ways to push our products further, and that's why our next move is the development of a fully functional open-source boilerplate application.&lt;/p&gt;

&lt;p&gt;This application will incorporate the new Magento 2 integration, the SDK and middleware, and of course, Storefront UI 2. We've chosen to use Nuxt 3 for this initial boilerplate due to its excellent performance, flexibility, and advanced features. As we move forward with this project, we'll document the process and share updates so you can follow along with our progress. Here's how you can stay informed:&lt;/p&gt;

&lt;p&gt;Checko out the &lt;a href="https://github.com/vuestorefront/magento2"&gt;magento-integration repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out our &lt;a href="https://www.youtube.com/channel/UCkm1F3Cglty3CE1QwKQUhhg"&gt;Youtube Channel&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Sign up for our &lt;a href="https://vuestorefront.io/developer-newsletter"&gt;Developer Newsletter&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Inviting Collaborators
&lt;/h2&gt;

&lt;p&gt;If you're interested, you're more than welcome to join us in developing this open-source storefront using the new Magento 2 SDK and Storefront UI 2. Whether you're an eCommerce expert, a beginner in open-source contributions, or simply curious to be part of an exciting project, we'd be delighted to have you on board. Everyone has something valuable to contribute, regardless of experience level. So, let's code together and see where this project takes us. We're excited about this journey and we hope you are too. Ready to start coding?&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/vuestorefront/magento-sdk-storefront"&gt;magento-sdk-storefront Repo&lt;/a&gt;, (it's brand new.)&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/-w0U95mOb7I"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>magento2</category>
      <category>nextjs</category>
      <category>nuxt</category>
      <category>ecommerce</category>
    </item>
  </channel>
</rss>
