<?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 Beignon from TwicPics</title>
    <description>The latest articles on DEV Community by Miguel Beignon from TwicPics (@miguel_beignon).</description>
    <link>https://dev.to/miguel_beignon</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%2F910634%2Fb93c9b0f-77b1-4a7d-86ec-11359938fc9b.jpeg</url>
      <title>DEV Community: Miguel Beignon from TwicPics</title>
      <link>https://dev.to/miguel_beignon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miguel_beignon"/>
    <language>en</language>
    <item>
      <title>A Simple Approach to LCP Image Optimization with TwicPics Components</title>
      <dc:creator>Miguel Beignon from TwicPics</dc:creator>
      <pubDate>Mon, 05 Feb 2024 09:24:40 +0000</pubDate>
      <link>https://dev.to/miguel_beignon/a-simple-approach-to-lcp-image-optimization-with-twicpics-components-89c</link>
      <guid>https://dev.to/miguel_beignon/a-simple-approach-to-lcp-image-optimization-with-twicpics-components-89c</guid>
      <description>&lt;p&gt;In a &lt;a href="https://www.twicpics.com/blog/optimizing-the-image-element-lcp"&gt;previous article&lt;/a&gt;, we delved into the common challenges of optimizing the &lt;strong&gt;Largest Contentful Paint&lt;/strong&gt; (LCP) for images.&lt;br&gt;
We explored best practices and showed how &lt;a href="https://www.twicpics.com/"&gt;TwicPics&lt;/a&gt; streamlines the implementation of &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#resolution_switching_same_size_different_resolutions"&gt;resolution switching&lt;/a&gt; through its user-friendly &lt;a href="https://www.twicpics.com/docs/guides/writing-api-requests"&gt;API&lt;/a&gt; and a &lt;strong&gt;single master image&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;While the &lt;strong&gt;use of a single source file&lt;/strong&gt; for all resolutions is already a &lt;strong&gt;significant improvement&lt;/strong&gt;, it's evident that the code implementation is still &lt;strong&gt;complex&lt;/strong&gt; and &lt;strong&gt;lengthy&lt;/strong&gt;. Furthermore, the proposed solution does not optimize the &lt;a href="https://web.dev/articles/optimize-cls"&gt;Cumulative Layout Shift&lt;/a&gt; and does not allow for &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#art_direction"&gt;Art direction&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this short tutorial, we will see how &lt;a href="https://www.twicpics.com/docs/essentials/components"&gt;TwicPics Components&lt;/a&gt; (more precisely, the &lt;code&gt;TwicPicture&lt;/code&gt; component) makes it easy to address all these issues.&lt;/p&gt;

&lt;p&gt;The solution makes the most sense in a framework that handles &lt;a href="https://www.sanity.io/glossary/server-side-rendering"&gt;SSR&lt;/a&gt;, and we have chosen to create an example of its usage with &lt;a href="https://nuxt.com/"&gt;Nuxt 3&lt;/a&gt;. Of course, you are free to use the &lt;a href="https://www.twicpics.com/docs/essentials/components#supported-frameworks"&gt;framework of your choice&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This tutorial requires using Node.js &lt;strong&gt;v18.0.0+&lt;/strong&gt; and TwicPics Components &lt;strong&gt;0.27.0+&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Scaffold your new Nuxt 3 Project
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;You can skip this part if you want to integrate TwicPics Components into an existing Nuxt 3 project.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# creates a new starter project&lt;/span&gt;
npx nuxi@latest init &amp;lt;project-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pick your preferred dependency manager (we chose &lt;code&gt;yarn&lt;/code&gt;) and wait for your new project to be created.&lt;/p&gt;

&lt;p&gt;You can now &lt;code&gt;cd&lt;/code&gt; into your new project directory.&lt;/p&gt;
&lt;h3&gt;
  
  
  Start Nuxt
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# starts and open your Nuxt app in development mode&lt;/span&gt;
yarn dev &lt;span class="nt"&gt;--open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If all goes well, &lt;code&gt;Nuxt&lt;/code&gt; should now be serving your project on &lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt; and you should see something like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fja838gloeyfi9q67vzq8.jpeg" alt="Image description" width="700" height="651"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;Nuxt is running&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you get stuck at any point, you can refer to the &lt;a href="https://nuxt.com/docs/getting-started/installation"&gt;Nuxt getting started page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install and configure TwicPics Components
&lt;/h2&gt;

&lt;p&gt;Now that &lt;code&gt;Nuxt&lt;/code&gt; is up and running, it is time to add and configure the &lt;a href="https://www.twicpics.com/docs/components/nuxt-3"&gt;Nuxt version of the TwicPics components&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the following, we will use our test domain:&lt;code&gt;&lt;a href="https://demo.twic.pics"&gt;https://demo.twic.pics&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
If you don't have a TwicPics domain yet, you can easily &lt;a href="https://account.twicpics.com/signup"&gt;create your own for free&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Install TwicPics Components
&lt;/h3&gt;

&lt;p&gt;Add the &lt;code&gt;@twicpics/components&lt;/code&gt; package to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# using yarn&lt;/span&gt;
yarn add @twicpics/components
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting-up TwicPics Components
&lt;/h3&gt;

&lt;p&gt;Since &lt;strong&gt;TwicPics components&lt;/strong&gt; for &lt;code&gt;Nuxt3&lt;/code&gt; are packaged as a &lt;a href="https://nuxt.com/modules?category=Images"&gt;module&lt;/a&gt;, integration and configuration take place in the &lt;code&gt;nuxt.config.ts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// nuxt.config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// integration&lt;/span&gt;
  &lt;span class="na"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`@twicpics/components/nuxt3`&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="c1"&gt;// configuration&lt;/span&gt;
  &lt;span class="na"&gt;twicpics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://demo.twic.pics`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// set your own domain here&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;And that's it. You are now ready to to use &lt;strong&gt;TwicPics components&lt;/strong&gt; in your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  TwicPicture enters the scene
&lt;/h2&gt;

