Reaccionar
El editor se monta como un componente en tu árbol. Tu router, tus proveedores y tu contexto de autenticación siguen envolviéndolo, y su estado fluye de vuelta a React como cualquier otro componente.
PageKit: el creador de sitios GrapesJS autoalojado, con el código fuente incluido. Obtener acceso anticipado
Integra un editor visual de correo personalizable en tu aplicación React o Next.js. Deja que tus usuarios creen plantillas de correo responsivas con bloques reutilizables, componentes personalizados y exportación MJML o HTML — mientras tu producto mantiene sus propios usuarios, datos e infraestructura de envío.
26k+
GitHub estrella en el núcleo del editor
1.4M+
Descargas de NMP al mes
100+
Plugins y presets en GJS.Market
BSD-3-Clause
Licencia del núcleo editorial
No es un editor alojado que alquilas, ni una galería de plantillas. Es una capa de edición que montas dentro de la aplicación que ya ejecutas.
El editor se monta como un componente en tu árbol. Tu router, tus proveedores y tu contexto de autenticación siguen envolviéndolo, y su estado fluye de vuelta a React como cualquier otro componente.
Tus usuarios ensamblan los correos eligiendo bloques y editando el texto donde lo coloca, en lugar de describir un diseño a un desarrollador o luchar contra el marcado de tabla a mano.
Los componentes, bloques, viñetas y comandos son todos tuyos para definir. Las partes de la experiencia de edición específicas de tu producto pueden ser escritas por ti.
Las plantillas se guardan a través de tu propia API en tu propia base de datos y se envían por el proveedor que ya pagas. Nada aquí llama a un servicio de editor en tiempo de ejecución.
Este lienzo es un componente de React que se ejecuta en esta página — sin paquete de editores, sin iframe. Añade un bloque, haz clic en cualquier sección para seleccionarlo, vuelve a escribir el texto en su sitio, restylearlo, reordenarlo y cambia la vista previa entre escritorio, tablet y móvil. Abre la pestaña HTML para ver qué tipo de marcado envía un creador de correo electrónico a tu código.
Bloques
Añade una sección al correo.
Haz clic en una sección para seleccionarla, luego edítala o restylea
Selección
Nada seleccionado
Haz clic en una sección del lienzo o añade una desde el panel de Bloques.
Nada de debajo carga hasta que lo pides: no hay iframe en el HTML de esta página, y solo se monta una demo a la vez. Estas son demos públicas alojadas por sus autores.
El preajuste del boletín: bloques seguros para correo electrónico, un gestor de estilos restringido y salida basada en tablas. Esto es lo más parecido a lo que verían tus usuarios.
Un creador de correo React es un editor visual que se ejecuta dentro de una aplicación React y permite a los usuarios crear y personalizar plantillas de correo electrónico sin necesidad de escribir a mano el marcado HTML de correo. No es un producto separado en el que tus usuarios inician sesión: es un componente de tu aplicación, por lo que las plantillas, las cuentas que las poseen y la infraestructura que las envía permanecen de tu lado.
Lo que pasa por ella
El trabajo del editor termina en producir el marco. Todo lo que hay antes y después es tu solicitud.
En cada uno de estos casos, la alternativa es que un desarrollador edite una plantilla a mano cada vez que alguien en el negocio quiera un cambio.
Permite que los clientes diseñen sus propios correos transaccionales y de ciclo de vida dentro de tu producto, en su propio plan, sin necesidad de un ticket de soporte.
Ofrece a los equipos de ventas y éxito una forma de moldear la comunicación con los clientes por sí mismos, con los campos y las etiquetas de fusión que tu CRM ya exporta.
Crea plantillas reutilizables una vez y refíralas en cada flujo de trabajo automatizado, en lugar de duplicar el marcado por paso de campaña.
Haz que escribir un tema sea una tarea de diseño en lugar de una tarea HTML, y deja que cada publicación mantenga su propio aspecto.
Reúne envíos promocionales y correos electrónicos relacionados con pedidos de bloques que ya saben cómo mostrar un producto, un precio y una llamada a la acción.
Deja que los equipos no técnicos se encarguen del contenido del correo en una superficie interna de administración, mientras que los desarrolladores se quedan con los componentes y las barreras de seguridad.
Es la base de la edición, no el producto final. Esa distinción es la clave: todo lo que sigue es un gancho sobre el que construyes en lugar de una característica que aceptas como dada.
Un lienzo de edición completo con selección, un árbol de componentes y un gestor de estilo: las partes que más tardan en escribirse y que son más difíciles de acertar.
Define tipos de componentes con sus propias características y su propio marcado, para que el editor entienda los objetos que ya tiene tu aplicación.
Registra tus propios bloques dentro de tus propias categorías y aparecen en el panel de bloques como cualquier otro incorporado.
Configura los anchos de los dispositivos entre los que los usuarios pueden cambiar durante la edición y previsualiza cada uno sin salir del lienzo.
Apunta el gestor de almacenamiento a tus propios puntos finales. Cargar y guardar se convierten en solicitudes ordinarias contra tu API.
Ya existen presets de correo electrónico, paquetes de bloques, gestores de activos y adaptadores de almacenamiento, así que no estás implementando cada capa tú mismo.
Los paneles, botones y comandos son configurables, y puedes manejar una instancia sin interfaz desde tu propia interfaz React.
Los paquetes se instalan desde npm y se envían en tu paquete. No hay servicio de editor para llamar en tiempo de ejecución ni cuenta de editor por asiento.
GrapesJS proporciona la capa de edición visual. Tu aplicación React mantiene el control de los usuarios, los datos, el almacenamiento y la publicación — que es todo el argumento para incrustar un editor en lugar de enviar a la gente a otro editor.
Tu aplicación React
El editor
Tu backend
Integrar un editor en el producto de otra persona plantea un conjunto diferente de preguntas.
Ambos caminos terminan en el mismo lugar. La única diferencia real es dónde se permite evaluar el módulo.
Reaccionar
Vite, CRA, ruta cliente Remix
@grapesjs/react
El componente de envoltorio publicado
GrapesJS
El lienzo de montaje
Preajuste de correo electrónico
Bloqueos y estilos seguros para correo electrónico
Renderiza el componente. No hay nada más que arreglar.
Integración de GrapesJS ReactNext.js
Páginas o enrutador de aplicaciones
dinámico(..., { ssr: false })
La línea extra
Componente de reacción
Tu wrapper de editor
GrapesJS
Solo navegador
Preajuste de correo electrónico
Bloqueos y estilos seguros para correo electrónico
Todo lo demás — rutas de API, obtención de datos, autenticación — sigue sin cambios.
Integración Next.js GrapesJSEl límite SSR, una vez
GrapesJS busca ventana y documento mientras se inicializa, por lo que no puede evaluarse en el servidor. En Next.js eso significa importar tu componente de editor a través de next/dynamic con ssr: false y darle un esqueleto de carga. Ese es todo el coste específico de Next.js; la página alrededor del editor aún puede renderizarse en el servidor, y sus datos pueden provenir de getStaticProps, getServerSideProps o un componente del servidor.
Tres paquetes y un componente. Todo lo que viene después de esto — almacenamiento, bloques personalizados, MJML — se cubre más abajo en la página.
npm install grapesjs @grapesjs/react grapesjs-preset-newsletterimport GjsEditor from '@grapesjs/react';
import newsletter from 'grapesjs-preset-newsletter';
import 'grapesjs/dist/css/grapes.min.css';
// A normal React component. The editor is a child of your tree, so your
// router, your auth context and your providers all still wrap it.
export default function EmailBuilder({ template, onSave }) {
return (
<GjsEditor
options={{
height: '100vh',
// Storage is wired to your own API further down this page.
storageManager: false,
plugins: [newsletter],
projectData: template,
}}
onEditor={(editor) => {
// Everything the user builds comes back out as plain data you can
// put straight into React state or POST to your backend.
editor.on('update', () => {
onSave({
html: editor.getHtml(),
css: editor.getCss(),
project: editor.getProjectData(),
});
});
}}
/>
);
}En Next.js, una importación dinámica mantiene el editor fuera del renderizado del servidor:
// app/emails/page.tsx (or pages/emails.tsx)
import dynamic from 'next/dynamic';
// GrapesJS reaches for window/document as it initialises, so it can only run
// in the browser. In Next.js that means one dynamic import with ssr: false —
// this is the whole of the Next.js-specific work.
const EmailBuilder = dynamic(() => import('@/components/EmailBuilder'), {
ssr: false,
loading: () => <EditorSkeleton />,
});
export default function EmailsPage({ template }) {
return <EmailBuilder template={template} onSave={saveTemplate} />;
}Las versiones anteriores se comprobaron con los paquetes publicados en 2026-09-03: grapesjs 0.23.6 es BSD-3-Clause; @grapesjs/react es MIT.
Estos provienen del núcleo del editor y sus preajustes de correo electrónico, no de nada que tengas que escribir.
Los usuarios mueven secciones por el correo y dejan nuevas desde el panel de bloques.
El texto, las imágenes y los botones se editan donde están, y el editor en línea se puede cambiar por uno que ya tienes licencia.
Filas, columnas y secciones, construidas a partir de la tabla de marcado que esperan los clientes de correo electrónico, en lugar de un CSS de diseño moderno.
Cambia entre anchos configurados de dispositivo mientras editas para que un diseño pueda ser estrecho antes de enviarlo.
Tipos de componentes que definas, con sus propias características y su propio marcado renderizado.
Una paleta de secciones listas de las que tus usuarios se ensamblan, agrupadas en categorías que nombras.
Un gestor de activos para imágenes, cuyos plugins pueden apuntar a tu propio almacenamiento o a un servicio multimedia que ya uses.
Un historial de mandos, así que experimentar con un diseño no es una puerta unidireccional.
MJML existe para hacer que el marcado de correo responsivo sea grabable a mano. Un constructor visual encima significa que nadie tiene que hacerlo. GrapesJS no incluye MJML en su núcleo — un plugin añade componentes MJML al editor, por lo que el proyecto se serializa a MJML en lugar de a HTML simple.
Donde ocurre la compilación
// pages/api/email/compile.ts
//
// mjml is a Node package — it parses and renders on the server, not in the
// browser. So the editor produces MJML in the client and this route turns it
// into the table-based HTML that email clients actually accept.
import mjml2html from 'mjml';
export default function handler(req, res) {
const { html, errors } = mjml2html(req.body.mjml, {
validationLevel: 'soft',
keepComments: false,
});
// MJML reports what it could not understand rather than failing silently.
if (errors.length) console.warn('[mjml]', errors);
res.status(200).json({ html });
}El compilador es un paquete Node, por lo que la compilación pertenece al servidor — en Next.js, una ruta API ordinaria. La dirección inversa no es simétrica: HTML arbitrario no se convierte limpiamente de nuevo a MJML, así que elige el formato que necesitas antes de construir sobre uno.
El editor entrega a tu código tres cosas diferentes, y una aplicación de React suele querer las tres en distintos momentos.
editor.getHtml() + getCss()
El correo renderizado, basado en tablas y en línea cuando un preajuste de correo está activo. Esto es lo que pasas a un proveedor de envío.
con el plugin MJML
El documento fuente, cuando tu flujo de trabajo está construido alrededor de MJML. Compilátalo en el servidor para obtener el HTML que realmente envías.
editor.getProjectData()
El proyecto editable. Guárdalo para que un usuario pueda volver a abrir una plantilla meses después y que vuelva exactamente como la dejó.
El marcado renderizado y el proyecto editable son artefactos diferentes con diferentes tiempos de vida. Almacena el JSON; regenera el HTML.
Aquí es cuando un creador embebido se adelanta a una herramienta de correo genérica: los bloques pueden conocer tu dominio. Un bloque no es la imagen de una tarjeta de producto: puede buscar el producto.
Tu solicitud
Generador de correo electrónico
Para ser precisos sobre qué es esto: un componente arbitrario de React no se convierte en un componente de correo electrónico. JSX renderiza un árbol DOM, y los clientes de correo no respetarán la mayoría. Lo que escribes es un tipo de componente GrapesJS cuyo toHTML emite marcado seguro para correo electrónico y cuyas características se corresponden a un registro que posee tu aplicación. El cableado es tuyo; el editor proporciona el lugar donde lo colocar.
Reduce el trabajo de diseño repetitivo enviando las secciones que tu producto realmente envía, en lugar de un conjunto genérico que tus usuarios tienen que adaptar cada vez.
Logotipo, palabra y texto de preencabezado, bloqueados al diseño que especifiquen las directrices de tu marca.
El único mensaje que existe para entregar el correo, dimensionado para sobrevivir a un visor estrecho.
La sección de la fuerza de batalla: una imagen visual con un párrafo debajo o al lado.
Un bloque de dominio conectado a tu catálogo en lugar de un marcador que alguien rellene.
Niveles y cifras generados a partir de tus datos de facturación, así que un cambio de precio no es una edición de plantilla.
Una lista repetible de puntos, organizada con tablas para que sobreviva a Outlook.
Un botón a prueba de balas con el acolchado y los recursos de respaldo que cada cliente necesita.
Enderezar, preferencias y cancelar suscripción — las piezas que se preocupan por el cumplimiento y que no dependen del usuario.
Una plantilla es simplemente un documento de proyecto guardado, así que enviar una biblioteca inicial significa sembrar filas y cargar una como projectData cuando el usuario la elige. Estas son las categorías que la mayoría de los productos acaban necesitando:
Puntos de partida comunes
Estas son categorías de diseño, no productos a la venta. GJS.Market lista presets de correo, packs de bloques y gestores de plantillas — no vende diseños de correo ya hechos, y esta página no mostrará tarjetas de productos que no existen.
Los usuarios cambian el ancho del dispositivo mientras editan, y el lienzo se redistribuye en ese ancho. Los anchos de correo electrónico son más estrechos que los de la web: 600px ha sido el máximo seguro de escritorio durante años.
Qué pueden cambiar los usuarios por ancho
Una vista previa es una vista previa. Muestra cómo se refluye el marcado, no cómo lo renderizará un cliente específico — que es la siguiente sección.
Los clientes de correo electrónico implementan HTML y CSS de forma diferente, y lo han hecho durante veinte años. Un constructor visual estandariza el flujo de trabajo de autoría; no hace que los clientes estén de acuerdo entre sí.
Elimina la cabeza del documento en varios contextos, por lo que los estilos que deben sobrevivir deben ser en línea.
Se renderiza a través de Word en Windows en algunas versiones, por eso el marcado de correo electrónico sigue siendo basado en tablas.
La más permisiva de las cuatro, y por tanto la menos útil como única prueba.
Su propio manejo de las consultas y clases de medios; vale la pena comprobar si es relevante para tu audiencia.
Por eso esta página no te dirá que funciona perfectamente en todas partes. La salida basada en tablas con estilos en línea es el punto de partida más predecible disponible, y los correos de producción deberían seguir probándose en los clientes que tus propios destinatarios realmente usan.
Conecta el editor con el backend y el modelo de datos que ya tienes. Tus usuarios, tu autenticación, tu base de datos, tus permisos y tu flujo de trabajo de publicación permanecen exactamente donde están.
El viaje de ida y vuelta
// The editor asks your API for a template and hands it back on save.
// Your users, your auth, your database, your permissions — unchanged.
const options = {
storageManager: {
type: 'remote',
autosave: true,
stepsBeforeSave: 5,
options: {
remote: {
urlStore: `/api/email-templates/${templateId}`,
urlLoad: `/api/email-templates/${templateId}`,
// Your existing session cookie is all the auth it needs.
fetchOptions: { credentials: 'include' },
},
},
},
};
// pages/api/email-templates/[id].ts — an ordinary Next.js route handler.
export default async function handler(req, res) {
const session = await getSession(req);
if (!session) return res.status(401).end();
if (req.method === 'POST') {
await db.emailTemplate.update({
where: { id: req.query.id, orgId: session.orgId },
data: { project: req.body },
});
return res.status(200).json({ ok: true });
}
const row = await db.emailTemplate.findFirst({
where: { id: req.query.id, orgId: session.orgId },
});
return res.status(200).json(row?.project ?? {});
}GJS.Market no aloja tus plantillas, no almacena tus datos ni envía tu correo electrónico. Vende plugins para un editor que tú mismo gestionas.
Personaliza la experiencia de edición hasta que se lea como una parte nativa de tu aplicación React en lugar de un panel de terceros atornillado. No hay marca de fabricante que eliminar en primer lugar.
Lo que ve el usuario
Lo que puedes cambiar
La versión más completa es ejecutar el editor sin interfaz y construir toda la interfaz tú mismo en React, usando el editor solo para el lienzo y el modelo.
Es algo razonable a considerar, hasta que se escriba la lista de piezas. Cada elemento que aparece a continuación es algo que un editor de correo necesita antes de poder usarlo — no es algo agradable de tener.
De qué está hecho un editor de correo electrónico
Construye todo tú mismo
Cada fila por encima
Empieza con GrapesJS
La base de la edición
Construye tu producto de correo — no otro editor desde cero. No vamos a ponerle un número de meses ahorrados: cuánto tardaría tu equipo depende de tu equipo.
Cada anuncio que aparece a continuación es un producto real con una página activa, y su nombre, precio y miniatura se muestran directamente del catálogo — así que nada en esta página puede desmarcarse de lo que realmente está a la venta.
La capa de esta página es la siguiente: interfaces de React construidas alrededor del núcleo del editor, para equipos que quieren que la interfaz de usuario que lo rodea sea React en lugar de los paneles estándar.
Explora esta categoríaUna interfaz React alrededor del editor, para equipos que prefieren extender componentes antes que configurar paneles.
Un preajuste orientado a React, útil como punto de partida cuando la aplicación circundante ya está en React.
Una interfaz completa de React construida sobre una biblioteca de componentes familiar, para productos que quieren que el editor coincida con el resto de su interfaz.
Sustituye los bloques web por defecto por otros seguros para correo electrónico y reduce el gestor de estilos a propiedades al honor de los clientes de correo electrónico. Esto es lo que hace que el editor sea un editor de correo electrónico.
Explora esta categoríaAñade componentes MJML al editor para que el proyecto se serialize a MJML y compile a HTML responsivo en tu servidor.
El punto de partida del correo: bloques seguros para correo, un gestor de estilos reducido y salida basada en tablas.
Un ajuste alternativo de correo electrónico, que merece la pena comparar con el del boletín antes de comprometerte con un vocabulario bloqueado.
Secciones listas y un gestor para guardar y recargar plantillas, para que tus usuarios no estén ensamblando todos los correos a partir de primitivas.
Explora esta categoríaUn conjunto más amplio de secciones de correo listos, para que tus usuarios ensamblen piezas terminadas en lugar de primitivas.
Guarda, lista y recarga proyectos — la mecánica detrás de enviar una biblioteca de plantillas de inicio a tus usuarios.
En los momentos, un desarrollador necesita ver o editar manualmente el marcado que produce una sección.
Explora esta categoríaConecta el gestor de almacenamiento a un backend sin escribir el adaptador, si el que usas ya está cubierto.
Explora esta categoríaSubida de imágenes y gestión de medios, dirigida a los servicios que ya ejecutan los equipos en lugar de a archivos locales.
Explora esta categoríaSeñala al gestor de activos en Cloudinary, así que las imágenes de correo electrónico provienen de un servicio que puede transformarlas y servirlas.
Una experiencia de subida más completa en el gestor de activos, incluyendo fuentes más allá del selector local de archivos.
Sacar el marcado final del editor y ponerlo en lo que venga después en tu pipeline.
Explora esta categoríaCuatro combinaciones que se corresponden con requisitos reales. Cada listado mostrado es uno que existe: no hay ningún plugin imaginario que llene un hueco en un diagrama.
Una primera versión: edición visual, bloques seguros para correo electrónico, HTML salido.
Cuando tu flujo de trabajo está basado en MJML y compila el lado del servidor.
De cara al cliente, con plantillas y recursos en tu propia infraestructura.
Volumen de campaña: muchas plantillas, muchas imágenes, muchos autores.
Los precios vienen del catálogo en el momento de la construcción.
Tu cliente abre el constructor
Una ruta en tu app, detrás de tu autorización, en su plan. Sin segunda cuenta, sin segundo inicio de sesión.
Elaboran una plantilla
De los bloques que has definido, incluidos aquellos que conocen sus datos en tu producto.
Guarda en tu base de datos
El documento del proyecto recorre la ruta de tu API y termina en una fila que pertenece a su organización.
Una campaña o flujo de trabajo lo referencia
Tu automatización elige la plantilla por id — no necesita saber cómo funciona el editor.
Tu backend renderiza y envía
Los campos de fusión se resuelven en el momento de enviar, el margen se entrega al proveedor por el que ya pagas.
Los clientes tienen control visual sobre el contenido del correo electrónico. Tú mantienes el producto, los datos y la infraestructura de entrega.
El patrón se repite en productos que de otro modo no tienen nada en común.
Plantillas reutilizables de comunicación con clientes, propiedad de los equipos que las envían a la empresa.
Plantillas diseñadas una vez y referenciadas en cada paso de un flujo de trabajo automatizado.
La composición de campañas es una tarea visual, con cada publicación manteniendo su propia identidad.
Correos promocionales y relacionados con pedidos construidos a partir de bloques que ya conocen el catálogo.
Un editor, muchas marcas de clientes, cada una viendo una interfaz que parece la suya.
El editor crea el correo. Tu infraestructura lo envía. Mantener esa línea clara es lo que hace que el resto de esta arquitectura sea sencilla.
Etapa 01
El usuario edita; el editor serializa lo que ha construido en un documento de proyecto.
proyecto JSONEtapa 02
Almacena el proyecto contra la cuenta que lo posee y lo renderiza cuando algo pide enviarlo.
Ruta APIEtapa 03
Campos de fusión resueltos, marcado producido — compilado desde MJML si ese es tu formato.
HTML / MJMLEtapa 04
Entregado a la API de envío que ya uses, con su propia entrega y análisis.
ReceptorEjemplos de proveedores que los equipos se lo dan
Mencionados como ejemplos de dónde acaba el marcado, no como integraciones integradas. Ni GrapesJS ni GJS.Market incluyen un conector para ninguno de ellos; llamas a su SDK desde tu propio backend, como ya haces con el resto de tu correo.
Esto es un intercambio arquitectónico, no un marcador. La columna de la derecha dice "depende" honestamente: los editores alojados difieren entre sí y cambian sus términos, y no vamos a inventar una respuesta específica en su nombre.
| Capacidad | GrapesJS autoalojado | Editor de correo electrónico alojado |
|---|---|---|
| Integración de React | Sí — envoltorio @grapesjs/react | Depende del proveedor |
| Autoalojamiento | Sí — paquetes npm incluidos en tu paquete | Depende del proveedor y del plan |
| Propiedad de los datos | Sí — tu base de datos | Depende del proveedor |
| Componentes personalizados | Sí — tus propios tipos de componentes | Depende del proveedor |
| Interfaz personalizada | Sí — viñetas o una instancia sin cabeza | Depende del proveedor |
| Ecosistema de plugins | Sí — 100+ en GJS.Market | Depende del proveedor |
| Tu propio backend | Sí — tus rutas API | Depende del proveedor |
| Licencia principal | BSD-3-Clause | Propietario |
| Bloqueo del proveedor | Más abajo — los datos del proyecto son tuyos | Potencialmente más alto |
La columna GrapesJS se verifica frente a grapesjs 0.23.6 y @grapesjs/react en 2026-09-03. Para comparar con un proveedor específico con nombre, con sus precios publicados, consulta la página dedicada.
Obtén ayuda para construir un constructor de correo React listo para producción en función de los requisitos de tu producto: tus componentes, tu modelo de datos, tu almacenamiento y tu proveedor de envío.
Crea un generador de correo personalizadoEnvía un resumen describiendo tu pila, tu modelo de datos y el formato de salida que necesitas, y recibirás una propuesta con el alcance de la cámara.
Páginas vecinas que llevan al mismo editor en una dirección diferente.
El argumento de formato y entrega: MJML entrado, HTML basado en tablas en línea hacia afuera, entregado a un proveedor por el que ya pagas.
Lee la guíaEl ángulo de la biblioteca de plantillas: gestionar, versionar y reutilizar diseños en todo un equipo.
Ver plantillasEl mismo editor del lado del marketer, donde el gesto importa más que la API.
Ver al constructorEl wrapper de React para la creación de páginas en general, no solo para el correo electrónico.
Ver la integraciónEmpieza con GrapesJS, intégralo en tu aplicación React y amplía el editor con los plugins de correo que tu producto realmente requiere.
Instala los paquetes, monta el componente y ten un editor de correo electrónico funcionando en tu app hoy mismo.
Inicio rápidoPresets, paquetes de bloques, adaptadores de almacenamiento e integraciones de activos — listados reales con precios en vivo.
Explorar pluginsUna integración en producción alrededor de tus componentes, tu modelo de datos y tu proveedor de envío.
Crea un generador de correo personalizadoMás sobre cómo construir editores con GrapesJS: