useblocks 1.1.72 → 1.1.84

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 (67) hide show
  1. package/CHANGELOG.md +461 -0
  2. package/README.md +55 -6
  3. package/iframe/css/sandbox-dark.css +1 -1
  4. package/iframe/css/sandbox-darktheme.css +3 -3
  5. package/iframe/css/sandbox-light.css +1 -1
  6. package/iframe/css/sandbox.css +2 -2
  7. package/iframe/js/amp.D1dkO3ub.js +1 -0
  8. package/iframe/js/iframe-eblock.js +1 -1
  9. package/iframe/js/iframe.js +1 -1
  10. package/iframe/js/rules.4N5s3OV-.js +1 -1
  11. package/package.json +30 -9
  12. package/static/core/{842c8d41.js → 16c7408a.js} +4 -4
  13. package/static/core/{dd94baa62.js → 278c19282.js} +1208 -1127
  14. package/static/core/27b7d154.js +1098 -0
  15. package/static/core/{585259872.js → 7877b5712.js} +41 -41
  16. package/static/core/{ffc83e02.js → 86acf537.js} +7 -7
  17. package/static/core/{e02024fb2.js → 95074b4e2.js} +58 -58
  18. package/static/core/{ce9be2ec2.js → 9a1229572.js} +2155 -2090
  19. package/static/core/{b7c107e3.js → ab3c035c.js} +15 -15
  20. package/static/core/{d082c64e2.js → b8fa83f82.js} +2490 -2229
  21. package/static/core/{bfab4558.js → bb8665a8.js} +3551 -3153
  22. package/static/core/{513594a8.js → c013e7cc.js} +72 -72
  23. package/static/core/{efbe495c.js → c871702e.js} +2403 -2548
  24. package/static/core/cf26b064.js +3280 -0
  25. package/static/core/{d645302e.js → d15a988b.js} +272 -248
  26. package/static/core/{24c3f399.js → d4962564.js} +3 -3
  27. package/static/core/dc948de7.js +2134 -0
  28. package/static/core/{5e082e16.js → e9b6fbb9.js} +48 -48
  29. package/static/core/{d19e8c6f.js → ec6e74e5.js} +22978 -19773
  30. package/static/umd-runtime/{n8zqoGYh.js → D80ABE1O.js} +7 -1
  31. package/static/umd-runtime/runtime.js +2 -2
  32. package/static/umd-runtime/ui-kit.js +1704 -1628
  33. package/ui-kit/index.js +1390 -1310
  34. package/{useblocks-core.8837a348.js → useblocks-core.2fa005e8.js} +6 -6
  35. package/useblocks-esm.js +4 -4
  36. package/{useblocks-po.8837a348.js → useblocks-po.2fa005e8.js} +1 -1
  37. package/useblocks.d.ts +55 -24
  38. package/useblocks.js +3 -3
  39. package/favicon-b.ico +0 -0
  40. package/favicon.ico +0 -0
  41. package/fonts/SegoeUI-Bold.woff2 +0 -0
  42. package/fonts/SegoeUI-Semibold.woff2 +0 -0
  43. package/fonts/SegoeUI.woff2 +0 -0
  44. package/iframe/js/amp.DllX-Im0.js +0 -1
  45. package/js/amplitude.min.js +0 -10859
  46. package/js/sourcebuster.min.js +0 -672
  47. package/manifest.json +0 -17
  48. package/npm-publish.manifest.json +0 -51
  49. package/static/core/241f0387.js +0 -3189
  50. package/static/core/45b5e246.js +0 -925
  51. package/static/core/9bcb736c.js +0 -2122
  52. package/static/media/image-editor/images/samples/large_sample.jpg +0 -0
  53. package/static/media/image-editor/images/samples/sample1.jpg +0 -0
  54. package/static/media/image-editor/images/samples/sample1_thumbnail.jpg +0 -0
  55. package/static/media/image-editor/images/samples/sample2.jpg +0 -0
  56. package/static/media/image-editor/images/samples/sample2_thumbnail.jpg +0 -0
  57. package/static/media/image-editor/images/samples/sample3.jpg +0 -0
  58. package/static/media/image-editor/images/samples/sample3_thumbnail.jpg +0 -0
  59. package/static/media/image-editor/images/samples/sample4.json +0 -871
  60. package/static/media/image-editor/images/samples/sample4_preview.jpg +0 -0
  61. package/test-font.otf +0 -0
  62. package/test-font.ttf +0 -0
  63. package/test-font.woff2 +0 -0
  64. package/tsconfig.json +0 -14
  65. package/two_step_headless_plugin.html +0 -558
  66. /package/iframe/{iframe-eblock.8837a348.html → iframe-eblock.2fa005e8.html} +0 -0
  67. /package/iframe/{iframe.8837a348.html → iframe.2fa005e8.html} +0 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,461 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
