@emailmaker/emailmaker 1.0.116 → 1.0.117-alpha.1

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 (38) hide show
  1. package/README.md +275 -109
  2. package/asset-manifest.json +27 -27
  3. package/emailmaker-esm.js +1 -1
  4. package/emailmaker.d.ts +235 -38
  5. package/emailmaker.js +1 -1
  6. package/iframe/429.js +1 -1
  7. package/iframe/766.js +1 -1
  8. package/iframe/iframe-eblock.3b8240bd8d75c6ee2a77.html +1 -0
  9. package/iframe/iframe.3b8240bd8d75c6ee2a77.html +1 -0
  10. package/iframe/index.html +1 -1
  11. package/iframe/js/525.7e478fc1.js +1 -0
  12. package/iframe/js/667.4d0450c5.js +1 -0
  13. package/iframe/js/882.46943f9a.js +1 -0
  14. package/iframe/sandbox-eblock.js +1 -1
  15. package/package.json +1 -1
  16. package/static/css/{369.d740f134.chunk.css → 5072.f959228f.chunk.css} +2 -2
  17. package/static/css/{main.8c8bed31.css → main.f5e75ca4.css} +2 -2
  18. package/static/js/{1902.9e9ca2af.js → 1902.fa7e9fe6.js} +3 -3
  19. package/static/js/{2854.10396f08.js → 2854.95e1c8d0.js} +2 -2
  20. package/static/js/5072.e5ce1614.js +3 -0
  21. package/static/js/598.61e6a78a.js +2 -0
  22. package/static/js/8430.12bfa59b.js +2 -0
  23. package/static/js/{8580.4f3e7c56.js → 8580.47fa4f83.js} +2 -2
  24. package/static/js/{8727.97602af2.js → 8727.ef480f4b.js} +2 -2
  25. package/static/js/{emailmaker_core.d07551cd.js → emailmaker_core.1f145e15.js} +2 -2
  26. package/iframe/iframe-eblock.612f5e3292f38c64ed91.html +0 -1
  27. package/iframe/iframe.612f5e3292f38c64ed91.html +0 -1
  28. package/iframe/js/525.5461ecf3.js +0 -1
  29. package/iframe/js/667.25c21b63.js +0 -1
  30. package/iframe/js/882.de4b06e1.js +0 -1
  31. package/static/js/369.05739401.js +0 -3
  32. package/static/js/5215.a9897c36.js +0 -2
  33. package/static/js/6438.78acfa4a.js +0 -2
  34. /package/iframe/js/{525.5461ecf3.js.LICENSE.txt → 525.7e478fc1.js.LICENSE.txt} +0 -0
  35. /package/iframe/js/{667.25c21b63.js.LICENSE.txt → 667.4d0450c5.js.LICENSE.txt} +0 -0
  36. /package/iframe/js/{882.de4b06e1.js.LICENSE.txt → 882.46943f9a.js.LICENSE.txt} +0 -0
  37. /package/static/js/{1902.9e9ca2af.js.LICENSE.txt → 1902.fa7e9fe6.js.LICENSE.txt} +0 -0
  38. /package/static/js/{369.05739401.js.LICENSE.txt → 5072.e5ce1614.js.LICENSE.txt} +0 -0
package/README.md CHANGED
@@ -4,59 +4,125 @@
4
4
 
5
5
  # Установка
6
6
 
7
- Выполните этот код в командной строке:
7
+ Установите пакет из npm:
8
8
 