&lt;p&gt;As a remember, optimizing the display of &lt;em&gt;LCP&lt;/em&gt; images, or more generally, &lt;em&gt;critical&lt;/em&gt; images in a web project, we need to fill the &lt;code&gt;srcset&lt;/code&gt; attribute of an &lt;code&gt;img&lt;/code&gt; tag with a list of differently-sized versions of the &lt;strong&gt;same image&lt;/strong&gt;. This is called &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#resolution_switching_same_size_different_resolutions"&gt;resolution switching&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, at the end of the &lt;a href="(https://www.twicpics.com/blog/optimizing-the-image-element-lcp)"&gt;article&lt;/a&gt; discussing &lt;em&gt;LCP&lt;/em&gt; image optimization, we had this code:&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;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://&amp;lt;your-domain&amp;gt;/&amp;lt;path-to-your-image&amp;gt;?twic=v1/resize=280"&lt;/span&gt;
  &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
    https://&amp;lt;your-domain&amp;gt;/&amp;lt;path-to-your-image&amp;gt;?twic=v1/resize=280   280w,
    https://&amp;lt;your-domain&amp;gt;/&amp;lt;path-to-your-image&amp;gt;?twic=v1/resize=480   480w,
    https://&amp;lt;your-domain&amp;gt;/&amp;lt;path-to-your-image&amp;gt;?twic=v1/resize=560   560w,
    https://&amp;lt;your-domain&amp;gt;/&amp;lt;path-to-your-image&amp;gt;?twic=v1/resize=840   840w,
    https://&amp;lt;your-domain&amp;gt;/&amp;lt;path-to-your-image&amp;gt;?twic=v1/resize=960   960w,
    https://&amp;lt;your-domain&amp;gt;/&amp;lt;path-to-your-image&amp;gt;?twic=v1/resize=1440 1440w
  "&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To do the same thing with &lt;code&gt;TwicPicture&lt;/code&gt;, all we have to do is:&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;TwicPicture&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"path-to-your-image"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's verify this in our project by making the following changes to the &lt;code&gt;app.vue&lt;/code&gt; file using &lt;a href="https://assets.twicpics.com/examples/puppy-dressed-as-a-reindeer.jpeg"&gt;puppy-dressed-as-a-reindeer.jpeg&lt;/a&gt; (&lt;code&gt;jpeg&lt;/code&gt; - 6777 x 3812 px - 15.28 MB) as master file image :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// app.vue
&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TwicPicture&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"puppy-dressed-as-a-reindeer.jpeg"&lt;/span&gt;
  &lt;span class="nt"&gt;/&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;Here is the generated code:&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;img&lt;/span&gt; 
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; 
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1536"&lt;/span&gt; 
  &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"1536"&lt;/span&gt;
  &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt; 
  &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=3072x3072 3072w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=2560x2560 2560w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=2048x2048 2048w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1536x1536 1536w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1280x1280 1280w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1024x1024 1024w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=768x768 768w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=640x640 640w,
    https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=320x320 320w
  "&lt;/span&gt; 
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1536x1536"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is what we should get on a &lt;code&gt;DPR2&lt;/code&gt; device when changing the viewport width from a small to a wide screen:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fll5ipkwabsrlbtpl5d5c.gif" alt="Image description" width="800" height="614"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;A Resolution Switching in action.&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We obtain various &lt;strong&gt;squared&lt;/strong&gt; variants, ideally compressed (&lt;code&gt;webp&lt;/code&gt;), whose resolution is tailored to both the &lt;em&gt;viewport&lt;/em&gt; and the &lt;em&gt;pixel density&lt;/em&gt; of the device: &lt;strong&gt;resolution switching is fully functional&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To achieve the same result while showcasing an image in &lt;code&gt;16:9&lt;/code&gt; format, we just need to modify &lt;code&gt;app.vue&lt;/code&gt; as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// app.vue
&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TwicPicture&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"puppy-dressed-as-a-reindeer.jpeg"&lt;/span&gt;
    &lt;span class="na"&gt;ratio=&lt;/span&gt;&lt;span class="s"&gt;"16/9"&lt;/span&gt;
  &lt;span class="nt"&gt;/&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;And this is what we get, this time on a &lt;code&gt;DPR1&lt;/code&gt; screen:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnk1vorhyu6ssrn5vdozf.gif" alt="Image description" width="800" height="614"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;Resolution Switching for a 16:9 variant.&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;TwicPicture&lt;/code&gt; allows the display of images not only with &lt;strong&gt;various resolutions&lt;/strong&gt; but also with &lt;strong&gt;different aspect ratios&lt;/strong&gt;, all &lt;strong&gt;from a single master file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can find the complete list of &lt;code&gt;TwicPicture&lt;/code&gt; properties &lt;a href="https://www.twicpics.com/docs/components/nuxt-3#twicpicture"&gt;here&lt;/a&gt;. Later on we'll explore how to leverage additional &lt;a href="https://www.twicpics.com/docs/reference/transformations"&gt;powerful transformations&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Control
&lt;/h2&gt;

