Saltar al contenido principal

Anatomía de un tema

Un tema OmniBuy es un directorio dentro de themes/ con una estructura predecible. Cada archivo tiene un rol específico.

Estructura de directorios

themes/<tu-tema>/
├── theme.json ← Manifest del tema
├── sections.json ← Schema del visual editor
├── config/
│ ├── settings_schema.json ← Configuración global del tema
│ └── settings_data.json ← Valores por defecto
├── sections/
│ ├── hero.html ← Módulos de contenido reordenables
│ ├── banner.html
│ └── ...
├── snippets/
│ ├── product-card.html ← Componentes reutilizables
│ └── ...
├── templates/
│ ├── index.html ← Template de la homepage
│ ├── product.html ← Template de página de producto
│ ├── collection.html ← Template de colección
│ ├── cart.html ← Carrito
│ ├── page.html ← Páginas CMS
│ └── ...
├── locales/
│ ├── es.json ← Traducciones español
│ └── en.json ← Traducciones inglés
└── assets/
├── theme.css ← Estilos del tema
└── theme.js ← JavaScript del tema

theme.json — Manifest del tema

Declara las capacidades del tema: qué secciones ofrece, qué addons activa por defecto, y qué industria apunta.

{
"name": "Cielo",
"industry": "moda",
"sections": [
"banner", "blog_posts", "collection_list", "collections",
"custom_links", "directory", "featured_products", "footer",
"hair_color_tryon", "html_block", "image_gallery", "image_split",
"logo_list", "marquee", "media", "newsletter", "rich_text",
"slideshow", "value_props"
],
"addons": [
{ "id": "reviews", "enabled_by_default": true },
{ "id": "complaints", "enabled_by_default": true },
{ "id": "size-fit", "enabled_by_default": false },
{ "id": "tryon-ar", "enabled_by_default": false }
],
"templates": ["index", "product", "collection", "cart", "page", "..."]
}
CampoDescripción
nameNombre visible del tema
industryIndustria objetivo (moda, lujo, general)
sectionsIDs de secciones de contenido disponibles en el editor
addonsAddons que el tema soporta y si se activan por defecto
templatesTemplates que el tema provee

Templates

Los templates definen la estructura de cada página. Usan Liquid-like syntax o Go templates.

TemplatePáginaContexto principal
index.htmlHomepage.HeroSlides, .FeaturedProducts, .Collections
product.htmlPDP.Product, .RelatedProducts
collection.htmlPLP.Collection, .Filters, .Pagination
cart.htmlCarrito.Cart, .Customer
checkout.htmlCheckout.Checkout, .CSRFToken
confirmation.htmlPost-purchase.Confirmation
page.htmlCMS pages.ContentPage
search.htmlResultados de búsqueda.Search, .SearchQuery
blog.htmlBlog listing.BlogPosts
article.htmlBlog article.Article
customer.htmlMi cuenta.Customer, .AccountOrder
categories.htmlDirectorio de categorías.CategoryCards
collections.htmlDirectorio de colecciones.CollectionCards

Cada template recibe el StoreContext completo — todos los objetos de contexto están disponibles, pero solo los relevantes están poblados.

Sections — Módulos de contenido

Las secciones son módulos reordenables que el merchant configura desde el Theme Editor. Cada sección es un archivo HTML en sections/ que define su propio template Go o Liquid.

<!-- sections/banner.html -->
{{define "sections/banner"}}
<div class="banner" style="background-color: {{.section.bg_color}}">
<h2>{{.section.title}}</h2>
<p>{{.section.subtitle}}</p>
{{if .section.cta_text}}
<a href="{{.section.cta_url}}">{{.section.cta_text}}</a>
{{end}}
</div>
{{end}}

Las secciones se acceden en los templates a través de .ThemeSettings.<section_id>.

Snippets — Componentes reutilizables

Los snippets son fragmentos de template que se renderizan con {% render "snippet_name" %} o {{template "snippets/nombre" .}}.

themes/_base/snippets/
├── breadcrumb.html ← Navegación de migas de pan
├── css_vars.html ← Variables CSS del tema
├── product-card.html ← Card de producto (used in grids)
├── seo_head.html ← Meta tags SEO
├── head.html ← <head> completo
└── page-sections.html ← Renderiza secciones de una página

Los temas pueden overridear snippets de _base o dawn creando un archivo con el mismo nombre.

Assets

Los assets son archivos estáticos (CSS, JS, imágenes, fuentes) servidos directamente. OmniBuy aplica fingerprinting automático a los assets del tema para cache-busting:

<!-- En el template se usa el filter asset() -->
<link rel="stylesheet" href="{{ 'theme.css' | asset_url }}">
<script src="{{ 'theme.js' | asset_url }}"></script>

El filter asset_url resuelve la URL fingerprinted del asset.

Locales (i18n)

Cada tema puede tener traducciones propias en locales/es.json y locales/en.json. Se usan con el filter t:

{{ t .Lang "sections.banner.title" }}

sections.json — Schema del visual editor

Define los campos editables de cada sección para el Theme Editor visual. Es un array de objetos con id, fields y defaults:

{
"sections": [
{
"id": "banner",
"name": "Banner",
"icon": "image",
"category": "content",
"global": false,
"fields": [
{ "key": "title", "type": "text", "label": "Título" },
{ "key": "subtitle", "type": "textarea", "label": "Subtítulo" },
{ "key": "image_url", "type": "image", "label": "Imagen" },
{ "key": "bg_color", "type": "color", "label": "Color de fondo", "default": "#FFFFFF" },
{ "key": "cta_text", "type": "text", "label": "Texto del botón" },
{ "key": "cta_url", "type": "url", "label": "URL del botón" }
],
"defaults": {
"bg_color": "#FFFFFF",
"full_width": false
}
}
]
}