9
- ```cmd
10
- $ npm i @emailmaker/emailmaker@1.0.116 -save
9
+ ```bash
10
+ npm install @emailmaker/emailmaker@1.0.117-alpha.1
11
11
  ```
12
12
 
13
- Добавьте EmailMaker plugin в ваш App config.
13
+ ### Полезные ссылки
14
14
 
15
- ### Для сборщика Webpack
15
+ - Каталог пакета на npm: [@emailmaker/emailmaker](https://www.npmjs.com/package/@emailmaker/emailmaker)
16
+ - Справка на сайте EmailMaker: [Подключение редактора](https://emailmaker.ru/docs/help/plugin/connecting-the-editor/)
16
17
 
17
- Импорт пакета:
18
+ Добавьте плагин сборки EmailMaker в конфигурацию приложения (он копирует статику пакета и задаёт **`EmailmakerEnvironment.publicPath`** для загрузки чанков). Без Webpack/Vite-плагина вручную нужно обеспечить корректный базовый путь к бандлу.
18
19
 
19
- ```javascript
20
- const emailMakerPlugin = require('@emailmaker/emailmaker/webpack');
21
- ```
20
+ ## Чеклист для агентов и автоматизации
21
+
22
+ Используйте таблицу при генерации кода интеграции или ревью. Источник типов — **`emailmaker.d.ts`** в пакете (**`ExportedApi`**); не подставляйте вымышленные поля API.
23
+
24
+ Подробнее о том, как в `.d.ts` сливаются **`ExportedApi.Options` / `Instance`**, что такое **`AppEvent`** и **`SaveEventPayload`**, и как читать исключения (**`handleSubjectChanged`** и др.): в репозитории EmailMaker — **`docs/plugin-types-agents.md`**.
25
+
26
+ | Правило | Детали |
27
+ | --- | --- |
28
+ | **`init`** | Обязательно **`content`**. Сигнатура: **`init(options)` → `Promise<Instance>`**. |
29
+ | Namespace vs **instance** | У модуля **`emailmaker`** — в основном **`init`** (+ именованные ESM-экспорты). **`setConfig`**, **`show`**, **`save`**, **`destroy`** — у **экземпляра** после **`init`**. |
30
+ | Повтор на том же DOM | Повторный **`init`** на тот же узел ведёт к **`reset`** — не запускайте два параллельных **`init`** на один контейнер. |
31
+ | События | **`instance.handle*(…)`** обычно возвращает **отписку**. **`handleSubjectChanged`** / **`handlePreheaderChanged`** — другая сигнатура (см. типы). |
32
+ | Async | Колбэки и **`getAuthToken`** могут быть **`async`**; ошибки — через **`handleError`** или свою логику. |
33
+ | Сборка | Без штатного плагина Webpack/Vite задайте **`publicPath`** (**`EmailmakerEnvironment`**). Бандл крупный (React, Monaco и др.). |
34
+ | Авторизация | **`getAuthToken`** или **`jwtAuth`**; **`client_secret`** только на сервере. |
35
+ | Файловый менеджер | **`storageProvider`**, **`config.imageCenterFileManagerView: true`**, при необходимости секция **`config.fileManager`** (**`ExportedApi.FileManagerOptions`**). Контракт **`StorageProvider`** объёмен — сверяйтесь с типами. |
36
+ | **`baseUrl`** | Базовый URL API приложения (**`AppInitMixin`**), если бэкенд не стандартный. |
37
+ | **`standaloneKey`** | Режимы с прокси файлов через события (см. код плагина); редкие сценарии. |
38
+ | **`commonStyles`** | Опционально на **`init` / `reset`**: объект стилей контента (частичный merge с **`COMMON_STYLES`**). Подробности — **`docs/plugin-content-styles.md`**. |
39
+
40
+ Примеры в репозитории: **`src/pluginExamples/`** (например **`plugin_default.html`**).
41
+
42
+ ### Для сборщика Webpack
22
43
 
23
- Определение пакета в приложении:
44
+ Импортируйте класс и передайте его в `plugins` под тем же именем:
24
45
 
25
46
  ```javascript
47
+ const EmailmakerWebpackPlugin = require('@emailmaker/emailmaker/webpack');
48
+
26
49
  module.exports = {
27
- plugins: [new EmailmakerWebpackPlugin()],
50
+ plugins: [
51
+ new EmailmakerWebpackPlugin({
52
+ // По желанию: outputFolder, modulesPath, publicPath — см. пакет.
53
+ }),
54
+ ],
28
55
  };
29
56
  ```
30
57
 
31
58
  ### Для сборщика Vite
32
59
 
33
- Импорт пакета:
60
+ Импорт только из **scoped-пакета**. Функция возвращает **массив из двух плагинов** — его нужно распаковать:
34
61
 
35
62
  ```javascript