&lt;p&gt;Now that we know &lt;code&gt;TwicPicture&lt;/code&gt; allows for managing &lt;strong&gt;aspect ratio&lt;/strong&gt; along with &lt;strong&gt;resolution switching&lt;/strong&gt;, it's time to explore how to implement &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#art_direction"&gt;Art Direction&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's reopen our &lt;code&gt;app.vue&lt;/code&gt; file and modify it by configuring the &lt;code&gt;ratio&lt;/code&gt; property following the &lt;strong&gt;mobile-first principle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// app.vue
&lt;span class="c"&gt;&amp;lt;!--
  This will display a:
  - 3/4 variant for small screen with width &amp;lt; 666px (a custom breakpoint is used here)
  - squared variant for screen with width ∈ [ 666px, 768px [
  - 4/3 variant for screen with width ∈ [ 768px, 1024px [
  - 21/9 variant for screen with width &amp;gt;= 1280px
--&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;TwicPicture&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"components/puppy-dressed-as-a-reindeer.jpeg"&lt;/span&gt;
    &lt;span class="na"&gt;ratio=&lt;/span&gt;&lt;span class="s"&gt;"
      3/4
      @666 1
      @md 4/3
      @xl 21/9
    "&lt;/span&gt;
  &lt;span class="nt"&gt;/&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;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.twicpics.com/docs/components/nuxt-3#default-breakpoints"&gt;Default breakpoint values&lt;/a&gt; are customizable during components  &lt;a href="https://www.twicpics.com/docs/components/nuxt-3#setup-options"&gt;configuration&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the result on a &lt;code&gt;DPR1&lt;/code&gt; screen:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yb7y6v0tjbxl6p9dkup.gif" alt="Image description" width="800" height="615"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;One single master file with art direction.&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The result is moderately satisfying: we achieve the &lt;strong&gt;desired aspect ratios based on the screen size&lt;/strong&gt;, but the image is poorly framed in its 21/9 variant. Let's fix the framing by adjusting the focus for that specific breakpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// app.vue
&lt;span class="c"&gt;&amp;lt;!--
  This will apply:
  - default focus transformation for screen with width &amp;lt; 1280px
  - focus="top" transformation for screen with width &amp;gt;= 1280px
--&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;TwicPicture&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"components/puppy-dressed-as-a-reindeer.jpeg"&lt;/span&gt;
    &lt;span class="na"&gt;focus=&lt;/span&gt;&lt;span class="s"&gt;"@xl top"&lt;/span&gt;
    &lt;span class="na"&gt;ratio=&lt;/span&gt;&lt;span class="s"&gt;"
      3/4
      @666 1
      @md 4/3
      @xl 21/9
    "&lt;/span&gt;
  &lt;span class="nt"&gt;/&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;This is the generated code:&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;height=&lt;/span&gt;&lt;span class="s"&gt;"549"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1280"&lt;/span&gt;
    &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 1280px)"&lt;/span&gt; 
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=3072x1317 3072w,https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=2560x1097 2560w,https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=1536x658 1536w,https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=1280x549 1280w
    "&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;height=&lt;/span&gt;&lt;span class="s"&gt;"576"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"768"&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;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=2048x1536 2048w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1536x1152 1536w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1024x768 1024w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=768x576 768w
    "&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;height=&lt;/span&gt;&lt;span class="s"&gt;"666"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"666"&lt;/span&gt;
    &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 666px)"&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1332x1332 1332w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=666x666 666w
    "&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;alt=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"888"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"666"&lt;/span&gt; 
    &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1280x1707 1280w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=640x853 640w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=320x427 320w
      "&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;p&gt;And this is the result with a fixed focus on wide screen:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlk0nbgq9cvg0tm7iq0j.gif" alt="Image description" width="800" height="615"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;A true art direction.&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Other properties of &lt;code&gt;TwicPicture&lt;/code&gt; are configurable based on breakpoints, allowing simple and great flexibility in the implementation of &lt;em&gt;Art Direction&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to explore the &lt;a href="https://www.twicpics.com/docs/components/nuxt-3#art-direction"&gt;documentation&lt;/a&gt; for a deeper understanding of &lt;code&gt;TwicPicture&lt;/code&gt; and its &lt;em&gt;design control&lt;/em&gt; feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Don't forget the sizes
&lt;/h3&gt;

&lt;p&gt;So far, we have displayed an image that occupies the entire width of the viewport.&lt;/p&gt;

&lt;p&gt;Let's modify our example to restrict the width of our image to a maximum of &lt;code&gt;1200px&lt;/code&gt;. Like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// app.vue
&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;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TwicPicture&lt;/span&gt;
      &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"components/puppy-dressed-as-a-reindeer.jpeg"&lt;/span&gt;
      &lt;span class="na"&gt;focus=&lt;/span&gt;&lt;span class="s"&gt;"@xl top"&lt;/span&gt;
      &lt;span class="na"&gt;ratio=&lt;/span&gt;&lt;span class="s"&gt;"
        3/4
        @666 1
        @md 4/3
        @xl 21/9
      "&lt;/span&gt;
      &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"
        (max-width: 1200px) 100vw,
        1200px
      "&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;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.container&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="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1200px&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;You've noticed that we used the &lt;code&gt;sizes&lt;/code&gt; property to inform the browser about the &lt;strong&gt;effective size of the image&lt;/strong&gt; to be displayed for a given viewport width.&lt;/p&gt;

&lt;p&gt;Without this property, the browser would have loaded the image corresponding to &lt;strong&gt;100% of the viewport&lt;/strong&gt;, potentially increasing loading times and &lt;strong&gt;impacting the LCP score&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's an &lt;strong&gt;easy trap to fall into&lt;/strong&gt;, so it's crucial not to forget to assign a value to the &lt;code&gt;sizes&lt;/code&gt; property.&lt;/p&gt;

&lt;p&gt;Here is the result, with and without &lt;code&gt;sizes&lt;/code&gt;: &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9hgevvrd2tia4w5kfhj.gif" alt="Image description" width="800" height="465"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;Don't forget the sizes.&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here, forgetting to assign a value to the &lt;code&gt;sizes&lt;/code&gt; property &lt;strong&gt;multiplies the weight of the image by 4&lt;/strong&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  Improve LCP Resource Load Delay Subpart
&lt;/h3&gt;

&lt;p&gt;In our &lt;a href="https://www.twicpics.com/blog/optimizing-the-image-element-lcp#improve-lcp-resource-load-delay-subpart"&gt;previous article&lt;/a&gt; about Image Element &lt;em&gt;LCP&lt;/em&gt; optimization, we discussed the issue of &lt;strong&gt;lazy-loading&lt;/strong&gt; and &lt;strong&gt;priority hints&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;TwicPicture&lt;/code&gt;, applying best practices to &lt;strong&gt;improve LCP score&lt;/strong&gt; is as simple as adding the &lt;code&gt;eager&lt;/code&gt; property to our component call: this will effectively &lt;strong&gt;disable lazy loading&lt;/strong&gt; for this image and set &lt;code&gt;fetchpriority&lt;/code&gt; attribute to &lt;code&gt;high&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;// app.vue
&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;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TwicPicture&lt;/span&gt;
      &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"components/puppy-dressed-as-a-reindeer.jpeg"&lt;/span&gt;
      &lt;span class="na"&gt;eager&lt;/span&gt;
      &lt;span class="na"&gt;focus=&lt;/span&gt;&lt;span class="s"&gt;"@xl top"&lt;/span&gt;
      &lt;span class="na"&gt;ratio=&lt;/span&gt;&lt;span class="s"&gt;"
        3/4
        @666 1
        @md 4/3
        @xl 21/9
      "&lt;/span&gt;
      &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"
        (max-width: 1200px) 100vw,
        1200px
      "&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;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.container&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="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1200px&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 time the generated code becomes&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;height=&lt;/span&gt;&lt;span class="s"&gt;"549"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1280"&lt;/span&gt;
    &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 1280px)"&lt;/span&gt; 
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=3072x1317 3072w,https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=2560x1097 2560w,https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=1536x658 1536w,https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/focus=top/cover=1280x549 1280w
    "&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;height=&lt;/span&gt;&lt;span class="s"&gt;"576"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"768"&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;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=2048x1536 2048w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1536x1152 1536w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1024x768 1024w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=768x576 768w
    "&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;height=&lt;/span&gt;&lt;span class="s"&gt;"666"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"666"&lt;/span&gt;
    &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 666px)"&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1332x1332 1332w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=666x666 666w
    "&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;alt=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
    &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"888"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"666"&lt;/span&gt; 
    &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"eager"&lt;/span&gt;
    &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"
      (max-width: 1200px) 100vw,
      1200px
    "&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=1280x1707 1280w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=640x853 640w,
      https://demo.twic.pics/puppy-dressed-as-a-reindeer.jpeg?twic=v1/cover=320x427 320w
      "&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;h2&gt;
  
  
  The Trial by Fire
