Aller au contenu

🎠 CarrouselsGratuit · 0 NahnahPar NAHNAH AI

Carrousel de produits choisis

Une sélection de produits que tu choisis un par un, en grandes cartes avec barre de progression du défilement.

Aperçu en direct

Données de démonstration (produits, menus, textes d’exemple) : dans ta boutique, ce sont les tiennes.

Photos : Unsplash / Pexels (exemples de l’aperçu, jamais inclus dans le code).

Code à copier

Fichier complet sections/nahnah-carrousel-produits-choisis.liquid (Liquid, CSS et JS inclus).

{%- comment -%} NAHNAH AI · Carrousel de produits choisis (bibliothèque Sections & effets) {%- endcomment -%}
{%- assign id_piste = 'nn-cpc-' | append: section.id -%}
<div class="nn-carrousel-produits-choisis" style="--nn-mh: {{ section.settings.marge_haut }}px; --nn-mb: {{ section.settings.marge_bas }}px; --nn-fond: {{ section.settings.couleur_fond }}; --nn-texte: {{ section.settings.couleur_texte }}; --nn-accent: {{ section.settings.couleur_accent }}; --nn-bouton: {{ section.settings.couleur_bouton }}; --nn-texte-bouton: {{ section.settings.couleur_texte_bouton }};">
  <nn-carrousel-produits-choisis class="nn-carrousel-produits-choisis__conteneur" role="region" aria-roledescription="carrousel" aria-label="{{ section.settings.titre | strip_html | default: 'Sélection de produits' | escape }}">
    <div class="nn-carrousel-produits-choisis__entete">
      <div>
        {%- if section.settings.surtitre != blank -%}<p class="nn-carrousel-produits-choisis__surtitre">{{ section.settings.surtitre | escape }}</p>{%- endif -%}
        {%- if section.settings.titre != blank -%}<h2 class="nn-carrousel-produits-choisis__titre">{{ section.settings.titre }}</h2>{%- endif -%}
      </div>
      <div class="nn-carrousel-produits-choisis__nav" data-nn-nav>
        <button type="button" class="nn-carrousel-produits-choisis__fleche" data-nn-prec aria-controls="{{ id_piste }}" aria-label="Produits précédents"><svg aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"/></svg></button>
        <button type="button" class="nn-carrousel-produits-choisis__fleche" data-nn-suiv aria-controls="{{ id_piste }}" aria-label="Produits suivants"><svg aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6l6 6-6 6"/></svg></button>
      </div>
    </div>
    {%- if section.settings.produits != blank -%}
      <ul class="nn-carrousel-produits-choisis__piste" id="{{ id_piste }}" data-nn-piste role="list">
        {%- for p in section.settings.produits -%}
          <li class="nn-carrousel-produits-choisis__item">
            <article class="nn-carrousel-produits-choisis__carte">
              <a class="nn-carrousel-produits-choisis__media" href="{{ p.url }}" tabindex="-1" aria-hidden="true">
                {%- if p.featured_media -%}
                  {{ p.featured_media | image_url: width: 800 | image_tag: loading: 'lazy', sizes: '(min-width: 990px) 40vw, 85vw', widths: '400, 600, 800', class: 'nn-carrousel-produits-choisis__image', alt: '' }}
                {%- else -%}
                  {{ 'product-2' | placeholder_svg_tag: 'nn-carrousel-produits-choisis__image' }}
                {%- endif -%}
              </a>
              <div class="nn-carrousel-produits-choisis__infos">
                <h3 class="nn-carrousel-produits-choisis__nom"><a href="{{ p.url }}">{{ p.title | escape }}</a></h3>
                <p class="nn-carrousel-produits-choisis__prix">
                  {{ p.price | money }}
                  {%- if p.compare_at_price > p.price -%}
                    <s class="nn-carrousel-produits-choisis__barre"><span class="nn-carrousel-produits-choisis__cache">Prix habituel</span>{{ p.compare_at_price | money }}</s>
                  {%- endif -%}
                </p>
                <span class="nn-carrousel-produits-choisis__voir" aria-hidden="true">{{ section.settings.texte_bouton | escape }}</span>
              </div>
            </article>
          </li>
        {%- endfor -%}
      </ul>
      <div class="nn-carrousel-produits-choisis__progression" data-nn-progression aria-hidden="true"><span></span></div>
    {%- elsif request.design_mode -%}
      <p class="nn-carrousel-produits-choisis__vide">Choisis jusqu’à 12 produits dans les réglages de la section.</p>
    {%- endif -%}
  </nn-carrousel-produits-choisis>
</div>

