@seliseblocks/mailcraft 0.1.1 → 0.2.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 (86) hide show
  1. package/DOCS.md +243 -16
  2. package/README.md +15 -6
  3. package/README.md.txt +135 -0
  4. package/dist/mailcraft-editor.bundle.js +87 -47
  5. package/dist/mailcraft-editor.bundle.js.map +3 -3
  6. package/examples/templates/activate-your-account.html +1 -1
  7. package/examples/templates/back-in-stock.html +1 -1
  8. package/examples/templates/cart-left-behind.html +1 -1
  9. package/examples/templates/community-giveaway.html +1 -1
  10. package/examples/templates/frontend-futures-invite.html +1 -1
  11. package/examples/templates/give-25-get-25.html +1 -1
  12. package/examples/templates/invoice-paid.html +1 -1
  13. package/examples/templates/meet-nova-launch.html +1 -1
  14. package/examples/templates/mega-weekend-sale.html +1 -1
  15. package/examples/templates/order-confirmed.html +80 -80
  16. package/examples/templates/rate-your-headphones.html +1 -1
  17. package/examples/templates/reset-your-password.html +1 -1
  18. package/examples/templates/thankyou-promo-code.html +1 -1
  19. package/examples/templates/the-sunday-brief.html +1 -1
  20. package/examples/templates/welcome-to-your-workspace.html +1 -1
  21. package/examples/templates/your-order-shipped.html +1 -1
  22. package/examples/templates/your-password-was-changed.html +1 -1
  23. package/examples/templates/your-signin-code.html +1 -1
  24. package/examples/vanilla.html +261 -47
  25. package/package.json +7 -2
  26. package/src/core/assets.js +10 -15
  27. package/src/core/binder.js +140 -118
  28. package/src/core/blocks.js +14 -1
  29. package/src/core/css-cascade.js +117 -117
  30. package/src/core/editor-core.js +1540 -1492
  31. package/src/core/export.js +158 -55
  32. package/src/core/i18n/ar.js +218 -177
  33. package/src/core/i18n/bg.js +195 -152
  34. package/src/core/i18n/bn.js +217 -176
  35. package/src/core/i18n/ca.js +195 -152
  36. package/src/core/i18n/cs.js +195 -152
  37. package/src/core/i18n/da.js +195 -152
  38. package/src/core/i18n/de-CH.js +195 -152
  39. package/src/core/i18n/de.js +195 -152
  40. package/src/core/i18n/dz.js +220 -179
  41. package/src/core/i18n/el.js +195 -152
  42. package/src/core/i18n/en.js +3 -11
  43. package/src/core/i18n/es.js +195 -152
  44. package/src/core/i18n/et.js +195 -152
  45. package/src/core/i18n/fi.js +195 -152
  46. package/src/core/i18n/fr.js +195 -152
  47. package/src/core/i18n/hr.js +195 -152
  48. package/src/core/i18n/hu.js +195 -152
  49. package/src/core/i18n/index.js +83 -83
  50. package/src/core/i18n/it.js +195 -152
  51. package/src/core/i18n/lt.js +195 -152
  52. package/src/core/i18n/lv.js +195 -152
  53. package/src/core/i18n/nb.js +195 -152
  54. package/src/core/i18n/nl.js +195 -152
  55. package/src/core/i18n/pl.js +195 -152
  56. package/src/core/i18n/pt.js +195 -152
  57. package/src/core/i18n/ro.js +195 -152
  58. package/src/core/i18n/ru.js +195 -152
  59. package/src/core/i18n/sk.js +195 -152
  60. package/src/core/i18n/sl.js +195 -152
  61. package/src/core/i18n/sv.js +195 -152
  62. package/src/core/i18n/tables.js +50 -50
  63. package/src/core/i18n/tr.js +195 -152
  64. package/src/core/i18n/uk.js +195 -152
  65. package/src/core/icons.js +237 -235
  66. package/src/core/ids.js +1 -1
  67. package/src/core/import-html.js +1047 -959
  68. package/src/core/layout-style.js +100 -100
  69. package/src/core/parse.js +10 -10
  70. package/src/core/placeholder.js +15 -15
  71. package/src/core/sanitize.js +141 -141
  72. package/src/core/storage-limits.js +189 -184
  73. package/src/core/storage.js +85 -85
  74. package/src/core/theme.js +15 -1
  75. package/src/core/variables.js +11 -11
  76. package/src/index.js +9 -9
  77. package/src/mailcraft-editor.js +64 -25
  78. package/src/render/block-body.js +49 -6
  79. package/src/render/canvas.js +74 -8
  80. package/src/render/fields.js +619 -588
  81. package/src/render/focus-preserve.js +158 -158
  82. package/src/render/rte.js +241 -212
  83. package/src/render/screenshot.js +138 -132
  84. package/src/render/story.js +415 -415
  85. package/src/render/style.js +44 -8
  86. package/types/index.d.ts +422 -0