&lt;/h2&gt;

&lt;p&gt;It's time to check the &lt;em&gt;LCP&lt;/em&gt; score of a web page using &lt;code&gt;TwicPicture&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To do this, we've created a &lt;a href="https://twicpics-lcp-images-with-twicpicture.netlify.app/"&gt;small demonstration site&lt;/a&gt; where, in addition to &lt;code&gt;TwicPicture&lt;/code&gt; which handles the &lt;em&gt;LCP&lt;/em&gt; image, we use &lt;a href="https://www.twicpics.com/docs/essentials/components#display-a-content-image"&gt;TwicImg&lt;/a&gt; to display content images.&lt;/p&gt;

&lt;p&gt;Here is the result of the performance audit with &lt;a href="https://chromewebstore.google.com/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=fr"&gt;Chrome's Lighthouse&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr525nmlr1355fpkmmae1.png" alt="Image description" width="800" height="564"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;The Trial by Fire&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our page achieves a performance score of &lt;strong&gt;100%&lt;/strong&gt; with a &lt;em&gt;LCP&lt;/em&gt; metric equal to &lt;strong&gt;0.5 s&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Significantly the &lt;em&gt;CLS&lt;/em&gt; metric is &lt;strong&gt;zero&lt;/strong&gt; as &lt;a href="https://www.twicpics.com/docs/essentials/components"&gt;TwicPics Components&lt;/a&gt;, by default, seamlessly optimize &lt;em&gt;Cumulative Layout Shift&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  To go further
&lt;/h2&gt;

&lt;p&gt;Suppose the background color of the main image isn't exactly right. Or the protagonist's orientation isn't correct.&lt;br&gt;
Should we take another photo?&lt;/p&gt;

&lt;p&gt;Fortunately, the answer is no. TwicPics &lt;a href="https://www.twicpics.com/docs/guides/writing-api-requests"&gt;API&lt;/a&gt; and its &lt;a href="https://www.twicpics.com/docs/reference/transformations"&gt;transformations&lt;/a&gt; lets you make these adjustments on the fly.&lt;/p&gt;

&lt;p&gt;For example, to change the background color to blue &lt;code&gt;#145480&lt;/code&gt; and orient the puppy's head on the other side, simply use the following transformation &lt;code&gt;background=remove+145480/flip=x&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To apply it to our main image, simply modify the app.vue file by adding the &lt;code&gt;preTransform&lt;/code&gt; property as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// app.vue
  ...
    &lt;span class="nt"&gt;&amp;lt;TwicPicture&lt;/span&gt;
      &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"components/puppy-dressed-as-a-reindeer.jpeg"&lt;/span&gt;
      &lt;span class="na"&gt;eager&lt;/span&gt;
      &lt;span class="na"&gt;focus=&lt;/span&gt;&lt;span class="s"&gt;"@xl top"&lt;/span&gt;
      &lt;span class="na"&gt;preTransform=&lt;/span&gt;&lt;span class="s"&gt;"background=remove+145480/flip=x"&lt;/span&gt;
      &lt;span class="na"&gt;ratio=&lt;/span&gt;&lt;span class="s"&gt;"
        3/4
        @666 1
        @md 4/3
        @xl 21/9
      "&lt;/span&gt;
      &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"
        (max-width: 1200px) 100vw,
        1200px
      "&lt;/span&gt;
    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcukoh84hdzxnbcduou9c.gif" alt="Image description" width="800" height="450"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;Using stunning transformations on the fly.&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you want to learn more about the versatile options offered by &lt;code&gt;TwicPicture&lt;/code&gt;, feel free to explore its &lt;a href="https://www.twicpics.com/docs/components/nuxt-3#twicpicture"&gt;properties&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The proper display of a &lt;em&gt;critical image&lt;/em&gt; on a web page involves the use of &lt;code&gt;picture&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;, and &lt;code&gt;img&lt;/code&gt; tags. The associated code is often verbose, time-consuming to develop, and may lead to poor results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twicpics.com/docs/essentials/components"&gt;TwicPics Components&lt;/a&gt;, particularly the &lt;code&gt;TwicPicture&lt;/code&gt; component, stands out as a robust and efficient solution for optimizing the &lt;em&gt;Largest Contentful Paint&lt;/em&gt; (LCP) in web projects, with best practices out of the box, including &lt;em&gt;Cumulative Layout Shift&lt;/em&gt; (CLS) optimization.&lt;/p&gt;