+
7
+ ---
8
+
9
+ ## [1.1.83] - 2026-09-22
10
+
11
+ ### Added
12
+
13
+ - Email and block folders: several emails or blocks can be dragged into a folder or the trash at
14
+ once; a collapsed folder with subfolders is marked with a plus on its icon
15
+ - AI email generation on the create page respects the plan: a lock on the card shows up front that
16
+ the feature is not in the plan or the limit is used up
17
+ - Empty email list: dedicated messages for a search with no results and for an empty trash, a
18
+ "Create a new email" button in an empty folder; the "no emails" screen no longer flashes while the
19
+ list is loading
20
+ - File Manager: `fileManager.availableImageExtensions` is declared in the public types. It sets the
21
+ supported formats hint under the upload area and does not restrict what can be uploaded
22
+
23
+ ### Fixed
24
+
25
+ - Video and countdown settings: fields keep the cursor while typing, the preview is rebuilt after a
26
+ pause in typing
27
+ - Expanding a folder no longer collapses its siblings, and row buttons in the folder tree line up
28
+ with their folders
29
+ - The button settings panel shows the button's actual alignment instead of always "center"
30
+ - Tooltips on the right panel tabs no longer go off screen; buttons on an image in the canvas now
31
+ have hover titles
32
+ - File Manager: files with commas, percent signs, ampersands and other symbols in the name upload
33
+ fine — such symbols are replaced with underscores, Ukrainian letters are transliterated
34
+ - Plugin types: `compressMaxSize` is documented in megabytes (default `0.48`), the way the editor
35
+ reads it, not in bytes — a `5 * 1024 * 1024` value written by the old description effectively
36
+ turned compression off. The docs now say that compression settings in `fileManager` override the
37
+ top-level ones only inside the file manager; defaults of `cacheStrategy` and `autosaveTimeout`
38
+ are corrected
39
+ - Translations: "Discount with promo code" on the billing page, email list messages, "Stock" in
40
+ Spanish and Portuguese now means a stock photo library, not warehouse stock
41
+
42
+ ---
43
+
44
+ ## [1.1.81] - 2026-09-17
45
+
46
+ ### Added
47
+
48
+ - Project styles in the plugin: `projectStyles` section in `init(options)` with the brand palette,
49
+ custom fonts and social links. Colors show up in the color pickers, fonts in the font picker and on
50
+ the canvas, and the "Social" element is filled with the project's links instead of a placeholder
51
+ - Email export to Markdown: a sub-item of the text export menu, `exportMarkdownEnabled` option
52
+ - Gmail annotations for the Promotions tab: a separate sidebar tab with a card preview,
53
+ `annotationsEnabled` option (off by default)
54
+ - "Swap columns" button for float block columns
55
+ - Plan limits apply to every editor feature: unavailable ones are either locked with an upgrade
56
+ offer or hidden; locks are lifted right after payment, without a reload
57
+
58
+ ### Fixed
59
+
60
+ - Showing and saving an email in the plugin: switching to another email or showing a template no
61
+ longer recreates the editor; subject and preheader edited in the UI are no longer rolled back;
62
+ unsaved autosaved edits are no longer overwritten by the server version; a new email without
63
+ markup opens with a starter layout, and the canvas is no longer reset after the first save;
64
+ `save()` with no email shown fails right away
65
+ - Plugin: if `handleLoadImage` throws, the editor shows the error message instead of uploading the
66
+ image to the UseBlocks backend; project styles are no longer requested from the UseBlocks backend
67
+ - Styles of a saved block no longer stretch the editor UI; block previews get the right height once
68
+ images load
69
+ - Editor: a variable in an image address is kept on save; content text color can be changed after
70
+ white; the button wrapper cell no longer shows up in breadcrumbs; a disabled border no longer comes
71
+ back with old values; removing the last block no longer leaves an empty table
72
+ - BeeFree layout converter: spacing of text, buttons, social icons and dividers is taken from the
73
+ source, loose text is no longer lost, Google fonts are attached
74
+ - File Manager: readable names for stock images and GIFs instead of `photo-<id>` and
75
+ `giphy-downsized`; GIF previews show up immediately; a version in the link query is no longer taken
76
+ for the file extension; no more i18next promo message in the console
77
+ - Error notifications show the server response, such as "Limit exceeded", instead of `rejected`
78
+ - Translations: project member dialogs, the block counter in bulk save, layout converter strings
79
+
80
+ ### Changed
81
+
82
+ - npm package contents are now an allowlist: the plugin test page, test fonts, analytics scripts and
83
+ the PWA manifest are no longer shipped; `CHANGELOG.md` is now included
84
+
85
+ ---
86
+
87
+ ## [1.1.71] - 2026-09-03
88
+
89
+ ### Added
90
+
91
+ - Project settings page: a single page with tabs — description and logo, storage, brand styles,
92
+ members and roles, integrations, plugin. The editor picks up the project's brand fonts and colors,
93
+ and unsaved edits are no longer lost when leaving the page
94
+ - The project card in the list shows the description and logo; the members table gained role,
95
+ invitation date, join date and last login
96
+ - Algorithmic Stripo layout converter: `stripoConverterEnabled` option. Runs locally and instantly,
97
+ without the AI service. Fixed-width emails convert to the non-responsive form, adaptive ones keep
98
+ their mobile rules
99
+ - Support chat is available to everyone: it is embedded directly, without Google Tag Manager, and
100
+ recognizes the signed-in user
101
+ - Email preview mode that hides the service markers of hidden blocks
102
+ - API error texts translated into Russian, Ukrainian, Spanish and Portuguese; the response language
103
+ is picked from the user profile and the `Accept-Language` header
104
+
105
+ ### Fixed
106
+
107
+ - Showing and saving an email in the plugin: a repeated `show()` of the same email no longer
108
+ recreates the canvas, switching to another email no longer waits for a timeout, the first save no
109
+ longer reloads the editor, and the second one goes with the assigned id instead of creating a
110
+ copy; no requests are sent after `destroy`
111
+ - Subject and preheader taken from the markup are no longer lost on save, and the save response no
112
+ longer rolls back fresh email metadata
113
+ - A new email created from a template keeps the link to its parent; history is requested for the
114
+ email actually shown
115
+ - Export: an email could be lost because of markup after `</html>`; an HTML build failure is no
116
+ longer reported as an empty result
117
+ - Layout converter: blocks are no longer lost in a hand-edited BeeFree email; a button without its
118
+ own width is no longer forced to 200px
119
+ - Social blocks are told apart in the settings pane by their position in the document
120
+ - Links in an email are no longer wrapped in a `span` with an underline
121
+ - File Manager: the file name is no longer lost in a CDN link with a query; settings now reach the
122
+ standalone image editor
123
+ - Translations: the "Project" menu, the unsaved changes dialog, integration descriptions and
124
+ statuses
125
+ - A catalog for a different locale is no longer applied, and an empty response no longer wipes the
126
+ translation cache
127
+ - Navigation in the SaaS version
128
+
129
+ ---
130
+
131
+ ## [1.1.60] - 2026-08-14
132
+
133
+ ### Added
134
+
135
+ - PNG export of an email as an archive containing desktop and mobile renders
136
+ - Trial period: an in-editor dialog offering the paid plan trial and a unified activation dialog on
137
+ the pricing page
138
+ - Project-owner plan gating: autosave and paid dialogs respect the project owner's plan instead of
139
+ the current user's; the owner's plan is part of the project domain model
140
+ - File Manager: lockable library tabs with a badge
141
+
142
+ ### Fixed
143
+
144
+ - Plugin resilience to backend outages: deferred standalone mode, failover no longer aborts on
145
+ authorization errors and switches back to the primary origin after recovery
146
+ - Editor performance: fewer redundant re-renders of the email pane and settings forms, smooth
147
+ drag-and-drop
148
+ - Public email preview no longer redirects to the login page
149
+ - A headless container without an explicit size broke the email layout and shrank images
150
+ - File Manager: preview shows the file while its thumbnail is not ready yet; image compression is
151
+ disabled when compression limits are zero; removed folder duplication in the tree
152
+
153
+ ---
154
+
155
+ ## [1.1.47] - 2026-08-07
156
+
157
+ ### Added
158
+
159
+ - Host-supplied AI in place of the built-in one: `handleAITextRequest` (chat assistant and email
160
+ generator) and `handleAIImageRequest` (image generation) callbacks in `init(options)`. The host
161
+ receives progress via `onProgress`, partial HTML via `onStreamChunk` and an `AbortSignal` for
162
+ cancellation; such generations are not gated by UseBlocks limits and are not counted against the
163
+ subscription quota.
164
+ - Public `templateDirectives` contract: an escaping policy for ESP template directives, applied
165
+ consistently in the editor, the block editor and on export (HTML, EML, ZIP)
166
+ - App tokens for integrators: `POST /auth/app/token`; the layout converter now works with app
167
+ tokens with per-client limits
168
+ - Headless embedding mode for the editor
169
+ - Password change in the user profile
170
+ - File Manager: parallel compression of uploaded files
171
+
172
+ ### Fixed
173
+
174
+ - Browser auto-translation is disabled — it was breaking the editor
175
+ - Monaco: ESM workers with a cross-origin publicPath
176
+ - Cyrillic file names are decoded on upload by URL
177
+ - Stable embedding in Angular and Module Federation hosts
178
+
179
+ ### Changed
180
+
181
+ - Migration to React 19 (Redux Toolkit 2, custom IframeResizer)
182
+ - Google, Yandex and eLama sign-in, registration and CAPTCHA moved to the new Go backend
183
+ (`/api/v2/auth/*`)
184
+ - The projects page is moving to the Go backend `/api/v2` (behind a flag): members and invitations,
185
+ single-save settings, tags and folders, ESP integrations, storage settings
186
+ - File Manager: a Go-backend provider (behind a flag) — background indexing of the legacy file tree
187
+ with a progress indicator, automatic thumbnail loading, trash with restore into a chosen folder
188
+
189
+ ---
190
+
191
+ ## [1.1.29] - 2026-07-14
192
+
193
+ ### Added
194
+
195
+ - Layout converter for foreign markup to UseBlocks format: separate flags `beeFreeConverterEnabled` (deterministic BeeFree/Stripo conversion) and `aiLayoutConverterEnabled` (AI conversion of other markup)
196
+ - CAPTCHA on login and sign-up forms (Cloudflare Turnstile, Yandex SmartCaptcha)
197
+ - UTM tags and dynamic URL substitutions on export
198
+ - VML button improvements for Outlook compatibility
199
+
200
+ ### Fixed
201
+
202
+ - Content sync between iframe and Monaco (echo loop, autosave)
203
+ - Stable editor embed in external React/Microfrontend hosts (StrictMode, publicPath)
204
+ - Readable error toasts; autosave no longer blocks user edits
205
+ - White screen when the locale API is unavailable
206
+
207
+ ### Changed
208
+
209
+ - UI Kit and app UI migrated to Ant Design 6
210
+ - File Manager updated to 1.1.0
211
+
212
+ ---
213
+
214
+ ## [1.1.25] - 2026-07-07
215
+
216
+ ### Added
217
+
218
+ - Float block copy
219
+ - Global blocks: available to all users, synchronization reworked
220
+ - Code mode in the editor sidebar
221
+ - Empty states in the emails and projects tables
222
+ - Save and autosave loading indicators
223
+
224
+ ### Fixed
225
+
226
+ - Email subject and preheader
227
+ - Autosave recovery after failure
228
+ - Accidental removal of all styles in a block
229
+ - HTML sanitization against AdGuard and other browser extensions
230
+ - Vite host plugin: public path in dev mode
231
+
232
+ ---
233
+
234
+ ## [1.1.4] - 2026-06-15
235
+
236
+ ### Added
237
+
238
+ - Analytics for actions in the email editor iframe
239
+ - Improved drag-and-drop atom insertion into the email
240
+
241
+ ### Fixed
242
+
243
+ - Image and video preview in element settings (`SelectedImageForm`)
244
+ - Meta and layout synchronization in the social block form (`SelectedSocialForm`)
245
+ - Detection and sanitization of styles broken by browser extensions (adblock)
246
+ - Settings panel tab navigation (`PanelFormTabsOverrides`)
247
+
248
+ ### Changed
249
+
250
+ - Sentry: switched to a reinstalled self-hosted instance
251
+
252
+ ---
253
+
254
+ ## [1.1.0] - 2026-06-08
255
+
256
+ ### Added
257
+
258
+ - Plugin system: extensions API, sandbox API, plugin development CLI, internal plugins; email settings API for plugins (DEV-11837)
259
+ - Global blocks: creation, preview markers, sync changes across all templates
260
+ - Projects page (DEV-11990): card view, search and filters, Viewer role, member management from menu and list, frequent projects in the sidebar
261
+ - Light/dark theme switching in the email editor
262
+ - Autosave with retry mechanism; correct `projectId` handling for new emails (DEV-14828)
263
+ - Roll back an email to a previous version (DEV-15046)
264
+ - UI Kit component localization
265
+ - Element settings change analytics in the panel (Amplitude `change_element_setting`)
266
+ - Link normalization in href fields
267
+ - EML export: embed images as base64
268
+
269
+ ### Fixed
270
+
271
+ - Rich text editor: formatting and text editing (DEV-14640, DEV-14852)
272
+ - Email variable editing (DEV-14582)
273
+ - Dark theme in the project menu and inbox card (DEV-14842)
274
+ - Stickers in the Pixie image editor (DEV-14969)
275
+ - Monaco: workers across different origins; ESM editor build
276
+ - Mobile text and button alignment
277
+ - Image preview URLs moved to env variables (DEV-15052)
278
+
279
+ ### Changed
280
+
281
+ - Build migrated to Vite/ESM; pnpm monorepo
282
+ - Prod releases and npm package version driven by git tags (`useblocks-v*`)
283
+ - Email HTML sanitization against browser extension interference
284
+
285
+ ---
286
+
287
+ ## [1.0.117] - 2026-04-07
288
+
289
+ ### Added
290
+
291
+ - Bulleted lists in the rich text editor (DEV-12615)
292
+ - Anchor links
293
+ - Billing page and UX: limits (`limitsApi`), usage stats, paywall and limit upgrade modals (`LimitUpgradeModal`, including `image_generate` overage), left-menu tariff widget (`MenuTariffWidget`): trial, subscription, auto-renew (DEV-11223 and related work)
294
+ - Billing modals: plan checkout choice (`PlanCheckoutChoiceModal`), legal-entity invoice request with prefilled fields and hidden-field sync (`TariffInvoiceRequestModal`)
295
+ - Social blocks overhaul: drag-and-drop, settings tooltips, custom icons; VK platform (`vkv`); contrast and atom/cell backgrounds; delete control in the social form; CDN URL updates and icon URL generation (DEV-13666 and related fixes)
296
+ - Text formatting options in `SelectedTextCommonForm`
297
+ - `commonStyles` in iframe and deep merging of content styles; panel padding refinements
298
+ - Strip `width` and `max-width` from images in non-responsive emails (`stripImageWidthForNonResponsive`)
299
+ - Explicit content-column width checks in multi-column layouts and correct block width recalculation
300
+
301
+ ### Fixed
302
+
303
+ - Email subject: whitespace handling and `title` tag parsing (`getSubject`)
304
+ - Email layout width for columns with the `em-insert-ignore` class
305
+ - Integrations: Dotdigital, Klaviyo, ActiveCampaign; updated Brevo API key help URL
306
+ - File manager: duplicate folder notification (409), scrollable folder list in the Move submenu, DataSource and copy flow updates; null crash in FloatingBlocks; file upload handling
307
+ - Thumbnail normalization for the Pixie image editor and display formats via `normalizeImageFormatForDisplay` in image loaders
308
+ - Text background in the email (DEV-14472)
309
+ - Navigate to the button parent element (DEV-14443)
310
+ - Image center fails to open (DEV-14425)
311
+ - Social blocks: root-table selectors, form and `ColorPickerInput` styling, spacing in `EmailPane` and the social form
312
+ - Theme switching; halt errors with Sentry and Unisender; path computation in the Vite plugin
313
+ - Disabled TypeScript checking for HTML in the Monaco editor
314
+ - Buttons: unified `height` and `line-height` tied to theme variables in `Button.scss`
315
+
316
+ ### Changed
317
+
318
+ - Sentry, file manager, and other dependency version bumps
319
+ - Updated base URLs for social network icon CDNs
320
+ - Billing: streamlined/refactored `BillingPage`, banners and auto-pay buttons; webhook build switched to `buildLegacyWebhookRequest`; removed Streamline and Giphy proxies; custom proxy support (DEV-14043)
321
+ - Shared styles: font specificity (`PanelForm`, `common.scss`), payment button styling in `BillingBannerModal`
322
+ - `Ribbon` component and notifications; billing and UI localization updates
323
+ - CI: removed redundant Allure report job; `GIT_CLONE_PATH` for test VM jobs
324
+
325
+ ---
326
+
327
+ ## [1.0.109] - 2026-04-07
328
+
329
+ ### Added
330
+
331
+ - Bulleted lists in the rich text editor (DEV-12615)
332
+ - AI settings: skip dialog queries when the assistant is disabled; richer context for the AI prompt
333
+ - Subscription fields in logging methods (DEV-13876)
334
+ - Error boundary errors reported to analytics
335
+
336
+ ### Fixed
337
+
338
+ - Email subject: whitespace handling and `title` tag parsing (getSubject)
339
+ - File manager: duplicate folder notification (409), scrollable folder list in the Move submenu, DataSource and copy flow updates
340
+ - Link forms: default protocol and empty URL handling
341
+ - Sandbox: drag-and-drop and click layering (pointer-events)
342
+ - `applicationElementSettingsSet` registration and element path filtering
343
+ - Thumbnail normalization for the Pixie image editor
344
+
345
+ ### Changed
346
+
347
+ - Sentry and dependency version bumps
348
+
349
+ ---
350
+
351
+ ## [1.0.108] - 2026-03-26
352
+
353
+ ### Added
354
+
355
+ - ESP integrations: Mailchimp, Klaviyo, HubSpot, Salesforce Marketing Cloud, ActiveCampaign, Brevo, Campaign Monitor, Constant Contact, GetResponse, Bento, Dotdigital
356
+ - Integrations tab in the project edit modal
357
+ - Data layer events for email export
358
+ - `imageCenterLocalUploadEnabled` for local uploads in the image center
359
+
360
+ ### Fixed
361
+
362
+ - File manager: Redux removed from FM integration (DEV-14018, DEV-13858), proxy and front-end pagination, stray Edited folder on upload
363
+ - Editor and sandbox: contenteditable iframe, empty list insertion (DEV-13612), text editing (DEV-13608), delete-from-end in blocks (DEV-13558), mobile text properties (DEV-13679)
364
+ - Email button issues (DEV-13746); alignment icons use `currentColor` (DEV-13790)
365
+ - Duplicate notifications when sending a test email (DEV-10977)
366
+ - Sorting in the projects table (DEV-13759)
367
+ - Autosave: `revisionService` guard and `emailId` in revisionToApply
368
+
369
+ ### Changed
370
+
371
+ - Blocks / Emails / Projects / Members tables: layout, menus, drag-and-drop on block and email pages
372
+ - Webhook handling in the email buttons component
373
+ - Dotdigital and ActiveCampaign integration improvements (drafts)
374
+
375
+ ---
376
+
377
+ ## [1.0.104-alpha.1] - 2026-03-02
378
+
379
+ ### Added
380
+
381
+ **Integrations:**
382
+
383
+ - Unisender integration and settings management
384
+ - App-specific integration availability system
385
+
386
+ **Editor:**
387
+
388
+ - Free plan restrictions in ButtonsEmail component
389
+ - mailto link support (subject, body) — DEV-13102
390
+ - Mass blocks functionality
391
+ - Element sorting
392
+ - Insert link with correct color — DEV-13172
393
+
394
+ **AI & UX:**
395
+
396
+ - AI functionality in EmailPageHeader with payment verification
397
+ - Improved modal animations
398
+
399
+ **FileManager:**
400
+
401
+ - Support for custom names when copying files and folders
402
+ - Cache clearing
403
+
404
+ ### Fixed
405
+
406
+ **Table Editor:**
407
+
408
+ - Dropdown menu layout for Table element — DEV-13370
409
+ - Table editor functionality — DEV-13371
410
+
411
+ **Paste & Links:**
412
+
413
+ - Tag duplication when pasting text — DEV-13293
414
+ - Link duplication when pasting — DEV-13378
415
+
416
+ **Elements:**
417
+
418
+ - Adding Button element to email — DEV-13312
419
+ - Incorrect marker settings display — DEV-13313
420
+ - Line break restriction for notifications — DEV-13143
421
+
422
+ **Data & API:**
423
+
424
+ - Tag and group changes when sending email data — DEV-10189
425
+ - Recurring payment calculation with `is_only_first_period` — DEV-13377
426
+ - Notification on test email send error
427
+ - Localization in yandexLoginProxyPage
428
+ - JWT token expiration check and 401 response handling
429
+
430
+ ### Changed
431
+
432
+ **sandbox.js → TypeScript Refactoring:**
433
+
434
+ - Migration to modular structure with types and centralized state
435
+ - Modules for mouse, keyboard, and drag-and-drop event handling
436
+ - Element settings handlers (links, variables, padding)
437
+ - Modules for accordions, buttons, carousels, tables
438
+ - Utilities for text formatting, styles, and VML
439
+
440
+ **Integrations:**
441
+
442
+ - IntegrationSettings renamed to IntegrationSettingsData
443
+ - Unisender integration migrated to flexible structure
444
+
445
+ **UI:**
446
+
447
+ - Updated layout for BlocksTable and EmailsTable
448
+ - Improved checkbox styles in tables
449
+
450
+ ### Testing
451
+
452
+ - Integration tests for html2Dom, dom2Html, and export pipeline
453
+ - Functional tests for css namespace in dom2Html
454
+ - Functional tests for html2Dom
455
+ - Tests for createWrapper function
456
+
457
+ ---
458
+
459
+ ## [1.0.103] - 2026-02-05
460
+
461
+ _Changelog not documented_
package/README.md CHANGED
@@ -121,6 +121,44 @@ You can take **`EMAIL_CODE`** from <a href="https://cdn.useblocks.io/plugin/new-
121
121
 
