Ce guide s’adresse aux développeurs qui créent des expériences personnalisées pour la boutique en ligne. Pour modifier simplement les couleurs et les textes, consultez le guide du modèle par défaut.
Pour les marchands qui souhaitent maîtriser toute la structure HTML ou créer une page de fidélité entièrement personnalisée, JeriCommerce propose des modèles de section Liquid autonomes qui chargent le moteur de la page de fidélité directement depuis le CDN.
Vous souhaitez éviter la configuration manuelle ? La skill IA loyalty-template-creator peut générer un modèle .liquid complet et personnalisé qui reprend le style visuel de votre boutique. Fournissez-lui une URL de référence : elle analyse les couleurs, les polices, la mise en page et les ressources pour produire un modèle prêt à l’emploi, basé sur le même moteur CDN que celui décrit ci-dessous.
Installez-la avec : npx skills add jericommerce/skills --skill loyalty-template-creator
Source : github.com/JeriCommerce/skills
Quand utiliser le mode CDN ¶
- Le marchand souhaite une mise en page entièrement personnalisée, au-delà des possibilités offertes par les paramètres de l’éditeur de thème.
- L’équipe de développement préfère gérer directement le HTML dans le code du thème.
- Vous devez intégrer la page de fidélité à un modèle de page existant, aux côtés d’autres sections.
Étapes de configuration ¶
Obtenir le modèle
JeriCommerce fournit deux modèles CDN prêts à l’emploi. Copiez celui qui répond le mieux à vos besoins :
- Modèle visuel (
templates/visual.liquid) : version complète avec une section d’accueil et un bouton d’action, des étapes expliquant le fonctionnement, des lignes de gains avec des icônes SVG propres à chaque réseau, des cartes de niveaux et un squelette de chargement. Son apparence est identique à celle du bloc de thème. - Modèle minimal (
templates/minimal.liquid) : présentation compacte en liste, avec un titre, les gains sous forme de liste simple et les niveaux présentés en lignes. Le CSS est intégré, sans feuille de style externe nécessaire.
Vous pouvez les obtenir dans l’administration JeriCommerce sous Loyalty Page > Get template code, ou les copier directement depuis les fichiers du dépôt.
Ajouter le modèle à votre thème
- Accédez à Shopify Admin > Online Store > Themes > Edit code.
- Dans le répertoire
sections/, cliquez sur Add a new section. - Donnez-lui un nom (par exemple,
jeri-loyalty) et collez le code du modèle.
Créer un modèle de page
Créez un modèle de page JSON qui fait référence à votre section :
{
"sections": {
"loyalty": {
"type": "jeri-loyalty"
}
},
"order": ["loyalty"]
}
Vous pouvez aussi ajouter la section à un modèle de page existant depuis l’éditeur de thème : Customize > Add section.
Créer la page
Accédez à Shopify Admin > Pages > Add page et sélectionnez le modèle « loyalty ».
Fonctionnement du mode CDN ¶
Les modèles CDN chargent le même JavaScript que le bloc d’extension d’application de thème, regroupé, minifié et toujours à jour :
<!-- Always the latest version -->
<script src="https://cdn.jericommerce.com/shopify/loyalty-page.js" defer></script>
<link rel="stylesheet" href="https://cdn.jericommerce.com/shopify/loyalty-page.css" />
Le moteur détecte automatiquement le domaine de la boutique depuis l’attribut data-shop de l’élément racine, ou utilise window.Shopify.shop en dernier recours.
Système de modèles : liaison des données ¶
Le moteur de modèles utilise deux systèmes pour relier les données de l’API à votre HTML.
1. Interpolation de variables : {varName} ¶
Insérez des expressions {varName} n’importe où dans le contenu textuel de votre HTML. Le moteur JS parcourt tous les nœuds textuels et les remplace par les données de l’API.
<h3>{tier.name}</h3>
<span>{tier.requiredPoints}</span>
<span>{earning.points}</span>
Dans les modèles répétitifs (niveaux, gains), les variables sont limitées aux données du modèle. La syntaxe utilise des accolades simples {key}, sans conflit avec Liquid ({{ }}), les littéraux de gabarit JS (${ }) ou le CSS.
Des variables globales (comme {programName} et {currencySymbol}) fonctionnent aussi dans tous les nœuds textuels du modèle, y compris en dehors des modèles répétitifs. Consultez la section Variables globales du modèle ci-dessous pour obtenir la liste complète.
2. Attributs de données : data-jeri ¶
Ils servent aux opérations non textuelles qui ne peuvent pas être exprimées par interpolation :
| Attribut | Rôle | Exemple |
|---|---|---|
data-jeri="name" sur <template> |
Définit un modèle de ligne répétitive | <template data-jeri="tiers"> |
data-jeri="name" sur un conteneur |
Reçoit les lignes clonées du modèle | <div data-jeri="tiers"> |
data-jeri="key" sur <img> |
Définit l’attribut src (masque l’image si la valeur est vide) |
<img data-jeri="earning.iconUrl"> |
data-jeri-hide-if="value" |
Masque l’élément lorsque la donnée correspond à la valeur | data-jeri-hide-if="1" |
data-jeri-html="key" |
Insère du contenu HTML brut | <p data-jeri-html="tier.content"> |
data-jeri-group="name" |
Conteneur de groupe (masqué lorsqu’il est vide) | data-jeri-group="purchases" |
Référence rapide : quelle syntaxe utiliser ¶
| Besoin | Syntaxe |
|---|---|
| Afficher du texte ou des nombres | {varName} dans le contenu textuel |
| Combiner des variables avec du texte personnalisé | Earn {earning.points} with {earning.title} |
| Définir la source d’une image | data-jeri="key" sur <img> |
| Masquer selon une valeur | data-jeri-hide-if |
| Insérer du contenu HTML enrichi | data-jeri-html="key" |
| Définir une ligne répétitive | <template data-jeri="name"> + <div data-jeri="name"> |
Variables globales du modèle ¶
Ces 7 variables globales peuvent être utilisées dans n’importe quel nœud textuel à l’intérieur de #jeri-loyalty-page-root. Écrivez-les avec la syntaxe {variableName} : le moteur les remplace automatiquement par les données de configuration du programme.
| Variable | Type | Description | Exemple |
|---|---|---|---|
{programName} |
string | Nom du programme de fidélité | « Mes récompenses » |
{currencySymbol} |
string | Symbole monétaire, déterminé via Intl.NumberFormat |
"$", "€", "£" |
{currencyCode} |
string | Code ISO de la devise | "USD", "EUR", "GBP" |
{balanceName} |
string | Nom des points au pluriel | « Points », « Étoiles » |
{singularBalanceName} |
string | Nom des points au singulier | « Point », « Étoile » |
{tierBalanceName} |
string | Nom des points de niveau au pluriel | « Points » |
{singularTierBalanceName} |
string | Nom des points de niveau au singulier | « Point » |
Exemple d’utilisation ¶
<h1>Welcome to {programName}!</h1>
<p>Earn {balanceName} with every {currencySymbol} you spend</p>
<p>Prices are in {currencyCode}</p>
Les variables globales fonctionnent avec les variables limitées au modèle ({earning.*}, {tier.*}). Dans les modèles répétitifs, les deux types de variables sont résolus.
La variable {currencySymbol} utilise la fonction native Intl.NumberFormat du navigateur pour déterminer le symbole correspondant au code de devise du programme. Le symbole s’adapte donc à la devise réelle du programme : $ pour USD, € pour EUR, £ pour GBP, etc.
Note de migration : la variable {hero.programName} a été supprimée. Utilisez {programName} à la place : elle fonctionne partout dans le modèle, pas uniquement dans la section d’accueil.
Champs de données disponibles ¶
Champs des gains (earning.*) ¶
À utiliser dans le modèle <template data-jeri="earning-row">.
| Champ | Type | Description |
|---|---|---|
earning.type |
string | Type de flux : purchase, social, referral, profile, verify, wallet, scan, link |
earning.title |
string | Titre lisible de la règle de gain |
earning.description |
string | Description détaillée de la façon de gagner des points |
earning.points |
string | Affichage compact des points : +100 pour un montant fixe, 10% pour un taux < 1, x2 pour un facteur >= 1 |
earning.iconUrl |
string | URL de l’icône (définie via data-jeri sur <img>, vide en l’absence d’icône) |
Champs des niveaux (tier.*) ¶
À utiliser dans le modèle <template data-jeri="tiers">.
| Champ | Type | Description |
|---|---|---|
tier.name |
string | Nom du niveau (par exemple, « Or », « VIP ») |
tier.content |
string | Description et avantages du niveau ; peut contenir du HTML, utilisez data-jeri-html="tier.content" |
tier.image |
string | URL de l’image du niveau (définie via data-jeri sur <img>) |
tier.requiredPoints |
string | Points nécessaires (par exemple, « 1 000 points de niveau »). Utilise tierBalanceName au singulier ou au pluriel |
tier.factor |
string | Facteur de points (par exemple, « 2 »). Masqué automatiquement lorsque sa valeur est « 1 », via data-jeri-hide-if |
tier.id |
string | Identifiant interne du niveau |
Élément racine obligatoire ¶
Chaque modèle personnalisé doit inclure cet élément racine avec les attributs requis :
<div
id="jeri-loyalty-page-root"
class="jeri-loyalty-page jeri-loyalty-page--loading"
data-shop="{{ shop.permanent_domain }}"
data-icon-base="https://cdn.jericommerce.com/shopify/"
data-locale="{{ request.locale.iso_code }}"
>
<!-- Your custom HTML here -->
</div>
| Attribut | Obligatoire | Rôle |
|---|---|---|
id="jeri-loyalty-page-root" |
Oui | Point d’entrée JS : le moteur recherche cet identifiant |
class="jeri-loyalty-page" |
Oui | Limitation de la portée CSS et variables CSS |
data-shop |
Oui | Domaine de la boutique pour les appels API |
data-icon-base |
Recommandé | Préfixe d’URL des icônes de gains |
data-locale |
Recommandé | Langue de la boutique pour l’internationalisation (utilise « en » par défaut) |
La classe jeri-loyalty-page--loading affiche un squelette de chargement et masque le contenu jusqu’au chargement des données. Le JS la supprime une fois les données récupérées.
La feuille de style CSS doit être chargée avant le contenu HTML (à l’intérieur de l’élément racine) pour éviter l’apparition temporaire de contenu sans mise en forme au premier chargement.
Règles des modèles ¶
Les 6 règles à respecter pour les modèles personnalisés :
- Conservez
id="jeri-loyalty-page-root"sur l’élément racine : le JS en a besoin pour s’initialiser. - Conservez
class="jeri-loyalty-page"sur la racine : les variables CSS y sont définies. - Conservez
data-shop, indispensable aux appels API. - Conservez les paires modèle/conteneur : un
<template data-jeri="X">doit avoir un<div data-jeri="X">correspondant au même niveau. - Utilisez librement
{varName}dans les nœuds textuels : le moteur remplace toutes les expressions qu’il reconnaît. - Utilisez
data-jeri-html="key"pour le contenu HTML (et non{var}, dont les caractères seraient échappés).
Structure du modèle par défaut ¶
Section d’accueil ¶
<section class="jeri-loyalty-page__hero">
<h1 class="jeri-loyalty-page__hero-title">Our Loyalty Program</h1>
<p class="jeri-loyalty-page__hero-subtitle">Join our loyalty program...</p>
<!-- CTA adapts to login state via Liquid -->
<div class="jeri-loyalty-page__hero-cta">
{% if customer %}
{% if block.settings.cta_action == 'widget_rewards' %}
<a href="#jeri=loyalty/rewards" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
{{ block.settings.logged_in_cta_label | default: 'See rewards' }}
</a>
{% else %}
<a href="{{ block.settings.logged_in_cta_url | default: '/account' }}" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
{{ block.settings.logged_in_cta_label | default: 'See rewards' }}
</a>
{% endif %}
{% else %}
<a href="{{ block.settings.guest_cta_url | default: '/account/login' }}" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
{{ 'loyalty_page.hero_cta' | t }}
</a>
{% endif %}
</div>
</section>
Section des niveaux ¶
<template data-jeri="tiers">
<div class="jeri-tier-card">
<div class="jeri-tier-card__body">
<div class="jeri-tier-card__top">
<h3 class="jeri-tier-card__name">{tier.name}</h3>
<span class="jeri-tier-card__factor" data-jeri="tier.factor" data-jeri-hide-if="1">
{tier.factor}x
</span>
</div>
<div class="jeri-tier-card__meta">
<span class="jeri-tier-card__points">{tier.requiredPoints}</span>
</div>
<p class="jeri-tier-card__content" data-jeri-html="tier.content"></p>
</div>
</div>
</template>
<!-- Container: cloned cards are appended here -->
<div data-jeri="tiers" class="jeri-tier-grid"></div>
Section des gains ¶
<!-- Purchase earnings group -->
<div class="jeri-earning-group" data-jeri-group="purchases">
<h3 class="jeri-earning-group__title">Purchases</h3>
<div class="jeri-earning-list" data-jeri="earnings-purchases"></div>
</div>
<!-- Action earnings group -->
<div class="jeri-earning-group" data-jeri-group="actions">
<h3 class="jeri-earning-group__title">Actions</h3>
<div class="jeri-earning-list" data-jeri="earnings-actions"></div>
</div>
<!-- Shared template for both groups -->
<template data-jeri="earning-row">
<div class="jeri-earning-row">
<img class="jeri-earning-row__icon" data-jeri="earning.iconUrl" alt="" width="48" height="48" loading="lazy" />
<div class="jeri-earning-row__content">
<h3 class="jeri-earning-row__title">{earning.title}</h3>
<p class="jeri-earning-row__description">{earning.description}</p>
</div>
<span class="jeri-earning-row__points">{earning.points}</span>
</div>
</template>
Exemple complet de modèle personnalisé ¶
Voici un modèle personnalisé minimal complet à utiliser comme point de départ :
<!-- CDN Scripts -->
<script src="https://cdn.jericommerce.com/shopify/loyalty-page.js" defer></script>
<link rel="stylesheet" href="https://cdn.jericommerce.com/shopify/loyalty-page.css" />
<div
id="jeri-loyalty-page-root"
class="jeri-loyalty-page jeri-loyalty-page--loading"
data-shop="{{ shop.permanent_domain }}"
data-icon-base="https://cdn.jericommerce.com/shopify/"
data-locale="{{ request.locale.iso_code }}"
>
<!-- Hero -->
<section class="jeri-loyalty-page__hero">
<h1 class="jeri-loyalty-page__hero-title">Our Loyalty Program</h1>
<p class="jeri-loyalty-page__hero-subtitle">Join and start earning rewards today.</p>
<div class="jeri-loyalty-page__hero-cta">
{% if customer %}
<a href="/account" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
See rewards
</a>
{% else %}
<a href="/account/login" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
Join now
</a>
{% endif %}
</div>
</section>
<!-- Tiers -->
<template data-jeri="tiers">
<div>
<h3>{tier.name}</h3>
<p>{tier.requiredPoints}</p>
<span data-jeri="tier.factor" data-jeri-hide-if="1">
Factor: {tier.factor}x
</span>
<div data-jeri-html="tier.content"></div>
</div>
</template>
<div data-jeri="tiers"></div>
<!-- Earnings -->
<template data-jeri="earning-row">
<div>
<img data-jeri="earning.iconUrl" alt="" width="32" height="32" />
<strong>{earning.title}</strong>
<span>{earning.points}</span>
<p>{earning.description}</p>
</div>
</template>
<div data-jeri-group="purchases">
<h3>Purchases</h3>
<div data-jeri="earnings-purchases"></div>
</div>
<div data-jeri-group="actions">
<h3>Actions</h3>
<div data-jeri="earnings-actions"></div>
</div>
<!-- Loading skeleton -->
<div class="jeri-loyalty-page__skeleton">
<div class="jeri-loyalty-page__skeleton-hero"></div>
</div>
</div>
Modèle visuel ou minimal ¶
Modèle visuel : adapté aux marques qui souhaitent une page de fidélité soignée, orientée marketing, avec une section d’accueil, des étapes expliquant le fonctionnement, des lignes de gains avec icônes SVG, des cartes de niveaux et un squelette de chargement complet.
Modèle minimal : adapté aux boutiques qui préfèrent une présentation épurée centrée sur les données, avec une liste compacte, du CSS intégré et aucune dépendance à une feuille de style externe, en complément du moteur JS.
Les deux modèles utilisent le même moteur JS et le même système de liaison des données. Seules la structure HTML et la présentation visuelle diffèrent. Vous pouvez partir de l’un ou de l’autre et le personnaliser librement.
Système d’icônes ¶
Les icônes des lignes de gains sont des fichiers SVG nommés selon leur type. L’URL d’une icône est calculée ainsi : data-icon-base + nom + .svg.
| Fichier d’icône | Utilisation |
|---|---|
purchase.svg |
Flux de gains liés aux achats |
facebook.svg |
S’abonner sur Facebook |
instagram.svg |
S’abonner sur Instagram |
tiktok.svg |
S’abonner sur TikTok |
x.svg |
S’abonner sur X |
youtube.svg |
S’abonner sur YouTube |
referral.svg |
Parrainer un ami |
profile.svg |
Compléter son profil |
wallet.svg |
Installer la carte Wallet |
scan.svg |
Effectuer un scan en magasin |
verify.svg |
Vérifier son compte |
link.svg |
Consulter un lien |
En mode CDN, l’URL de base des icônes est définie dans le code sur https://cdn.jericommerce.com/shopify/. Si data-icon-base est absent ou si une icône n’existe pas, l’élément <img> est automatiquement masqué.
Format d’affichage des points ¶
Le champ earning.points utilise un format compact selon le type de gain :
| Type de gain | Format | Exemple |
|---|---|---|
| Achat (taux < 1) | Pourcentage reversé | 10% |
| Achat (taux >= 1) | Facteur | x2 |
| Tous les autres (réseaux sociaux, parrainage, profil, etc.) | Points fixes | +100 |
Pour le parrainage, seuls les points du parrain figurent dans le badge. La récompense de l’ami est mentionnée dans la description.
La description des gains liés aux achats utilise dynamiquement le symbole de la devise réelle du programme (par exemple, « Gagnez x3 points par $ dépensé » pour USD, ou « Gagnez x3 points par € dépensé » pour EUR). La devise est déterminée à partir de la configuration du programme avec Intl.NumberFormat du navigateur.
Résolution des noms du Wallet ¶
Quatre propriétés de nommage sont récupérées dans la configuration du programme :
| Nom | Utilisation | Exemple |
|---|---|---|
balanceName / singularBalanceName |
Descriptions et titres des gains | « points » / « point » |
tierBalanceName / singularTierBalanceName |
Points requis pour les niveaux | « points de niveau » / « point de niveau » |
Ces propriétés sont lues depuis program.configurations.wallet (configuration de base). Le singulier ou le pluriel est appliqué automatiquement selon le montant (1 = singulier, sinon pluriel).
Ces quatre noms sont également disponibles comme variables globales du modèle : {balanceName}, {singularBalanceName}, {tierBalanceName} et {singularTierBalanceName}. Vous pouvez donc les utiliser directement dans n’importe quel nœud textuel.
Paramètres de l’éditeur de thème ¶
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
| Enable Loyalty Page | Case à cocher | true |
Afficher ou masquer le bloc entier |
| Hero Title | Texte | "Our Loyalty Program" | Titre principal |
| Hero Subtitle | Zone de texte | "Join our loyalty..." | Description sous le titre |
| Guest CTA URL | URL | /account/login |
Destination des visiteurs non connectés |
| Logged-in CTA Action | Liste de sélection | account |
account = accéder à la page du compte, widget_rewards = ouvrir le widget des récompenses |
| Logged-in CTA Label | Texte | "See rewards" | Texte du bouton affiché aux clients connectés |
| Logged-in CTA URL | URL | /account |
URL lorsque l’action choisie est "Go to account page" |
| Show How It Works | Case à cocher | true |
Afficher ou masquer la section en 3 étapes |
| Show Earning Rules | Case à cocher | true |
Afficher ou masquer la section des gains |
| Show VIP Tiers | Case à cocher | true |
Afficher ou masquer la section des niveaux |
| Primary Color | Couleur | #0f0f0f |
Boutons, accents et badges |
| Primary Contrast | Couleur | #fcfcfc |
Texte sur les arrière-plans de couleur principale |
| Secondary Color | Couleur | #f5f5f5 |
Arrière-plan des cartes |
| Text Color | Couleur | #0f0f0f |
Titres et corps du texte |
| Muted Color | Couleur | #888888 |
Sous-titres et descriptions |
| Custom CSS | Zone de texte | Aucune | Règles CSS supplémentaires à appliquer |
Intégration du widget ¶
Le bouton d’action "See rewards" (lorsque cta_action vaut widget_rewards) utilise #jeri=loyalty/rewards comme cible de lien. Si le widget JeriCommerce est actif sur la page, un clic sur ce lien ouvre son panneau de récompenses. Ainsi :
- La page de fidélité explique le programme (informations publiques).
- Le widget gère les récompenses, les transactions et le compte (après authentification).
- Les deux fonctionnent indépendamment, mais se complètent grâce au format d’URL
#jeri=.
Visibilité conditionnelle ¶
La page masque automatiquement certains éléments selon la configuration du programme :
| Élément | Condition |
|---|---|
| Section VIP Tiers | Masquée lorsque le programme ne comporte aucun niveau |
| Section Ways to Earn | Masquée lorsque le programme ne comporte aucun flux d’engagement actif |
| Groupe Purchases | Masqué lorsqu’aucun flux de type achat n’existe |
| Groupe Actions | Masqué lorsqu’aucun flux de type action n’existe |
Variables CSS ¶
Variables configurables par le marchand ¶
Le modèle Liquid définit ces variables sur :root à partir des paramètres de couleur de l’éditeur de thème :
| Variable | Valeur par défaut | Définie par |
|---|---|---|
--jeri-loyalty-primary |
#0f0f0f |
Paramètre Primary Color |
--jeri-loyalty-primary-contrast |
#fcfcfc |
Paramètre Primary Contrast |
--jeri-loyalty-secondary |
#f5f5f5 |
Paramètre Secondary Color |
--jeri-loyalty-text |
#0f0f0f |
Paramètre Text Color |
--jeri-loyalty-muted |
#888888 |
Paramètre Muted Color |
Variables internes ¶
Ces variables reprennent celles du marchand et ajoutent des valeurs pour la mise en page et la structure. Redéfinissez-les dans Custom CSS pour un contrôle plus précis :
| Variable | Valeur par défaut | Rôle |
|---|---|---|
--jlp-primary |
var(--jeri-loyalty-primary, #0f0f0f) |
Couleur principale |
--jlp-primary-contrast |
var(--jeri-loyalty-primary-contrast, #fcfcfc) |
Texte sur la couleur principale |
--jlp-text |
var(--jeri-loyalty-text, #0f0f0f) |
Couleur du corps du texte |
--jlp-muted |
var(--jeri-loyalty-muted, #888888) |
Couleur du texte secondaire |
--jlp-font |
var(--font-body-family, system stack) |
Famille de polices |
--jlp-border-radius |
16px |
Rayon des coins des cartes |
--jlp-space |
16px |
Unité d’espacement de base |
--jlp-border-color |
#e8e8e8 |
Couleur des bordures des cartes et listes |
--jlp-card-bg |
#fcfcfc |
Couleur d’arrière-plan des cartes |
--jlp-divider |
#f0f0f0 |
Couleur des séparateurs de lignes |
--jlp-skeleton-bg |
#f5f5f5 |
Couleur du squelette de chargement |
--jlp-icon-size |
48px |
Taille des icônes des lignes de gains |
--jlp-max-width |
1200px |
Largeur maximale de la page |
Exemple : modifier les espacements ¶
.jeri-loyalty-page {
--jlp-space: 12px;
--jlp-border-radius: 8px;
}
Exemple : thème sombre ¶
.jeri-loyalty-page {
--jlp-card-bg: #1a1a1a;
--jlp-border-color: #333;
--jlp-divider: #2a2a2a;
--jlp-skeleton-bg: #222;
}
Référence des classes CSS ¶
Mise en page ¶
| Classe | Élément |
|---|---|
.jeri-loyalty-page |
Conteneur racine |
.jeri-loyalty-page--loading |
État de chargement (affiche le squelette et masque le contenu) |
.jeri-loyalty-page__hero |
Section d’accueil |
.jeri-loyalty-page__section |
Section de contenu |
.jeri-loyalty-page__section-title |
Titre de section |
.jeri-loyalty-page__skeleton |
Conteneur du squelette de chargement |
Accueil ¶
| Classe | Élément |
|---|---|
.jeri-loyalty-page__hero-title |
Titre de la section d’accueil |
.jeri-loyalty-page__hero-subtitle |
Description de la section d’accueil |
.jeri-loyalty-page__hero-cta |
Conteneur du bouton d’action |
.jeri-loyalty-page__cta-button |
Style de base du bouton d’action |
.jeri-loyalty-page__cta-button--primary |
Variante principale du bouton d’action |
Fonctionnement ¶
| Classe | Élément |
|---|---|
.jeri-loyalty-page__steps |
Grille des étapes (3 colonnes) |
.jeri-loyalty-page__step |
Étape individuelle |
.jeri-loyalty-page__step-number |
Cercle contenant le numéro |
.jeri-loyalty-page__step-title |
Titre de l’étape |
.jeri-loyalty-page__step-text |
Description de l’étape |
Gains ¶
| Classe | Élément |
|---|---|
.jeri-earning-group |
Conteneur de groupe (Purchases/Actions) |
.jeri-earning-group__title |
Titre du groupe |
.jeri-earning-list |
Conteneur de liste avec bordure |
.jeri-earning-row |
Ligne de gain individuelle |
.jeri-earning-row__icon |
Icône de la ligne (<img>) |
.jeri-earning-row__content |
Conteneur du texte de la ligne |
.jeri-earning-row__title |
Titre de la ligne |
.jeri-earning-row__description |
Description de la ligne |
.jeri-earning-row__points |
Affichage des points |
Niveaux ¶
| Classe | Élément |
|---|---|
.jeri-tier-grid |
Conteneur flex des cartes de niveaux |
.jeri-tier-card |
Carte de niveau individuelle |
.jeri-tier-card__body |
Corps de la carte |
.jeri-tier-card__top |
Ligne du nom et du facteur |
.jeri-tier-card__name |
Nom du niveau |
.jeri-tier-card__factor |
Badge du facteur (masqué à 1x) |
.jeri-tier-card__content |
Description (affichée en HTML) |
.jeri-tier-card__points |
Points requis |
Internationalisation (i18n) ¶
La page de fidélité prend en charge plusieurs langues selon la langue actuelle de la boutique :
- Anglais (en), par défaut
- Espagnol (es)
- Français (fr)
- Allemand (de)
- Italien (it)
Les langues non prises en charge utilisent automatiquement l’anglais.
Fonctionnement ¶
L’internationalisation comporte deux couches :
- Textes côté Liquid (rendus sur le serveur) : utilisent le filtre Shopify
{{ 'key' | t }}avec des fichiers JSON de langue danslocales/. Ils traduisent les textes statiques, comme « Purchases », « Actions », les étapes « How It Works » et le bouton d’action des visiteurs non connectés. - Textes côté TypeScript (rendus dans le navigateur) : utilisent l’utilitaire partagé
i18n.tsavec des fichiers.tsde langue inclus dans le JS. Ils traduisent les titres et descriptions dynamiques des flux de gains.
Détection de la langue ¶
La langue de la boutique est transmise au JavaScript via l’attribut data-locale de l’élément racine :
<div id="jeri-loyalty-page-root" data-locale="{{ request.locale.iso_code }}" ...>
</div>
Ajouter une langue ¶
- Créez
theme-extensions/loyalty-page/locales/{lang}.ts(copiezen.tset traduisez-le). - Créez
theme-extensions/loyalty-page/locales/{lang}.json(copiezen.default.jsonet traduisez-le). - Importez la nouvelle langue dans
loyalty-page.tset ajoutez-la àinitFromSession(locale, { en, es, fr, de, it, {lang} }). - Exécutez
npm run build:theme-extensionspour reconstruire les fichiers.
Fichiers de traduction ¶
| Fichier | Rôle |
|---|---|
locales/en.ts |
Traductions anglaises des textes côté JS (incluses dans le JS) |
locales/es.ts |
Traductions espagnoles des textes côté JS (incluses dans le JS) |
locales/fr.ts |
Traductions françaises des textes côté JS (incluses dans le JS) |
locales/de.ts |
Traductions allemandes des textes côté JS (incluses dans le JS) |
locales/it.ts |
Traductions italiennes des textes côté JS (incluses dans le JS) |
locales/en.default.json |
Traductions anglaises des textes côté Liquid (copiées dans le répertoire locales/ de sortie) |
locales/es.json |
Traductions espagnoles des textes côté Liquid (copiées dans le répertoire locales/ de sortie) |
locales/fr.json |
Traductions françaises des textes côté Liquid (copiées dans le répertoire locales/ de sortie) |
locales/de.json |
Traductions allemandes des textes côté Liquid (copiées dans le répertoire locales/ de sortie) |
locales/it.json |
Traductions italiennes des textes côté Liquid (copiées dans le répertoire locales/ de sortie) |