&lt;p&gt;Whether the objective is to achieve &lt;strong&gt;optimal performance&lt;/strong&gt; or manage &lt;strong&gt;design control&lt;/strong&gt;, &lt;code&gt;TwicPicture&lt;/code&gt; comprehensively and flexibly addresses these challenges, offering a streamlined approach to handling &lt;em&gt;critical images&lt;/em&gt;. Additionally, it provides the capability to leverage the power of &lt;a href="https://www.twicpics.com/"&gt;TwicPics&lt;/a&gt;: &lt;strong&gt;perfectly compressed images&lt;/strong&gt;, rich and scalable &lt;a href="https://www.twicpics.com/docs/reference/transformations"&gt;transformations&lt;/a&gt;, and the benefits of its &lt;strong&gt;worldwide CDN proximity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, we used &lt;a href="https://nuxt.com/"&gt;Nuxt3&lt;/a&gt; to assess the ease of use and effectiveness of &lt;code&gt;TwicPicture&lt;/code&gt;. The &lt;a href="https://github.com/TwicPics/components-demo-twic-picture/"&gt;source code&lt;/a&gt; for the test project is at your disposal, allowing you to conduct your own experiments freely. Feel free to replicate the same in the &lt;a href="https://www.twicpics.com/docs/essentials/components#supported-frameworks"&gt;framework of your choice&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; are both free and open-source. You can test them for yourself &lt;strong&gt;without any cost&lt;/strong&gt;. The only requirement is to have a &lt;strong&gt;TwicPics account&lt;/strong&gt;, which you can easily create for free by &lt;a href="https://account.twicpics.com/signup"&gt;signing up here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>images</category>
      <category>nuxt</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Introducing TwicPics Components</title>
      <dc:creator>Miguel Beignon from TwicPics</dc:creator>
      <pubDate>Mon, 22 Aug 2022 08:56:35 +0000</pubDate>
      <link>https://dev.to/miguel_beignon/introducing-twicpics-components-9ok</link>
      <guid>https://dev.to/miguel_beignon/introducing-twicpics-components-9ok</guid>
      <description>&lt;p&gt;Is it possible to simply (and efficiently) publish images and short videos on a website? This is the question we want to explore in this post about &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.twicpics.com/"&gt;TwicPics&lt;/a&gt; is a SaaS for responsive image services. It provides optimized, perfectly sized, and context-aware media from a single high-resolution version. All that's left to do is &lt;strong&gt;display this media in the browser&lt;/strong&gt;. This is precisely the part that &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; handles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; is a &lt;strong&gt;free and open-source web component collection&lt;/strong&gt; that replaces &lt;code&gt;img&lt;/code&gt; and &lt;code&gt;video&lt;/code&gt; tags.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="c"&gt;&amp;lt;!-- a classical img usage --&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;"path/to/image"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="c"&gt;&amp;lt;!-- a TwicPics img component usage --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TwicImg&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"path/to/image"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Available for the most popular frameworks (&lt;a href="https://github.com/TwicPics/components/blob/main/documentation/angular.md"&gt;Angular&lt;/a&gt;, &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/react.md"&gt;React&lt;/a&gt;, &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/gatsby.md"&gt;Gatsby&lt;/a&gt;, &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/next.md"&gt;Next.js&lt;/a&gt;, &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/svelte3.md"&gt;Svelte&lt;/a&gt;,&lt;a href="https://github.com/TwicPics/components/blob/main/documentation/vue2.md"&gt;Vue.js (version 2)&lt;/a&gt;, &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/vue3.md"&gt;Vue.js (version 3)&lt;/a&gt;, &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/nuxt2.md"&gt;Nuxt.js&lt;/a&gt;, and &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/webComponents.md"&gt;native Web Components&lt;/a&gt;), they allow you to integrate the &lt;a href="https://www.twicpics.com/"&gt;TwicPics&lt;/a&gt; solution quickly and easily into your projects.&lt;/p&gt;

&lt;p&gt;The only requirement to use them is to have a TwicPics account. If you don't already have one, you can easily create your own &lt;a href="https://account.twicpics.com/signup"&gt;TwicPics account for free&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the first part&lt;/strong&gt; of this post, we will write, step by step, the code needed to overcome the various difficulties related to publishing media in a browser: &lt;a href="https://www.twicpics.com/docs/guides/best-practices#lazy-load-off-screen-media"&gt;lazy loading&lt;/a&gt;, &lt;a href="https://www.twicpics.com/blog/images-and-core-web-vitals#images-and-cumulative-layout-shift"&gt;CLS optimization&lt;/a&gt;, &lt;a href="https://www.twicpics.com/docs/guides/placeholders#responsive-placeholders"&gt;respect of aspect-ratio&lt;/a&gt;, &lt;a href="https://www.twicpics.com/docs/api/transformations#cover"&gt;filling option&lt;/a&gt;, &lt;a href="https://www.twicpics.com/docs/guides/best-practices#lqip--blurry-image-placeholder"&gt;LQIP (Low-Quality Image Placeholders)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the second part&lt;/strong&gt;, we will see how easy it is to do the same thing (and even more) by using &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part One - Displaying image without TwicPics Components
&lt;/h2&gt;

&lt;p&gt;We consider here only images. For videos, simply replace &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; with &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The image used in this section is &lt;a href="https://assets.twicpics.com/examples/cat_1x1.jpg"&gt;https://assets.twicpics.com/examples/cat_1x1.jpg&lt;/a&gt; (jpg - 1561x1561px - 428kB).&lt;/p&gt;

&lt;h3&gt;
  
  
  Layout-Driven Pattern from scratch
&lt;/h3&gt;

&lt;p&gt;Let's start by loading the image into the browser.&lt;/p&gt;

&lt;p&gt;We use the TwicPics &lt;a href="https://www.twicpics.com/docs/script/setup"&gt;Script&lt;/a&gt; and the &lt;code&gt;data-twic-src&lt;/code&gt; property instead of the native &lt;code&gt;src&lt;/code&gt; attribute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Requested: jpg - 1561x1561px - 428kB --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Received: webP - 300 x 300 px - 7.2 kB --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"300px"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"300px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Installation of TwicPics. That's it, you're all set! --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/?v1"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can improve this snippet by implementing a primary level of &lt;a href="https://www.twicpics.com/docs/guides/best-practices#lqip--blurry-image-placeholder"&gt;LQIP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We tell the browser to load a lightweight blurry placeholder first by using the &lt;a href="https://www.twicpics.com/docs/api/transformations#output"&gt;output=preview&lt;/a&gt; API transformation and to replace it with the pixel-perfect version later.&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;img&lt;/span&gt; 
    &lt;span class="na"&gt;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"300px"&lt;/span&gt; 
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"300px"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Installation of TwicPics --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/?v1"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage, we load an image that is perfectly sized for the display area, ideally compressed and with a working preview.&lt;/p&gt;

