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.
- package/README.md +63 -19
- package/SKILL.md +173 -0
- package/dist/block-views-builtin.d.ts +6 -0
- package/dist/block-views-builtin.d.ts.map +1 -0
- package/dist/block-views.d.ts +124 -0
- package/dist/block-views.d.ts.map +1 -0
- package/dist/components/builder/canvas.d.ts.map +1 -1
- package/dist/components/builder/editable-block-renderer.d.ts +27 -0
- package/dist/components/builder/editable-block-renderer.d.ts.map +1 -1
- package/dist/components/builder/email-builder.d.ts.map +1 -1
- package/dist/components/builder/field-editors.d.ts +36 -0
- package/dist/components/builder/field-editors.d.ts.map +1 -0
- package/dist/components/builder/nested-block-list.d.ts +8 -0
- package/dist/components/builder/nested-block-list.d.ts.map +1 -0
- package/dist/components/builder/nested-blocks.d.ts +6 -0
- package/dist/components/builder/nested-blocks.d.ts.map +1 -0
- package/dist/components/builder/properties-panel.d.ts +1 -2
- package/dist/components/builder/properties-panel.d.ts.map +1 -1
- package/dist/components/builder/settings-dialog.d.ts +7 -0
- package/dist/components/builder/settings-dialog.d.ts.map +1 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/types.d.ts +45 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/core/blocks.d.ts +19 -6
- package/dist/core/blocks.d.ts.map +1 -1
- package/dist/core/build.d.ts +2 -0
- package/dist/core/build.d.ts.map +1 -0
- package/dist/core/render.d.ts.map +1 -1
- package/dist/footer-presets.d.ts +9 -0
- package/dist/footer-presets.d.ts.map +1 -0
- package/dist/gallery-presets.d.ts +9 -0
- package/dist/gallery-presets.d.ts.map +1 -0
- package/dist/hooks/use-email-builder.d.ts +3 -2
- package/dist/hooks/use-email-builder.d.ts.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29836 -22830
- package/dist/index.js.map +1 -1
- package/dist/list-presets.d.ts +9 -0
- package/dist/list-presets.d.ts.map +1 -0
- package/dist/pricing-presets.d.ts +9 -0
- package/dist/pricing-presets.d.ts.map +1 -0
- package/dist/product-presets.d.ts +9 -0
- package/dist/product-presets.d.ts.map +1 -0
- package/dist/register-builtin-views.d.ts +2 -0
- package/dist/register-builtin-views.d.ts.map +1 -0
- package/dist/store/block-tree.d.ts +18 -0
- package/dist/store/block-tree.d.ts.map +1 -0
- package/dist/store/create-email-builder-store.d.ts +6 -2
- package/dist/store/create-email-builder-store.d.ts.map +1 -1
- package/dist/store/email-builder-provider.d.ts +3 -2
- package/dist/store/email-builder-provider.d.ts.map +1 -1
- package/llms.txt +17 -0
- 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}
|
|
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` (
|
|
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
|
|
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
|
|
109
|
+
#### Bloques disponibles
|
|
99
110
|
|
|
100
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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":"
|
|
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,
|
|
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":"
|
|
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) =>
|
|
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,
|
|
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 @@
|
|
|
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,
|
|
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"}
|