Saltar al contenido
themeforge
ES
Empieza gratis
Menú

Generación IA

Esta guía explica cómo colocar atributos ThemeForge en elementos HTML para que el generador cree un tema WordPress con un panel de administración completamente funcional.

Puede compartir esta página con cualquier asistente de IA (ChatGPT, Claude, Gemini, etc.) para que lea las reglas y coloque correctamente los atributos.

Comparta este enlace con su IA: https://themeforge.pro/ai

Envíe su asistente de IA a esta dirección: leerá las reglas de colocación desde la fuente, las mismas con las que el generador evalúa su marcado. Primero responde con un índice breve y luego sirve cada módulo de reglas a petición.

Flujos de trabajo

Hay varias formas de usar los atributos ThemeForge dependiendo de su punto de partida y herramientas.

1. La IA genera un sitio con atributos

Para: usuarios con un diseño (Figma, boceto, referencia)

Comparta el enlace de esta página con su asistente de IA junto con su diseño. La IA genera HTML con los atributos ya colocados. Usted revisa el informe, solicita correcciones y genera el tema WordPress.

  1. Dé a su IA el enlace a esta guía + su diseño (URL de Figma, capturas, referencia)
  2. La IA genera HTML con todos los atributos según las reglas
  3. Revise el informe de atributos — ajuste si es necesario
  4. Genere el tema WordPress a través de ThemeForge

2. La IA añade atributos al HTML existente

Para: desarrolladores con HTML listo (exportación de Webflow, plantilla, código manual)

Ya tiene HTML sin atributos ThemeForge. Comparta esta guía con su IA y pídala que analice el HTML y coloque los atributos en los elementos correctos.

  1. Dé a su IA el enlace a esta guía + sus archivos HTML
  2. La IA analiza la estructura y añade atributos a textos, imágenes, enlaces
  3. Revise el informe — la IA no siempre sabe qué elementos son decorativos
  4. Ejecute la validación, corrija problemas, genere el tema

3. Colocación manual en Webflow Designer

Para: usuarios experimentados de Webflow que prefieren control total

Añada atributos personalizados directamente en Webflow Designer (Configuración del elemento → Custom Attributes). Exporte el sitio y ejecute la validación antes de generar el tema.

  1. Seleccione un elemento en Webflow → Settings → Custom Attributes
  2. Añada el nombre del atributo (ej. fld-text) y el valor (ej. Heading)
  3. Exporte el sitio (Code Export o .webflow.io)
  4. Ejecute la validación y genere el tema

Ciclo completo

Independientemente del método, el ciclo de revisión es rápido — no necesita importar en Webflow ni instalar en WordPress solo para verificar atributos:

  1. Coloque atributos (IA o manualmente)
  2. Ejecute el informe — revise el árbol en segundos
  3. ¿No le gusta? → diga a la IA qué corregir → informe de nuevo
  4. Ejecute la validación — verifique errores
  5. Genere el tema WordPress

Ready-Made AI Prompts

Copy a prompt below and paste it into your AI assistant (ChatGPT, Claude, Gemini) along with the link to this guide. The AI will follow the attribute rules automatically.

Prompt A: Add attributes to existing HTML

Use this when you already have an HTML site and need to add ThemeForge attributes.

I have a finished HTML website that I want to convert into a WordPress theme with an editable admin panel, using ThemeForge.

Read the placement rules and follow them exactly. Start here — it names the rule modules and tells you what to do first:
https://themeforge.pro/ai
Always pull the `core` module; if you are generating the site from scratch, pull `build` too. Then add what this site needs (pages, blog, cpt, woocommerce, deploy).

Then add ThemeForge attributes to every piece of editable content in my HTML:
- Each visual section = a tab + group pair; short headings/labels = text, paragraphs and long wrapping headings = textarea, images on  tags, links as a URL + text pair.
- Repeating cards (features, team, FAQ) = a repeater with 2+ rows.
- Header, footer, navigation, logo and contacts = site-wide options.
- If my site is multilingual, mark the language switcher with wp-menu="Language" and do NOT hardcode any visible text — every label must be a field (each language has its own value).
- Keep image/file paths as they are; do not skip any visible text.

[Add your specific requirements here: which pages, WooCommerce / blog support, languages, etc.]