&lt;p&gt;But as its size is fixed, it is not responsive.&lt;/p&gt;

&lt;p&gt;Let's modify our snippet so that the image occupies the full size of its potential container: aka the &lt;strong&gt;layout-driven pattern&lt;/strong&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;img&lt;/span&gt; 
    &lt;span class="na"&gt;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Installation of TwicPics --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/?v1"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;img&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="nb"&gt;block&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;100%&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;100%&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;Let's test it in the example below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Container size set to 200 px wide --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:200px;"&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;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&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="c"&gt;&amp;lt;!-- Container size set to 300px px wide --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:300px;"&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;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&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="c"&gt;&amp;lt;!-- Container size set to 400x200 px --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:400px;height:200px"&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;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqjecvj9j2ypnhts9jxwi.jpg" alt="Layout Driven - First attempt" width="800" height="505"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;&lt;em&gt;Layout Driven - First attempt&lt;/em&gt;&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The network console shows us that we have loaded 4 images.&lt;br&gt;
The first one corresponds to the preview.&lt;/p&gt;

&lt;p&gt;The 3 others correspond to the images returned by the TwicPics SaaS.&lt;/p&gt;

&lt;p&gt;What happened here?&lt;/p&gt;

&lt;p&gt;1 - the script understood the display context and asked for the single master image to be resized to fill the 3 containers. &lt;strong&gt;This is the good news&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;2 - the resizing of the third image brings back a distorted image. &lt;strong&gt;We need to specify the filling method (cover or contain)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's use &lt;code&gt;object-fit&lt;/code&gt; to indicate how the image should fit into its container.&lt;/p&gt;

&lt;p&gt;We set &lt;code&gt;cover&lt;/code&gt; as the default and add a CSS class so we can choose the &lt;code&gt;contain&lt;/code&gt; fill option from our template.&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="nt"&gt;img&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="nb"&gt;block&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;100%&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;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.contain&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;contain&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;Let's test our modifications with this new example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Container size set to 200 px wide --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:200px;"&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;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&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="c"&gt;&amp;lt;!-- Container size set to 400x200 px --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:400px;height:200px"&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;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&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="c"&gt;&amp;lt;!-- Container size set to 400x200 px --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:400px;height:200px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Sets object-fit to contain --&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;"contain"&lt;/span&gt;
        &lt;span class="na"&gt;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/cat_1x1.jpg?twic=v1/output=preview"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnihrx4btmq5m482uy8e5.jpg" alt="Layout Driven - Second attempt" width="800" height="405"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;&lt;em&gt;Layout Driven - Second attempt&lt;/em&gt;&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The TwicPics script automatically applied the &lt;code&gt;cover&lt;/code&gt; or &lt;code&gt;contain&lt;/code&gt; transformations depending on the display context.&lt;/p&gt;

&lt;p&gt;We now have an image displayed without distortion and whose rendering is controlled by the layout. As we want to manage responsive images, &lt;strong&gt;we should not set the size of the display area&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is a Codepen to test our quick snippet and see how much work remains to be done.&lt;br&gt;
Feel free to look at the network console and resize your browser to see what's happening.&lt;/p&gt;

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

&lt;p&gt;We still have 2 serious problems. We don't manage the &lt;strong&gt;aspect ratio&lt;/strong&gt; nor the &lt;strong&gt;CLS optimization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's what we are going to fix here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layout Driven Pattern + Aspect Ratio Boxes
&lt;/h3&gt;

&lt;p&gt;It's time to integrate the concept of &lt;a href="https://css-tricks.com/aspect-ratio-boxes/"&gt;CSS aspect ratio boxes&lt;/a&gt;, aka the &lt;code&gt;padding trick&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This &lt;code&gt;CSS&lt;/code&gt; hint allows us to manage the aspect ratio (even on old browsers) and optimize the &lt;a href="https://www.twicpics.com/blog/images-and-core-web-vitals#images-and-cumulative-layout-shift"&gt;CLS&lt;/a&gt;. Of course, you could also use the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio"&gt;&lt;code&gt;aspect-ratio&lt;/code&gt; CSS property&lt;/a&gt; if you target modern browsers only.&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;main&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Empty div but with a reserved 1:1 aspect-ratio area --&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;"wrapper squared"&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="c"&gt;&amp;lt;!-- Empty div but with a reserved 2:3 aspect-ratio area --&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;"wrapper portrait"&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="c"&gt;&amp;lt;!-- Empty div but with a reserved 3:2 aspect-ratio area --&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;"wrapper landscape"&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;/main&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;I Will Not CLS&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* layout setting */&lt;/span&gt;
&lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&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="py"&gt;grid-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;div&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;#1CFFA6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* padding trick factorisation (scss function)  */&lt;/span&gt;
&lt;span class="k"&gt;@mixin&lt;/span&gt; &lt;span class="n"&gt;aspect-ratio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&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="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="err"&gt;&amp;amp;:before&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&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;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* our aspect-ratio box: let us call it our twic container */&lt;/span&gt;
&lt;span class="nc"&gt;.wrapper&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;10px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;red&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;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* setting a 1:1 aspect ratio */&lt;/span&gt;
&lt;span class="nc"&gt;.squared&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;@include&lt;/span&gt; &lt;span class="err"&gt;aspect-ratio(1,&lt;/span&gt; &lt;span class="err"&gt;1);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* setting a 3:2 aspect ratio */&lt;/span&gt;
&lt;span class="nc"&gt;.landscape&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;@include&lt;/span&gt; &lt;span class="err"&gt;aspect-ratio(3,&lt;/span&gt; &lt;span class="err"&gt;2);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* setting a 2:3 aspect ratio */&lt;/span&gt;
&lt;span class="nc"&gt;.portrait&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;@include&lt;/span&gt; &lt;span class="err"&gt;aspect-ratio(2,&lt;/span&gt; &lt;span class="err"&gt;3);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ouj1s73cnujtij1ntrc.jpg" alt="Aspect Ratio Boxes" width="800" height="399"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;center&gt;&lt;em&gt;Aspect Ratio Boxes&lt;/em&gt;&lt;/center&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As the TwicPics script determines the transformations to be applied according to the context of the display area, all we have to do is place images in the reserved areas.&lt;/p&gt;

&lt;p&gt;Here is a code pen where we have integrated the images in cover and contain mode.&lt;/p&gt;

