Diese Anleitung richtet sich an Entwickler, die individuelle Storefront-Erlebnisse erstellen. Wenn Sie nur Farben und Texte anpassen möchten, verwenden Sie stattdessen die Anleitung zur Standardvorlage.
Für Händler, die das HTML-Layout vollständig kontrollieren oder eine komplett eigene Loyalty-Seite erstellen möchten, stellt JeriCommerce eigenständige Liquid-Abschnittsvorlagen bereit. Sie laden die Loyalty-Page-Engine direkt vom CDN.
Möchten Sie die manuelle Einrichtung überspringen? Der KI-Skill loyalty-template-creator kann eine vollständige benutzerdefinierte .liquid-Vorlage erstellen, die zum visuellen Stil Ihres Shops passt. Geben Sie eine Referenz-URL an. Der Skill analysiert Farben, Schriftarten, Layout und Medien und erstellt eine sofort nutzbare Vorlage auf Basis derselben CDN-Engine, die weiter unten beschrieben wird.
Installieren Sie ihn mit: npx skills add jericommerce/skills --skill loyalty-template-creator
Quelle: github.com/JeriCommerce/skills
Wann Sie den CDN-Modus verwenden sollten ¶
- Der Händler benötigt ein vollständig individuelles Layout, das über die Möglichkeiten der Theme-Editor-Einstellungen hinausgeht.
- Das Entwicklungsteam möchte das HTML direkt im Theme-Code verwalten.
- Sie müssen die Loyalty-Seite zusammen mit anderen Abschnitten in eine vorhandene Seitenvorlage integrieren.
Einrichtungsschritte ¶
Vorlage abrufen
JeriCommerce stellt zwei fertige CDN-Vorlagen bereit. Kopieren Sie die Vorlage, die am besten zu Ihren Anforderungen passt:
- Visuelle Vorlage (
templates/visual.liquid) : Voll ausgestattet: Hero-Bereich mit CTA, Schritte zur Funktionsweise, Zeilen zum Punkteverdienen mit SVG-Symbolen je Netzwerk, Stufenkarten und Ladegerüst. Sieht genauso aus wie der Theme-Block. - Minimale Vorlage (
templates/minimal.liquid) : Kompaktes Listenlayout: Titel, Verdienste als einfache Liste und Stufen als Zeilen. Mit Inline-CSS, kein externes Stylesheet erforderlich.
Sie finden die Vorlagen in der JeriCommerce-Verwaltung unter Loyalty Page > Get template code oder können sie direkt aus den Repository-Dateien kopieren.
Zum Theme hinzufügen
- Öffnen Sie Shopify Admin > Online Store > Themes > Edit code.
- Klicken Sie im Verzeichnis
sections/auf Add a new section. - Geben Sie einen Namen ein (z. B.
jeri-loyalty) und fügen Sie den Vorlagencode ein.
Seitenvorlage erstellen
Erstellen Sie eine JSON-Seitenvorlage, die auf Ihren Abschnitt verweist:
{
"sections": {
"loyalty": {
"type": "jeri-loyalty"
}
},
"order": ["loyalty"]
}
Alternativ können Sie den Abschnitt im Theme-Editor zu einer vorhandenen Seitenvorlage hinzufügen: Customize > Add section.
Seite erstellen
Öffnen Sie Shopify Admin > Pages > Add page und wählen Sie die Vorlage "loyalty" aus.
Funktionsweise des CDN-Modus ¶
CDN-Vorlagen laden dasselbe JavaScript, das auch den Block der Theme-App-Erweiterung antreibt. Es ist gebündelt, minimiert und immer aktuell:
<!-- 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" />
Die Engine erkennt die Shop-Domain automatisch anhand des Attributs data-shop am Wurzelelement. Andernfalls verwendet sie window.Shopify.shop.
Vorlagensystem: So funktioniert die Datenbindung ¶
Die Vorlagen-Engine verwendet zwei Verfahren, um API-Daten an Ihr HTML zu binden.
1. Variablenersetzung: {varName} ¶
Schreiben Sie {varName}-Platzhalter an beliebiger Stelle in Ihren HTML-Text. Die JS-Engine durchsucht alle Textknoten und ersetzt sie durch API-Daten.
<h3>{tier.name}</h3>
<span>{tier.requiredPoints}</span>
<span>{earning.points}</span>
In wiederholten Vorlagen (Stufen, Verdienste) beziehen sich Variablen auf die jeweiligen Vorlagendaten. Die Syntax mit einzelnen geschweiften Klammern {key} steht nicht in Konflikt mit Liquid ({{ }}), JS-Template-Literalen (${ }) oder CSS.
Außerdem gibt es globale Variablen wie {programName} und {currencySymbol}, die in jedem Textknoten der gesamten Vorlage funktionieren, auch außerhalb wiederholter Vorlagen. Die vollständige Liste finden Sie weiter unten im Abschnitt Globale Vorlagenvariablen.
2. Datenattribute: data-jeri ¶
Für Vorgänge ohne Text, die sich nicht durch Textersetzung abbilden lassen:
| Attribut | Zweck | Beispiel |
|---|---|---|
data-jeri="name" auf <template> |
Definiert eine Vorlage für wiederholte Zeilen | <template data-jeri="tiers"> |
data-jeri="name" am Container |
Nimmt kopierte Vorlagenzeilen auf | <div data-jeri="tiers"> |
data-jeri="key" am <img> |
Setzt das Attribut src (wird bei leerem Wert ausgeblendet) |
<img data-jeri="earning.iconUrl"> |
data-jeri-hide-if="value" |
Blendet das Element aus, wenn die Daten dem Wert entsprechen | data-jeri-hide-if="1" |
data-jeri-html="key" |
Fügt rohen HTML-Inhalt ein | <p data-jeri-html="tier.content"> |
data-jeri-group="name" |
Gruppencontainer (wird ausgeblendet, wenn leer) | data-jeri-group="purchases" |
Kurzübersicht: Welches Verfahren wann? ¶
| Anforderung | Verwendung |
|---|---|
| Text/Zahlen anzeigen | {varName} im Textinhalt |
| Variablen mit eigenem Text kombinieren | Earn {earning.points} with {earning.title} |
| Bildquelle setzen | data-jeri="key" am <img> |
| Abhängig vom Wert ausblenden | data-jeri-hide-if |
| Formatierte HTML-Inhalte einfügen | data-jeri-html="key" |
| Wiederholte Zeile definieren | <template data-jeri="name"> + <div data-jeri="name"> |
Globale Vorlagenvariablen ¶
Diese sieben globalen Variablen können in jedem Textknoten innerhalb von #jeri-loyalty-page-root verwendet werden. Schreiben Sie sie in der Form {variableName}. Die Engine ersetzt sie automatisch durch Werte aus der Programmeinstellung.
| Variable | Typ | Beschreibung | Beispiel |
|---|---|---|---|
{programName} |
string | Name des Treueprogramms | "My Rewards" |
{currencySymbol} |
string | Währungssymbol, ermittelt mit Intl.NumberFormat |
"$", "€", "£" |
{currencyCode} |
string | ISO-Währungscode | "USD", "EUR", "GBP" |
{balanceName} |
string | Mehrzahlbezeichnung für Punkte | "Points", "Stars" |
{singularBalanceName} |
string | Einzahlbezeichnung für Punkte | "Point", "Star" |
{tierBalanceName} |
string | Mehrzahlbezeichnung für Stufenpunkte | "Points" |
{singularTierBalanceName} |
string | Einzahlbezeichnung für Stufenpunkte | "Point" |
Anwendungsbeispiel ¶
<h1>Welcome to {programName}!</h1>
<p>Earn {balanceName} with every {currencySymbol} you spend</p>
<p>Prices are in {currencyCode}</p>
Globale Variablen funktionieren zusammen mit bereichsgebundenen Variablen ({earning.*}, {tier.*}). In wiederholten Vorlagen werden beide Arten aufgelöst.
Die Variable {currencySymbol} verwendet Intl.NumberFormat des Browsers, um das passende Symbol zum Währungscode des Programms zu ermitteln. Das Symbol richtet sich also nach der tatsächlichen Programmwährung, etwa $ für USD, € für EUR oder £ für GBP.
Hinweis zur Migration: Die Variable {hero.programName} wurde entfernt. Verwenden Sie stattdessen {programName}. Sie funktioniert überall in der Vorlage und nicht nur im Hero-Bereich.
Verfügbare Datenfelder ¶
Felder für Verdienste (earning.*) ¶
Wird innerhalb der Vorlage <template data-jeri="earning-row"> verwendet.
| Feld | Typ | Beschreibung |
|---|---|---|
earning.type |
string | Ablauftyp: purchase, social, referral, profile, verify, wallet, scan, link |
earning.title |
string | Lesbarer Titel der Verdienstregel |
earning.description |
string | Ausführliche Beschreibung, wie Punkte verdient werden |
earning.points |
string | Kompakte Punkteanzeige: +100 bei einem Festwert, 10% bei einer Rate < 1, x2 bei einem Faktor >= 1 |
earning.iconUrl |
string | Symbol-URL (wird über data-jeri am <img> gesetzt, leer wenn kein Symbol vorhanden) |
Felder für Stufen (tier.*) ¶
Wird innerhalb der Vorlage <template data-jeri="tiers"> verwendet.
| Feld | Typ | Beschreibung |
|---|---|---|
tier.name |
string | Stufenname (z. B. "Gold", "VIP") |
tier.content |
string | Beschreibung/Vorteile der Stufe, können HTML enthalten; verwenden Sie data-jeri-html="tier.content" |
tier.image |
string | Bild-URL der Stufe (wird über data-jeri am <img> gesetzt) |
tier.requiredPoints |
string | Benötigte Punkte (z. B. "1,000 tier points"). Verwendet tierBalanceName mit singular/plural |
tier.factor |
string | Punktefaktor (z. B. "2"); wird bei "1" über data-jeri-hide-if automatisch ausgeblendet |
tier.id |
string | Interne Stufen-ID |
Erforderliches Wurzelelement ¶
Jede benutzerdefinierte Vorlage muss dieses Wurzelelement mit den erforderlichen Attributen enthalten:
<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 | Erforderlich | Zweck |
|---|---|---|
id="jeri-loyalty-page-root" |
Ja | JavaScript-Einstiegspunkt, nach dieser ID sucht die Engine |
class="jeri-loyalty-page" |
Ja | CSS-Geltungsbereich und CSS-Variablen |
data-shop |
Ja | Shop-Domain für API-Aufrufe |
data-icon-base |
Empfohlen | URL-Präfix für Verdienstsymbole |
data-locale |
Empfohlen | Spracheinstellung des Shops für i18n (Standard ist "en") |
Die Klasse jeri-loyalty-page--loading zeigt ein Ladegerüst und blendet den Inhalt aus, bis die Daten geladen sind. Nach dem Abruf entfernt JavaScript die Klasse.
Das CSS-Stylesheet muss vor dem HTML-Inhalt innerhalb des Wurzelelements geladen werden. So erscheint beim ersten Laden kein ungestalteter Inhalt.
Vorlagenregeln ¶
Beachten Sie diese sechs Regeln für benutzerdefinierte Vorlagen:
- Lassen Sie
id="jeri-loyalty-page-root"am Wurzelelement stehen. JavaScript benötigt es zur Initialisierung. - Lassen Sie
class="jeri-loyalty-page"am Wurzelelement stehen. Hier werden die CSS-Variablen definiert. - Lassen Sie
data-shopstehen. Das Attribut ist für API-Aufrufe erforderlich. - Lassen Sie Vorlagen- und Container-Paare bestehen. Zu
<template data-jeri="X">gehört ein entsprechendes benachbartes<div data-jeri="X">. - Verwenden Sie
{varName}in beliebigen Textknoten. Die Engine ersetzt alle erkannten Platzhalter. - Verwenden Sie
data-jeri-html="key"für HTML-Inhalte.{var}würde als Text maskiert.
Struktur der Standardvorlage ¶
Hero-Bereich ¶
<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>
Stufenbereich ¶
<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>
Verdienstbereich ¶
<!-- 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>
Vollständiges Beispiel einer benutzerdefinierten Vorlage ¶
Hier sehen Sie eine vollständige, minimale benutzerdefinierte Vorlage als Ausgangspunkt:
<!-- 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>
Visuelle und minimale Vorlage ¶
Visuelle Vorlage: Ideal für Marken, die eine ausgearbeitete Loyalty-Seite im Marketingstil mit Hero-Bereich, Schritten zur Funktionsweise, Verdienstzeilen mit SVG-Symbolen, Stufenkarten und vollständigem Ladegerüst wünschen.
Minimale Vorlage: Ideal für Shops, die ein klares, datenorientiertes Layout mit kompakter Liste und Inline-CSS wünschen. Abgesehen von der JS-Engine ist kein externes Stylesheet erforderlich.
Beide Vorlagen verwenden dieselbe JS-Engine und dasselbe Datenbindungssystem. Sie unterscheiden sich nur in HTML-Struktur und visueller Gestaltung. Sie können mit jeder der beiden Vorlagen beginnen und sie frei anpassen.
Symbolsystem ¶
Die Symbole der Verdienstzeilen sind SVG-Dateien, deren Namen dem jeweiligen Typ entsprechen. Die Symbol-URL wird aus data-icon-base + Name + .svg gebildet.
| Symboldatei | Verwendungszweck |
|---|---|
purchase.svg |
Kaufbasierte Verdienstabläufe |
facebook.svg |
Facebook folgen |
instagram.svg |
Instagram folgen |
tiktok.svg |
TikTok folgen |
x.svg |
X folgen |
youtube.svg |
YouTube folgen |
referral.svg |
Freund empfehlen |
profile.svg |
Profil vervollständigen |
wallet.svg |
Wallet-Pass installieren |
scan.svg |
Im Geschäft scannen |
verify.svg |
Konto bestätigen |
link.svg |
Link aufrufen |
Im CDN-Modus ist die Basis-URL der Symbole fest auf https://cdn.jericommerce.com/shopify/ gesetzt. Fehlt data-icon-base oder ist ein Symbol nicht vorhanden, wird das <img>-Element automatisch ausgeblendet.
Anzeigeformat für Punkte ¶
Das Feld earning.points verwendet je nach Verdienstart ein kompaktes Format:
| Verdiensttyp | Format | Beispiel |
|---|---|---|
| Kauf (Rate < 1) | Prozentuale Rückgabe | 10% |
| Kauf (Rate >= 1) | Faktor | x2 |
| Alle anderen (Social, Empfehlung, Profil usw.) | Feste Punkte | +100 |
Bei Empfehlungen zeigt das Badge nur die Punkte der werbenden Person. Die Prämie der eingeladenen Person steht im Beschreibungstext.
Die Beschreibung für Kaufverdienste verwendet dynamisch das tatsächliche Währungssymbol des Programms (z. B. "Earn x3 Points per $ spent" für USD oder "Earn x3 Points per € spent" für EUR). Die Währung wird anhand der Programmeinstellung mit Intl.NumberFormat des Browsers ermittelt.
Ermittlung der Wallet-Bezeichnungen ¶
Vier Bezeichnungseigenschaften werden aus der Programmeinstellung übernommen:
| Name | Verwendungszweck | Beispiel |
|---|---|---|
balanceName / singularBalanceName |
Verdienstbeschreibungen und Titel | "points" / "point" |
tierBalanceName / singularTierBalanceName |
Benötigte Stufenpunkte | "tier points" / "tier point" |
Diese Werte werden aus program.configurations.wallet (Basiskonfiguration) gelesen. Die Einzahl oder Mehrzahl wird automatisch anhand der Menge gewählt (1 = Einzahl, sonst Mehrzahl).
Diese vier Bezeichnungen sind auch als globale Vorlagenvariablen verfügbar: {balanceName}, {singularBalanceName}, {tierBalanceName} und {singularTierBalanceName}. Sie können sie direkt in jedem Textknoten verwenden.
Einstellungen im Theme-Editor ¶
| Einstellung | Typ | Standardwert | Beschreibung |
|---|---|---|---|
| Enable Loyalty Page | Checkbox | true |
Gesamten Block ein- oder ausblenden |
| Hero Title | Text | "Our Loyalty Program" | Hauptüberschrift |
| Hero Subtitle | Textbereich | "Join our loyalty..." | Beschreibung unter der Überschrift |
| Guest CTA URL | URL | /account/login |
Ziel für Gäste |
| Logged-in CTA Action | Select | account |
account = Kontoseite öffnen, widget_rewards = Prämien-Widget öffnen |
| Logged-in CTA Label | Text | "See rewards" | Buttontext für angemeldete Kunden |
| Logged-in CTA URL | URL | /account |
URL bei der Aktion "Go to account page" |
| Show How It Works | Checkbox | true |
Abschnitt mit drei Schritten ein- oder ausblenden |
| Show Earning Rules | Checkbox | true |
Verdienstbereich ein- oder ausblenden |
| Show VIP Tiers | Checkbox | true |
Stufenbereich ein- oder ausblenden |
| Primary Color | Farbe | #0f0f0f |
Buttons, Akzente, Badges |
| Primary Contrast | Farbe | #fcfcfc |
Text auf primären Hintergründen |
| Secondary Color | Farbe | #f5f5f5 |
Kartenhintergründe |
| Text Color | Farbe | #0f0f0f |
Überschriften und Fließtext |
| Muted Color | Farbe | #888888 |
Untertitel und Beschreibungen |
| Custom CSS | Textbereich | Zusätzliche CSS-Überschreibungen |
Widget-Integration ¶
Der CTA "See rewards" verwendet cta_action, wenn widget_rewards auf #jeri=loyalty/rewards gesetzt ist. Ist das JeriCommerce-Widget auf der Seite aktiv, öffnet ein Klick auf diesen Link dessen Prämienbereich. Das bedeutet:
- Die Loyalty-Seite erklärt das Programm (öffentliche Informationen)
- Das Widget verwaltet Prämien, Transaktionen und Konten (nach der Anmeldung)
- Beide funktionieren unabhängig voneinander und ergänzen sich über das URL-Muster
#jeri=
Bedingte Sichtbarkeit ¶
Die Seite blendet Elemente abhängig von der Programmeinstellung automatisch aus:
| Element | Bedingung |
|---|---|
| VIP-Stufenbereich | Wird ausgeblendet, wenn das Programm keine Stufen hat |
| Bereich Ways to Earn | Wird ausgeblendet, wenn das Programm keine aktiven Interaktionsabläufe hat |
| Gruppe Purchases | Wird ausgeblendet, wenn keine kaufbasierten Abläufe vorhanden sind |
| Gruppe Actions | Wird ausgeblendet, wenn keine aktionsbasierten Abläufe vorhanden sind |
CSS-Variablen ¶
Variablen für Händler ¶
Die Liquid-Vorlage setzt diese Werte auf :root, basierend auf den Farbeinstellungen im Theme-Editor:
| Variable | Standardwert | Festgelegt durch |
|---|---|---|
--jeri-loyalty-primary |
#0f0f0f |
Einstellung Primary Color |
--jeri-loyalty-primary-contrast |
#fcfcfc |
Einstellung Primary Contrast |
--jeri-loyalty-secondary |
#f5f5f5 |
Einstellung Secondary Color |
--jeri-loyalty-text |
#0f0f0f |
Einstellung Text Color |
--jeri-loyalty-muted |
#888888 |
Einstellung Muted Color |
Interne Variablen ¶
Diese Variablen übernehmen die Händlerwerte und ergänzen Layout- und Strukturwerte. Überschreiben Sie sie bei Bedarf im Custom CSS, um Details anzupassen:
| Variable | Standardwert | Zweck |
|---|---|---|
--jlp-primary |
var(--jeri-loyalty-primary, #0f0f0f) |
Primary Color |
--jlp-primary-contrast |
var(--jeri-loyalty-primary-contrast, #fcfcfc) |
Text auf Primärfarbe |
--jlp-text |
var(--jeri-loyalty-text, #0f0f0f) |
Fließtextfarbe |
--jlp-muted |
var(--jeri-loyalty-muted, #888888) |
Farbe für sekundären Text |
--jlp-font |
var(--font-body-family, system stack) |
Schriftfamilie |
--jlp-border-radius |
16px |
Eckenradius der Karten |
--jlp-space |
16px |
Abstandseinheit |
--jlp-border-color |
#e8e8e8 |
Rahmenfarbe von Karten und Listen |
--jlp-card-bg |
#fcfcfc |
Kartenhintergrundfarbe |
--jlp-divider |
#f0f0f0 |
Trennlinienfarbe der Zeilen |
--jlp-skeleton-bg |
#f5f5f5 |
Farbe des Ladegerüsts |
--jlp-icon-size |
48px |
Größe des Verdienstzeilensymbols |
--jlp-max-width |
1200px |
Maximale Seitenbreite |
Beispiel: Abstände überschreiben ¶
.jeri-loyalty-page {
--jlp-space: 12px;
--jlp-border-radius: 8px;
}
Beispiel: Dunkles Theme ¶
.jeri-loyalty-page {
--jlp-card-bg: #1a1a1a;
--jlp-border-color: #333;
--jlp-divider: #2a2a2a;
--jlp-skeleton-bg: #222;
}
Referenz der CSS-Klassen ¶
Layout ¶
| Klasse | Element |
|---|---|
.jeri-loyalty-page |
Wurzelcontainer |
.jeri-loyalty-page--loading |
Ladezustand (zeigt Ladegerüst, blendet Inhalt aus) |
.jeri-loyalty-page__hero |
Hero-Bereich |
.jeri-loyalty-page__section |
Inhaltsbereich |
.jeri-loyalty-page__section-title |
Abschnittsüberschrift |
.jeri-loyalty-page__skeleton |
Ladegerüst-Wrapper |
Hero-Bereich ¶
| Klasse | Element |
|---|---|
.jeri-loyalty-page__hero-title |
Hero-Überschrift |
.jeri-loyalty-page__hero-subtitle |
Hero-Beschreibung |
.jeri-loyalty-page__hero-cta |
CTA-Button-Wrapper |
.jeri-loyalty-page__cta-button |
CTA-Button-Grundstil |
.jeri-loyalty-page__cta-button--primary |
Primäre CTA-Variante |
Funktionsweise ¶
| Klasse | Element |
|---|---|
.jeri-loyalty-page__steps |
Schrittraster (3 Spalten) |
.jeri-loyalty-page__step |
Einzelner Schritt |
.jeri-loyalty-page__step-number |
Kreis mit Nummer |
.jeri-loyalty-page__step-title |
Schrittüberschrift |
.jeri-loyalty-page__step-text |
Schrittbeschreibung |
Verdienste ¶
| Klasse | Element |
|---|---|
.jeri-earning-group |
Gruppen-Wrapper (Purchases/Actions) |
.jeri-earning-group__title |
Gruppenüberschrift |
.jeri-earning-list |
Umrandeter Listencontainer |
.jeri-earning-row |
Einzelne Verdienstzeile |
.jeri-earning-row__icon |
Symbol der Zeile (<img>) |
.jeri-earning-row__content |
Text-Wrapper der Zeile |
.jeri-earning-row__title |
Titel der Zeile |
.jeri-earning-row__description |
Beschreibung der Zeile |
.jeri-earning-row__points |
Punkteanzeige |
Stufen ¶
| Klasse | Element |
|---|---|
.jeri-tier-grid |
Flex-Container für Stufenkarten |
.jeri-tier-card |
Einzelne Stufenkarte |
.jeri-tier-card__body |
Karteninhalt |
.jeri-tier-card__top |
Zeile mit Name und Faktor |
.jeri-tier-card__name |
Stufenname |
.jeri-tier-card__factor |
Faktor-Badge (wird bei 1x ausgeblendet) |
.jeri-tier-card__content |
Beschreibung (als HTML dargestellt) |
.jeri-tier-card__points |
Benötigte Punkte |
Internationalisierung (i18n) ¶
Die Loyalty-Seite unterstützt abhängig von der aktuellen Spracheinstellung des Shops mehrere Sprachen:
- Englisch (en), Standard
- Spanisch (es)
- Französisch (fr)
- Deutsch (de)
- Italienisch (it)
Bei nicht unterstützten Spracheinstellungen wird automatisch Englisch verwendet.
Funktionsweise ¶
Die Internationalisierung umfasst zwei Ebenen:
- Liquid-Texte (serverseitig gerendert): Verwenden den Shopify-Filter
{{ 'key' | t }}mit JSON-Dateien inlocales/. Damit werden statische Texte wie "Purchases", "Actions", Schritte unter "How It Works" und der CTA-Button für Gäste übersetzt. - TypeScript-Texte (clientseitig gerendert): Verwenden das gemeinsame Hilfsprogramm
i18n.tsmit Sprachdateien im Format.ts, die in das JS gebündelt werden. Damit werden dynamische Titel und Beschreibungen von Verdienstabläufen übersetzt.
Erkennung der Spracheinstellung ¶
Die Spracheinstellung des Shops wird JavaScript über das Attribut data-locale am Wurzelelement übergeben:
<div id="jeri-loyalty-page-root" data-locale="{{ request.locale.iso_code }}" ...>
</div>
Sprache hinzufügen ¶
- Erstellen Sie
theme-extensions/loyalty-page/locales/{lang}.ts(kopieren Sieen.tsund übersetzen Sie die Inhalte). - Erstellen Sie
theme-extensions/loyalty-page/locales/{lang}.json(kopieren Sieen.default.jsonund übersetzen Sie die Inhalte). - Importieren Sie die neue Sprache in
loyalty-page.tsund ergänzen Sie sie ininitFromSession(locale, { en, es, fr, de, it, {lang} }). - Führen Sie zum erneuten Erstellen
npm run build:theme-extensionsaus.
Übersetzungsdateien ¶
| Datei | Zweck |
|---|---|
locales/en.ts |
Englische Übersetzungen für JS-Texte (in JS gebündelt) |
locales/es.ts |
Spanische Übersetzungen für JS-Texte (in JS gebündelt) |
locales/fr.ts |
Französische Übersetzungen für JS-Texte (in JS gebündelt) |
locales/de.ts |
Deutsche Übersetzungen für JS-Texte (in JS gebündelt) |
locales/it.ts |
Italienische Übersetzungen für JS-Texte (in JS gebündelt) |
locales/en.default.json |
Englische Übersetzungen für Liquid-Texte (nach locales/ kopiert) |
locales/es.json |
Spanische Übersetzungen für Liquid-Texte (nach locales/ kopiert) |
locales/fr.json |
Französische Übersetzungen für Liquid-Texte (nach locales/ kopiert) |
locales/de.json |
Deutsche Übersetzungen für Liquid-Texte (nach locales/ kopiert) |
locales/it.json |
Italienische Übersetzungen für Liquid-Texte (nach locales/ kopiert) |