36
- import emailMakerPlugin from 'emailmaker/vite';
37
- ```
38
-
39
- Определение пакета в приложении:
63
+ import { defineConfig } from 'vite';
64
+ import emailmakerVite from '@emailmaker/emailmaker/vite';
40
65
 
41
- ```javascript
42
66
  export default defineConfig({
43
- plugins: [emailMakerPlugin()],
67
+ plugins: [
68
+ ...emailmakerVite({
69
+ // По желанию: outputFolder, modulesPath, publicPath — см. пакет.
70
+ }),
71
+ ],
44
72
  });
45
73
  ```
46
74
 
75
+ ## `EmailmakerEnvironment`
76
+
77
+ Плагины Webpack/Vite добавляют в бандл объект **`EmailmakerEnvironment = { publicPath: '...' }`** с базовым URL к чанкам пакета. Вручную менять его обычно не нужно; без штатного плагина задайте **`publicPath`** самостоятельно так, чтобы загрузчик нашёл собранные **`emailmaker.js`** / **`emailmaker-esm.js`**.
78
+
79
+ Имя класса Webpack-плагина строится из имени приложения в `package.json` (для **`@emailmaker/emailmaker`** это **`EmailmakerWebpackPlugin`**).
80
+
47
81
  # Инициализация
48
82
 
49
- Импортируйте EmailMaker plugin в вашем компоненте:
83
+ Импортируйте плагин в коде приложения:
50
84
 
51
85
  ```javascript
52
86
  import * as emailmaker from '@emailmaker/emailmaker';
53
87
  ```
54
88
 
55
- Параметры инициализации плагина содержат параметр `getAuthToken`. В него должна быть передана функция, которая запрашивает авторизационный OAuth токен по Client ID и Client Secret.
89
+ У **`init`** обязательное поле **`content`** (HTML-строка или объект письма / шаблона). После успешной инициализации методы **`setConfig`**, **`updateConfig`**, **`show`**, **`save`** и др. доступны у **экземпляра**, возвращённого из **`init`** (не у объекта `emailmaker`).
90
+
91
+ Частые поля верхнего уровня — в таблице; детали конфигурации и содержимого см. ниже в разделе **«Конфигурация»**.
92
+
93
+ | Поле | Назначение |
94
+ | --- | --- |
95
+ | **`getAuthToken`** или **`jwtAuth`** | OAuth-колбэк **или** вход по логину/паролю (**`ExportedApi.JWTMixin`** / **`jwtAuth`**). Не смешивайте сценарии без необходимости. |
96
+ | **`element`** | Контейнер монтирования (селектор, узел или фрагмент). |
97
+ | **`content`** | Обязательно: HTML-строка или объект письма/шаблона. |
98
+ | **`config`** | Настройки UI редактора (**`ExportedApi.Config`**). |
99
+ | **`project`** | Идентификатор проекта в вашей системе / в EmailMaker. |
100
+ | **`baseUrl`** | Базовый URL API при кастомном бэкенде (**`AppInitMixin.Options`**). |
101
+ | **`storageProvider`** | Реализация **`StorageProvider`** для файлового менеджера. |
102
+ | **`standaloneKey`** | Редкие режимы прокси файлов (**`instance.handleFileProxy`** / **`handleUrlProxy`**). |
103
+ | **`commonStyles`** | Объект стилей контента (частичный **merge** с **`COMMON_STYLES`**). См. **`docs/plugin-content-styles.md`**. |
104
+
105
+ - **`getAuthToken`** — функция **`(user?, project?, prevToken?) => string | Promise<string>`**, возвращающая OAuth access token. **`client_secret`** получайте **только на сервере**.
106
+ - **`jwtAuth`** — **`{ email, password, remember? }`** вместо **`getAuthToken`** (см. **`ExportedApi.JWTMixin`** в **`emailmaker.d.ts`**).
107
+
108
+ Именованные экспорты в ESM-сборке (**`emailmaker-esm.js`**):
109
+
110
+ ```javascript
111
+ import { init, parseAMP, COMMON_STYLES, version, helpers, errors } from '@emailmaker/emailmaker';
112
+ ```
113
+
114
+ | Экспорт | Назначение |
115
+ | --- | --- |
116
+ | **`init`** | То же, что **`emailmaker.init`**, с ленивой подгрузкой ядра (**`Promise<Instance>`**). |
117
+ | **`parseAMP`** | Разбор AMP: вход — строка или **`{ code }`**, результат **`ParsedAMP`** (html / ampHtml и т.д.). |
118
+ | **`COMMON_STYLES`** | Дефолтный пресет стилей контента текущей сборки EmailMaker. Для **`init({ commonStyles: { ...COMMON_STYLES, … } })`**. Исходник с JSDoc: **`src/constants/commonStyles.defaults.ts`**. |
119
+ | **`version`** | Строка версии сборки. |
120
+ | **`helpers`** | Вспомогательные утилиты (например, соответствие HTTP-статусов кодам ошибок). |
121
+ | **`errors`** | Ошибки API, в т.ч. **`errors.FileManagerApiError`** для контракта с файловым менеджером. |
56
122
 
57
123
  ### Получение OAuth токена на бэкенде
58
124
 
59
- ```curl
125
+ ```bash
60
126
  curl --location 'https://api.emailmaker.ru/oauth/token' \
61
127
  --header 'Content-Type: application/x-www-form-urlencoded' \
62
128
  --data-urlencode 'client_id=*******' \
@@ -64,15 +130,27 @@ curl --location 'https://api.emailmaker.ru/oauth/token' \
64
130
  --data-urlencode 'grant_type=client_credentials'
65
131
  ```