{% schema %}
{
  "name": "Produits choisis",
  "tag": "section",
  "class": "nn-section-carrousel-produits-choisis",
  "settings": [
    {
      "type": "text",
      "id": "surtitre",
      "label": "Surtitre",
      "default": "Sélection"
    },
    {
      "type": "inline_richtext",
      "id": "titre",
      "label": "Titre",
      "default": "Nos coups de cœur du moment"
    },
    {
      "type": "product_list",
      "id": "produits",
      "label": "Produits",
      "limit": 12
    },
    {
      "type": "text",
      "id": "texte_bouton",
      "label": "Texte du lien de chaque carte",
      "default": "Voir le produit"
    },
    {
      "type": "header",
      "content": "Couleurs"
    },
    {
      "type": "color",
      "id": "couleur_fond",
      "label": "Fond",
      "default": "#F6F1EA"
    },
    {
      "type": "color",
      "id": "couleur_texte",
      "label": "Texte",
      "default": "#1E1A16"
    },
    {
      "type": "color",
      "id": "couleur_accent",
      "label": "Accent",
      "default": "#B8935A"
    },
    {
      "type": "color",
      "id": "couleur_bouton",
      "label": "Boutons et flèches",
      "default": "#1E1A16"
    },
    {
      "type": "color",
      "id": "couleur_texte_bouton",
      "label": "Texte des boutons et flèches",
      "default": "#F6F1EA"
    },
    {
      "type": "header",
      "content": "Espacement"
    },
    {
      "type": "range",
      "id": "marge_haut",
      "label": "Marge haute",
      "min": 0,
      "max": 120,
      "step": 4,
      "unit": "px",
      "default": 48
    },
    {
      "type": "range",
      "id": "marge_bas",
      "label": "Marge basse",
      "min": 0,
      "max": 120,
      "step": 4,
      "unit": "px",
      "default": 48
    }
  ],
  "presets": [
    {
      "name": "Produits choisis"
    }
  ]
}
{% endschema %}

