@seliseblocks/mailcraft 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/DOCS.md +240 -12
  2. package/README.md +11 -3
  3. package/README.md.txt +134 -0
  4. package/dist/mailcraft-editor.bundle.js +51 -39
  5. package/dist/mailcraft-editor.bundle.js.map +3 -3
  6. package/examples/templates/order-confirmed.html +80 -80
  7. package/examples/vanilla.html +242 -23
  8. package/package.json +7 -2
  9. package/src/core/assets.js +10 -15
  10. package/src/core/binder.js +120 -118
  11. package/src/core/blocks.js +14 -1
  12. package/src/core/css-cascade.js +117 -117
  13. package/src/core/editor-core.js +1530 -1492
  14. package/src/core/export.js +142 -55
  15. package/src/core/i18n/ar.js +219 -177
  16. package/src/core/i18n/bg.js +196 -152
  17. package/src/core/i18n/bn.js +218 -176
  18. package/src/core/i18n/ca.js +196 -152
  19. package/src/core/i18n/cs.js +196 -152
  20. package/src/core/i18n/da.js +196 -152
  21. package/src/core/i18n/de-CH.js +196 -152
  22. package/src/core/i18n/de.js +196 -152
  23. package/src/core/i18n/dz.js +221 -179
  24. package/src/core/i18n/el.js +196 -152
  25. package/src/core/i18n/en.js +3 -10
  26. package/src/core/i18n/es.js +196 -152
  27. package/src/core/i18n/et.js +196 -152
  28. package/src/core/i18n/fi.js +196 -152
  29. package/src/core/i18n/fr.js +196 -152
  30. package/src/core/i18n/hr.js +196 -152
  31. package/src/core/i18n/hu.js +196 -152
  32. package/src/core/i18n/index.js +83 -83
  33. package/src/core/i18n/it.js +196 -152
  34. package/src/core/i18n/lt.js +196 -152
  35. package/src/core/i18n/lv.js +196 -152
  36. package/src/core/i18n/nb.js +196 -152
  37. package/src/core/i18n/nl.js +196 -152
  38. package/src/core/i18n/pl.js +196 -152
  39. package/src/core/i18n/pt.js +196 -152
  40. package/src/core/i18n/ro.js +196 -152
  41. package/src/core/i18n/ru.js +196 -152
  42. package/src/core/i18n/sk.js +196 -152
  43. package/src/core/i18n/sl.js +196 -152
  44. package/src/core/i18n/sv.js +196 -152
  45. package/src/core/i18n/tables.js +50 -50
  46. package/src/core/i18n/tr.js +196 -152
  47. package/src/core/i18n/uk.js +196 -152
  48. package/src/core/icons.js +237 -235
  49. package/src/core/ids.js +1 -1
  50. package/src/core/import-html.js +1025 -959
  51. package/src/core/layout-style.js +100 -100
  52. package/src/core/parse.js +10 -10
  53. package/src/core/placeholder.js +15 -15
  54. package/src/core/sanitize.js +141 -141
  55. package/src/core/storage-limits.js +184 -184
  56. package/src/core/storage.js +85 -85
  57. package/src/core/theme.js +1 -1
  58. package/src/core/variables.js +11 -11
  59. package/src/index.js +9 -9
  60. package/src/mailcraft-editor.js +26 -14
  61. package/src/render/block-body.js +49 -6
  62. package/src/render/canvas.js +31 -2
  63. package/src/render/fields.js +602 -588
  64. package/src/render/focus-preserve.js +158 -158
  65. package/src/render/rte.js +241 -212
  66. package/src/render/screenshot.js +132 -132
  67. package/src/render/story.js +415 -415
  68. package/src/render/style.js +8 -0
  69. package/types/index.d.ts +419 -0