66
132
 
133
+ Пример **клиентской** функции: токен отдаёт ваш бэкенд (секрет не уходит в браузер):
134
+
135
+ ```javascript
136
+ async function getAuthToken(user, project, prevToken) {
137
+ const res = await fetch('/api/your-backend/emailmaker-token', { method: 'POST' });
138
+ const data = await res.json();
139
+ return data.access_token;
140
+ }
141
+ ```
142
+
67
143
  ### Создание сущности EmailMaker plugin
68
144
 
145
+ Простейший вариант — HTML письма и тема:
146
+
69
147
  ```javascript
70
148
  emailmaker
71
149
  .init({
72
- getAuthToken: getAuthToken,
150
+ getAuthToken,
73
151
  element: '#test',
74
152
  content: {
75
- title: 'Email subject',
153
+ subject: 'Тема письма',
76
154
  html: `КОД_ПИСЬМА`,
77
155
  },
78
156
  config: {},
@@ -80,52 +158,129 @@ emailmaker
80
158
  .then((instance) => {});
81
159
  ```
82
160
 
161
+ Вариант с **шаблоном** и внешним id письма:
162
+
163
+ ```javascript
164
+ emailmaker
165
+ .init({
166
+ getAuthToken,
167
+ element: '#editor',
168
+ project: 'ключ-проекта-в-вашей-системе',
169
+ content: {
170
+ templateId: 22304,
171
+ email: {
172
+ id: 'crm-email-id-123',
173
+ },
174
+ blocks: [],
175
+ },
176
+ config: {
177
+ theme: 'light',
178
+ // advancedConfigs: { editor: { … }, pro: { … } },
179
+ },
180
+ })
181
+ .then((instance) => {});
182
+ ```
183
+
83
184
  КОД_ПИСЬМА можно взять из <a href="https://emcdn.ru/plugin/new-email.html" target="_blank">нашего образца</a> или вставить HTML-код своего письма.
84
185
 
186
+ ### React (обёртка)
187
+
188
+ Минимальный каркас: монтирование, **`destroy`** при размонтировании.
189
+
190
+ ```tsx
191
+ import { useEffect, useRef } from 'react';
192
+ import * as emailmaker from '@emailmaker/emailmaker';
193
+
194
+ export function EmailmakerEditor({
195
+ project,
196
+ templateId,
197
+ getAuthToken,
198
+ }: {
199
+ project: string | number;
200
+ templateId: number;
201
+ getAuthToken: NonNullable<Parameters<typeof emailmaker.init>[0]['getAuthToken']>;
202
+ }) {
203
+ const rootRef = useRef<HTMLDivElement>(null);
204
+
205
+ useEffect(() => {
206
+ let instance: Awaited<ReturnType<typeof emailmaker.init>> | undefined;
207
+
208
+ (async () => {
209
+ instance = await emailmaker.init({
210
+ getAuthToken,
211
+ element: rootRef.current ?? '#emailmaker-root',
212
+ project,
213
+ content: { email: { id: 'new' }, templateId },
214
+ config: { theme: 'light' },
215
+ });
216
+ })();
217
+
218
+ return () => {
219
+ instance?.destroy();
220
+ };
221
+ }, [project, templateId, getAuthToken]);
222
+
223
+ return <div id="emailmaker-root" ref={rootRef} style={{ height: '100vh' }} />;
224
+ }
225
+ ```
226
+
85
227
  # Конфигурация