{% stylesheet %}
.nn-carrousel-produits-choisis {
  padding: var(--nn-mh) 0 var(--nn-mb);
  background: var(--nn-fond);
  color: var(--nn-texte);
}
.nn-carrousel-produits-choisis__conteneur {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 16px;
}
.nn-carrousel-produits-choisis__titre {
  margin: 0;
  font-size: clamp(24px, 4vw, 36px);
  line-height: 1.2;
  color: inherit;
}
.nn-carrousel-produits-choisis__cache {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
.nn-carrousel-produits-choisis__vide {
  margin: 0;
  padding: 16px;
  border: 1px dashed currentColor;
  border-radius: 12px;
  font-size: 14px;
  opacity: 0.8;
}
nn-carrousel-produits-choisis { display: block; }
.nn-carrousel-produits-choisis__entete {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 12px 16px;
  margin-bottom: 20px;
}
.nn-carrousel-produits-choisis__piste {
  --nn-ecart: 16px;
  display: flex;
  gap: var(--nn-ecart);
  margin: 0;
  padding: 4px 2px 14px;
  list-style: none;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scrollbar-width: thin;
  -webkit-overflow-scrolling: touch;
}
.nn-carrousel-produits-choisis__piste > * {
  position: relative;
  flex: 0 0 var(--nn-l, 78%);
  min-width: 0;
  scroll-snap-align: start;
}
@media (min-width: 750px) {
  .nn-carrousel-produits-choisis__piste > * { flex-basis: var(--nn-l-md, calc((100% - 2 * var(--nn-ecart)) / 3)); }
}
@media (min-width: 990px) {
  .nn-carrousel-produits-choisis__piste > * { flex-basis: var(--nn-l-lg, calc((100% - 3 * var(--nn-ecart)) / 4)); }
}
.nn-carrousel-produits-choisis__piste:focus-visible {
  outline: 3px solid var(--nn-accent);
  outline-offset: 4px;
}
.nn-carrousel-produits-choisis__nav {
  display: flex;
  gap: 8px;
  margin-inline-start: auto;
}
.nn-carrousel-produits-choisis__nav[hidden],
.nn-carrousel-produits-choisis [hidden] {
  display: none !important;
}
.nn-carrousel-produits-choisis__fleche {
  display: inline-grid;
  place-items: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 1px solid color-mix(in srgb, currentColor 25%, transparent);
  border-radius: 50%;
  background: var(--nn-bouton, transparent);
  color: var(--nn-texte-bouton, inherit);
  cursor: pointer;
  transition: opacity 0.2s ease, transform 0.2s ease;
}
.nn-carrousel-produits-choisis__fleche svg {
  width: 20px;
  height: 20px;
}
.nn-carrousel-produits-choisis__fleche:disabled {
  opacity: 0.35;
  cursor: default;
}
.nn-carrousel-produits-choisis__fleche:focus-visible {
  outline: 3px solid var(--nn-accent);
  outline-offset: 2px;
}
@media (hover: hover) {
  .nn-carrousel-produits-choisis__fleche:not(:disabled):hover { transform: scale(1.06); }
}
[dir="rtl"] .nn-carrousel-produits-choisis__fleche svg { transform: scaleX(-1); }

.nn-carrousel-produits-choisis__piste {
  --nn-l: 85%;
  --nn-l-md: calc((100% - var(--nn-ecart)) / 2);
  --nn-l-lg: calc((100% - 2 * var(--nn-ecart)) / 2.6);
}
.nn-carrousel-produits-choisis__surtitre {
  margin: 0 0 4px;
  color: var(--nn-accent);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
.nn-carrousel-produits-choisis__carte {
  position: relative;
  display: flex;
  flex-direction: column;
  height: 100%;
  overflow: hidden;
  border-radius: 18px;
  background: color-mix(in srgb, var(--nn-texte) 5%, var(--nn-fond));
}
.nn-carrousel-produits-choisis__media {
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
}
.nn-carrousel-produits-choisis__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s ease;
}
.nn-carrousel-produits-choisis__infos {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1;
  padding: 16px 18px 18px;
}
.nn-carrousel-produits-choisis__nom {
  margin: 0;
  font-size: 18px;
  line-height: 1.3;
}
.nn-carrousel-produits-choisis__nom a {
  color: inherit;
  text-decoration: none;
}
.nn-carrousel-produits-choisis__nom a::after {
  content: "";
  position: absolute;
  inset: 0;
}
.nn-carrousel-produits-choisis__nom a:focus-visible {
  outline: none;
}
.nn-carrousel-produits-choisis__carte:focus-within {
  outline: 3px solid var(--nn-accent);
  outline-offset: 2px;
}
.nn-carrousel-produits-choisis__prix {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 10px;
  margin: 0;
  font-weight: 600;
}
.nn-carrousel-produits-choisis__barre {
  font-weight: 400;
  opacity: 0.6;
}
.nn-carrousel-produits-choisis__voir {
  margin-top: auto;
  padding-top: 8px;
  color: var(--nn-accent);
  font-weight: 700;
}
@media (hover: hover) {
  .nn-carrousel-produits-choisis__carte:hover .nn-carrousel-produits-choisis__image { transform: scale(1.05); }
}
.nn-carrousel-produits-choisis__progression {
  height: 3px;
  margin-top: 6px;
  border-radius: 3px;
  background: color-mix(in srgb, var(--nn-texte) 15%, transparent);
  overflow: hidden;
}
.nn-carrousel-produits-choisis__progression span {
  display: block;
  height: 100%;
  background: var(--nn-accent);
  transform: scaleX(var(--nn-progression, 0));
  transform-origin: left;
  transition: transform 0.15s linear;
}
[dir="rtl"] .nn-carrousel-produits-choisis__progression span { transform-origin: right; }
@media (prefers-reduced-motion: reduce) {
  .nn-carrousel-produits-choisis * {
    animation: none !important;
    transition: none !important;
  }
}
{% endstylesheet %}

{% javascript %}
(function () {
  // Défilement au doigt (scroll-snap) et flèches accessibles ; aucune donnée externe
  function nnQuandPret(f) {
    if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", f, { once: true });
    else f();
  }
  var reduit = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
  function nnDefilement(racine) {
    var piste = racine.querySelector("[data-nn-piste]");
    if (!piste) return;
    var prec = racine.querySelector("[data-nn-prec]");
    var suiv = racine.querySelector("[data-nn-suiv]");
    var nav = racine.querySelector("[data-nn-nav]");
    var barre = racine.querySelector("[data-nn-progression]");
    var sens = getComputedStyle(piste).direction === "rtl" ? -1 : 1;
    function maj() {
      var max = piste.scrollWidth - piste.clientWidth;
      var x = Math.abs(piste.scrollLeft);
      if (nav) nav.hidden = max <= 4;
      if (prec) prec.disabled = x <= 4;
      if (suiv) suiv.disabled = x >= max - 4;
      if (barre) barre.style.setProperty("--nn-progression", max > 4 ? Math.min(1, x / max).toFixed(3) : "1");
    }
    function aller(n) {
      var premier = piste.firstElementChild;
      var ecart = parseFloat(getComputedStyle(piste).columnGap) || 0;
      var pas = premier ? premier.getBoundingClientRect().width + ecart : piste.clientWidth;
      var nombre = Math.max(1, Math.floor((piste.clientWidth + ecart + 1) / pas));
      piste.scrollBy({ left: n * sens * pas * nombre, behavior: reduit ? "auto" : "smooth" });
    }
    if (prec) prec.addEventListener("click", function () { aller(-1); });
    if (suiv) suiv.addEventListener("click", function () { aller(1); });
    piste.addEventListener("scroll", maj, { passive: true });
    if (window.ResizeObserver) new ResizeObserver(maj).observe(piste);
    else window.addEventListener("resize", maj);
    maj();
  }
  if (!customElements.get("nn-carrousel-produits-choisis")) {
    customElements.define("nn-carrousel-produits-choisis", class extends HTMLElement {
      connectedCallback() {
        var moi = this;
        nnQuandPret(function () {
          if (moi.nnPret || !moi.isConnected) return;
          moi.nnPret = true;
          moi.demarrer();
        });
      }
      demarrer() {
        nnDefilement(this);
      }
    });
  }
})();
{% endjavascript %}
Télécharger le fichier .liquid

Licence NAHNAH AI : utilisation libre dans tes boutiques (y compris commerciales), modification permise, revente de l’élément seul interdite.

Prompt à copier

À coller dans Claude ou ChatGPT avec le fichier téléchargé (ou le code copié) : l’assistant t’aide à l’installer et à l’adapter à ta marque.

Tu es un expert des thèmes Shopify Online Store 2.0. Aide-moi à installer puis à adapter à ma marque cet élément gratuit de la bibliothèque NAHNAH AI.

Élément : « Carrousel de produits choisis » (Carrousels)
Description : Une sélection de produits que tu choisis un par un, en grandes cartes avec barre de progression du défilement.
Page de l’élément (aperçu en direct) : https://ai.nahnah.shop/bibliotheque-shopify/carrousel-produits-choisis
Fichier : nahnah-carrousel-produits-choisis.liquid (bouton « Télécharger » de la page) ou le code copié avec le bouton « Copier » : je te le joins ou je le colle après ce message.
Emplacement dans le thème : sections/nahnah-carrousel-produits-choisis.liquid (Liquid, puis {% stylesheet %} et {% javascript %}, dans ce seul fichier).

Étapes d’installation :
1. Dans Shopify : Boutique en ligne → Thèmes → bouton « … » du thème → Modifier le code.
2. Dossier « sections » → « Ajouter une section » (ou « Nouveau fichier ») → nomme-la « nahnah-carrousel-produits-choisis ».
3. Efface le contenu proposé, colle le code de l’onglet Liquid (fichier complet), puis Enregistrer.
4. Ouvre Personnaliser → Ajouter une section → choisis-la, règle les textes et les couleurs, puis Enregistrer.

Ce que j’attends de toi :
- Guide-moi pas à pas dans Shopify : Boutique en ligne → Thèmes → « … » → Modifier le code → dossier sections → Ajouter une section, puis Personnaliser → Ajouter une section.
- Propose-moi d’adapter les couleurs, les textes et les liens à ma marque : demande d’abord mes couleurs (codes hexadécimaux), mon ton et mes liens.
- Garde le bloc {% schema %} et tous ses réglages (identifiants, types, presets) : je dois pouvoir tout régler ensuite dans l’éditeur de thème.
- Rends-moi le fichier complet modifié, prêt à coller, sans faux avis, fausse urgence ni chiffre inventé.

Si tu as le connecteur NAHNAH AI (MCP), récupère directement le code exact avec l’outil obtenir_code_element (id : carrousel-produits-choisis).

Installer dans ma boutique

En un clic, la section est ajoutée à un thème de ta boutique Shopify connectée (un thème non publié par défaut).

Chargement de tes boutiques…

Installer dans Shopify

  1. Dans Shopify : Boutique en ligne → Thèmes → bouton « … » du thème → Modifier le code.
  2. Dossier « sections » → « Ajouter une section » (ou « Nouveau fichier ») → nomme-la « nahnah-carrousel-produits-choisis ».
  3. Efface le contenu proposé, colle le code de l’onglet Liquid (fichier complet), puis Enregistrer.
  4. Ouvre Personnaliser → Ajouter une section → choisis-la, règle les textes et les couleurs, puis Enregistrer.

Installer via le MCP

Depuis Claude, Claude Code ou ChatGPT connecté à NAHNAH AI, demande : « Donne-moi le code de l’élément carrousel-produits-choisis de la bibliothèque NAHNAH AI et les étapes pour l’installer ». L’assistant récupère le code et les étapes (outil obtenir_code_element), gratuitement.

Boutique connectée à NAHNAH AI : l’assistant peut aussi l’installer directement (outil installer_element).

Connecter le MCP

Dans la même catégorie