When done, follow the Final Delivery steps: create the theme-options page with ALL option fields, serve the files locally, and give me the complete list of page URLs to paste into ThemeForge.

Prompt B: Generate HTML with attributes from scratch

Use this when you want the AI to create an HTML site from a design (Figma, screenshot, description) with ThemeForge attributes already included.

I need you to generate an HTML website with ThemeForge attributes already in place, ready for WordPress theme generation.

Read the placement rules and follow them exactly. Start here — it names the rule modules and tells you what to do first:
https://themeforge.pro/ai
Always pull the `core` module; if you are generating the site from scratch, pull `build` too. Then add what this site needs (pages, blog, cpt, woocommerce, deploy).

Here is my design: [ATTACH YOUR FIGMA LINK / SCREENSHOTS / DESCRIPTION]

Generate clean, semantic HTML + CSS and place ThemeForge attributes on all editable content as you build each section (not as a separate pass):
- Each section = a tab + group pair; text vs textarea by line count; images on ; links as a URL + text pair; repeating cards as a repeater with 2+ rows.
- Header/footer/navigation/contacts = site-wide options.
- For a multilingual site, mark the language switcher with wp-menu="Language" and keep every visible string as a field (no hardcoded text).
Use real placeholder content (not lorem ipsum) so data import populates real fields.

[Add your specific requirements here: colors, fonts, number of pages, WooCommerce / blog, languages, etc.]

When done, follow the Final Delivery steps: create the theme-options page with ALL option fields, serve the files locally, and give me the complete list of page URLs to paste into ThemeForge.

Tips for Better Results

  • Para el Prompt B: adjunte todo el contexto visual posible — capturas de pantalla, enlaces de Figma, sitios de referencia. Cuanto más contexto, mejor será el resultado.
  • Puede ampliar los prompts con sus propios requisitos: esquema de colores, fuentes, secciones específicas, número de páginas, soporte de WooCommerce, etc.
  • Cuando la IA termine, pídele que despliegue el sitio en una carpeta local y lo sirva — luego pegue la URL local en ThemeForge para generar el tema de WordPress.
  • El enlace de la guía ya está incluido en el prompt. La IA leerá las reglas completas de atributos directamente desde la página.
  • ¿Sitio multilingüe? Marca el contenido con normalidad — un nombre de campo almacena todos los idiomas; conecta el selector con wp-menu=«Language». Consulta la sección Multilingüe.
  • Da a cada campo un nombre ÚNICO dentro de su ámbito — nunca reutilices el nombre de una sección para un repetidor dentro de ella, o el enlace y su imagen no sobrevivirán ambos.

Prefijos de atributos

PrefixScopeDescription
fld-*Per-pageCampos por página — contenido único para UNA página (texto del hero, imágenes de la página)
opt-*Site-wideOpciones del sitio — contenido compartido en TODAS las páginas (teléfono, email, logo)
tax-*TaxonomyCampos de taxonomía — contenido en páginas de archivo de categorías/etiquetas
wp="..."WP CoreWordPress core — datos dinámicos de WP (título del post, fecha, imagen destacada)
wp-fields-group="..."SectionsAgrupación de secciones — agrupa campos en secciones del panel de administración (metaboxes)

Tipos de campos

AttributeFieldHTML ElementExample
fld-textText<h1>-<h6>, <p>, <div><h2 fld-text="Heading">
fld-areaTextarea<p>, <div><p fld-area="Description">
fld-imageImage<img> only<img fld-image="Photo">
fld-bg-imageBG ImageAny element<div fld-bg-image="BG">
fld-linkLink<a> only<a fld-link="Button">
fld-editorRich editor<div><div fld-editor="Content">
fld-loopRepeaterWrapper <div><div fld-loop="Items">
fld-groupGroupContainer<div fld-group="Hero">
fld-layoutsSection builderWrapper <div><div fld-layouts="Page Sections">
fld-layoutSection typeDirect child<section fld-layout="Hero">
layout-previewPreview controlOn fld-layoutlayout-preview="off"
fld-tabTabEmpty <div><div fld-tab="Hero" wp="delete-element">
fld-showToggle (show)Wrapper <div><div fld-show="Show CTA">
fld-hideToggle (hide)Wrapper <div><div fld-hide="Hide CTA">
fld-galleryGalleryWrapper <div><div fld-gallery="Photos">