86
228
 
87
- Конфигурация плагина представляет собой JSON с несколькими уровнями вложенности. В конфигурации вы можете настроить внешний вид, содержимое, с которым будет работать плагин и логику.
229
+ Конфигурация задаётся объектом с несколькими уровнями вложенности: внешний вид редактора, стартовое содержимое и обработчики событий.
230
+
231
+ Повторный вызов **`init`** на **тот же DOM-элемент** внутри приводит к **`reset`** с новыми опциями — не запускайте параллельно два **`init`** на один контейнер.
88
232
 
89
233
  ### element
90
234
 
91
- Вы можете передать строку `element` в конфигурацию плагина. Это селектор DOM-элемента, внутри которого нужно инициализировать плагин. Если элемент не определен, приложение будет запущено в фоновом режиме.
235
+ Строка-селектор, **`Element`** или **`DocumentFragment`**: контейнер, куда монтируется редактор. Если элемент не задан, приложение может работать в фоновом режиме без видимого контейнера.
92
236
 
93
237
  ### content
94
238
 
95
- Секция `content` содержит параметры письма, которое нужно отобразить в редакторе.
96
- В этот параметр может быть передано:
239
+ Секция **`content`** задаёт данные для редактора. Варианты:
97
240
 
98
241
  #### {string}
99
242
 
100
- HTML верстка письма.
243
+ HTML-разметка письма.
101
244
 
102
- #### {object} email options
245
+ #### {object} параметры письма
103
246
 
104
247
  ```javascript
105
248
  {
106
- id?: string; // Уникальный ID проекта в вашей системе.
107
- html?: string; // HTML верстка письма.
249
+ id?: string; // Уникальный ID письма в вашей системе.
250
+ html?: string; // HTML письма.
108
251
  subject?: string; // Тема письма.
109
- preheader?: string; // Прехедер письма.
252
+ preheader?: string; // Прехедер.
110
253
  }
111
254
  ```
112
255
 
113
- #### {object} full description
256
+ #### {object} шаблон, блоки, комментарии
114
257
 
115
258
  ```javascript
116
259
  {
117
- temlateId?: string; // ID шаблона внутри EmailMaker.
118
- email?: object; // email options.
119
- blocks?: []; // Дополнительные блоки.
120
- comments?: []; // Комментарии в письме.
260
+ templateId?: string | number; // ID шаблона в EmailMaker.
261
+ email?: object; // параметры письма (см. выше).
262
+ blocks?: []; // блоки.
263
+ comments?: []; // комментарии к письму.
121
264
  }
122
265
  ```
123
266
 
124
- Можно изменить содержимое в любой момент после инициализации с помощью метода `instance.show(content)`.
267
+ Сменить контент после инициализации: **`instance.show(content)`**.
268
+
269
+ ### Стили контента (`commonStyles`)
270
+
271
+ Не путать с **`config`**: объект **`commonStyles`** передаётся **на верхнем уровне** **`init`** / **`reset`** (тип **`ExportedApi.AppConfigMixin.Options`**).
272
+
273
+ - **Дефолт из сборки:** именованный экспорт **`COMMON_STYLES`** (см. исходник **`src/constants/commonStyles.defaults.ts`**, там же подробный **JSDoc** для IDE).
274
+ - **Частичное переопределение:** можно передать только нужные ветки (например `{ block: { backgroundColor: '#000' } }`) — приложение **сливает** их с **`COMMON_STYLES`**, чтобы панель «Стили контента», iframe и список общих блоков не ломались на «дырах» в объекте.
275
+ - **Приоритет:** сохранённое **`email.common_styles`** важнее, чем **`init.commonStyles`**.
276
+ - **Сброс** сохранённого в сторе плагина override: **`commonStyles: undefined`** в **`reset`** или **`updateConfig`** (с ключом).
277
+ - **Вкладка в UI:** флаг **`config.commonStylesEnabled`** (часто `true` по умолчанию).
278
+
279
+ Полное описание: **`docs/plugin-content-styles.md`** в репозитории EmailMaker.
125
280
 
