create-email-template 0.1.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +63 -19
  2. package/SKILL.md +173 -0
  3. package/dist/block-views-builtin.d.ts +6 -0
  4. package/dist/block-views-builtin.d.ts.map +1 -0
  5. package/dist/block-views.d.ts +124 -0
  6. package/dist/block-views.d.ts.map +1 -0
  7. package/dist/components/builder/canvas.d.ts.map +1 -1
  8. package/dist/components/builder/editable-block-renderer.d.ts +27 -0
  9. package/dist/components/builder/editable-block-renderer.d.ts.map +1 -1
  10. package/dist/components/builder/email-builder.d.ts.map +1 -1
  11. package/dist/components/builder/field-editors.d.ts +36 -0
  12. package/dist/components/builder/field-editors.d.ts.map +1 -0
  13. package/dist/components/builder/nested-block-list.d.ts +8 -0
  14. package/dist/components/builder/nested-block-list.d.ts.map +1 -0
  15. package/dist/components/builder/nested-blocks.d.ts +6 -0
  16. package/dist/components/builder/nested-blocks.d.ts.map +1 -0
  17. package/dist/components/builder/properties-panel.d.ts +1 -2
  18. package/dist/components/builder/properties-panel.d.ts.map +1 -1
  19. package/dist/components/builder/settings-dialog.d.ts +7 -0
  20. package/dist/components/builder/settings-dialog.d.ts.map +1 -0
  21. package/dist/config/defaults.d.ts.map +1 -1
  22. package/dist/config/types.d.ts +45 -0
  23. package/dist/config/types.d.ts.map +1 -1
  24. package/dist/core/blocks.d.ts +19 -6
  25. package/dist/core/blocks.d.ts.map +1 -1
  26. package/dist/core/build.d.ts +2 -0
  27. package/dist/core/build.d.ts.map +1 -0
  28. package/dist/core/render.d.ts.map +1 -1
  29. package/dist/footer-presets.d.ts +9 -0
  30. package/dist/footer-presets.d.ts.map +1 -0
  31. package/dist/gallery-presets.d.ts +9 -0
  32. package/dist/gallery-presets.d.ts.map +1 -0
  33. package/dist/hooks/use-email-builder.d.ts +3 -2
  34. package/dist/hooks/use-email-builder.d.ts.map +1 -1
  35. package/dist/index.d.ts +10 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +29836 -22830
  38. package/dist/index.js.map +1 -1
  39. package/dist/list-presets.d.ts +9 -0
  40. package/dist/list-presets.d.ts.map +1 -0
  41. package/dist/pricing-presets.d.ts +9 -0
  42. package/dist/pricing-presets.d.ts.map +1 -0
  43. package/dist/product-presets.d.ts +9 -0
  44. package/dist/product-presets.d.ts.map +1 -0
  45. package/dist/register-builtin-views.d.ts +2 -0
  46. package/dist/register-builtin-views.d.ts.map +1 -0
  47. package/dist/store/block-tree.d.ts +18 -0
  48. package/dist/store/block-tree.d.ts.map +1 -0
  49. package/dist/store/create-email-builder-store.d.ts +6 -2
  50. package/dist/store/create-email-builder-store.d.ts.map +1 -1
  51. package/dist/store/email-builder-provider.d.ts +3 -2
  52. package/dist/store/email-builder-provider.d.ts.map +1 -1
  53. package/llms.txt +17 -0
  54. package/package.json +5 -3
package/README.md CHANGED
@@ -4,6 +4,15 @@ Editor visual de plantillas de email por bloques para React: palette, canvas con
4
4
 