122
122
  For debugging, the dev build may support a front-end token flow — configure an auth proxy in your app if you use that path.
123
123
 
124
+ ### React wrapper
125
+
126
+ The package ships a ready-made component. It creates its own container, calls **`init`** on mount
127
+ and **`destroy`** on unmount.
128
+
129
+ ```tsx
130
+ import Useblocks from 'useblocks/react';
131
+
132
+ const content = { subject: 'Email subject', html: 'EMAIL_CODE' };
133
+ const editorConfig = { theme: 'light' };
134
+ const editorStyle = { height: '100vh' };
135
+
136
+ export function Editor({ getAuthToken }) {
137
+ return (
138
+ <Useblocks
139
+ getAuthToken={getAuthToken}
140
+ content={content}
141
+ config={editorConfig}
142
+ style={editorStyle}
143
+ />
144
+ );
145
+ }
146
+ ```
147
+
148
+ The component takes the same options as **`init`**, plus `id`, `className`, `style` and `container`
149
+ (any other container attributes). Do not pass **`element`** — the component supplies its own `div`.
150
+ Keep `react` 16.8 or newer in your own dependencies; it is not bundled.
151
+
152
+ Two limitations worth knowing up front:
153
+
154
+ - Every props update triggers an editor **`reset`**. Keep objects and callbacks stable
155
+ (`useMemo` / `useCallback`), otherwise the editor is recreated on every parent render.
156
+ - Initialization errors are neither rethrown nor displayed. A failing **`init`** leaves an empty
157
+ container — call **`init`** directly to diagnose it.
158
+
159
+ When you need full control over the lifecycle, mount the editor by hand with **`init`** and
160
+ **`destroy`** instead.
161
+
124
162
  # Configuration