126
281
  ### config
127
282
 
128
- Раздел для настройки внешнего вида и настроек редактора. Вы можете изменить конфигурацию этого раздела после инициализации, используя `emailmaker.setConfig` или `emailmaker.updateConfig`.
283
+ Настройки UI редактора. После **`init`** используйте **`instance.setConfig`**, **`instance.updateConfig`** и **`instance.getConfig`** не методы объекта **`emailmaker`**.
129
284
 
130
285
  ##### Список параметров секции config
131
286
  | Параметр | Описание | Значение по умолчанию |
@@ -135,7 +290,7 @@ HTML верстка письма.
135
290
  | mergeTags | JSON со списком динамических переменных. | undefined |
136
291
  | styles | Строка со стилями в формате CSS. | '' |
137
292
  | | | |
138
- | headerShow | Ппоказ шапки. | true |
293
+ | headerShow | Показ шапки. | true |
139
294
  | headerArrowBackVisible | Показ стрелки "Назад". | true |
140
295
  | headerTitleVisible | Показ поля "Тема". | true |
141
296
  | headerPreheaderVisible | Показ поля "Прехедер". | true |
@@ -172,7 +327,7 @@ HTML верстка письма.
172
327
  | nextButtonEnabled | Показ второстепенной кнопки. | false |
173
328
  | nextButtonText | Текст на второстепенной кнопке. | '' |
174
329
  | saveButtonEnabled | Показ основной кнопки. | true |
175
- | saveButtonText | Текст основной кнопки. | true |
330
+ | saveButtonText | Текст основной кнопки. | '' |
176
331
  | commandButtonsEnabled | Показ основной и второстепенной кнопки. | true |
177
332
  | | | |
178
333
  | sidePanelFloating | Плавающая боковая панель. | true |
@@ -263,92 +418,103 @@ HTML верстка письма.
263
418
  | imageCenterStockEnabled | Таб Стока фотографий. | true |
264
419
  | imageCenterGifEnabled | Таб Стока гифок. | true |
265
420
  | imageCenterEditorEnabled | Таб редактора изображений. | true |
266
- | compressMaxSize | Макс. вес картинки после оптимизации, Мб. | true |
267
- | compressMaxWidthOrHeight | Макс. ширина картинки после оптимизации, px. | true |
268
- ### Обработка событий
421
+ | compressMaxSize | Макс. размер файла для клиентского сжатия в файловом менеджере, байт (по умолчанию порядка 5 MiB). | см. типы |
422
+ | compressMaxWidthOrHeight | Макс. ширина/высота после ресайза, px (по умолчанию 2000). | см. типы |
269
423
 
270
- События могут быть переданы в конфигурации или добавлены после при работе с экземпляром плагина. Все подписчики событий могут быть асинхронными функциями.
424
+ ### Обработка событий
271
425
 
272
- #### Пример
426
+ Обработчики передаются в **`init({ ... })`** или подписываются на экземпляре: **`instance.handle*(listener, priority?)`**. Подписка обычно возвращает **функцию отписки**. Обработчики могут быть **`async`**.
273
427
 
274
- ```javascript
275
- emailmaker.init({
276
- ....,
277
- // Подписка на события в инициализации.
278
- handleReadEmail: (e) => {},
279
- handleSaveEmail: async (e) => {}
280
- }).then((instance) => {
281
- // Подписка на события после инициализации.
282
- const dispose = instance.handleReadEmail(e => {});
283
- const dispose = instance.handleSaveEmail(async (e) => {});
284
- });
285
- ```
428
+ События **`handleSaveEmail`**, **`handleSaveBlock`**, **`handleSaveComment`** получают **не сырой объект**, а **`SaveEventPayload`**: **`{ patch, value, prev?, source? }`** — полезно сравнивать **`patch`** и итоговое **`value`**.
286
429
 
287
- Передавая асинхронную функцию, вы можете реализовать асинхронную загрузку данных.
430
+ **`handleSubjectChanged`** и **`handlePreheaderChanged`** оформлены иначе: через них подписываются на строковые значения темы и прехедера — см. **`emailmaker.d.ts`**.
288
431
 
