Esta guía está dirigida a desarrolladores que crean experiencias personalizadas para la tienda. Si solo quiere ajustar colores y textos, consulte la guía de la plantilla predeterminada.
Para los comercios que necesitan controlar por completo el diseño HTML o crear una página de fidelización totalmente personalizada, JeriCommerce ofrece plantillas de sección Liquid independientes que cargan el motor de la página directamente desde el CDN.
¿Quiere omitir la configuración manual? La skill de IA loyalty-template-creator puede generar una plantilla .liquid personalizada completa que coincida con el estilo visual de su tienda. Proporcione una URL de referencia y analizará los colores, las fuentes, el diseño y los recursos para crear una plantilla lista para usar basada en el mismo motor CDN que se describe a continuación.
Instálela con: npx skills add jericommerce/skills --skill loyalty-template-creator
Fuente: github.com/JeriCommerce/skills
Cuándo usar el modo CDN ¶
Use el modo CDN cuando:
- El comerciante necesita un diseño totalmente personalizado que supere las opciones del editor del tema.
- El equipo de desarrollo prefiere gestionar el HTML directamente en el código del tema.
- La página de fidelización debe integrarse en una plantilla existente junto con otras secciones.
Pasos de configuración ¶
Obtener la plantilla
JeriCommerce ofrece dos plantillas CDN listas para usar. Copie la que mejor se adapte a sus necesidades:
- Plantilla visual (
templates/visual.liquid): completa, con sección principal y CTA, pasos que explican el funcionamiento, filas para obtener puntos con iconos SVG por red, tarjetas de nivel y una estructura de carga. Tiene el mismo aspecto que el bloque del tema. - Plantilla minimalista (
templates/minimal.liquid): diseño compacto en forma de lista, con un título, las formas de obtener puntos en una lista sencilla y los niveles en filas. Usa CSS integrado y no requiere una hoja de estilos externa.
Puede obtenerlas desde el panel de administración de JeriCommerce, en Loyalty Page > Get template code, o copiarlas directamente de los archivos del repositorio.
Añadir al tema
- Vaya a Shopify Admin > Online Store > Themes > Edit code.
- En el directorio
sections/, haga clic en Add a new section. - Asígnele un nombre (por ejemplo,
jeri-loyalty) y pegue el código de la plantilla.
Crear una plantilla de página
Cree una plantilla de página JSON que haga referencia a su sección:
{
"sections": {
"loyalty": {
"type": "jeri-loyalty"
}
},
"order": ["loyalty"]
}
Como alternativa, añada la sección a una plantilla de página existente desde el editor del tema: Customize > Add section.
Crear la página
Vaya a Shopify Admin > Pages > Add page y seleccione la plantilla "loyalty".
Cómo funciona el modo CDN ¶
Las plantillas CDN cargan el mismo JavaScript que impulsa el bloque de la extensión de la aplicación del tema. Está empaquetado, minificado y siempre actualizado:
<!-- 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" />
El motor detecta automáticamente el dominio de la tienda mediante el atributo data-shop del elemento raíz. Si no está disponible, usa window.Shopify.shop.
Sistema de plantillas: cómo funciona la vinculación de datos ¶
El motor de plantillas ofrece dos métodos para vincular los datos de la API con el HTML.
1. Interpolación de variables: {varName} ¶
Escriba marcadores {varName} en cualquier parte del texto HTML. El motor JS recorre todos los nodos de texto y los sustituye por datos de la API.
<h3>{tier.name}</h3>
<span>{tier.requiredPoints}</span>
<span>{earning.points}</span>
En las plantillas repetidas (niveles y formas de obtener puntos), las variables corresponden a los datos de cada elemento. La sintaxis con una sola llave a cada lado, {key}, no entra en conflicto con Liquid ({{ }}), los literales de plantilla JS (${ }) ni CSS.
También hay variables globales, como {programName} y {currencySymbol}, que funcionan en cualquier nodo de texto de la plantilla, no solo en las plantillas repetidas. Consulte la lista completa en la sección Variables globales de plantilla.
2. Atributos de datos: data-jeri ¶
Se usan para operaciones que no son de texto y que no se pueden expresar mediante interpolación:
| Atributo | Propósito | Ejemplo |
|---|---|---|
data-jeri="name" en <template> |
Define una plantilla para filas repetidas | <template data-jeri="tiers"> |
data-jeri="name" en el contenedor |
Recibe como elementos secundarios las filas clonadas de la plantilla | <div data-jeri="tiers"> |
data-jeri="key" en <img> |
Establece el atributo src (se oculta si está vacío) |
<img data-jeri="earning.iconUrl"> |
data-jeri-hide-if="value" |
Oculta el elemento si el dato coincide con el valor indicado | data-jeri-hide-if="1" |
data-jeri-html="key" |
Inserta contenido HTML sin procesar | <p data-jeri-html="tier.content"> |
data-jeri-group="name" |
Agrupa el contenedor y lo oculta cuando está vacío | data-jeri-group="purchases" |
Referencia rápida: cuándo usar cada método ¶
| Necesidad | Uso |
|---|---|
| Mostrar texto o números | {varName} en el contenido de texto |
| Combinar variables con texto personalizado | Earn {earning.points} with {earning.title} |
| Establecer la fuente de imagen | data-jeri="key" en <img> |
| Ocultar según el valor | data-jeri-hide-if |
| Insertar contenido HTML enriquecido | data-jeri-html="key" |
| Definir una fila repetida | <template data-jeri="name"> + <div data-jeri="name"> |
Variables globales de plantilla ¶
Estas siete variables globales se pueden usar en cualquier nodo de texto dentro de #jeri-loyalty-page-root. Escríbalas con la sintaxis {variableName} y el motor las sustituirá automáticamente por los datos de configuración del programa.
| Variable | Tipo | Descripción | Ejemplo |
|---|---|---|---|
{programName} |
cadena | Nombre del programa de fidelización | "My Rewards" |
{currencySymbol} |
cadena | Símbolo de moneda, determinado mediante Intl.NumberFormat |
"$", "€", "£" |
{currencyCode} |
cadena | Código de moneda ISO | "USD", "EUR", "GBP" |
{balanceName} |
cadena | Nombre plural de los puntos | "Points", "Stars" |
{singularBalanceName} |
cadena | Nombre singular de los puntos | "Point", "Star" |
{tierBalanceName} |
cadena | Nombre plural de los puntos de nivel | "Points" |
{singularTierBalanceName} |
cadena | Nombre singular de los puntos de nivel | "Point" |
Ejemplo de uso ¶
<h1>Welcome to {programName}!</h1>
<p>Earn {balanceName} with every {currencySymbol} you spend</p>
<p>Prices are in {currencyCode}</p>
Las variables globales funcionan junto con las variables de ámbito ({earning.*}, {tier.*}). En las plantillas repetidas se resuelven ambos tipos.
La variable {currencySymbol} usa el Intl.NumberFormat nativo del navegador para determinar el símbolo adecuado según el código de moneda del programa. Así, el símbolo se adapta a la moneda real del programa: $ para USD, € para EUR, £ para GBP, etc.
Nota de migración: Se ha eliminado la variable {hero.programName}. Use {programName} en su lugar. Esta variable funciona en toda la plantilla, no solo en la sección principal.
Campos de datos disponibles ¶
Campos de formas de ganar (earning.*) ¶
Se usa dentro de la plantilla <template data-jeri="earning-row">.
| Campo | Tipo | Descripción |
|---|---|---|
earning.type |
cadena | Tipo de flujo: purchase, social, referral, profile, verify, wallet, scan, link |
earning.title |
cadena | Título legible de la regla para ganar puntos |
earning.description |
cadena | Descripción detallada de cómo ganar puntos |
earning.points |
cadena | Visualización compacta de puntos: +100 para un valor fijo, 10% para una tasa < 1, x2 para un factor >= 1 |
earning.iconUrl |
cadena | URL del icono (se establece mediante data-jeri en <img>; queda vacía si no hay icono) |
Campos de nivel (tier.*) ¶
Se usa dentro de la plantilla <template data-jeri="tiers">.
| Campo | Tipo | Descripción |
|---|---|---|
tier.name |
cadena | Nombre del nivel (por ejemplo, «Gold» o «VIP») |
tier.content |
cadena | Descripción o beneficios del nivel. Puede incluir HTML; use data-jeri-html="tier.content" |
tier.image |
cadena | URL de la imagen del nivel (se establece mediante data-jeri en <img>) |
tier.requiredPoints |
cadena | Puntos necesarios (por ejemplo, "1,000 tier points"). Usa tierBalanceName en singular o plural |
tier.factor |
cadena | Factor de puntos (por ejemplo, "2"). Se oculta automáticamente cuando es "1" mediante data-jeri-hide-if |
tier.id |
cadena | ID interno del nivel |
Elemento raíz obligatorio ¶
Todas las plantillas personalizadas deben incluir este elemento raíz con los atributos obligatorios:
<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>
| Atributo | Obligatorio | Propósito |
|---|---|---|
id="jeri-loyalty-page-root" |
Sí | Punto de entrada para JavaScript; el motor busca este ID |
class="jeri-loyalty-page" |
Sí | Ámbito CSS y variables CSS |
data-shop |
Sí | Dominio de la tienda para las llamadas a la API |
data-icon-base |
Recomendado | Prefijo URL de los iconos para ganar puntos |
data-locale |
Recomendado | Idioma de la tienda para i18n (usa "en" como alternativa) |
La clase jeri-loyalty-page--loading muestra una estructura de carga y oculta el contenido hasta que se cargan los datos. JavaScript la elimina después de obtenerlos.
La hoja de estilos CSS debe cargarse antes del contenido HTML (dentro del elemento raíz) para evitar que aparezca contenido sin estilos durante la primera carga.
Reglas de las plantillas ¶
Siga estas seis reglas para crear plantillas personalizadas:
- Mantenga
id="jeri-loyalty-page-root"en el elemento raíz. JavaScript lo necesita para inicializarse. - Mantenga
class="jeri-loyalty-page"en el elemento raíz. Aquí se definen las variables CSS. - Mantenga el atributo
data-shop. Es obligatorio para las llamadas a la API. - Mantenga los pares de plantilla y contenedor. Cada
<template data-jeri="X">necesita un<div data-jeri="X">correspondiente como elemento hermano. - Use
{varName}en cualquier nodo de texto. El motor sustituye todos los marcadores que reconoce. - Use
data-jeri-html="key"para insertar contenido HTML. Con{var}, el contenido se escaparía como texto.
Estructura de la plantilla predeterminada ¶
Sección principal ¶
<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>
Sección de niveles ¶
<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>
Sección de formas de ganar ¶
<!-- 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>
Ejemplo completo de plantilla personalizada ¶
Aquí tiene una plantilla personalizada mínima y completa que puede usar como punto de partida:
<!-- 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>
Plantilla visual y minimalista ¶
Plantilla visual: ideal para marcas que buscan una página de fidelización cuidada y orientada al marketing, con una sección principal, pasos explicativos, filas para obtener puntos con iconos SVG, tarjetas de nivel y una estructura de carga completa.
Plantilla minimalista: ideal para tiendas que prefieren un enfoque claro y basado en datos, con una lista compacta y CSS integrado. No depende de hojas de estilos externas, aparte de la del motor JS.
Ambas plantillas usan el mismo motor JS y el mismo sistema de vinculación de datos. Solo cambia la estructura HTML y el diseño visual. Puede empezar con cualquiera y personalizarla libremente.
Sistema de iconos ¶
Los iconos de las filas para ganar puntos son archivos SVG cuyo nombre corresponde al tipo. La URL del icono se forma concatenando data-icon-base + nombre + .svg.
| Archivo de icono | Se usa para |
|---|---|
purchase.svg |
Flujos para obtener puntos por compras |
facebook.svg |
Seguir en Facebook |
instagram.svg |
Seguir en Instagram |
tiktok.svg |
Seguir en TikTok |
x.svg |
Seguir en X |
youtube.svg |
Seguir en YouTube |
referral.svg |
Recomendar a un amigo |
profile.svg |
Completar el perfil |
wallet.svg |
Instalar el pase en Wallet |
scan.svg |
Escanear en la tienda |
verify.svg |
Verificar la cuenta |
link.svg |
Visitar el enlace |
En el modo CDN, la URL base de los iconos está fijada en https://cdn.jericommerce.com/shopify/. Si falta data-icon-base o el icono no existe, el elemento <img> se oculta automáticamente.
Formato de visualización de puntos ¶
El campo earning.points usa un formato compacto según la forma de ganar puntos:
| Tipo de forma de ganar | Formato | Ejemplo |
|---|---|---|
| Compra (tasa < 1) | Porcentaje de devolución | 10% |
| Compra (tasa >= 1) | Factor | x2 |
| Todos los demás (social, recomendación, perfil, etc.) | Puntos fijos | +100 |
En las recomendaciones, la insignia solo muestra los puntos de quien recomienda. La recompensa de la persona invitada se indica en la descripción.
La descripción de los puntos por compra inserta dinámicamente el símbolo de moneda del programa. Por ejemplo, para USD puede mostrar «Gana x3 puntos por cada $ gastado» y para EUR, «Gana x3 puntos por cada € gastado». El navegador determina la moneda a partir de la configuración del programa mediante Intl.NumberFormat.
Resolución de los nombres de Wallet ¶
La configuración del programa proporciona cuatro propiedades de nombre:
| Nombre | Uso | Ejemplo |
|---|---|---|
balanceName / singularBalanceName |
Descripciones y títulos de formas de ganar | "points" / "point" |
tierBalanceName / singularTierBalanceName |
Puntos de nivel necesarios | "tier points" / "tier point" |
Se obtienen de program.configurations.wallet (configuración base). La forma singular o plural se aplica automáticamente según la cantidad: 1 usa el singular y cualquier otro valor usa el plural.
Estos cuatro nombres también están disponibles como variables globales de plantilla: {balanceName}, {singularBalanceName}, {tierBalanceName} y {singularTierBalanceName}. Puede usarlas directamente en cualquier nodo de texto.
Ajustes del editor del tema ¶
| Ajuste | Tipo | Valor predeterminado | Descripción |
|---|---|---|---|
| Enable Loyalty Page | Casilla | true |
Mostrar u ocultar todo el bloque |
| Hero Title | Texto | "Our Loyalty Program" | Encabezado principal |
| Hero Subtitle | Área de texto | "Join our loyalty..." | Descripción debajo del encabezado |
| Guest CTA URL | URL | /account/login |
Destino para visitantes |
| Logged-in CTA Action | Selección | account |
account = ir a la página de cuenta, widget_rewards = abrir el widget de recompensas |
| Logged-in CTA Label | Texto | "See rewards" | Texto del botón para clientes con sesión iniciada |
| Logged-in CTA URL | URL | /account |
URL cuando la acción es "Go to account page" |
| Show How It Works | Casilla | true |
Mostrar u ocultar la sección de tres pasos |
| Show Earning Rules | Casilla | true |
Mostrar u ocultar la sección de formas de ganar |
| Show VIP Tiers | Casilla | true |
Mostrar u ocultar la sección de niveles |
| Primary Color | Color | #0f0f0f |
Botones, acentos e insignias |
| Primary Contrast | Color | #fcfcfc |
Texto sobre fondos principales |
| Secondary Color | Color | #f5f5f5 |
Fondos de tarjetas |
| Text Color | Color | #0f0f0f |
Encabezados y texto principal |
| Muted Color | Color | #888888 |
Subtítulos y descripciones |
| Custom CSS | Área de texto | Sin valor | Reglas CSS adicionales |
Integración con el widget ¶
El CTA "See rewards", cuando cta_action tiene el valor widget_rewards, usa #jeri=loyalty/rewards como destino. Si el widget de JeriCommerce está activo en la página, al hacer clic en el enlace se abre su panel de recompensas. Esto significa que:
- La página de fidelización explica el programa y muestra información pública.
- El widget gestiona las recompensas, las transacciones y la cuenta de cada cliente con sesión iniciada.
- Ambos funcionan de forma independiente y se complementan mediante el patrón de URL
#jeri=.
Visibilidad condicional ¶
La página oculta elementos automáticamente según la configuración del programa:
| Elemento | Condición |
|---|---|
| Sección VIP Tiers | Se oculta si el programa no tiene niveles. |
| Sección Ways to Earn | Se oculta si el programa no tiene flujos de participación activos. |
| Grupo Purchases | Se oculta si no hay flujos de compra. |
| Grupo Actions | Se oculta si no hay flujos de acciones. |
Variables CSS ¶
Variables para comerciantes ¶
La plantilla Liquid establece estos valores en :root según los ajustes de color del editor del tema:
| Variable | Valor predeterminado | Definido por |
|---|---|---|
--jeri-loyalty-primary |
#0f0f0f |
Ajuste Primary Color |
--jeri-loyalty-primary-contrast |
#fcfcfc |
Ajuste Primary Contrast |
--jeri-loyalty-secondary |
#f5f5f5 |
Ajuste Secondary Color |
--jeri-loyalty-text |
#0f0f0f |
Ajuste Text Color |
--jeri-loyalty-muted |
#888888 |
Ajuste Muted Color |
Variables internas ¶
Estas resuelven las variables del comercio y añaden tokens estructurales y de diseño. Puede sobrescribirlas en Custom CSS para ajustar detalles específicos:
| Variable | Valor predeterminado | Propósito |
|---|---|---|
--jlp-primary |
var(--jeri-loyalty-primary, #0f0f0f) |
Color principal |
--jlp-primary-contrast |
var(--jeri-loyalty-primary-contrast, #fcfcfc) |
Texto sobre el color principal |
--jlp-text |
var(--jeri-loyalty-text, #0f0f0f) |
Color del texto principal |
--jlp-muted |
var(--jeri-loyalty-muted, #888888) |
Color del texto secundario |
--jlp-font |
var(--font-body-family, system stack) |
Familia tipográfica |
--jlp-border-radius |
16px |
Radio de las esquinas de las tarjetas |
--jlp-space |
16px |
Unidad de espaciado |
--jlp-border-color |
#e8e8e8 |
Color del borde de tarjetas y listas |
--jlp-card-bg |
#fcfcfc |
Color de fondo de las tarjetas |
--jlp-divider |
#f0f0f0 |
Color del separador entre filas |
--jlp-skeleton-bg |
#f5f5f5 |
Color de la estructura de carga |
--jlp-icon-size |
48px |
Tamaño del icono de la fila de puntos |
--jlp-max-width |
1200px |
Anchura máxima del contenido |
Ejemplo: cambiar el espaciado ¶
.jeri-loyalty-page {
--jlp-space: 12px;
--jlp-border-radius: 8px;
}
Ejemplo: tema oscuro ¶
.jeri-loyalty-page {
--jlp-card-bg: #1a1a1a;
--jlp-border-color: #333;
--jlp-divider: #2a2a2a;
--jlp-skeleton-bg: #222;
}
Referencia de clases CSS ¶
Diseño ¶
| Clase | Elemento |
|---|---|
.jeri-loyalty-page |
Contenedor raíz |
.jeri-loyalty-page--loading |
Estado de carga (muestra la estructura de carga y oculta el contenido) |
.jeri-loyalty-page__hero |
Sección principal |
.jeri-loyalty-page__section |
Sección de contenido |
.jeri-loyalty-page__section-title |
Encabezado de sección |
.jeri-loyalty-page__skeleton |
Contenedor de la estructura de carga |
Sección principal ¶
| Clase | Elemento |
|---|---|
.jeri-loyalty-page__hero-title |
Encabezado principal |
.jeri-loyalty-page__hero-subtitle |
Descripción principal |
.jeri-loyalty-page__hero-cta |
Contenedor del botón CTA |
.jeri-loyalty-page__cta-button |
Estilo base del botón CTA |
.jeri-loyalty-page__cta-button--primary |
Variante CTA principal |
Cómo funciona ¶
| Clase | Elemento |
|---|---|
.jeri-loyalty-page__steps |
Cuadrícula de pasos (3 columnas) |
.jeri-loyalty-page__step |
Paso individual |
.jeri-loyalty-page__step-number |
Círculo con número |
.jeri-loyalty-page__step-title |
Encabezado del paso |
.jeri-loyalty-page__step-text |
Descripción del paso |
Formas de ganar ¶
| Clase | Elemento |
|---|---|
.jeri-earning-group |
Contenedor de grupo (Purchases/Actions) |
.jeri-earning-group__title |
Encabezado del grupo |
.jeri-earning-list |
Contenedor de lista con borde |
.jeri-earning-row |
Fila individual para ganar puntos |
.jeri-earning-row__icon |
Icono de la fila (<img>) |
.jeri-earning-row__content |
Contenedor de texto de la fila |
.jeri-earning-row__title |
Título de la fila |
.jeri-earning-row__description |
Descripción de la fila |
.jeri-earning-row__points |
Visualización de puntos |
Niveles ¶
| Clase | Elemento |
|---|---|
.jeri-tier-grid |
Contenedor flexible de tarjetas de nivel |
.jeri-tier-card |
Tarjeta individual de nivel |
.jeri-tier-card__body |
Contenido de la tarjeta |
.jeri-tier-card__top |
Fila con nombre y factor |
.jeri-tier-card__name |
Nombre del nivel |
.jeri-tier-card__factor |
Insignia del factor (se oculta si es 1x) |
.jeri-tier-card__content |
Descripción (se representa como HTML) |
.jeri-tier-card__points |
Puntos necesarios |
Internacionalización (i18n) ¶
La página de fidelización admite varios idiomas según el idioma actual de la tienda:
- Inglés (en), predeterminado
- Español (es)
- Francés (fr)
- Alemán (de)
- Italiano (it)
Los idiomas no compatibles usan inglés automáticamente.
Cómo funciona ¶
La internacionalización tiene dos capas:
- Textos de Liquid (renderizados en el servidor): usan el filtro de Shopify
{{ 'key' | t }}con archivos JSON de idioma enlocales/. Traducen texto estático como "Purchases", "Actions", los pasos de "How It Works" y el botón CTA para visitantes. - Textos de TypeScript (renderizados en el cliente): usan la utilidad compartida
i18n.tsy archivos de idioma.tsincluidos en el código JS. Traducen los títulos y las descripciones dinámicos de las formas de obtener puntos.
Detección del idioma ¶
El idioma de la tienda se pasa a JavaScript mediante el atributo data-locale del elemento raíz:
<div id="jeri-loyalty-page-root" data-locale="{{ request.locale.iso_code }}" ...>
</div>
Añadir un idioma ¶
- Cree
theme-extensions/loyalty-page/locales/{lang}.ts(copieen.tsy traduzca su contenido) - Cree
theme-extensions/loyalty-page/locales/{lang}.json(copieen.default.jsony traduzca su contenido) - Importe el nuevo idioma en
loyalty-page.tsy añádalo ainitFromSession(locale, { en, es, fr, de, it, {lang} }) - Ejecute
npm run build:theme-extensionspara volver a compilar
Archivos de traducción ¶
| Archivo | Propósito |
|---|---|
locales/en.ts |
Traducciones al inglés de textos JS (incluidas en JS) |
locales/es.ts |
Traducciones al español de textos JS (incluidas en JS) |
locales/fr.ts |
Traducciones al francés de textos JS (incluidas en JS) |
locales/de.ts |
Traducciones al alemán de textos JS (incluidas en JS) |
locales/it.ts |
Traducciones al italiano de textos JS (incluidas en JS) |
locales/en.default.json |
Traducciones al inglés de textos Liquid (se copian a locales/) |
locales/es.json |
Traducciones al español de textos Liquid (se copian a locales/) |
locales/fr.json |
Traducciones al francés de textos Liquid (se copian a locales/) |
locales/de.json |
Traducciones al alemán de textos Liquid (se copian a locales/) |
locales/it.json |
Traducciones al italiano de textos Liquid (se copian a locales/) |