Replace fld- with opt- for site-wide options. Full reference: Referencia de atributos

Reglas de colocación

Secciones y pestañas

fld-tab debe estar en un <div> vacío separado, NO en el mismo elemento que fld-group. Colóquelo como hermano ANTES del grupo.

<!-- ONE wp-fields-group per page on <body> -->
<body wp-fields-group="Home Page">

  <!-- Tab = empty sibling BEFORE the group -->
  <div fld-tab="Hero" wp="delete-element" class="tab-div"></div>
  <section fld-group="Hero" class="hero">
    <h1 fld-text="Heading">Welcome</h1>
    <p fld-area="Description">...</p>
  </section>

  <div fld-tab="Features" wp="delete-element" class="tab-div"></div>
  <section fld-group="Features" class="features">
    ...
  </section>

</body>

Enlaces — siempre un par

Cada enlace DEBE tener tanto un atributo de enlace como de texto, con DOS nombres — fld-link="X" en <a>, fld-text="X text" en un <div> hijo. Un solo nombre para ambos hace que un campo alimente la URL y el texto. Teléfono/email: solo opt-phone-link / opt-email-link — un atributo rellena el href y el texto visible. Excepción: enlaces de icono sin texto visible.

<!-- CORRECT: fld-link on <a>, fld-text on child, two names -->
<a fld-link="CTA" href="/shop" class="btn w-inline-block">
  <div fld-text="CTA text">Shop Now</div>
</a>

<!-- Phone/email: one attribute fills both href and text -->
<a opt-phone-link="Phone" href="tel:...">+1 234 567</a>

Imágenes

fld-image va SOLO en etiquetas <img>. fld-bg-image en cualquier elemento con imagen de fondo.

<img fld-image="Hero Image" src="images/hero.jpg" alt="Hero" />
<div fld-bg-image="Background" style="background-image:url('img/bg.jpg')"></div>

Repetidores

TODOS los hijos dentro de fld-loop DEBEN tener los MISMOS atributos ThemeForge. Use texto e imágenes diferentes en cada fila.

<div fld-loop="Team" class="team-grid">
  <div class="card">
    <img fld-image="Photo" src="images/avatar-1.jpg" />
    <h3 fld-text="Name">John Doe</h3>
  </div>
  <!-- Row 2: SAME attributes, DIFFERENT content -->
  <div class="card">
    <img fld-image="Photo" src="images/avatar-2.jpg" />
    <h3 fld-text="Name">Jane Smith</h3>
  </div>
</div>

Opciones del sitio

Elementos en cada página (teléfono, email, logo, dirección) deben usar opt-* en lugar de fld-*.

<!-- Header: site-wide, use opt-* -->
<img opt-image="Logo" src="images/logo.png" />

<!-- Navigation: a repeater of link + caption rows (NOT wp-menu) -->
<nav opt-loop="Nav links" class="nav">
  <div class="nav-item">
    <a opt-link="Link" href="/about" class="nav-link w-inline-block">
      <div opt-text="Link text">About</div>
    </a>
  </div>
  …
</nav>

<!-- Footer: contacts — one attribute each -->
<a opt-phone-link="Phone" href="tel:...">+1 234 567</a>
<a opt-email-link="Email" href="mailto:...">info@site.com</a>
<p opt-text="Address">123 Main St</p>

Menús

<!-- Navigation: an opt-loop of link + caption rows (preferred) -->
<nav opt-loop="Nav links" class="nav">
  <div class="nav-item">
    <a opt-link="Link" href="/" class="nav-link w-inline-block">
      <div opt-text="Link text">Home</div>
    </a>
  </div>
  <div class="nav-item">
    <a opt-link="Link" href="/about" class="nav-link w-inline-block">
      <div opt-text="Link text">About</div>
    </a>
  </div>
</nav>

<!-- Language switcher (Polylang): use wp-menu -->
<div wp-menu="Language" class="lang-switcher">
  <a href="/en" class="lang-link">EN</a>
  <a href="/ua" class="lang-link">UA</a>
</div>

Nombres — cada nombre único