@@ -1,152 +1,195 @@
1
- /** Romanian (Română) — `ro`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const RO = {
3
- 'action.undoHint': 'Anulează — ⌘Z',
4
- 'action.redoHint': 'Refă — ⌘⇧Z',
5
- 'action.chromeToDark': 'Întunecat',
6
- 'action.chromeToLight': 'Luminos',
7
- 'action.chromeHint': 'Temă editor luminoasă / întunecată',
8
- 'action.aiCopy': 'Text',
9
- 'action.aiCopyHint': 'Redactează text cu AI',
10
- 'action.code': 'Cod',
11
- 'action.codeHint': 'Editează HTML brut cu previzualizare live',
12
- 'action.preview': 'Previzualizare',
13
- 'action.export': 'Exportă',
14
- 'device.desktop': 'Desktop',
15
- 'device.desktopHint': 'Lățime desktop',
16
- 'device.mobile': 'Mobil',
17
- 'device.mobileHint': 'Lățime mobil',
18
- 'device.dark': 'Întunecat',
19
- 'device.darkHint': 'Mod întunecat pentru inbox',
20
- 'status.autosaveOn': 'salvare automată activă',
21
- 'status.saved': 'salvat {time}',
22
- 'status.saveFailed': 'nu s-a salvat — stocare plină',
23
- 'canvas.meta': '{rows} rânduri · {blocks} blocuri · {width}px',
24
- 'tab.design': 'Stil',
25
- 'tab.designHint': 'Stilizează selecția',
26
- 'tab.blocks': 'Blocuri',
27
- 'tab.blocksHint': 'Blocuri de conținut și variabile',
28
- 'tab.rows': 'Secțiuni',
29
- 'tab.rowsHint': 'Aspecte de secțiuni și model de canvas',
30
- 'tab.files': 'Fișiere',
31
- 'tab.filesHint': 'Bibliotecă de resurse',
32
- 'tab.layers': 'Structură',
33
- 'tab.layersHint': 'Structura documentului',
34
- 'tab.theme': 'Temă',
35
- 'tab.themeHint': 'Stiluri globale',
36
- 'tab.data': 'Var.',
37
- 'tab.dataHint': 'Variabile furnizate de codul dvs.',
38
- 'inspector.blockProperties': 'Proprietățile blocului',
39
- 'inspector.sectionProperties': 'Proprietățile secțiunii',
40
- 'inspector.title': 'Inspector',
41
- 'inspector.sectionLabel': 'Secțiune',
42
- 'inspector.nothingSelected': 'Nimic selectat',
43
- 'action.duplicateHint': 'Duplică — ⌘D',
44
- 'action.deleteHint': 'Șterge — ⌫',
45
- 'inspector.emptyBody':
46
- 'Selectați un rând sau un bloc pe canvas pentru a-l stiliza aici. Trageți blocuri din fila <strong style="color: var(--ed-text); font-weight: 600;">Blocuri</strong>; dați dublu clic pe orice text pentru a-l edita direct.',
47
- 'inspector.shortcuts': 'Comenzi rapide',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z anulează, refă',
49
- 'shortcut.duplicate': '⌘D — duplică selecția',
50
- 'shortcut.delete': 'șterge selecția',
51
- 'shortcut.export': '⌘Eexportă HTML',
52
- 'shortcut.escape': 'ESCdeselectează, închide',
53
- 'blocks.dragHint': 'Trageți pe canvas',
54
- 'blocks.count': '{count} blocuri',
55
- 'rows.sectionLayouts': 'Aspecte de secțiuni',
56
- 'rows.customMarkup': 'Cod personalizat',
57
- 'rows.htmlRowHint': 'Trageți pentru a insera, sau dați clic pentru a adăuga — un rând pe toată lățimea pe care îl completați cu HTML brut',
58
- 'rows.rawHtmlSection': 'Secțiune HTML brut',
59
- 'rows.rawHtmlDesc': 'Secțiune pe toată lățimea, codul dvs. propriu, în continuare se poate trage',
60
- 'rows.canvasModel': 'Model canvas',
61
- 'rows.modeRowBased': 'Bazat pe rânduri',
62
- 'rows.modeFreeStack': 'Stivă liberă',
63
- 'rows.hintRows':
64
- 'Bazat pe secțiuni: plasați mai întâi un aspect, apoi blocuri în coloanele sale — fiecare secțiune are propriul fundal, bordură, setări flex sau grilă.',
65
- 'rows.hintStack': 'Stivă liberă: fără aspecte — fiecare bloc plasat devine propria secțiune pe toată lățimea, stivuită în ordine.',
66
- 'files.libraryCount': 'Bibliotecă{count} fișiere',
67
- 'files.openManager': 'Deschide managerul de fișiere',
68
- 'files.dragToCanvas': 'Trageți orice fișier direct pe canvas pentru a-l plasa ca bloc de imagine.',
69
- 'layers.structure': 'Structură',
70
- 'layers.sectionSingle': 'Secțiune',
71
- 'layers.sectionMulti': 'Secțiune · {count} coloane',
72
- 'layers.blockCount': '{count} bl.',
73
- 'theme.globalStyles': 'Stiluri globale',
74
- 'vars.title': 'Variabile',
75
- 'vars.fromCode': '{count} din codul dvs.',
76
- 'vars.declaredNote': 'Declarate de aplicația dvs. — canvasul afișează întotdeauna tokenul, niciodată o valoare.',
77
- 'vars.filterPlaceholder': 'Filtrează variabilele…',
78
- 'vars.insertHint': 'Dați clic pentru a insera în textul, titlul sau butonul selectat',
79
- 'vars.insert': 'inserează',
80
- 'vars.noMatch': 'Nicio variabilă nu corespunde acestui filtru.',
81
- 'vars.noneDeclared': 'Aplicația dvs. nu a declarat încă nicio variabilă.',
82
- 'vars.rteHint': 'În timp ce editați text, puteți alege o variabilă și direct din meniul derulant al barei de instrumente în linie.',
83
- 'modal.fileManager': 'Manager de fișiere',
84
- 'modal.assetsTitle': 'Resurse',
85
- 'modal.replaceImage': 'Înlocuiește imaginea',
86
- 'library.searchPlaceholder': 'Căutare fișiere…',
87
- 'action.upload': 'Încarcă',
88
- 'library.clickToPlace': 'Dați clic pe un fișier pentru a-l plasa · sau trageți un fișier pe canvas',
89
- 'library.clickToReplace': 'Dați clic pe un fișier pentru a înlocui imaginea selectată',
90
- 'library.storageLabel': '{count} fișiere · {size}',
91
- 'library.folders': 'Foldere',
92
- 'library.dropHint': 'Plasați fișiere imagine aici pentru încărcare — sau folosiți butonul Încarcă.',
93
- 'library.deleteFileHint': 'Șterge fișierul',
94
- 'library.del': 'ȘTERG',
95
- 'toast.assetDeleted': '{name} șters',
96
- 'modal.export': 'Exportă',
97
- 'modal.exportTitle': 'HTML de e-mail bazat pe tabele',
98
- 'export.copy': 'Copiază',
99
- 'export.copied': 'Copiat',
100
- 'action.download': 'Descarcă',
101
- 'export.meta': '{kb} KB · tabele + stiluri inline · lățimi sigure pentru Outlook',
102
- 'modal.rawHtmlTitle': 'HTML brut, previzualizare live',
103
- 'code.statusEdited': 'Vizualizare cod editat previzualizare live, încă neaplicat',
104
- 'code.statusSynced': 'Vizualizare cod sincronizat cu canvasul',
105
- 'action.reload': 'Reîncarcă',
106
- 'action.reloadHint': 'Reîncarcă sursa din canvas',
107
- 'action.applyToCanvas': 'Aplică pe canvas',
108
- 'action.applyToCanvasHint': 'Reanalizează sursa în rânduri editabile',
109
- 'action.closeWithoutApplyingHint': 'Închide fără a aplica',
110
- 'code.source': 'Sursă',
111
- 'code.livePreview': 'Previzualizare live',
112
- 'code.liveHtmlPreviewTitle': 'Previzualizare HTML live',
113
- 'code.applyNote':
114
- 'Aplicarea analizează fiecare rând de tabel de nivel superior într-un rând de canvas pe care îl puteți încă selecta, reordona și șterge — codul scris manual supraviețuiește procesului nemodificat.',
115
- 'code.meta': '{kb} KB · {lines} rânduri',
116
- 'toast.sourceReloaded': 'Sursă reîncărcată din canvas',
117
- 'toast.sourceAppliedOne': 'Sursă aplicată — 1 rând pe canvas',
118
- 'toast.sourceAppliedMany': 'Sursă aplicată — {rows} rânduri pe canvas',
119
- 'toast.parseError': 'Acest HTML nu a putut fi analizat',
120
- 'modal.copyAssist': 'Asistent de redactare',
121
- 'modal.draftCopyTitle': 'Redactează text pentru această campanie',
122
- 'ai.goal': 'Obiectiv',
123
- 'ai.tone': 'Ton',
124
- 'ai.briefLabel': 'Despre ce este acest e-mail?',
125
- 'ai.briefPlaceholder': 'de ex. Colecție de toamnă, 15% pentru abonați, livrare gratuită peste 150 lei',
126
- 'ai.generate': 'Generează text',
127
- 'ai.writing': 'Se scrie…',
128
- 'ai.kindHeadline': 'Titlu',
129
- 'ai.kindBody': 'Text principal',
130
- 'ai.kindButton': 'Text buton',
131
- 'ai.actionInsertHeading': 'Inserează ca titlu',
132
- 'ai.actionInsertText': 'Inserează ca bloc de text',
133
- 'ai.actionInsertButton': 'Inserează ca buton',
134
- 'toast.headingAdded': 'Titlu adăugat',
135
- 'toast.textBlockAdded': 'Bloc de text adăugat',
136
- 'toast.buttonAdded': 'Buton adăugat',
137
- 'preview.kickerMobile': 'Previzualizare mobil 375px',
138
- 'preview.kickerDark': 'Previzualizare inbox întunecat',
139
- 'preview.kickerDesktop': 'Previzualizare desktop {width}px',
140
- 'action.close': 'Închide',
141
- 'toast.duplicated': 'Duplicat',
142
- 'toast.fileUploadedOne': '1 fișier încărcat',
143
- 'toast.fileUploadedMany': '{count} fișiere încărcate',
144
- 'toast.imageReplaced': 'Imagine înlocuită',
145
- 'toast.imageAdded': 'Imagine adăugată pe canvas',
146
- 'toast.htmlCopied': 'HTML copiat în clipboard',
147
- 'toast.templateLoaded': '{name} încărcat',
148
- 'toast.snippetDefaultLabel': 'Fragment',
149
- 'toast.snippetInserted': '{name} inserat',
150
- 'toast.snippetCopied': '{name} copiat — selectați un bloc de text pentru a-l insera',
151
- };
152
-
1
+ /** Romanian (Română) — `ro`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const RO = {
3
+ 'action.undoHint': 'Anulează — ⌘Z',
4
+ 'action.redoHint': 'Refă — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Întunecat',
6
+ 'action.chromeToLight': 'Luminos',
7
+ 'action.chromeHint': 'Temă editor luminoasă / întunecată',
8
+ 'action.chromeHintToDark': 'Mod întunecat',
9
+ 'action.chromeHintToLight': 'Mod luminos',
10
+ 'action.aiDraft': 'Ciornă',
11
+ 'action.aiDraftHint': 'Scrie conținutul e-mailului cu AI',
12
+ 'action.code': 'Cod',
13
+ 'action.codeHint': 'Editează HTML brut cu previzualizare live',
14
+ 'action.preview': 'Previzualizare',
15
+ 'action.previewHint': 'Previzualizează e-mailul',
16
+ 'action.export': 'Exportă',
17
+ 'action.exportHint': 'Exportă e-mailul tău',
18
+ 'device.desktop': 'Desktop',
19
+ 'device.desktopHint': 'Lățime desktop',
20
+ 'device.mobile': 'Mobil',
21
+ 'device.mobileHint': 'Lățime mobil',
22
+ 'status.autosaveOn': 'salvare automată activă',
23
+ 'status.saved': 'salvat {time}',
24
+ 'status.saveFailed': 'nu s-a salvat — stocare plină',
25
+ 'canvas.meta': '{rows} rânduri · {blocks} blocuri · {width}px',
26
+ 'tab.design': 'Stil',
27
+ 'tab.designHint': 'Stilizează selecția',
28
+ 'tab.blocks': 'Blocuri',
29
+ 'tab.blocksHint': 'Blocuri de conținut și variabile',
30
+ 'tab.rows': 'Secțiuni',
31
+ 'tab.rowsHint': 'Aspecte de secțiuni și model de canvas',
32
+ 'tab.files': 'Fișiere',
33
+ 'tab.filesHint': 'Bibliotecă de resurse',
34
+ 'tab.layers': 'Structură',
35
+ 'tab.layersHint': 'Structura documentului',
36
+ 'tab.settings': 'Setări',
37
+ 'tab.settingsHint': 'Setările e-mailului',
38
+ 'tab.data': 'Var.',
39
+ 'tab.dataHint': 'Variabile furnizate de codul dvs.',
40
+ 'inspector.blockProperties': 'Proprietățile blocului',
41
+ 'inspector.sectionProperties': 'Proprietățile secțiunii',
42
+ 'inspector.title': 'Inspector',
43
+ 'inspector.sectionLabel': 'Secțiune',
44
+ 'inspector.nothingSelected': 'Nimic selectat',
45
+ 'action.duplicateHint': 'Duplică — ⌘D',
46
+ 'action.deleteHint': 'Șterge ',
47
+ 'inspector.emptyBody':
48
+ 'Selectați un rând sau un bloc pe canvas pentru a-l stiliza aici. Trageți blocuri din fila <strong style="color: var(--ed-text); font-weight: 600;">Blocuri</strong>; dați dublu clic pe orice text pentru a-l edita direct.',
49
+ 'inspector.shortcuts': 'Comenzi rapide',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z anulează, refă',
51
+ 'shortcut.duplicate': '⌘Dduplică selecția',
52
+ 'shortcut.delete': 'șterge selecția',
53
+ 'shortcut.export': '⌘E exportă HTML',
54
+ 'shortcut.escape': 'ESC — deselectează, închide',
55
+ 'blocks.dragHint': 'Trageți pe canvas',
56
+ 'blocks.count': '{count} blocuri',
57
+ 'rows.sectionLayouts': 'Aspecte de secțiuni',
58
+ 'rows.customMarkup': 'Cod personalizat',
59
+ 'rows.htmlRowHint': 'Trageți pentru a insera, sau dați clic pentru a adăuga — un rând pe toată lățimea pe care îl completați cu HTML brut',
60
+ 'rows.rawHtmlSection': 'Secțiune HTML brut',
61
+ 'rows.rawHtmlDesc': 'Secțiune pe toată lățimea, codul dvs. propriu, în continuare se poate trage',
62
+ 'rows.canvasModel': 'Model canvas',
63
+ 'rows.modeRowBased': 'Bazat pe rânduri',
64
+ 'rows.modeFreeStack': 'Stivă liberă',
65
+ 'rows.hintRows':
66
+ 'Bazat pe secțiuni: plasați mai întâi un aspect, apoi blocuri în coloanele sale fiecare secțiune are propriul fundal, bordură, setări flex sau grilă.',
67
+ 'rows.hintStack': 'Stivă liberă: fără aspecte — fiecare bloc plasat devine propria secțiune pe toată lățimea, stivuită în ordine.',
68
+ 'files.libraryCount': 'Bibliotecă {count} fișiere',
69
+ 'files.openManager': 'Deschide managerul de fișiere',
70
+ 'files.dragToCanvas': 'Trageți orice fișier direct pe canvas pentru a-l plasa ca bloc de imagine.',
71
+ 'layers.structure': 'Structură',
72
+ 'layers.sectionSingle': 'Secțiune',
73
+ 'layers.sectionMulti': 'Secțiune · {count} coloane',
74
+ 'layers.column': 'Coloana {index}',
75
+ 'layers.blockCount': '{count} bl.',
76
+ 'vars.title': 'Variabile',
77
+ 'vars.fromCode': '{count} din codul dvs.',
78
+ 'vars.declaredNote': 'Declarate de aplicația dvs. canvasul afișează întotdeauna tokenul, niciodată o valoare.',
79
+ 'vars.filterPlaceholder': 'Filtrează variabilele…',
80
+ 'vars.insertHint': 'Dați clic pentru a insera în textul, titlul sau butonul selectat',
81
+ 'vars.insert': 'inserează',
82
+ 'vars.noMatch': 'Nicio variabilă nu corespunde acestui filtru.',
83
+ 'vars.noneDeclared': 'Aplicația dvs. nu a declarat încă nicio variabilă.',
84
+ 'vars.rteHint': 'În timp ce editați text, puteți alege o variabilă și direct din meniul derulant al barei de instrumente în linie.',
85
+ 'modal.fileManager': 'Manager de fișiere',
86
+ 'modal.assetsTitle': 'Resurse',
87
+ 'modal.replaceImage': 'Înlocuiește imaginea',
88
+ 'library.searchPlaceholder': 'Căutare fișiere…',
89
+ 'action.upload': 'Încarcă',
90
+ 'library.clickToPlace': 'Dați clic pe un fișier pentru a-l plasa · sau trageți un fișier pe canvas',
91
+ 'library.clickToReplace': 'Dați clic pe un fișier pentru a înlocui imaginea selectată',
92
+ 'library.storageLabel': '{count} fișiere · {size}',
93
+ 'library.folders': 'Foldere',
94
+ 'library.dropHint': 'Plasați fișiere imagine aici pentru încărcare — sau folosiți butonul Încarcă.',
95
+ 'library.deleteFileHint': 'Șterge fișierul',
96
+ 'library.del': 'ȘTERG',
97
+ 'toast.assetDeleted': '{name} șters',
98
+ 'library.allFiles': 'Toate fișierele',
99
+ 'library.loadMore': 'Încarcă mai multe',
100
+ 'library.empty': 'Încă nu există fișiere aici.',
101
+ 'storage.loading': 'Se încarcă fișierele…',
102
+ 'storage.uploading': 'Se încarcă {count}…',
103
+ 'storage.errLoadFailed': 'Biblioteca de fișiere nu a putut fi încărcată — {reason}',
104
+ 'storage.errNoLimits': 'Încărcările sunt oprite: această aplicație nu a stabilit nicio limită de încărcare.',
105
+ 'storage.errNoMaxBytes': 'Încărcările sunt oprite: nu a fost stabilită o dimensiune maximă a fișierului.',
106
+ 'storage.errTooLarge': '{name} are {size} — limita este {max}.',
107
+ 'storage.errFormat': '{name} este un fișier {type}, care nu este permis aici.',
108
+ 'storage.errSvg': '{name} este un SVG, pe care această aplicație nu îl acceptă.',
109
+ 'storage.errDimensions': '{name} are {w}×{ht}px — limita este {maxW}×{maxH}px.',
110
+ 'storage.errTooMany': 'Se pot încărca doar {max} fișiere odată.',
111
+ 'storage.errUnreadable': '{name} nu este o imagine lizibilă.',
112
+ 'storage.errUploadFailed': '{name} nu a putut fi încărcat — {reason}',
113
+ 'storage.errDeleteFailed': '{name} nu a putut fi șters — {reason}',
114
+ 'modal.export': 'Exportă',
115
+ 'modal.exportTitle': 'HTML de e-mail bazat pe tabele',
116
+ 'export.copy': 'Copiază',
117
+ 'export.copied': 'Copiat',
118
+ 'action.download': 'Descarcă',
119
+ 'export.meta': '{kb} KB · tabele + stiluri inline · lățimi sigure pentru Outlook',
120
+ 'modal.rawHtmlTitle': 'HTML brut, previzualizare live',
121
+ 'code.statusEdited': 'Vizualizare cod editat — previzualizare live, încă neaplicat',
122
+ 'code.statusSynced': 'Vizualizare cod — sincronizat cu canvasul',
123
+ 'action.reload': 'Reîncarcă',
124
+ 'action.reloadHint': 'Reîncarcă sursa din canvas',
125
+ 'action.applyToCanvas': 'Aplică pe canvas',
126
+ 'action.applyToCanvasHint': 'Reanalizează sursa în rânduri editabile',
127
+ 'action.closeWithoutApplyingHint': 'Închide fără a aplica',
128
+ 'code.source': 'Sursă',
129
+ 'code.livePreview': 'Previzualizare live',
130
+ 'code.liveHtmlPreviewTitle': 'Previzualizare HTML live',
131
+ 'code.applyNote':
132
+ 'Aplicarea analizează fiecare rând de tabel de nivel superior într-un rând de canvas pe care îl puteți încă selecta, reordona și șterge — codul scris manual supraviețuiește procesului nemodificat.',
133
+ 'code.meta': '{kb} KB · {lines} rânduri',
134
+ 'toast.sourceReloaded': 'Sursă reîncărcată din canvas',
135
+ 'toast.sourceAppliedOne': 'Sursă aplicată 1 rând pe canvas',
136
+ 'toast.sourceAppliedMany': 'Sursă aplicată — {rows} rânduri pe canvas',
137
+ 'toast.parseError': 'Acest HTML nu a putut fi analizat',
138
+ 'modal.aiDraft': 'Asistent de scriere AI',
139
+ 'modal.aiDraftTitle': 'Scrie-ți e-mailul cu AI',
140
+ 'ai.disclosure': 'AI creează sugestii pornind de la brieful tău. Verifică și editează rezultatul înainte de trimitere.',
141
+ 'ai.goal': 'Obiectiv',
142
+ 'ai.tone': 'Ton',
143
+ 'ai.briefLabel': 'Despre ce este acest e-mail?',
144
+ 'ai.briefPlaceholder': 'de ex. Colecție de toamnă, 15% pentru abonați, livrare gratuită peste 150 lei',
145
+ 'ai.generate': 'Generează text',
146
+ 'ai.writing': 'Se scrie…',
147
+ 'ai.kindHeadline': 'Titlu',
148
+ 'ai.kindBody': 'Text principal',
149
+ 'ai.kindButton': 'Text buton',
150
+ 'ai.actionInsertHeading': 'Inserează ca titlu',
151
+ 'ai.actionInsertText': 'Inserează ca bloc de text',
152
+ 'ai.actionInsertButton': 'Inserează ca buton',
153
+ 'toast.headingAdded': 'Titlu adăugat',
154
+ 'toast.textBlockAdded': 'Bloc de text adăugat',
155
+ 'toast.buttonAdded': 'Buton adăugat',
156
+ 'preview.kickerMobile': 'Previzualizare — mobil 375px',
157
+ 'preview.kickerDesktop': 'Previzualizare — desktop {width}px',
158
+ 'action.close': 'Închide',
159
+ 'toast.duplicated': 'Duplicat',
160
+ 'toast.fileUploadedOne': '1 fișier încărcat',
161
+ 'toast.fileUploadedMany': '{count} fișiere încărcate',
162
+ 'toast.imageReplaced': 'Imagine înlocuită',
163
+ 'toast.imageAdded': 'Imagine adăugată pe canvas',
164
+ 'toast.htmlCopied': 'HTML copiat în clipboard',
165
+ 'toast.templateLoaded': '{name} încărcat',
166
+ 'toast.snippetDefaultLabel': 'Fragment',
167
+ 'toast.snippetInserted': '{name} inserat',
168
+ 'toast.snippetCopied': '{name} copiat — selectați un bloc de text pentru a-l insera',
169
+ 'rte.textStyle': 'Stilul textului',
170
+ 'rte.mergeTags': 'Câmpuri de îmbinare',
171
+ 'rte.noMergeTags': 'Nu există câmpuri de îmbinare disponibile',
172
+ 'rte.textColor': 'Culoarea textului',
173
+ 'rte.highlightColor': 'Culoarea evidențierii',
174
+ 'rte.removeHighlight': 'Elimină evidențierea',
175
+ 'rte.clearFormatting': 'Șterge formatarea',
176
+ 'action.downloadPng': 'Descarcă PNG',
177
+ 'action.screenshot': 'Captură de ecran',
178
+ 'action.screenshotHint': 'Vezi tot șablonul ca imagine, apoi descarc-o',
179
+ 'toast.pngSaved': 'Captura a fost descărcată',
180
+ 'toast.pngFailed': 'Captura a eșuat — o imagine externă nu a putut fi încărcată',
181
+ 'toast.pngCopied': 'Captura a fost copiată în clipboard',
182
+ 'toast.pngCopyFailed': 'Acest browser nu a acceptat o imagine în clipboard',
183
+ 'story.kicker': 'Captură de ecran',
184
+ 'story.rendering': 'Se generează captura',
185
+ 'story.renderingHint': 'Fiecare bloc este desenat la 2× — la un șablon lung durează un moment.',
186
+ 'story.failed': 'Captura a eșuat',
187
+ 'story.failedHint': 'O imagine din șablon nu a putut fi încărcată pentru captură.',
188
+ 'story.retry': 'Încearcă din nou',
189
+ 'story.play': 'Redă',
190
+ 'story.pause': 'Pauză',
191
+ 'story.replay': 'Redă din nou',
192
+ 'story.copy': 'Copiază',
193
+ 'story.meta': '{w}×{h} · ecranul {i} din {n}',
194
+ 'footer.poweredBy': 'Susținut de SELISE Blocks © 2026',
195
+ };