Note: This tutorial applies to our premium themes. Normally it should work fine but in some themes might need a few adjustments. If so, our team is ready to help.
 
In case you need to show variant images instead of the default color swatches we need to change some lines of code

Open this file snippets/product-block-options.liquid
Find this code:
        <ul class="color-swatches list-unstyled">
            {% for value in option.values %}
              {% assign swatch_img = value | handleize | prepend: 'swatch-' | append: '.png' %}
              <li>
                <input 
                  class="visually-hidden" 
                  type="radio" 
                  name="option-{{ option.name | handleize }}"
                  id="option-{{ option.name | handleize }}-{{ value | handleize }}" 
                  value="{{ value | escape }}"
                  data-option-position="{{ option.position }}"
                  {% if option.selected_value == value %}checked{% endif %}>
                <label 
                  for="option-{{ option.name | handleize }}-{{ value | handleize }}"
                  title="{{ value }}"
                  data-bs-toggle="tooltip">
                  <img
                    class="img-fluid"
                    src="{{ swatch_img | file_img_url: '30x30', crop: 'center' }}"
                    alt="{{ value }}"
                    width="30"
                    height="30"
                    loading="lazy">
                </label>
              </li>
            {% endfor %}
          </ul>
And replace it with:
       {% assign reversed_variants = product.variants | reverse %}
          <style>
            .product-options .color-swatches input + label,
            .product-options .color-swatches input + label img {
              border-radius: var(--bs-border-radius);
            }
          </style>
          <ul class="color-swatches list-unstyled mt-2">
            {% for value in option.values %}
              {% liquid
                for variant in reversed_variants
                  if variant.title contains value
                    assign variant_img = variant.image
                  endif
                endfor
              %}
              <li>
                <input
                  class="visually-hidden"
                  type="radio"
                  name="option-{{ option.name | handleize }}"
                  id="option-{{ option.name | handleize }}-{{ value | handleize }}"
                  value="{{ value | escape }}"
                  data-option-position="{{ option.position }}"
                  {% if option.selected_value == value %}
                    checked
                  {% endif %}
                >
                <label
                  for="option-{{ option.name | handleize }}-{{ value | handleize }}"
                  title="{{ value }}"
                  data-bs-toggle="tooltip"
                >
                  <img
                    class="img-fluid"
                    src="{{ variant_img | image_url: width: 120, height: 120, crop: 'center' }}"
                    alt="{{ value }}"
                    width="60"
                    height="60"
                    loading="lazy"
                  >
                </label>
              </li>
            {% endfor %}
          </ul>