Dentro de un ámbito cada nombre de campo debe ser único. ThemeForge indexa los campos por nombre, por lo que dos campos distintos con el mismo nombre colisionan y uno se pierde en silencio.

  • NUNCA des a un repetidor (fld-loop) el mismo nombre que la sección o grupo en el que está — nombra el repetidor por sus filas (p. ej. «Tarjetas de contador»), no como la sección («Contadores»).
  • Un enlace y su imagen o texto en el mismo lugar necesitan nombres DISTINTOS — p. ej. opt-link=«Enlace del logo» + opt-image=«Logo», no ambos «Logo».
  • Reutiliza el MISMO nombre solo a propósito (filas de repetidor, interruptores show/hide). El conversor avisa de colisiones de nombre accidentales en los Registros del proyecto.
<!-- WRONG: repeater reuses its section/group name -->
<section fld-group="Counters">
  <div fld-loop="Counters"> ... </div>
</section>

<!-- RIGHT: distinct names -->
<section fld-group="Counters">
  <div fld-loop="Counter cards"> ... </div>
</section>

Sitios multilingües (Polylang / WPML)

Si el origen tiene dos o más idiomas (un selector, códigos de idioma como ua/ru/en o páginas duplicadas por idioma) es multilingüe. ThemeForge detecta Polylang o WPML automáticamente — el marcado es idéntico. Solo dos cosas difieren de un sitio monolingüe:

  1. El selector de idioma usa wp-menu=«Language» — el plugin de idioma inyecta los enlaces de cada idioma.
  2. Cada campo de contenido almacena un valor POR idioma. Usa UN solo nombre de campo (p. ej. fld-text=«Título») — NO crees «Título EN» / «Título RU». El propietario edita cada idioma en el admin y el importador rellena cada idioma.

Selector de idioma — la receta

<!-- Dropdown: toggle shows the CURRENT language (an options field),
     the list is a connected wp-menu="Language" (locales injected) -->
<div opt-hide="Hide language switcher" class="lang-drop w-dropdown">
  <div class="lang-dt w-dropdown-toggle">
    <div opt-text="Current language">UA</div>
  </div>
  <nav class="lang-drop-list w-dropdown-list">
    <div wp-menu="Language" class="lang-switcher">
      <a href="/en"><div>ENG</div></a>
      <a href="/ru"><div>РУС</div></a>
    </div>
  </nav>
</div>

<!-- Simple variant: a flat list of language links -->
<ul wp-menu="Language" class="header__languages">
  <li><a href="/">UA</a></li>
  <li><a href="/ru/">RU</a></li>
  <li><a href="/en/">EN</a></li>
</ul>

Los campos globales opt-* (teléfono, dirección, etiquetas de navegación) también son por idioma, así que la cabecera/pie de cada idioma pueden diferir. Márcalos con opt-* como siempre — sin trabajo extra.

En un sitio multilingüe, NO:

  • codifiques texto visible de forma fija — se vuelve intraducible; todo es un campo;
  • crees un campo por idioma — un nombre, el CMS lo almacena por idioma;
  • marques los enlaces dentro de wp-menu=«Language» — el plugin los reemplaza por sus propios enlaces de idioma.

Consejo de detección: un selector de idioma en cabecera/pie (banderas o códigos ua/ru/en), o prefijos de URL /ru/… y /en/…, significan que el sitio es multilingüe — conecta el selector con wp-menu=«Language» y espera contenido por idioma. Un sitio monolingüe no necesita nada de esto.

Qué NO marcar

  • Elementos decorativos: separadores, espaciadores, overlays de fondo, iconos SVG
  • Wrappers estructurales: contenedores grid, wrappers flex, estructura de diseño
  • Enlaces de navegación dentro de wp-menu (WordPress los gestiona)
  • Etiquetas UI estáticas: "Precio:", "Cantidad:", encabezados de tabla
  • Iconos UI: búsqueda, carrito, chevrones, flechas
  • Texto estándar del footer: "Todos los derechos reservados", año de copyright

Regla general: si el propietario del sitio querría cambiar este texto/imagen desde el panel de administración — ponga un atributo. Si es decoración UI — omítalo.