@@ -1,152 +1,196 @@
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': 'Previzualizaremobil 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.errNoAccept': 'Încărcările sunt oprite: nu a fost permis niciun format de fișier.',
106
+ 'storage.errNoMaxBytes': 'Încărcările sunt oprite: nu a fost stabilită o dimensiune maximă a fișierului.',
107
+ 'storage.errTooLarge': '{name} are {size} — limita este {max}.',
108
+ 'storage.errFormat': '{name} este un fișier {type}, care nu este permis aici.',
109
+ 'storage.errSvg': '{name} este un SVG, pe care această aplicație nu îl acceptă.',
110
+ 'storage.errDimensions': '{name} are {w}×{ht}px — limita este {maxW}×{maxH}px.',
111
+ 'storage.errTooMany': 'Se pot încărca doar {max} fișiere odată.',
112
+ 'storage.errUnreadable': '{name} nu este o imagine lizibilă.',
113
+ 'storage.errUploadFailed': '{name} nu a putut fi încărcat — {reason}',
114
+ 'storage.errDeleteFailed': '{name} nu a putut fi șters{reason}',
115
+ 'modal.export': 'Exportă',
116
+ 'modal.exportTitle': 'HTML de e-mail bazat pe tabele',
117
+ 'export.copy': 'Copiază',
118
+ 'export.copied': 'Copiat',
119
+ 'action.download': 'Descarcă',
120
+ 'export.meta': '{kb} KB · tabele + stiluri inline · lățimi sigure pentru Outlook',
121
+ 'modal.rawHtmlTitle': 'HTML brut, previzualizare live',
122
+ 'code.statusEdited': 'Vizualizare cod — editat — previzualizare live, încă neaplicat',
123
+ 'code.statusSynced': 'Vizualizare cod — sincronizat cu canvasul',
124
+ 'action.reload': 'Reîncarcă',
125
+ 'action.reloadHint': 'Reîncarcă sursa din canvas',
126
+ 'action.applyToCanvas': 'Aplică pe canvas',
127
+ 'action.applyToCanvasHint': 'Reanalizează sursa în rânduri editabile',
128
+ 'action.closeWithoutApplyingHint': 'Închide fără a aplica',
129
+ 'code.source': 'Sursă',
130
+ 'code.livePreview': 'Previzualizare live',
131
+ 'code.liveHtmlPreviewTitle': 'Previzualizare HTML live',
132
+ 'code.applyNote':
133
+ '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.',
134
+ 'code.meta': '{kb} KB · {lines} rânduri',
135
+ 'toast.sourceReloaded': 'Sursă reîncărcată din canvas',
136
+ 'toast.sourceAppliedOne': 'Sursă aplicată — 1 rând pe canvas',
137
+ 'toast.sourceAppliedMany': 'Sursă aplicată {rows} rânduri pe canvas',
138
+ 'toast.parseError': 'Acest HTML nu a putut fi analizat',
139
+ 'modal.aiDraft': 'Asistent de scriere AI',
140
+ 'modal.aiDraftTitle': 'Scrie-ți e-mailul cu AI',
141
+ 'ai.disclosure': 'AI creează sugestii pornind de la brieful tău. Verifică și editează rezultatul înainte de trimitere.',
142
+ 'ai.goal': 'Obiectiv',
143
+ 'ai.tone': 'Ton',
144
+ 'ai.briefLabel': 'Despre ce este acest e-mail?',
145
+ 'ai.briefPlaceholder': 'de ex. Colecție de toamnă, 15% pentru abonați, livrare gratuită peste 150 lei',
146
+ 'ai.generate': 'Generează text',
147
+ 'ai.writing': 'Se scrie…',
148
+ 'ai.kindHeadline': 'Titlu',
149
+ 'ai.kindBody': 'Text principal',
150
+ 'ai.kindButton': 'Text buton',
151
+ 'ai.actionInsertHeading': 'Inserează ca titlu',
152
+ 'ai.actionInsertText': 'Inserează ca bloc de text',
153
+ 'ai.actionInsertButton': 'Inserează ca buton',
154
+ 'toast.headingAdded': 'Titlu adăugat',
155
+ 'toast.textBlockAdded': 'Bloc de text adăugat',
156
+ 'toast.buttonAdded': 'Buton adăugat',
157
+ 'preview.kickerMobile': 'Previzualizare — mobil 375px',
158
+ 'preview.kickerDesktop': 'Previzualizare — desktop {width}px',
159
+ 'action.close': 'Închide',
160
+ 'toast.duplicated': 'Duplicat',
161
+ 'toast.fileUploadedOne': '1 fișier încărcat',
162
+ 'toast.fileUploadedMany': '{count} fișiere încărcate',
163
+ 'toast.imageReplaced': 'Imagine înlocuită',
164
+ 'toast.imageAdded': 'Imagine adăugată pe canvas',
165
+ 'toast.htmlCopied': 'HTML copiat în clipboard',
166
+ 'toast.templateLoaded': '{name} încărcat',
167
+ 'toast.snippetDefaultLabel': 'Fragment',
168
+ 'toast.snippetInserted': '{name} inserat',
169
+ 'toast.snippetCopied': '{name} copiat — selectați un bloc de text pentru a-l insera',
170
+ 'rte.textStyle': 'Stilul textului',
171
+ 'rte.mergeTags': 'Câmpuri de îmbinare',
172
+ 'rte.noMergeTags': 'Nu există câmpuri de îmbinare disponibile',
173
+ 'rte.textColor': 'Culoarea textului',
174
+ 'rte.highlightColor': 'Culoarea evidențierii',
175
+ 'rte.removeHighlight': 'Elimină evidențierea',
176
+ 'rte.clearFormatting': 'Șterge formatarea',
177
+ 'action.downloadPng': 'Descarcă PNG',
178
+ 'action.screenshot': 'Captură de ecran',
179
+ 'action.screenshotHint': 'Vezi tot șablonul ca imagine, apoi descarc-o',
180
+ 'toast.pngSaved': 'Captura a fost descărcată',
181
+ 'toast.pngFailed': 'Captura a eșuat — o imagine externă nu a putut fi încărcată',
182
+ 'toast.pngCopied': 'Captura a fost copiată în clipboard',
183
+ 'toast.pngCopyFailed': 'Acest browser nu a acceptat o imagine în clipboard',
184
+ 'story.kicker': 'Captură de ecran',
185
+ 'story.rendering': 'Se generează captura',
186
+ 'story.renderingHint': 'Fiecare bloc este desenat la 2× — la un șablon lung durează un moment.',
187
+ 'story.failed': 'Captura a eșuat',
188
+ 'story.failedHint': 'O imagine din șablon nu a putut fi încărcată pentru captură.',
189
+ 'story.retry': 'Încearcă din nou',
190
+ 'story.play': 'Redă',
191
+ 'story.pause': 'Pauză',
192
+ 'story.replay': 'Redă din nou',
193
+ 'story.copy': 'Copiază',
194
+ 'story.meta': '{w}×{h} · ecranul {i} din {n}',
195
+ 'footer.poweredBy': 'Susținut de SELISE Blocks © 2026',
196
+ };