289
432
  #### Пример
290
433
 
291
434
  ```javascript
292
435
  emailmaker.init({
293
- element: "#test",
294
- content: {
295
- id: "1"
296
- }
297
- handleReadEmail: async (id) => {
298
- return await fetchData(id); // Ваша функция получения данных.
299
- }
436
+ element: '#test',
437
+ content: { email: { id: '1' } },
438
+ getAuthToken,
439
+ handleReadEmail: async (id) => fetchEmail(id),
440
+ handleSaveEmail: async (payload) => saveEmail(payload.value),
300
441
  }).then((instance) => {
301
- setTimeout(() => instance.show({ id: "2" }), 1000)
442
+ const unsubscribe = instance.handleEmailChanged(async () => {
443
+ /* ... */
444
+ });
445
+ /* unsubscribe(); */
302
446
  });
303
447
  ```
304
448
 
305
449
  ### События
306
450
 
307
- | Обработчик события | Описание |
308
- | ------------------------- | ------------------------------------------ |
309
- | handleReadEmail | Чтение письма |
310
- | handleSaveEmail | Сохранение / обновление письма |
311
- | handleReadEmailRevisions | Чтение списка автосохранений |
312
- | handleEmailAutosave | Автосохранение |
313
- | handleReadBlocks | Чтение списка блоков проекта |
314
- | handleSaveBlock | Сохранение / обновление блока проекта |
315
- | handleRemoveBlock | Удаление блока проекта |
316
- | handleReadComments | Чтение списка комментариев письма |
317
- | handleSaveComment | Сохранение / обновление комментария |
318
- | handleRemoveComment | Удаление комментария письма |
319
- | handleSaveButtonClick | Нажатие кнопки сохранения письма |
320
- | handleNextButtonClick | Нажатие кнопки Далее |
321
- | handlePreviousButtonClick | Нажатие кнопки Назад |
322
- | handleEmailChanged | Изменение любого параметра письма |
323
- | handleHtmlChanged | Изменение кода письма |
324
- | handleDestroy | Деструкция плагина |
325
- | handleLoad | Окончание инициализации экземпляра плагина |
326
- | handleLoadImage | Загрузка изображений |
327
- | handleNotify | Уведомление |
328
- | handleError | Уведомление типа Ошибка |
329
- | handleSuccess | Уведомление типа Успех |
330
- | handleTestEmailSend | Отправка тестового письма |
331
- | handleTestEmailModal | Открытие модального окна тестового письма |
451
+ | Обработчик | Описание |
452
+ | ---------- | -------- |
453
+ | handleReadEmail | Загрузка письма по id с вашего API (**аргумент — строка id**). |
454
+ | handleSaveEmail | Сохранение письма; полезная нагрузка — **`SaveEventPayload`** с **`value`** и **`patch`**. |
455
+ | handleRemoveEmail | Удаление письма. |
456
+ | handleReadEmailRevisions | Список автосохранений / ревизий для письма. |
457
+ | handleEmailAutosave | Создано автосохранение (**`EmailRevision`**). |
458
+ | handleRemoveEmailAutoSave | Удалено автосохранение. |
459
+ | handleReadBlocks | Список блоков проекта. |
460
+ | handleReadCommonBlocks | Общие блоки. |
461
+ | handleReadTemplateBlocks | Блоки шаблона в контексте письма. |
462
+ | handleSaveBlock | Сохранение блока (**`SaveEventPayload`**). |
463
+ | handleRemoveBlock | Удаление блока. |
464
+ | handleReadComments | Комментарии к письму. |
465
+ | handleSaveComment | Сохранение комментария. |
466
+ | handleRemoveComment | Удаление комментария. |
467
+ | handleSaveButtonClick | Клик по основной кнопке (например «Сохранить»). |
468
+ | handleNextButtonClick | Клик по «Далее». |
469
+ | handlePreviousButtonClick | Клик «Назад» в шапке. |
470
+ | handleEmailInit | Инициализирован контур письма. |
471
+ | handleEmailChanged | Изменился параметр письма. |
472
+ | handleHtmlChanged | Изменился HTML-код. |
473
+ | handleSubjectChanged | Изменилась тема (особая подпись — см. типы). |
474
+ | handlePreheaderChanged | Изменился прехедер (особая подпись — см. типы). |
475
+ | handleCloneEmail | Клонирование письма. |
476
+ | handleShareEmail | Поделиться. |
477
+ | handleLivePreviewEmail | Живой предпросмотр. |
478
+ | handlePreviewEmail | Предпросмотр. |
479
+ | handleValidate | Результат проверки кода (**`CodeError[]`**). |
480
+ | handleTestEmailSend | Отправка тестового письма. |
481
+ | handleTestEmailModal | Открыто окно тестовой отправки. |
482
+ | handleDestroy | Перед уничтожением экземпляра. |
483
+ | handleLoad | Завершена загрузка экземпляра; можно безопасно вызывать **`getEmail`** и др. |
484
+ | handleLoadImage | Загрузка изображения пользователем; **`handleFileProxy`**, **`handleUrlProxy`** — прокси файлов/URL при необходимости. |
485
+ | handleNotify | Произвольное уведомление. |
486
+ | handleError | Ошибка (можно переопределить UI). |
487
+ | handleSuccess | Успешная операция. |
488
+ | handleReadLocale | Язык интерфейса (**`AppConfigMixin`**). |
489
+ | handleTranslate | Пользовательский перевод строк. |
490
+ | handleLimitUsage | Отображение квот / лимитов. |
491
+
492
+ Полный перечень и сигнатуры — в **`emailmaker.d.ts`** (**`ExportedApi.DataMixin.Events`** и смежные миксины).
332
493
 