125
163
 
126
164
  Configuration is a nested object: editor chrome, initial email payload, and callback hooks.
@@ -247,7 +285,9 @@ Editor UI tuning. Use **`instance.setConfig`**, **`instance.updateConfig`**, **`
247
285
  | optimizeSpamAssassinEnabled | Show SpamAssassin check. | true |
248
286
  | optimizeCheckCodeEnabled | Show code check. | true |
249
287
  | settingsEnabled | Show “Settings” button. | true |
288
+ | settingsTabEnabled | Show the “Settings” tab in the settings panel. The UTM tags and Annotations tabs do not depend on it. | true |
250
289
  | UTMEnabled | Show UTM tags tab. | true |
290
+ | annotationsEnabled | Show the Gmail annotations tab. Enabled only in `pro` mode. | false |
251
291
  | descriptionEnabled | Show “Description” field in settings. | true |
252
292
  | tagsEnabled | Show “Tags” field in settings. | true |
253
293
  | switchDesktopMobilePropsEnabled | Show mobile properties toggle. | true |
@@ -315,8 +355,8 @@ Editor UI tuning. Use **`instance.setConfig`**, **`instance.updateConfig`**, **`
315
355
  | imageCenterStockEnabled | Stock photos tab. | true |
316
356
  | imageCenterGifEnabled | Stock GIFs tab. | true |