Lista de verificación

  1. Cada sección wp-fields-group tiene un nombre claro y único
  2. Todos los hijos del repetidor tienen atributos idénticos con contenido diferente
  3. Las imágenes usan etiquetas <img> donde sea posible
  4. Cada enlace tiene AMBOS atributos: enlace + texto (fld-link + fld-text, opt-phone-link + opt-text, etc.)
  5. Los contactos del footer usan opt-* (opciones), no fld-*
  6. Los divs de pestañas son hermanos vacíos con wp="delete-element"
  7. Sin atributos en elementos decorativos/estructurales
  8. Las etiquetas son legibles, en inglés

Required Pages & Slugs

The file name (slug) determines which WordPress template is generated. Some pages are required, others depend on the site type (blog, shop).

theme-options.html — REQUIRED

You MUST create this page. It contains ALL opt-* fields used across the site (logo, navigation, phone, email, address, social links, copyright). Add wp-fields-group="Theme Options" on <body> and organize fields with opt-tab. Without this page, option fields will NOT appear in the WordPress admin panel.

<!-- theme-options.html -->
<body wp-fields-group="Theme Options">
  <div opt-tab="Header" wp="delete-element" class="tab-div"></div>
  <img opt-image="Logo" src="images/logo.png" />
  <nav opt-loop="Nav links" class="nav">
    <div class="nav-item">
      <a opt-link="Link" href="/about" class="nav-link w-inline-block">
        <div opt-text="Link text">About</div>
      </a>
    </div>
    <div class="nav-item">
      <a opt-link="Link" href="/contacts" class="nav-link w-inline-block">
        <div opt-text="Link text">Contacts</div>
      </a>
    </div>
  </nav>

  <div opt-tab="Footer" wp="delete-element" class="tab-div"></div>
  <a opt-phone-link="Phone" href="tel:...">+1 234 567</a>
  <a opt-email-link="Email" href="mailto:...">info@site.com</a>
  <p opt-text="Address">123 Main St</p>
  <div opt-text="Copyright">&copy; Company</div>
</body>

Slug → Template Mapping

Use these exact file names. Custom pages (about, services, contacts, etc.) can use any slug that doesn't conflict with the reserved names below.

File nameWP templateWhen to use
index.htmlindex.phpHome page (required)
about.htmlabout.phpCustom page — any slug
single.htmlsingle.phpSingle blog post (blog sites)
archive.htmlarchive.phpBlog posts list (blog sites)
404.html404.phpNot found page
search-page.htmlsearch.phpSearch results
single-product.htmlsingle-product.phpSingle product (WooCommerce)
archive-product.htmlarchive-product.phpProduct catalog (WooCommerce)
taxonomy-product-cat.htmltaxonomy-product-cat.phpProduct category archive (WooCommerce)
page-cart.htmlpage-cart.phpCart (WooCommerce)
page-checkout.htmlpage-checkout.phpCheckout (WooCommerce)
page-wishlist.htmlpage-wishlist.phpWishlist (WooCommerce)
page-my-account.htmlpage-my-account.phpMy account (WooCommerce)
single-{type}.htmlsingle-{type}.phpCustom post type — single / archive
theme-options.html—Site-wide options (admin panel only, no template)

Final Delivery — Do NOT Skip

After generating all pages with attributes, you MUST complete these steps:

  1. Create theme-options.html with ALL opt-* fields (see above)
  2. Save all HTML files to a single folder. Tell the user the folder name
  3. Give the user the complete list of ALL page slugs (filenames without .html), ready to paste into the ThemeForge generator page list:
  4. En ThemeForge cree un proyecto, marque «La fuente se subirá en el sitio», pegue la lista de páginas y descargue el tema en blanco. Instálelo en WordPress, suba el ZIP de su sitio en «ThemeForge → Fuente» (su propio elemento del menú de administración) y pulse «Actualizar el tema desde el proyecto».
index, about, services, contacts, theme-options

tf-cors.php

Opcional: si su sitio ya se sirve desde una dirección localhost, puede indicar esa dirección en el proyecto en lugar de subir el archivo en el sitio (véase «La fuente en tu sitio»). Cree este fichero en la raíz del sitio y arranque el servidor con: php -S localhost:8080 tf-cors.php. Solo se permite themeforge.pro — ningún otro sitio puede acceder a sus archivos.