333
494
  ### Методы
334
495
 
335
- | Метод | Описание |
336
- | ----------------- | ----------------------------------------- |
337
- | init | Инициализация (async) |
338
- | show | Изменение содержимого после инициализации |
339
- | destroy | Деструкция экземпляра |
340
- | reset | Сброс всей конфигурации |
341
- | getEmail | Получение текущего письма |
342
- | getConfig | Получение конфигурации |
343
- | getBlocks | Получение блоков проекта |
344
- | getComments | Получение комментариев письма |
345
- | getEmailRevisions | Получение списка контроля версий |
346
- | setConfig | Установка новых парамеров config |
347
- | updateConfig | Добавление к параметрам config |
348
- | notify | Показ уведомлений |
349
- | getElement | Получение элемента инициализации |
350
- | save | Сохраенние письма. |
351
- | compileEmail | Получение скопмилированного письма |
496
+ Модуль экспортирует **`init`** (и именованные символы в ESM). Остальное — методы **экземпляра** после **`await emailmaker.init(...)`**.
497
+
498
+ | Метод | Описание |
499
+ | ----- | -------- |
500
+ | init | Асинхронная инициализация: **`Promise<Instance>`**. |
501
+ | show | Подмена контента (**строка или объект `Content`**). |
502
+ | save | Сохранить текущее письмо по цепочке приложения. |
503
+ | getEmail | Текущее письмо; для скомпилированных полей см. **`compileEmail`** / **`CompiledEmail`**. |
504
+ | compileEmail | Явная компиляция HTML/AMP/текста; опционально **`email`** и флаги форматов. |
505
+ | setEmailMeta | Обновить **`meta`** текущего письма без полной замены. |
506
+ | getBlocks | Блоки в текущем контексте. |
507
+ | getComments | Комментарии. |
508
+ | getEmailRevisions | Ревизии / автосохранения. |
509
+ | getCodeErrors | Ошибки линтера кода в редакторе. |
510
+ | getConfig | Текущий **`config`**. |
511
+ | setConfig | Полная замена настроек UI. |
512
+ | updateConfig | Глубокое слияние с текущим **`config`**. |
513
+ | notify | Показать уведомление (строка или объект). |
514
+ | getElement | DOM-узел или фрагмент монтирования. |
515
+ | destroy | Уничтожить экземпляр (вызывайте при размонтировании в SPA). |
516
+ | reset | Переинициализация с новыми **`Options`** (**`Promise<Instance>`**). |
517
+ | undoRedoService | Сервис отмены/повтора (**`undo`**, **`redo`**, снимки истории и др.). |
352
518
 
353
519
  ### 📂 Файловый менеджер
354
520