&lt;p&gt;Feel free to open the network console and see what happens when you scroll down.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Improving the user experience
&lt;/h3&gt;

&lt;p&gt;We are almost done.&lt;/p&gt;

&lt;p&gt;At this point, we load a perfectly sized and ideally compressed image. Aspect ratio is managed as well as the CLS optimization. The LQIP method reduces the perceived loading time, but the transition between preview and final image remains too rough.&lt;br&gt;
This can be improved by taking advantage of TwicPics's &lt;a href="https://www.twicpics.com/docs/script/dynamic#life-cycles"&gt;life cycles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here are the few modifications to be made:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Blurry image is moved from img to the wrapper --&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;"wrapper squared"&lt;/span&gt;
  &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('https://demo.twic.pics/cat_1x1.jpg.twic=v1/output=preview');"&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;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&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&lt;/span&gt; 
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"wrapper portrait contain"&lt;/span&gt;
  &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('https://demo.twic.pics/cat_1x1.jpg?twic=v1/contain=667x1000/output=preview');"&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;"contain"&lt;/span&gt;
      &lt;span class="na"&gt;data-twic-src=&lt;/span&gt;&lt;span class="s"&gt;"image:cat_1x1.jpg"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.wrapper&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;10px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;red&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;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;no-repeat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-position&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;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="err"&gt;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;img&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/** opacity set to 0 **/&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&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c"&gt;/** animation on opacity property **/&lt;/span&gt;
    &lt;span class="nl"&gt;transition-property&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;will-change&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition-delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition-duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400ms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition-timing-function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="err"&gt;&amp;amp;.twic-done{&lt;/span&gt;
      &lt;span class="c"&gt;/** opacity set to 1 on image loaded event **/&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="err"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.contain&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;contain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;contain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a Codepen with complete integration.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Intermission
&lt;/h2&gt;

&lt;p&gt;We can now display images that are &lt;strong&gt;perfectly sized&lt;/strong&gt; for the display area. In addition, the &lt;strong&gt;CLS&lt;/strong&gt; is optimized, &lt;strong&gt;lazy loading&lt;/strong&gt; works, and we have implemented &lt;strong&gt;Low-Quality Image Placeholders (LQIP)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But it is far from perfect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;HTML&lt;/code&gt; and &lt;code&gt;CSS&lt;/code&gt; code is a bit heavy&lt;/li&gt;
&lt;li&gt;some features would deserve to be more flexible (aspect ratio, display mode...)&lt;/li&gt;
&lt;li&gt;LQIP would require the addition of some javascript to be handled automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A block of code remains to be done, including this HTML structure, CSS code, and the necessary javascript. In short, a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components"&gt;Web Component&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part Two - TwicPics Components to the rescue
&lt;/h2&gt;

&lt;p&gt;The examples below use the &lt;code&gt;React&lt;/code&gt; version of &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt;. They can easily be adapted to other &lt;a href="https://github.com/TwicPics/components/tree/main/documentation#supported-frameworks"&gt;available versions&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;In the first part of this post, to use the TwicPics SaaS, we loaded the script by adding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Installation of TwicPics --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.twic.pics/?v1"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The equivalent for &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; is the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* index.js (or jsx) */&lt;/span&gt;

&lt;span class="cm"&gt;/* imports TwicPics Components */&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;installTwicPics&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="s2"&gt;@twicpics/components/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@twicpics/components/style.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* configuration */&lt;/span&gt;
&lt;span class="nf"&gt;installTwicPics&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://demo.twic.pics`&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Our &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; are now ready to be used, and we can move on to the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&gt;

&lt;p&gt;To reproduce the previous example, all we have to do is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* your-template.js (or jsx) */&lt;/span&gt;

&lt;span class="cm"&gt;/* imports the component */&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;TwicImg&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="s2"&gt;@twicpics/components/react&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="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Uses&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2/3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3/2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2/3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3/2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/main&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* The css of the components is embedded in the installation */&lt;/span&gt;
&lt;span class="cm"&gt;/* Nothing to add here */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See how easy it is to manage the &lt;strong&gt;aspect-ratio&lt;/strong&gt; and the &lt;strong&gt;filling option&lt;/strong&gt; with &lt;a href="https://twicpics-react-demo.netlify.app/ratio"&gt;ratio&lt;/a&gt; and &lt;a href="https://twicpics-react-demo.netlify.app/mode"&gt;mode&lt;/a&gt; properties.&lt;/p&gt;

&lt;p&gt;Here is a Codesandbox with the complete example.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/5pdwrq"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Everything is in place: &lt;strong&gt;CLS optimization&lt;/strong&gt;, &lt;strong&gt;LQIP&lt;/strong&gt;, &lt;strong&gt;Lazy Loading&lt;/strong&gt;, &lt;strong&gt;respect of aspect-ratio&lt;/strong&gt;, and &lt;strong&gt;fill option&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;: in the &lt;code&gt;contain&lt;/code&gt; mode, &lt;strong&gt;the aspect ratio is applied to the display area&lt;/strong&gt;, not the image itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Templating driven components
&lt;/h3&gt;

&lt;p&gt;The template controls the behavior of &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; through the properties they expose.&lt;/p&gt;

&lt;p&gt;We can see these properties working in the following online examples: &lt;a href="https://twicpics-react-demo.netlify.app/ratio"&gt;ratio&lt;/a&gt;, &lt;a href="https://twicpics-react-demo.netlify.app/mode"&gt;mode&lt;/a&gt;, &lt;a href="https://twicpics-react-demo.netlify.app/focus"&gt;focus&lt;/a&gt;, &lt;a href="https://twicpics-react-demo.netlify.app/placeholders"&gt;placeholder&lt;/a&gt;, &lt;a href="https://twicpics-react-demo.netlify.app/position"&gt;position&lt;/a&gt;, &lt;a href="https://twicpics-react-demo.netlify.app/transition"&gt;transition&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an example, we can adapt the transition time of the &lt;strong&gt;LQIP&lt;/strong&gt; by setting the &lt;code&gt;transitionDuration&lt;/code&gt; attribute. We can even disable &lt;strong&gt;LQIP&lt;/strong&gt; while &lt;strong&gt;keeping the CLS optimization&lt;/strong&gt; by setting &lt;code&gt;placeholder&lt;/code&gt; to &lt;code&gt;none&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* your-template.js (or jsx) */&lt;/span&gt;

&lt;span class="cm"&gt;/* imports the component */&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;TwicImg&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="s2"&gt;@twicpics/components/react&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="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Uses&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="cm"&gt;/* Default behavior */&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="cm"&gt;/* No placeholder but CLS still optimized */&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="cm"&gt;/*  A long transition */&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;transitionDuration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10000ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/main&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A full description of those properties is available &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/react.md#components-properties"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Style-driven components
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; can also be set up by using pure CSS through the power of &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties"&gt;CSS variables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The list of usable variables is available &lt;a href="https://github.com/TwicPics/components/blob/main/documentation/react.md#css-variables"&gt;here&lt;/a&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="c"&gt;/** &amp;lt;your-style&amp;gt;.css **/&lt;/span&gt;

&lt;span class="nc"&gt;.landscape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/** applies a 2/3 aspect ratio for all landscape class elements **/&lt;/span&gt;
  &lt;span class="py"&gt;--twic-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.portrait&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/** applies a 3/2 aspect ratio for all portrait class elements **/&lt;/span&gt;
  &lt;span class="py"&gt;--twic-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.square&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c"&gt;/** applies a 1/1 aspect ratio for all square class elements **/&lt;/span&gt;
  &lt;span class="py"&gt;--twic-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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="nc"&gt;.contain&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/** applies a contain fill option for all contain class elements **/&lt;/span&gt;
  &lt;span class="py"&gt;--twic-mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;contain&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* your-template.js (or jsx) */&lt;/span&gt;

&lt;span class="cm"&gt;/* imports the component */&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;TwicImg&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="s2"&gt;@twicpics/components/react&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="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Uses&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contain portrait&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;square&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;landscape&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/main&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a Codesandbox that demonstrates the style-driven approach.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/m1zxqs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Feel free to check the &lt;a href="https://twicpics-react-demo.netlify.app/style-driven"&gt;features demo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about Art Direction?
&lt;/h3&gt;

&lt;p&gt;We saved the best example for last.&lt;/p&gt;

&lt;p&gt;Since the advent of &lt;a href="http://usecases.responsiveimages.org/"&gt;responsive design&lt;/a&gt;, &lt;strong&gt;art direction&lt;/strong&gt; has always been the worst problem to deal with.&lt;/p&gt;

&lt;p&gt;Adapting the image size to the device is no longer a problem. But &lt;strong&gt;what about its aspect ratio&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;There are several approaches to solve the problem.&lt;/p&gt;

&lt;p&gt;For example, one could imagine this solution using &lt;a href="https://tailwindcss.com/"&gt;TailwindCSS&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** Dealing with four element in our template **/&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ArtDirectionSample&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sm:hidden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3/4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hidden md:block lg:hidden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hidden lg:block xl:hidden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;4/3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hidden xl:block&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;16/9&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ArtDirectionSample&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; and the style-driven approach, the solution becomes so simple.&lt;/p&gt;

&lt;p&gt;First, we define some &lt;code&gt;CSS&lt;/code&gt; rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** &amp;lt;your-style&amp;gt;.scss **/&lt;/span&gt;

&lt;span class="cm"&gt;/** Breakpoint definition **/&lt;/span&gt;
&lt;span class="nv"&gt;$breakpoint-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"only screen and (min-width: 768px)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$breakpoint-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"only screen and (min-width: 1024px)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$breakpoint-xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"only screen and (min-width: 1280px)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="cm"&gt;/** mobile first **/&lt;/span&gt;
&lt;span class="nc"&gt;.style-driven-responsive&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;--twic-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/** aspect ratio definition vs breakpoints**/&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="si"&gt;#{&lt;/span&gt; &lt;span class="nv"&gt;$breakpoint-md&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.style-driven-responsive&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;--twic-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;calc&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="si"&gt;#{&lt;/span&gt; &lt;span class="nv"&gt;$breakpoint-lg&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.style-driven-responsive&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;--twic-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;3&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="k"&gt;@media&lt;/span&gt; &lt;span class="si"&gt;#{&lt;/span&gt; &lt;span class="nv"&gt;$breakpoint-xl&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.style-driven-responsive&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;--twic-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;9&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;Then, we write our template with a single component that will follow our &lt;code&gt;CSS&lt;/code&gt; directives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* your-template.js (or jsx) */&lt;/span&gt;

&lt;span class="cm"&gt;/* imports the component */&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;TwicImg&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="s2"&gt;@twicpics/components/react&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;const&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&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="cm"&gt;/** Only one element in our template **/&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;style-driven-responsive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TwicImg&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat_1x1.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TwicSample&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Here is a Codesandbox to play with.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/d6hd2g"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Feel free to check the &lt;a href="https://twicpics-react-demo.netlify.app/art-directions"&gt;Art Direction demo&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;It is possible to simply and efficiently deliver images and short videos on a website. As simple as writing:&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;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"path/to/image"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but with the condition of writing:&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;TwicImg&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"path/to/image"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@twicpics/components"&gt;TwicPics Components&lt;/a&gt; are free and open-source. Don't hesitate to test them for yourself.&lt;br&gt;
The only requirement to use them is to have a TwicPics account. If you don't already have one, you can easily create your own &lt;a href="https://account.twicpics.com/signup"&gt;TwicPics account for free&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In a future article, we'll go into more detail about integrating the components into &lt;code&gt;Next.js&lt;/code&gt; and &lt;code&gt;Gatsby&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the meantime, feel free to explore our demonstrations for &lt;a href="https://twicpics-angular-demo.netlify.app/"&gt;Angular&lt;/a&gt;, &lt;a href="https://twicpics-react-demo.netlify.app/"&gt;React&lt;/a&gt;, &lt;a href="https://twicpics-next-demo.netlify.app/"&gt;Next.js&lt;/a&gt;, &lt;a href="https://twicpics-gatsby-demo.netlify.app/"&gt;Gatsby.js&lt;/a&gt; and &lt;a href="https://twicpics-vue-demo.netlify.app"&gt;Vue.js (version2)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Stay tuned :-)&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>ux</category>
      <category>image</category>
    </item>
  </channel>
</rss>