<?php
// ThemeForge CORS Router — place in site root, run: php -S localhost:8080 tf-cors.php
$allowed = ['https://themeforge.pro', 'https://www.themeforge.pro', 'http://localhost:8081'];
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if (in_array($origin, $allowed, true)) header('Access-Control-Allow-Origin: ' . $origin);
elseif (empty($origin)) header('Access-Control-Allow-Origin: https://themeforge.pro');
header('Access-Control-Allow-Methods: GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$file = __DIR__ . $path;
if (is_dir($file)) $file = rtrim($file, '/') . '/index.html';
if (!is_file($file) && is_file($file . '.html')) $file .= '.html';
if (is_file($file)) {
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    $types = ['html'=>'text/html','css'=>'text/css','js'=>'application/javascript','json'=>'application/json',
        'png'=>'image/png','jpg'=>'image/jpeg','jpeg'=>'image/jpeg','gif'=>'image/gif','svg'=>'image/svg+xml',
        'webp'=>'image/webp','ico'=>'image/x-icon','woff'=>'font/woff','woff2'=>'font/woff2','ttf'=>'font/ttf'];
    if (isset($types[$ext])) header('Content-Type: ' . $types[$ext]);
    readfile($file); return true;
}
http_response_code(404); echo '404 Not Found';

Referencia rápida

PAGE:        <body wp-fields-group="Page Name">  (ONE per page)
TAB:         <div fld-tab="Section" wp="delete-element" class="tab-div"></div>
GROUP:       <section fld-group="Section">  (ALWAYS after each tab)

TEXT:        <h2 fld-text="Heading">...</h2>
TEXTAREA:    <p fld-area="Description">...</p>
IMAGE:       <img fld-image="Photo" src="..." />
BG IMAGE:    <div fld-bg-image="BG" style="background-image:url(...)">
LINK+TEXT:   <a fld-link="Btn"><div fld-text="Btn text">Click</div></a>
REPEATER:    <div fld-loop="Items">  (all children = same attrs)
BUILDER:     <div fld-layouts="Page Sections"><section fld-layout="Hero">
             (client picks section types; previews are automatic)
             optional: layout-preview="off" | layout-preview="images/x.jpg"
TOGGLE:      <div fld-show="Show X">  or  <div fld-hide="Hide X">

NAV LINKS:   <nav opt-loop="Nav links"><div><a opt-link="Link"><div opt-text="Link text">...</div></a></div>…</nav>
OPTIONS:     opt-text, opt-image, opt-link, opt-phone-link, opt-email-link
LANG SWITCH: <div wp-menu="Language">  (Polylang only)
POST LOOP:   <div wp-query="'post_type'=>'post','posts_per_page'=>3">
PRODUCTS:    <div wp-product-query="'post_type'=>'product','posts_per_page'=>4">
CONDITION:   <div wp-if="on_sale">

Comprobar el marcado

Antes de entregar el sitio, envíe todas sus páginas al comprobador gratuito. Ejecuta el analizador real del generador — sin cuenta, no se guarda nada — y enumera lo que el generador objetaría: error rompe el tema, warning significa que algo se descarta en silencio, hint conviene saberlo. Repita hasta que la respuesta diga "ok": true.

POST /api/validate-markup

Envíe el conjunto completo en una sola petición: algunas comprobaciones afectan al conjunto y no a un archivo — si existe theme-options.html, si está la página de inicio.

POST https://themeforge.pro/api/validate-markup
Content-Type: application/json

{"pages":[
  {"name":"index.html","html":"<!doctype html>…"},
  {"name":"about.html","html":"…"},
  {"name":"theme-options.html","html":"…"}
]}

Avanzado — Agente de IA + Webflow MCP

Los dos prompts de arriba funcionan con cualquier IA sobre una página HTML terminada. Si construyes en Webflow, puedes colocar los mismos atributos directamente en el Designer con un agente de IA (p. ej. Claude Code) conectado al Webflow MCP — las mismas reglas, sin copiar y pegar.

  • El mismo canon: las reglas de colocación de esta página son la única fuente de verdad para ambas rutas.
  • En cualquier caso el resultado es un conjunto de páginas con atributos que entregas al generador de ThemeForge (una URL *.webflow.io publicada o una carpeta HTML local).