317
357
  | imageCenterEditorEnabled | Image editor tab. | true |
318
- | compressMaxSize | Client-side compression max bytes in file manager (~5&nbsp;MiB default). | see types |
319
- | compressMaxWidthOrHeight | Resize max width/height, px (2000 default). | see types |
358
+ | compressMaxSize | Target image weight after client-side compression, **megabytes** (not bytes). `0` disables compression. Default 0.48. | see types |
359
+ | compressMaxWidthOrHeight | Resize max width/height, px. `0` disables compression. Default 2000. | see types |
320
360
 
321
361
  ### Event wiring
322
362
 
@@ -407,6 +447,8 @@ useblocks.init({
407
447
 
408
448
  The `fileManager` section controls feature flags; every field is optional — default **true** when omitted unless noted in typings.
409
449
 
450
+ The section also accepts `compressMaxSize` and `compressMaxWidthOrHeight` — the same fields as at config root. Set here, they override the root ones **inside the file manager only**: an image dropped straight onto the canvas, uploaded through the image modal or pulled in by HTML import still uses the root value.
451
+
410
452
  #### Basic Operations
411
453
 
412
454
  - **enableTrash** — enables trash functionality for deleted files. When enabled, files are moved to trash instead of permanent deletion. Default: true
@@ -421,11 +463,18 @@ The `fileManager` section controls feature flags; every field is optional — de
421
463
  - **enableDelete** — allows deleting files and folders. When the recycle bin is enabled, files are moved there instead of being permanently deleted. Default is true
422
464
  - **multiSelect** — allows multiple selection of files and folders for batch operations. Default is true
423
465
  - **defaultFolderName** — default folder name
466
+ - **availableImageExtensions** — extensions shown in the "Supported files" hint under the empty-folder upload area, rendered with a leading dot (`['jpg', 'png']` → `.jpg, .png`). A caption only: it does not restrict what can be uploaded. Default: `['jpeg', 'svg', 'png']`
467
+ - **dedupeUploadNamesOnClient** — the client picks a free name before uploading: a taken `photo.png` is sent as `photo_1.png`, then `photo_2.png`. Covers image-editor copies, upload by URL, copy and move as well; creating a folder with a taken name is rejected with an error. Costs one extra folder listing per upload, so enable it when your backend does not resolve name collisions itself. Default: false
468
+ - **saveCopyToCurrentFolder** — "Save copy" in the image editor stores the file in the current folder. By default (false) the copy goes to the default folder regardless of where the editor was opened
469
+ - **showNotifications** — file manager toast notifications. Default: true
424
470
  - **sortOptions** — whitelist of sort dropdown values (`'date-desc' \| 'date-asc' \| 'size-desc' \| 'size-asc' \| 'name-asc' \| 'name-desc' \| 'type-asc'`). If omitted or empty, all options supported by the file-manager package are shown. Use a non-empty array to hide sorts your platform does not implement (e.g. size or type).
425
471
 
426
472
  #### Pagination & Display
427
473
 
428
474
  - **enablePagination** — enables paginated navigation. If disabled, all items are loaded at once. Default: true
475
+ - **unifiedCatalogFetch** — applies only together with `enablePagination: false`. Folder and file list requests are merged into a single whole-catalog request and the needed type is filtered client-side: one `getItems` call instead of two. Ignored when server-side pagination is on. Set `false` if your backend needs separate folder vs file requests. Default: true
476
+ - **expandRootFolderOnInit** — expands the root node of the folder tree on open; nested folders stay collapsed. Default: true
477
+ - **previewFallbackToFileUrl** — when a file has no `thumbnail` and no `thumbnailUrl`, `file.url` is used for the table and grid preview (images only). Default: true
429
478
 
430
479
  #### Client-Side Processing
431
480
 
@@ -444,10 +493,10 @@ The `fileManager` section controls feature flags; every field is optional — de
444
493
  #### Cache Strategy
445
494
 
446
495
  - **cacheStrategy** — caching strategy for performance optimization.
447
- - **ttl** — cache time-to-live in milliseconds. Default: 300000 (5 minutes)
448
- - **errorTtl** — cache TTL for errors in milliseconds. Default: 60000 (1 minute)
449
- - **allowSortedInsert** — allows inserting elements into sorted arrays without full cache invalidation. Default: false
450
- - **allowSearchInsert** — allows inserting elements into filtered arrays without full cache invalidation. Default: false
496
+ - **ttl** — cache time-to-live in milliseconds. Default: 1800000 (30 minutes)
497
+ - **errorTtl** — cache TTL for errors in milliseconds. Defaults to `ttl` when omitted
498
+ - **allowSortedInsert** — allows inserting elements into sorted arrays without full cache invalidation. Default: true
499
+ - **allowSearchInsert** — allows inserting elements into filtered arrays without full cache invalidation. Default: true
451
500
  - **invalidateOnPaginationFull** — marks cache as stale when inserting into a full paginated page. Default: true
452
501
  - **comparator** — comparison function for sorting two files. Default: name-based comparison
453
502
  - **filterMatch** — function to check if a file passes current filters. Default: name-based search
@@ -12,7 +12,7 @@
12
12
  }
13
13
 
14
14
  .of-atom .em-element-editor-widget {
15
- background: #d0ebff;
15
+ background: var(--ub-colorPrimaryBg, #d0ebff);
16
16
  }
17
17
 
18
18
  [class^='em-element-editor-widget-'] {
@@ -42,7 +42,7 @@
42
42
 
43
43
  .of-atom .em-element-editor-widget {
44
44
  width: 82px;
45
- background: #d0ebff;
45
+ background: var(--ub-colorPrimaryBg, #d0ebff);
46
46
  top: -1px;
47
47
  left: 0;
48
48
  border-radius: 6px 6px 0 0;
@@ -69,7 +69,7 @@
69
69
  width: 20px;
70
70
  height: 20px;
71
71
  font-size: 16px;
72
- color: #344966;
72
+ color: var(--ub-colorAtomToolbarIcon, #344966);
73
73
  }
74
74
 
75
75
  [class^='em-element-editor-widget-']:hover {
@@ -79,7 +79,7 @@
79
79
  }
80
80
 
81
81
  .of-atom [class^='em-element-editor-widget-']:hover {
82
- background: #b8d4e9;
82
+ background: var(--ub-colorPrimaryBgHover, #b8d4e9);
83
83
  }
84
84
 
85
85
  .em-element-editor-widget.sticky {
@@ -16,7 +16,7 @@
16
16
  }
17
17
 
18
18
  .of-atom .em-element-editor-widget {
19
- background: #d0ebff;
19
+ background: var(--ub-colorPrimaryBg, #d0ebff);
20
20
  }
21
21
 
22
22
  [class^='em-element-editor-widget-'] {
@@ -575,7 +575,7 @@ tinymce *.em-code[em-edit='active'] {
575
575
  width: 20px;
576
576
  height: 20px;
577
577
  font-size: 16px;
578
- color: #344966;
578
+ color: var(--ub-colorAtomToolbarIcon, #344966);
579
579
  }
580
580
 
581
581
  [class^='em-element-editor-widget-']:hover {
@@ -591,7 +591,7 @@ tinymce *.em-code[em-edit='active'] {
591
591
  }
592
592
 
593
593
  .of-atom [class^='em-element-editor-widget-']:hover {
594
- background: #b8d4e9;
594
+ background: var(--ub-colorPrimaryBgHover, #b8d4e9);
595
595
  }
596
596
 
597
597
  .em-element-editor-widget.sticky {