5
5
  El JSON que produce se renderiza a HTML email-safe con su compañero [`create-email-renderer`](https://www.npmjs.com/package/create-email-renderer) (**sin React**, pensado para backend/edge). Ambas librerías comparten el mismo core, por lo que el preview del editor y el HTML final nunca divergen.
6
6
 
7
+ ## ¿Programas con una IA o vas a integrarlo?
8
+
9
+ - **[`SKILL.md`](./SKILL.md)** — orientación para agentes: provider, hooks, store, presets, CSS
10
+ obligatorio y errores comunes.
11
+ - **[`llms.txt`](./llms.txt)** — índice corto.
12
+ - **Catálogo de bloques** (core compartido): `node_modules/create-email-renderer/docs/BLOCKS.md`
13
+ — props, defaults, variantes y ejemplos de los 25 bloques.
14
+ - **Guía de MCP**: `node_modules/create-email-renderer/docs/MCP.md`.
15
+
7
16
  ## Instalación
8
17
 
9
18
  ```sh
@@ -38,7 +47,8 @@ export function EditorPage() {
38
47
  ```tsx
39
48
  <EmailBuilderProvider
40
49
  config={{ /* opciones del builder (todas opcionales) */ }}
41
- uploadImage={fnUpload} // opcional: subida de imágenes
50
+ uploadImage={fnUpload} // opcional: subida de imágenes
51
+ uploadFile={fnUploadFile} // opcional: subida de documentos (PDF, DOC, XLS…)
42
52
  autosave={{ /* opcional: autoguardado */ }}
43
53
  >
44
54
  ```
@@ -48,9 +58,10 @@ export function EditorPage() {
48
58
  | Opción | Tipo | Default | Qué hace |
49
59
  |---|---|---|---|
50
60
  | `blockDefaults` | `Partial<Record<Bloque, Partial<Props>>>` | — | Valores iniciales por tipo de bloque. Se aplican **al arrastrar** el bloque al canvas. |
51
- | `blockLibrary` | `BlockDefinition[]` | `DEFAULT_BLOCK_LIBRARY` (12 bloques) | Qué bloques aparecen en la palette y con qué defaultProps. |
61
+ | `blockLibrary` | `BlockDefinition[]` | `DEFAULT_BLOCK_LIBRARY` (26 bloques) | Qué bloques aparecen en la palette y con qué defaultProps. |
52
62
  | `palette` | `Partial<EmailPalette>` | `DEFAULT_PALETTE` | Colores base del tema: `INK` (texto), `DARK` (fondos oscuros), `GOLD` (acentos), `CREAM_DIM` (texto secundario). |
53
- | `defaultSettings` | `Partial<EmailSettings>` | `DEFAULT_SETTINGS` | Fondo de página, grosor y redondeo del borde de la tarjeta. |
63
+ | `defaultSettings` | `Partial<EmailSettings>` | `DEFAULT_SETTINGS` | Fondo de página, grosor/redondeo del borde, tipografía y **archivos** (`files`). |
64
+ | `files` | `Partial<EmailBuilderFileOptions>` | `{ accept, maxSizeMb: 10, maxCount: 10, warnTotalMb: 5 }` | Límites y formatos aceptados al subir archivos en Ajustes. |
54
65
  | `variables` | `EmailVariable[]` | `DEFAULT_VARIABLES` | Etiquetas `{key}` disponibles para el usuario. |
55
66
  | `variableSections` | `EmailVariableSection[]` | agrupación única | Agrupa las variables por categoría en el dialog "Etiquetas disponibles". |
56
67
  | `sampleContext` | `EmailContext` | `SAMPLE_CONTEXT` | Datos de ejemplo: al previsualizar, `{firstName}` se ve como el valor de aquí. |
@@ -95,24 +106,20 @@ export function EditorPage() {
95
106
  >
96
107
  ```
97
108
 
98
- #### Bloques disponibles y sus props
109
+ #### Bloques disponibles
99
110
 
100
- Todos los bloques aceptan `align` ("left" | "center" | "right"), `backgroundColor`, `paddingY` y `paddingX`.
111
+ **26 bloques**: `header`, `hero`, `heading`, `text`, `list`, `button`, `image`, `quote`,
112
+ `columns`, `container`, `grid`, `divider`, `spacer`, `footer`, `social`, `gallery`, `stats`,
113
+ `pricing`, `product`, `checkout`, `downloads`, `testimonial`, `features`, `avatar`, `code` y
114
+ `link`. Muchos tienen **variantes** (`list`, `footer`, `pricing`, `gallery`, `product`).
101
115
 
102
- | Tipo | Props específicas |
103
- |---|---|
104
- | `header` | `brandName`, `tagline?`, `logoUrl?` |
105
- | `hero` | `title`, `subtitle?`, `imageUrl?` |
106
- | `heading` | `text`, `size?`, `color?` |
107
- | `text` | `text`, `size?`, `color?` |
108
- | `list` | `items: string[]`, `icon?` ("✓", "•", "→"…) |
109
- | `button` | `label`, `href` (acepta variables), `backgroundColor?`, `color?`, `blockBackgroundColor?` |
110
- | `image` | `src`, `alt?`, `width?`, `href?` (si hay `href`, la imagen es clicable) |
111
- | `quote` | `text`, `author?`, `borderColor?`, `borderWidth?`, `marginLeft?` |
112
- | `columns` | `columns: { id: string; text: string }[]` |
113
- | `divider` | `color?`, `height?` |
114
- | `spacer` | `height?`, `backgroundColor?` |
115
- | `footer` | `text?`, `brandName?`, `backgroundColor?` |
116
+ Todos aceptan `align`, `backgroundColor`, `paddingY`/`paddingX` (+ overrides por lado),
117
+ `marginTop`/`marginBottom` y `gap`.
118
+
119
+ 📖 Props, defaults, variantes y ejemplos de cada uno: el catálogo del core,
120
+ [`create-email-renderer/docs/BLOCKS.md`](../create-email-renderer/docs/BLOCKS.md) (desde npm:
121
+ `node_modules/create-email-renderer/docs/BLOCKS.md`). Es la **única fuente de verdad** y viaja
122
+ con el paquete del renderer.
116
123
 
117
124
  ### `uploadImage`
118
125
 
@@ -128,6 +135,43 @@ uploadImage={async (file: File) => {
128
135
  }}
129
136
  ```
130
137
 
138
+ ### `uploadFile`
139
+
140
+ Se invoca cuando el usuario sube un documento desde **Ajustes** (el engranaje del lienzo). Recibe
141
+ el `File` y debe devolver la **URL pública** donde quedó alojado: el destinatario la usa para
142
+ descargar y tu backend para adjuntarlo al enviar.
143
+
144
+ ```tsx
145
+ uploadFile={async (file: File) => {
146
+ const form = new FormData();
147
+ form.append("file", file);
148
+ const res = await fetch("/api/uploads", { method: "POST", body: form });
149
+ const { url } = await res.json();
150
+ return url; // URL pública (R2, S3, tu API…)
151
+ }}
152
+ ```
153
+
154
+ Los archivos quedan en `settings.files` del payload y el bloque **`downloads`** los lista en el
155
+ correo. Cada archivo tiene dos interruptores:
156
+
157
+ | Interruptor | Campo | Para qué |
158
+ |---|---|---|
159
+ | **Adjuntar** | `attach` | Que tu ESP lo adjunte al enviar (el HTML no adjunta nada). |
160
+ | **Enlace** | `link` | Que aparezca en el bloque `downloads` (default `true`). |
161
+
162
+ Contrato del backend:
163
+
164
+ ```ts
165
+ const { content, settings } = parseTemplatePayload(template.payload);
166
+ const attachments = settings.files
167
+ .filter((f) => f.attach)
168
+ .map((f) => ({ filename: f.name, path: f.url })); // p. ej. Resend/SES
169
+ const { html, subject } = await renderTemplateEmail({ subject, payload: template.payload, context });
170
+ ```
171
+
172
+ > Sin `uploadFile` la librería usa `URL.createObjectURL` (blob local) para que puedas probar el
173
+ > editor: sirve para previsualizar, **no** para un correo real.
174
+
131
175
  ---
132
176
 
133
177
  ## Autoguardado (`autosave`) y guardado manual
package/SKILL.md ADDED
@@ -0,0 +1,173 @@
1
+ ---
2
+ name: create-email-template
3
+ description: React email template builder UI (drag & drop editor with autosave) backed by create-email-renderer
4
+ licence: MIT
5
+ metadata:
6
+ author: asmel2020
7
+ version: 1.0.0
8
+ ---
9
+
10
+ # Skill: `create-email-template`
11
+
12
+ Editor visual de plantillas de email para React. Se apoya en `create-email-renderer` (el core sin
13
+ React) para tipos, defaults, normalización y el HTML final → **el preview del editor y el HTML
14
+ del back-end nunca divergen**.
15
+
16
+ - 📖 Catálogo de bloques, props y defaults: [`create-email-renderer/docs/BLOCKS.md`](../create-email-renderer/docs/BLOCKS.md)
17
+ - 🔌 Exponer un MCP en el back-end: [`create-email-renderer/docs/MCP.md`](../create-email-renderer/docs/MCP.md)
18
+
19
+ > Instalado desde npm, el catálogo vive en
20
+ > `node_modules/create-email-renderer/docs/BLOCKS.md`.
21
+
22
+ ---
23
+
24
+ ## Cuándo usar esto
25
+
26
+ - Meter un editor de correos en tu app (drag & drop, panel de propiedades, undo, autosave).
27
+ - Cargar una plantilla guardada para editarla y volver a guardarla.
28
+ - Reusar el **payload** (`{ content, settings }`) que tu back-end renderiza con
29
+ `create-email-renderer`.
30
+
31
+ ## Instalación y CSS (importante)
32
+
33
+ ```sh
34
+ npm install create-email-template create-email-renderer
35
+ ```
36
+
37
+ ```tsx
38
+ import { EmailBuilderProvider, EmailBuilder } from "create-email-template";
39
+ import "create-email-template/style.css"; // ← OBLIGATORIO
40
+ ```
41
+
42
+ El CSS es **autocontenido** (fuente Geist inline) y está **scopeado bajo `.ter-theme`**. El
43
+ consumidor debe importarlo explícitamente; sin él, el editor se ve sin estilos.
44
+
45
+ ## Uso mínimo
46
+
47
+ ```tsx
48
+ <EmailBuilderProvider
49
+ config={{ variables: [{ key: "firstName", label: "Nombre" }] }}
50
+ autosave={{ onSave: async (payload) => { await api.put(`/templates/${id}`, payload); } }}
51
+ >
52
+ <EmailBuilder />
53
+ </EmailBuilderProvider>
54
+ ```
55
+
56
+ `onSave` recibe el payload `{ content, settings }`; la librería **no** hace red.
57
+
58
+ ## API pública
59
+
60
+ ### Componentes
61
+
62
+ | Componente | Para qué |
63
+ |---|---|
64
+ | `EmailBuilder` | Editor completo (paleta + canvas + panel). |
65
+ | `BlockPalette` | Paleta de bloques suelta. |
66
+ | `Canvas` / `SortableCanvas` | Lienzo con drag & drop. |
67
+ | `EditableBlockRenderer` | Render editable de un bloque concreto. |
68
+ | `PropertiesPanel` | Panel de propiedades schema-driven. |
69
+ | `InlineTextEditor`, `SelectionToolbar`, `VariablesInfoDialog`, `SettingsDialog` | Piezas internas reutilizables (el dialog de Ajustes gestiona tipografía, fondo y archivos). |
70
+
71
+ ### Hooks (siempre dentro de `<EmailBuilderProvider>`)
72
+
73
+ | Hook | Devuelve |
74
+ |---|---|
75
+ | `useRenderEmail()` | `{ getPayload, renderHtml, getHtml, resolve, html, isPending, setHtml }` |
76
+ | `useAutosaveStatus()` | `{ isSaving, lastSavedAt, lastError, lastResult, saveNow }` |
77
+ | `useEmailBuilderStore(selector)` | Estado/acciones con selector. |
78
+ | `useEmailBuilderStoreInstance()` | Instancia vanilla del store (`getState`/`setState`/`subscribe`). |
79
+ | `useEmailBuilderConfig()` | Config resuelta. |
80
+
81
+ ### Store
82
+
83
+ Estado: `blocks, selectedId, settings, dirty, propertiesOpen, past`.
84
+ Acciones: `addBlock(type, index?, location?)`, `removeBlock`, `duplicateBlock`,
85
+ `updateBlockProps`, `reorder(a, b, location?)`, `moveBlock`, `setSettings`, `select`,
86
+ `setPropertiesOpen`, `hydrate({ blocks, settings? })`, `markSaved`, `getPayload`, `undo`.
87
+
88
+ ### Provider (`EmailBuilderConfig`)
89
+
90
+ `variables`, `variableSections`, `blockLibrary`, `blockDefaults`, `palette`, `defaultSettings`,
91
+ `sampleContext`, `files`, `labels`, `historyLimit` (default 50). `autosave` recibe
92
+ `{ onSave, intervalMs (10s), enabled, onSaved }`; `uploadImage` sube imágenes y `uploadFile`
93
+ sube documentos (PDF, DOC, XLS…).
94
+
95
+ ### Archivos descargables (`uploadFile` + `settings.files`)
96
+
97
+ El usuario sube archivos en **Ajustes** (el engranaje del lienzo). Quedan en
98
+ `settings.files` del payload y el bloque `downloads` los lista en el correo:
99
+
100
+ ```tsx
101
+ <EmailBuilderProvider
102
+ uploadFile={async (file) => {
103
+ const form = new FormData();
104
+ form.append("file", file);
105
+ const res = await fetch("/api/uploads", { method: "POST", body: form });
106
+ const { url } = await res.json();
107
+ return url; // URL PÚBLICA: el destinatario la descarga y tu backend la adjunta
108
+ }}
109
+ config={{ files: { maxSizeMb: 10, maxCount: 10, warnTotalMb: 5 } }} // opcional
110
+ >
111
+ ```
112
+
113
+ - Cada archivo lleva dos interruptores: **Adjuntar** (`attach`, lo resuelve tu ESP al enviar) y
114
+ **Enlace** (`link`, aparece en el bloque `downloads`). Defaults: `link: true`, `attach: false`.
115
+ - Sin `uploadFile`, la demo usa `URL.createObjectURL` (blob local): sirve para previsualizar,
116
+ **no** para un correo real.
117
+ - Tu backend lee los adjuntos del payload:
118
+ `settings.files.filter((f) => f.attach).map((f) => ({ filename: f.name, path: f.url }))`.
119
+
120
+ ## Flujos típicos
121
+
122
+ ### Cargar una plantilla del backend
123
+
124
+ ```ts
125
+ const { json } = await api.get(`/templates/${id}`);
126
+ store.hydrate({ blocks: json.content, settings: json.settings }); // normaliza y reinicia el undo
127
+ ```
128
+
129
+ ### Guardar
130
+
131
+ ```ts
132
+ const payload = store.getPayload(); // { content, settings }
133
+ await api.put(`/templates/${id}`, payload); // tu backend lo renderiza con create-email-renderer
134
+ ```
135
+
136
+ ### Forzar guardado (botón manual)
137
+
138
+ ```ts
139
+ const { saveNow } = useAutosaveStatus();
140
+ await saveNow();
141
+ ```
142
+
143
+ ## Cómo extender
144
+
145
+ - **Bloques nuevos de UI** (preview + editable + campos): registra una vista con `registerBlockViews`
146
+ (`block-views.ts`) y el render del backend con `registerBlock` en `create-email-renderer`.
147
+ - **Recetas de variantes** (estilos de un bloque): un archivo `*-presets.ts` con `{ value, label, build() }`
148
+ que el panel consume con el kind `preset`.
149
+ - **Kinds del panel** (`BlockFieldDef`): `text, richText, number, color, align, select, layout,
150
+ preset, image, icons, hint, row, group, stringList, repeat, custom`; los `group` aceptan
151
+ `visibleWhen: { key, equals }` para mostrar solo la sección de la variante activa.
152
+ - **Labels**: todo texto de UI pasa por `labels` (`EmailBuilderLabels`) para i18n.
153
+
154
+ ## Reglas de oro
155
+
156
+ 1. **Core compartido en el renderer**: `src/core/*` son shims de una línea hacia
157
+ `create-email-renderer`. No dupliques tipos ni defaults aquí.
158
+ 2. **Nunca externalices** más de `react`, `react-dom` y `use-sync-external-store`.
159
+ 3. **CSS**: todo bajo `.ter-theme`/`ter-*`; los portales (dialog/sheet/toolbar) también. Un
160
+ selector global rompe la app del consumidor.
161
+ 4. **No expongas un entry `/server`**: el back-end usa el renderer.
162
+
163
+ ## Errores comunes
164
+
165
+ | Síntoma | Causa |
166
+ |---|---|
167
+ | El editor se ve sin estilos | Falta `import "create-email-template/style.css"`. |
168
+ | Un hook lanza "outside provider" | Está fuera de `<EmailBuilderProvider>`. |
169
+ | Estilos raros en tu app | Un selector del CSS de la lib no está scopeado (`check:css-scope` lo vigila). |
170
+ | El canvas muestra una versión vieja | Caché del dev server: borra `node_modules/.vite` y reinicia. |
171
+ | `dirty` no baja | Solo `markSaved()` (autosave o manual) lo limpia. |
172
+ | El bloque de descargas no muestra nada | No hay archivos en Ajustes con el interruptor **Enlace** activo. |
173
+ | El archivo no llega adjunto | El HTML no adjunta: tu backend debe leer `settings.files` con `attach: true`. |
@@ -0,0 +1,6 @@
1
+ import type { BlockFieldDef, BlockViewRegistration } from "./block-views";
2
+ /** Editables built-in por tipo — registrados junto a los Preview. */
3
+ export declare const BUILTIN_EDITABLES: Record<string, BlockViewRegistration["Editable"]>;
4
+ export declare const BUILTIN_FIELDS: Record<string, BlockFieldDef[]>;
5
+ export declare const RICH_INLINE_TYPES: Set<string>;
6
+ //# sourceMappingURL=block-views-builtin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-views-builtin.d.ts","sourceRoot":"","sources":["../src/block-views-builtin.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAmqBzE,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,MAAM,EACN,qBAAqB,CAAC,UAAU,CAAC,CA4BlC,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CA2B1D,CAAA;AAED,eAAO,MAAM,iBAAiB,aAO5B,CAAA"}
@@ -0,0 +1,124 @@
1
+ import type * as React from "react";
2
+ import type { EmailBlock, EmailContext, EmailPalette } from "./core/types";
3
+ import type { EmailBuilderLabels } from "./config/types";
4
+ export interface BlockPreviewProps {
5
+ props: any;
6
+ context: EmailContext;
7
+ palette: EmailPalette;
8
+ }
9
+ export interface BlockEditableProps {
10
+ block: EmailBlock;
11
+ props: any;
12
+ set: (patch: Record<string, unknown>) => void;
13
+ palette: EmailPalette;
14
+ labels: EmailBuilderLabels;
15
+ }
16
+ export interface BlockFieldsProps {
17
+ block: EmailBlock;
18
+ props: any;
19
+ set: (patch: Record<string, unknown>) => void;
20
+ labels: EmailBuilderLabels;
21
+ }
22
+ export type BlockFieldDef = {
23
+ kind: "text";
24
+ key: string;
25
+ label: string;
26
+ } | {
27
+ kind: "richText";
28
+ key: string;
29
+ label: string;
30
+ placeholder?: string;
31
+ } | {
32
+ kind: "number";
33
+ key: string;
34
+ label: string;
35
+ min?: number;
36
+ default?: number;
37
+ } | {
38
+ kind: "color";
39
+ key: string;
40
+ label: string;
41
+ fallback?: string;
42
+ } | {
43
+ kind: "align";
44
+ key: string;
45
+ label: string;
46
+ } | {
47
+ kind: "select";
48
+ key: string;
49
+ label: string;
50
+ options: {
51
+ value: string | boolean | number;
52
+ label: string;
53
+ }[];
54
+ } | {
55
+ kind: "layout";
56
+ key: string;
57
+ label: string;
58
+ options: {
59
+ value: string;
60
+ label: string;
61
+ widths: number[];
62
+ }[];
63
+ } | {
64
+ kind: "preset";
65
+ key: string;
66
+ label: string;
67
+ options: {
68
+ value: string;
69
+ label: string;
70
+ build: () => Record<string, unknown>;
71
+ }[];
72
+ } | {
73
+ kind: "image";
74
+ key: string;
75
+ } | {
76
+ kind: "icons";
77
+ key: string;
78
+ label: string;
79
+ options: readonly string[];
80
+ } | {
81
+ kind: "hint";
82
+ labelKey: keyof EmailBuilderLabels;
83
+ } | {
84
+ kind: "row";
85
+ fields: [BlockFieldDef, BlockFieldDef?];
86
+ } | {
87
+ kind: "group";
88
+ label: string;
89
+ fields: BlockFieldDef[];
90
+ /** Muestra el grupo solo si `props[key]` coincide con `equals`. */
91
+ visibleWhen?: {
92
+ key: string;
93
+ equals: string | boolean | number | (string | boolean | number)[];
94
+ };
95
+ } | {
96
+ kind: "stringList";
97
+ key: string;
98
+ label: string;
99
+ placeholder?: string;
100
+ } | {
101
+ kind: "repeat";
102
+ key: string;
103
+ label: string;
104
+ itemLabel: string;
105
+ /** No numera las filas ("Plan" en vez de "Plan 1"). */
106
+ hideIndex?: boolean;
107
+ fields: BlockFieldDef[];
108
+ } | {
109
+ kind: "custom";
110
+ id: string;
111
+ };
112
+ export interface BlockViewRegistration {
113
+ type: string;
114
+ Preview?: React.ComponentType<BlockPreviewProps>;
115
+ Editable?: React.ComponentType<BlockEditableProps>;
116
+ fields?: BlockFieldDef[];
117
+ /** Muestra el hint de edición inline en el panel. */
118
+ richInline?: boolean;
119
+ }
120
+ export declare const registerBlockViews: (registration: BlockViewRegistration) => void;
121
+ export declare const unregisterBlockViews: (type: string) => void;
122
+ export declare const getBlockView: (type: string) => BlockViewRegistration | undefined;
123
+ export declare const listBlockViews: () => BlockViewRegistration[];
124
+ //# sourceMappingURL=block-views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-views.d.ts","sourceRoot":"","sources":["../src/block-views.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/components/builder/canvas.tsx"],"names":[],"mappings":"AA6BA,eAAO,MAAM,cAAc,GAAI,cAE5B;IACD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,gCA+NA,CAAC"}
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/components/builder/canvas.tsx"],"names":[],"mappings":"AA4BA,eAAO,MAAM,cAAc,GAAI,cAE5B;IACD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,gCAsJA,CAAC"}
@@ -1,7 +1,34 @@
1
1
  import { type EmailBlock } from "../../core/types";
2
+ import { type BlockEditableProps } from "../../block-views";
2
3
  interface Props {
3
4
  block: EmailBlock;
4
5
  }
6
+ export declare const EditableHeader: ({ props, set, palette, }: BlockEditableProps) => import("react").JSX.Element;
7
+ export declare const EditableHero: ({ props, set, palette }: BlockEditableProps) => import("react").JSX.Element;
8
+ export declare const EditableHeading: ({ props, set, palette }: BlockEditableProps) => import("react").JSX.Element;
9
+ export declare const EditableText: ({ props, set, palette }: BlockEditableProps) => import("react").JSX.Element;
10
+ export declare const EditableList: ({ props, set, palette, labels }: BlockEditableProps) => import("react").JSX.Element;
11
+ export declare const EditableButton: ({ props, set, palette }: BlockEditableProps) => import("react").JSX.Element;
12
+ export declare const EditableImage: ({ props, palette, labels, }: BlockEditableProps) => import("react").JSX.Element;
13
+ export declare const EditableQuote: ({ props, set, palette, labels }: BlockEditableProps) => import("react").JSX.Element;
14
+ export declare const EditableDivider: ({ props }: BlockEditableProps) => import("react").JSX.Element;
15
+ export declare const EditableSpacer: ({ props }: BlockEditableProps) => import("react").JSX.Element;
16
+ export declare const EditableSocial: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
17
+ export declare const EditableGallery: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
18
+ export declare const EditableStats: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
19
+ export declare const EditablePricing: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
20
+ export declare const EditableCheckout: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
21
+ export declare const EditableProduct: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
22
+ export declare const EditableTestimonial: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
23
+ export declare const EditableFeatures: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
24
+ export declare const EditableAvatar: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
25
+ export declare const EditableCode: ({ props }: BlockEditableProps) => import("react").JSX.Element;
26
+ export declare const EditableLink: ({ props, palette }: BlockEditableProps) => import("react").JSX.Element;
27
+ /**
28
+ * Lista de archivos descargables. Los archivos NO se editan aquí: se suben en
29
+ * Ajustes (`settings.files`); el lienzo solo replica el diseño final.
30
+ */
31
+ export declare const EditableDownloads: ({ props, palette, labels, }: BlockEditableProps) => import("react").JSX.Element;
5
32
  export declare const EditableBlockRenderer: ({ block }: Props) => import("react").JSX.Element | null;
6
33
  export {};
7
34
  //# sourceMappingURL=editable-block-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"editable-block-renderer.d.ts","sourceRoot":"","sources":["../../../src/components/builder/editable-block-renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAUlD,UAAU,KAAK;IACb,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,eAAO,MAAM,qBAAqB,GAAI,WAAW,KAAK,uCAycrD,CAAA"}
1
+ {"version":3,"file":"editable-block-renderer.d.ts","sourceRoot":"","sources":["../../../src/components/builder/editable-block-renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,kBAAkB,CAAA;AAgBrE,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,UAAU,KAAK;IACb,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,eAAO,MAAM,cAAc,GAAI,0BAI5B,kBAAkB,gCA+CpB,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,yBAAyB,kBAAkB,gCAqCvE,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,yBAAyB,kBAAkB,gCAyB1E,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,yBAAyB,kBAAkB,gCAwBvE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,iCAAiC,kBAAkB,gCAsP/E,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,yBAAyB,kBAAkB,gCAwCzE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,6BAI3B,kBAAkB,gCAuCpB,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,iCAAiC,kBAAkB,gCAuChF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,WAAW,kBAAkB,gCAe5D,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,WAAW,kBAAkB,gCAO3D,CAAA;AAwBD,eAAO,MAAM,cAAc,GAAI,oBAAoB,kBAAkB,gCAgDpE,CAAA;AA8CD,eAAO,MAAM,eAAe,GAAI,oBAAoB,kBAAkB,gCAqErE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,oBAAoB,kBAAkB,gCAsBnE,CAAA;AAyKD,eAAO,MAAM,eAAe,GAAI,oBAAoB,kBAAkB,gCAkErE,CAAA;AAiND,eAAO,MAAM,gBAAgB,GAAI,oBAAoB,kBAAkB,gCAoFtE,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,oBAAoB,kBAAkB,gCAKrE,CAAA;AA4CD,eAAO,MAAM,mBAAmB,GAAI,oBAAoB,kBAAkB,gCAiCzE,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,oBAAoB,kBAAkB,gCA8BtE,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,oBAAoB,kBAAkB,gCAmCpE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,WAAW,kBAAkB,gCAmBzD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,oBAAoB,kBAAkB,gCAalE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,6BAI/B,kBAAkB,gCAsHpB,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,WAAW,KAAK,uCAuBrD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"email-builder.d.ts","sourceRoot":"","sources":["../../../src/components/builder/email-builder.tsx"],"names":[],"mappings":"AAgCA,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,YAAY,GAAI,eAAe,iBAAiB,gCA6M5D,CAAA"}
1
+ {"version":3,"file":"email-builder.d.ts","sourceRoot":"","sources":["../../../src/components/builder/email-builder.tsx"],"names":[],"mappings":"AAiCA,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,YAAY,GAAI,eAAe,iBAAiB,gCA8M5D,CAAA"}
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import type { BlockFieldDef } from "../../block-views";
3
+ import type { EmailBuilderLabels } from "../../config/types";
4
+ export declare const Field: ({ label, children, }: {
5
+ label: string;
6
+ children: React.ReactNode;
7
+ }) => React.JSX.Element;
8
+ export declare const InlineHint: ({ text }: {
9
+ text: string;
10
+ }) => React.JSX.Element;
11
+ export declare const TextEdit: ({ label, value, onChange, }: {
12
+ label: string;
13
+ value: string;
14
+ onChange: (v: string) => void;
15
+ }) => React.JSX.Element;
16
+ export declare const AlignEdit: ({ value, onChange, }: {
17
+ value: string;
18
+ onChange: (v: "left" | "center" | "right") => void;
19
+ }) => React.JSX.Element;
20
+ export declare const ColorEdit: ({ value, onChange, }: {
21
+ value: string;
22
+ onChange: (v: string) => void;
23
+ }) => React.JSX.Element;
24
+ export declare const ImageEdit: ({ value, onChange, }: {
25
+ value: string;
26
+ onChange: (v: string) => void;
27
+ }) => React.JSX.Element;
28
+ export interface FieldsRendererProps {
29
+ props: any;
30
+ set: (patch: Record<string, unknown>) => void;
31
+ labels: EmailBuilderLabels;
32
+ fields: BlockFieldDef[];
33
+ }
34
+ /** Resuelve un schema de campos a controles concretos. */
35
+ export declare const FieldsRenderer: ({ props, set, labels, fields, }: FieldsRendererProps) => React.JSX.Element;
36
+ //# sourceMappingURL=field-editors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-editors.d.ts","sourceRoot":"","sources":["../../../src/components/builder/field-editors.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA2B,MAAM,OAAO,CAAA;AAS/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,eAAO,MAAM,KAAK,GAAI,sBAGnB;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,sBAOA,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,UAAU;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,sBAKpD,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,6BAItB;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,sBAOA,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,sBAGvB;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAA;CACnD,sBAeA,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,sBAGvB;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,sBAcA,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,sBAGvB;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,sBAkEA,CAAA;AAED,MAAM,WAAW,mBAAmB;IAElC,KAAK,EAAE,GAAG,CAAA;IACV,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC7C,MAAM,EAAE,kBAAkB,CAAA;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAA;CACxB;AAED,0DAA0D;AAC1D,eAAO,MAAM,cAAc,GAAI,iCAK5B,mBAAmB,sBAgVrB,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { type BlockLocation } from "../../store/block-tree";
2
+ interface Props {
3
+ location: BlockLocation;
4
+ emptyLabel?: string;
5
+ }
6
+ export declare const NestedBlockList: ({ location, emptyLabel }: Props) => import("react").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=nested-block-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-block-list.d.ts","sourceRoot":"","sources":["../../../src/components/builder/nested-block-list.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGtF,UAAU,KAAK;IACb,QAAQ,EAAE,aAAa,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,eAAO,MAAM,eAAe,GAAI,0BAA0B,KAAK,gCA6F9D,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { BlockEditableProps } from "../../block-views";
2
+ export declare const EditableContainer: ({ block, props, }: BlockEditableProps) => import("react").JSX.Element;
3
+ export declare const EditableGrid: ({ block, props }: BlockEditableProps) => import("react").JSX.Element;
4
+ export declare const EditableColumns: ({ block, props, }: BlockEditableProps) => import("react").JSX.Element;
5
+ export declare const EditableFooter: ({ block, props, set, palette, }: BlockEditableProps) => import("react").JSX.Element;
6
+ //# sourceMappingURL=nested-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-blocks.d.ts","sourceRoot":"","sources":["../../../src/components/builder/nested-blocks.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAI3D,eAAO,MAAM,iBAAiB,GAAI,mBAG/B,kBAAkB,gCAcpB,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,kBAAkB,kBAAkB,gCA+BhE,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,mBAG7B,kBAAkB,gCAuBpB,CAAA;AAID,eAAO,MAAM,cAAc,GAAI,iCAK5B,kBAAkB,gCA4DpB,CAAA"}
@@ -1,8 +1,7 @@
1
- import React from "react";
2
1
  import { type EmailBlock } from "../../core/types";
3
2
  interface Props {
4
3
  block: EmailBlock;
5
4
  }
6
- export declare const PropertiesPanel: ({ block }: Props) => React.JSX.Element;
5
+ export declare const PropertiesPanel: ({ block }: Props) => import("react").JSX.Element;
7
6
  export {};
8
7
  //# sourceMappingURL=properties-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"properties-panel.d.ts","sourceRoot":"","sources":["../../../src/components/builder/properties-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA2B,MAAM,OAAO,CAAA;AAI/C,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,kBAAkB,CAAA;AAyK9D,UAAU,KAAK;IACb,KAAK,EAAE,UAAU,CAAA;CAClB;AAYD,eAAO,MAAM,eAAe,GAAI,WAAW,KAAK,sBA0U/C,CAAA"}
1
+ {"version":3,"file":"properties-panel.d.ts","sourceRoot":"","sources":["../../../src/components/builder/properties-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAKlD,UAAU,KAAK;IACb,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,eAAO,MAAM,eAAe,GAAI,WAAW,KAAK,gCA4C/C,CAAA"}
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ open: boolean;
3
+ onOpenChange: (open: boolean) => void;
4
+ }
5
+ export declare const SettingsDialog: ({ open, onOpenChange }: Props) => import("react").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=settings-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/builder/settings-dialog.tsx"],"names":[],"mappings":"AAwCA,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACtC;AA8DD,eAAO,MAAM,cAAc,GAAI,wBAAwB,KAAK,gCAuU3D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAEV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAejB,eAAO,MAAM,yBAAyB,GACpC,SAAS,kBAAkB,KAC1B,0BAyCF,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAEV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAejB,eAAO,MAAM,yBAAyB,GACpC,SAAS,kBAAkB,KAC1B,0BA0CF,CAAC"}