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

1

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.

2

Zum Theme hinzufügen

  1. Öffnen Sie Shopify Admin > Online Store > Themes > Edit code.
  2. Klicken Sie im Verzeichnis sections/ auf Add a new section.
  3. Geben Sie einen Namen ein (z. B. jeri-loyalty) und fügen Sie den Vorlagencode ein.
3

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.

4

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:

  1. Lassen Sie id="jeri-loyalty-page-root" am Wurzelelement stehen. JavaScript benötigt es zur Initialisierung.
  2. Lassen Sie class="jeri-loyalty-page" am Wurzelelement stehen. Hier werden die CSS-Variablen definiert.
  3. Lassen Sie data-shop stehen. Das Attribut ist für API-Aufrufe erforderlich.
  4. Lassen Sie Vorlagen- und Container-Paare bestehen. Zu <template data-jeri="X"> gehört ein entsprechendes benachbartes <div data-jeri="X">.
  5. Verwenden Sie {varName} in beliebigen Textknoten. Die Engine ersetzt alle erkannten Platzhalter.
  6. 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 in locales/. 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.ts mit 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

  1. Erstellen Sie theme-extensions/loyalty-page/locales/{lang}.ts (kopieren Sie en.ts und übersetzen Sie die Inhalte).
  2. Erstellen Sie theme-extensions/loyalty-page/locales/{lang}.json (kopieren Sie en.default.json und übersetzen Sie die Inhalte).
  3. Importieren Sie die neue Sprache in loyalty-page.ts und ergänzen Sie sie in initFromSession(locale, { en, es, fr, de, it, {lang} }).
  4. Führen Sie zum erneuten Erstellen npm run build:theme-extensions aus.

Ü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)