@seliseblocks/mailcraft 0.1.1 → 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 +238 -10
  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 +234 -22
  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
- /** Catalan (Català) — `ca`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const CA = {
3
- 'action.undoHint': 'Desfés — ⌘Z',
4
- 'action.redoHint': 'Refés — ⌘⇧Z',
5
- 'action.chromeToDark': 'Fosc',
6
- 'action.chromeToLight': 'Clar',
7
- 'action.chromeHint': 'Tema de l’editor clar / fosc',
8
- 'action.aiCopy': 'Text',
9
- 'action.aiCopyHint': 'Redactar text amb IA',
10
- 'action.code': 'Codi',
11
- 'action.codeHint': 'Editar l’HTML en brut amb previsualització en directe',
12
- 'action.preview': 'Previsualització',
13
- 'action.export': 'Exporta',
14
- 'device.desktop': 'Escriptori',
15
- 'device.desktopHint': 'Amplada d’escriptori',
16
- 'device.mobile': 'Mòbil',
17
- 'device.mobileHint': 'Amplada mòbil',
18
- 'device.dark': 'Fosc',
19
- 'device.darkHint': 'Bústia en mode fosc',
20
- 'status.autosaveOn': 'desament automàtic activat',
21
- 'status.saved': 'desat {time}',
22
- 'status.saveFailed': 'no desat — emmagatzematge ple',
23
- 'canvas.meta': '{rows} files · {blocks} blocs · {width}px',
24
- 'tab.design': 'Estil',
25
- 'tab.designHint': 'Aplica estil a la selecció',
26
- 'tab.blocks': 'Blocs',
27
- 'tab.blocksHint': 'Blocs de contingut i variables',
28
- 'tab.rows': 'Seccions',
29
- 'tab.rowsHint': 'Dissenys de secció i model de llenç',
30
- 'tab.files': 'Fitxers',
31
- 'tab.filesHint': 'Biblioteca de recursos',
32
- 'tab.layers': 'Estruct.',
33
- 'tab.layersHint': 'Estructura del document',
34
- 'tab.theme': 'Tema',
35
- 'tab.themeHint': 'Estils globals',
36
- 'tab.data': 'Var.',
37
- 'tab.dataHint': 'Variables proporcionades pel vostre codi',
38
- 'inspector.blockProperties': 'Propietats del bloc',
39
- 'inspector.sectionProperties': 'Propietats de la secció',
40
- 'inspector.title': 'Inspector',
41
- 'inspector.sectionLabel': 'Secció',
42
- 'inspector.nothingSelected': 'Res seleccionat',
43
- 'action.duplicateHint': 'Duplica — ⌘D',
44
- 'action.deleteHint': 'Elimina — ⌫',
45
- 'inspector.emptyBody':
46
- 'Seleccioneu una fila o un bloc al llenç per donar-li estil aquí. Arrossegueu blocs des de la pestanya <strong style="color: var(--ed-text); font-weight: 600;">Blocs</strong>; feu doble clic a qualsevol text per editar-lo directament.',
47
- 'inspector.shortcuts': 'Dreceres',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z desfés, refés',
49
- 'shortcut.duplicate': '⌘D — duplica la selecció',
50
- 'shortcut.delete': 'elimina la selecció',
51
- 'shortcut.export': '⌘Eexporta HTML',
52
- 'shortcut.escape': 'ESCdesselecciona, tanca',
53
- 'blocks.dragHint': 'Arrossegueu al llenç',
54
- 'blocks.count': '{count} blocs',
55
- 'rows.sectionLayouts': 'Dissenys de secció',
56
- 'rows.customMarkup': 'Marcat personalitzat',
57
- 'rows.htmlRowHint': 'Arrossegueu per inserir, o feu clic per afegir — una fila d’amplada completa que ompliu amb HTML en brut',
58
- 'rows.rawHtmlSection': 'Secció d’HTML en brut',
59
- 'rows.rawHtmlDesc': 'Secció d’amplada completa, el vostre propi marcat, encara es pot arrossegar',
60
- 'rows.canvasModel': 'Model de llenç',
61
- 'rows.modeRowBased': 'Basat en files',
62
- 'rows.modeFreeStack': 'Pila lliure',
63
- 'rows.hintRows':
64
- 'Basat en seccions: primer deixeu anar un disseny, després blocs a les seves columnes — cada secció té el seu propi fons, vora, configuració flex o de graella.',
65
- 'rows.hintStack': 'Pila lliure: sense dissenys — cada bloc que deixeu anar esdevé la seva pròpia secció d’amplada completa, apilada en ordre.',
66
- 'files.libraryCount': 'Biblioteca{count} fitxers',
67
- 'files.openManager': 'Obre el gestor de fitxers',
68
- 'files.dragToCanvas': 'Arrossegueu qualsevol fitxer directament al llenç per col·locar-lo com a bloc d’imatge.',
69
- 'layers.structure': 'Estructura',
70
- 'layers.sectionSingle': 'Secció',
71
- 'layers.sectionMulti': 'Secció · {count} col.',
72
- 'layers.blockCount': '{count} bl.',
73
- 'theme.globalStyles': 'Estils globals',
74
- 'vars.title': 'Variables',
75
- 'vars.fromCode': '{count} del vostre codi',
76
- 'vars.declaredNote': 'Declarades per la vostra aplicació — el llenç sempre mostra el testimoni, mai un valor.',
77
- 'vars.filterPlaceholder': 'Filtra variables…',
78
- 'vars.insertHint': 'Feu clic per inserir al text, títol o botó seleccionat',
79
- 'vars.insert': 'insereix',
80
- 'vars.noMatch': 'Cap variable coincideix amb aquest filtre.',
81
- 'vars.noneDeclared': 'La vostra aplicació encara no ha declarat cap variable.',
82
- 'vars.rteHint': 'Mentre editeu text, també podeu triar una variable directament des del menú desplegable de la barra d’eines en línia.',
83
- 'modal.fileManager': 'Gestor de fitxers',
84
- 'modal.assetsTitle': 'Recursos',
85
- 'modal.replaceImage': 'Substitueix la imatge',
86
- 'library.searchPlaceholder': 'Cerca fitxers…',
87
- 'action.upload': 'Puja',
88
- 'library.clickToPlace': 'Feu clic a un fitxer per col·locar-lo · o arrossegueu un fitxer al llenç',
89
- 'library.clickToReplace': 'Feu clic a un fitxer per substituir la imatge seleccionada',
90
- 'library.storageLabel': '{count} fitxers · {size}',
91
- 'library.folders': 'Carpetes',
92
- 'library.dropHint': 'Deixeu anar fitxers d’imatge aquí per pujar-los — o utilitzeu el botó Puja.',
93
- 'library.deleteFileHint': 'Elimina el fitxer',
94
- 'library.del': 'ELIM',
95
- 'toast.assetDeleted': '{name} eliminat',
96
- 'modal.export': 'Exporta',
97
- 'modal.exportTitle': 'HTML de correu basat en taules',
98
- 'export.copy': 'Copia',
99
- 'export.copied': 'Copiat',
100
- 'action.download': 'Descarrega',
101
- 'export.meta': '{kb} KB · taules + estils en línia · amplades segures per a Outlook',
102
- 'modal.rawHtmlTitle': 'HTML en brut, previsualització en directe',
103
- 'code.statusEdited': 'Vista de codi editat previsualització en directe, encara no aplicat',
104
- 'code.statusSynced': 'Vista de codi sincronitzat amb el llenç',
105
- 'action.reload': 'Recarrega',
106
- 'action.reloadHint': 'Recarrega la font des del llenç',
107
- 'action.applyToCanvas': 'Aplica al llenç',
108
- 'action.applyToCanvasHint': 'Torna a analitzar la font en files editables',
109
- 'action.closeWithoutApplyingHint': 'Tanca sense aplicar',
110
- 'code.source': 'Font',
111
- 'code.livePreview': 'Previsualització en directe',
112
- 'code.liveHtmlPreviewTitle': 'Previsualització d’HTML en directe',
113
- 'code.applyNote':
114
- 'Aplicar analitza cada fila de taula de nivell superior en una fila de llenç que encara podeu seleccionar, reordenar i eliminar el marcatge escrit a mà sobreviu al procés.',
115
- 'code.meta': '{kb} KB · {lines} línies',
116
- 'toast.sourceReloaded': 'Font recarregada des del llenç',
117
- 'toast.sourceAppliedOne': 'Font aplicada — 1 fila al llenç',
118
- 'toast.sourceAppliedMany': 'Font aplicada — {rows} files al llenç',
119
- 'toast.parseError': 'No s’ha pogut analitzar aquest HTML',
120
- 'modal.copyAssist': 'Assistent de redacció',
121
- 'modal.draftCopyTitle': 'Redacta text per a aquesta campanya',
122
- 'ai.goal': 'Objectiu',
123
- 'ai.tone': 'To',
124
- 'ai.briefLabel': 'De què tracta aquest correu?',
125
- 'ai.briefPlaceholder': 'p. ex. Col·lecció de tardor, 15% per a subscriptors, enviament gratuït a partir de 150 €',
126
- 'ai.generate': 'Genera text',
127
- 'ai.writing': 'S’està escrivint…',
128
- 'ai.kindHeadline': 'Titular',
129
- 'ai.kindBody': 'Cos del text',
130
- 'ai.kindButton': 'Text del botó',
131
- 'ai.actionInsertHeading': 'Insereix com a capçalera',
132
- 'ai.actionInsertText': 'Insereix com a bloc de text',
133
- 'ai.actionInsertButton': 'Insereix com a botó',
134
- 'toast.headingAdded': 'Capçalera afegida',
135
- 'toast.textBlockAdded': 'Bloc de text afegit',
136
- 'toast.buttonAdded': 'Botó afegit',
137
- 'preview.kickerMobile': 'Previsualitzaciómòbil 375px',
138
- 'preview.kickerDark': 'Previsualització bústia fosca',
139
- 'preview.kickerDesktop': 'Previsualització escriptori {width}px',
140
- 'action.close': 'Tanca',
141
- 'toast.duplicated': 'Duplicat',
142
- 'toast.fileUploadedOne': '1 fitxer pujat',
143
- 'toast.fileUploadedMany': '{count} fitxers pujats',
144
- 'toast.imageReplaced': 'Imatge substituïda',
145
- 'toast.imageAdded': 'Imatge afegida al llenç',
146
- 'toast.htmlCopied': 'HTML copiat al porta-retalls',
147
- 'toast.templateLoaded': '{name} carregat',
148
- 'toast.snippetDefaultLabel': 'Fragment',
149
- 'toast.snippetInserted': '{name} inserit',
150
- 'toast.snippetCopied': '{name} copiat — seleccioneu un bloc de text per inserir-lo',
151
- };
152
-
1
+ /** Catalan (Català) — `ca`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const CA = {
3
+ 'action.undoHint': 'Desfés — ⌘Z',
4
+ 'action.redoHint': 'Refés — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Fosc',
6
+ 'action.chromeToLight': 'Clar',
7
+ 'action.chromeHint': 'Tema de l’editor clar / fosc',
8
+ 'action.chromeHintToDark': 'Mode fosc',
9
+ 'action.chromeHintToLight': 'Mode clar',
10
+ 'action.aiDraft': 'Esborrany',
11
+ 'action.aiDraftHint': 'Redactar el contingut del correu amb IA',
12
+ 'action.code': 'Codi',
13
+ 'action.codeHint': 'Editar l’HTML en brut amb previsualització en directe',
14
+ 'action.preview': 'Previsualització',
15
+ 'action.previewHint': 'Previsualitza el correu',
16
+ 'action.export': 'Exporta',
17
+ 'action.exportHint': 'Exporta el teu correu',
18
+ 'device.desktop': 'Escriptori',
19
+ 'device.desktopHint': 'Amplada d’escriptori',
20
+ 'device.mobile': 'Mòbil',
21
+ 'device.mobileHint': 'Amplada mòbil',
22
+ 'status.autosaveOn': 'desament automàtic activat',
23
+ 'status.saved': 'desat {time}',
24
+ 'status.saveFailed': 'no desat — emmagatzematge ple',
25
+ 'canvas.meta': '{rows} files · {blocks} blocs · {width}px',
26
+ 'tab.design': 'Estil',
27
+ 'tab.designHint': 'Aplica estil a la selecció',
28
+ 'tab.blocks': 'Blocs',
29
+ 'tab.blocksHint': 'Blocs de contingut i variables',
30
+ 'tab.rows': 'Seccions',
31
+ 'tab.rowsHint': 'Dissenys de secció i model de llenç',
32
+ 'tab.files': 'Fitxers',
33
+ 'tab.filesHint': 'Biblioteca de recursos',
34
+ 'tab.layers': 'Estruct.',
35
+ 'tab.layersHint': 'Estructura del document',
36
+ 'tab.settings': 'Configuració',
37
+ 'tab.settingsHint': 'Configuració del correu',
38
+ 'tab.data': 'Var.',
39
+ 'tab.dataHint': 'Variables proporcionades pel vostre codi',
40
+ 'inspector.blockProperties': 'Propietats del bloc',
41
+ 'inspector.sectionProperties': 'Propietats de la secció',
42
+ 'inspector.title': 'Inspector',
43
+ 'inspector.sectionLabel': 'Secció',
44
+ 'inspector.nothingSelected': 'Res seleccionat',
45
+ 'action.duplicateHint': 'Duplica — ⌘D',
46
+ 'action.deleteHint': 'Elimina ',
47
+ 'inspector.emptyBody':
48
+ 'Seleccioneu una fila o un bloc al llenç per donar-li estil aquí. Arrossegueu blocs des de la pestanya <strong style="color: var(--ed-text); font-weight: 600;">Blocs</strong>; feu doble clic a qualsevol text per editar-lo directament.',
49
+ 'inspector.shortcuts': 'Dreceres',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z desfés, refés',
51
+ 'shortcut.duplicate': '⌘Dduplica la selecció',
52
+ 'shortcut.delete': 'elimina la selecció',
53
+ 'shortcut.export': '⌘E exporta HTML',
54
+ 'shortcut.escape': 'ESC — desselecciona, tanca',
55
+ 'blocks.dragHint': 'Arrossegueu al llenç',
56
+ 'blocks.count': '{count} blocs',
57
+ 'rows.sectionLayouts': 'Dissenys de secció',
58
+ 'rows.customMarkup': 'Marcat personalitzat',
59
+ 'rows.htmlRowHint': 'Arrossegueu per inserir, o feu clic per afegir — una fila d’amplada completa que ompliu amb HTML en brut',
60
+ 'rows.rawHtmlSection': 'Secció d’HTML en brut',
61
+ 'rows.rawHtmlDesc': 'Secció d’amplada completa, el vostre propi marcat, encara es pot arrossegar',
62
+ 'rows.canvasModel': 'Model de llenç',
63
+ 'rows.modeRowBased': 'Basat en files',
64
+ 'rows.modeFreeStack': 'Pila lliure',
65
+ 'rows.hintRows':
66
+ 'Basat en seccions: primer deixeu anar un disseny, després blocs a les seves columnes cada secció té el seu propi fons, vora, configuració flex o de graella.',
67
+ 'rows.hintStack': 'Pila lliure: sense dissenys — cada bloc que deixeu anar esdevé la seva pròpia secció d’amplada completa, apilada en ordre.',
68
+ 'files.libraryCount': 'Biblioteca {count} fitxers',
69
+ 'files.openManager': 'Obre el gestor de fitxers',
70
+ 'files.dragToCanvas': 'Arrossegueu qualsevol fitxer directament al llenç per col·locar-lo com a bloc d’imatge.',
71
+ 'layers.structure': 'Estructura',
72
+ 'layers.sectionSingle': 'Secció',
73
+ 'layers.sectionMulti': 'Secció · {count} col.',
74
+ 'layers.column': 'Columna {index}',
75
+ 'layers.blockCount': '{count} bl.',
76
+ 'vars.title': 'Variables',
77
+ 'vars.fromCode': '{count} del vostre codi',
78
+ 'vars.declaredNote': 'Declarades per la vostra aplicació — el llenç sempre mostra el testimoni, mai un valor.',
79
+ 'vars.filterPlaceholder': 'Filtra variables…',
80
+ 'vars.insertHint': 'Feu clic per inserir al text, títol o botó seleccionat',
81
+ 'vars.insert': 'insereix',
82
+ 'vars.noMatch': 'Cap variable coincideix amb aquest filtre.',
83
+ 'vars.noneDeclared': 'La vostra aplicació encara no ha declarat cap variable.',
84
+ 'vars.rteHint': 'Mentre editeu text, també podeu triar una variable directament des del menú desplegable de la barra d’eines en línia.',
85
+ 'modal.fileManager': 'Gestor de fitxers',
86
+ 'modal.assetsTitle': 'Recursos',
87
+ 'modal.replaceImage': 'Substitueix la imatge',
88
+ 'library.searchPlaceholder': 'Cerca fitxers…',
89
+ 'action.upload': 'Puja',
90
+ 'library.clickToPlace': 'Feu clic a un fitxer per col·locar-lo · o arrossegueu un fitxer al llenç',
91
+ 'library.clickToReplace': 'Feu clic a un fitxer per substituir la imatge seleccionada',
92
+ 'library.storageLabel': '{count} fitxers · {size}',
93
+ 'library.folders': 'Carpetes',
94
+ 'library.dropHint': 'Deixeu anar fitxers d’imatge aquí per pujar-los — o utilitzeu el botó Puja.',
95
+ 'library.deleteFileHint': 'Elimina el fitxer',
96
+ 'library.del': 'ELIM',
97
+ 'toast.assetDeleted': '{name} eliminat',
98
+ 'library.allFiles': 'Tots els fitxers',
99
+ 'library.loadMore': 'Carrega’n més',
100
+ 'library.empty': 'Encara no hi ha cap fitxer.',
101
+ 'storage.loading': 'S’estan carregant els fitxers…',
102
+ 'storage.uploading': 'S’estan pujant {count}…',
103
+ 'storage.errLoadFailed': 'No s’ha pogut carregar la biblioteca de fitxers {reason}',
104
+ 'storage.errNoLimits': 'Les pujades estan desactivades: aquesta aplicació no ha definit cap límit de pujada.',
105
+ 'storage.errNoAccept': 'Les pujades estan desactivades: no s’ha permès cap format de fitxer.',
106
+ 'storage.errNoMaxBytes': 'Les pujades estan desactivades: no s’ha definit cap mida màxima de fitxer.',
107
+ 'storage.errTooLarge': '{name} fa {size} — el límit és {max}.',
108
+ 'storage.errFormat': '{name} és un fitxer {type}, que no s’admet aquí.',
109
+ 'storage.errSvg': '{name} és un SVG, i aquesta aplicació no l’accepta.',
110
+ 'storage.errDimensions': '{name} fa {w}×{ht}px — el límit és {maxW}×{maxH}px.',
111
+ 'storage.errTooMany': 'Només es poden pujar {max} fitxers alhora.',
112
+ 'storage.errUnreadable': '{name} no és una imatge llegible.',
113
+ 'storage.errUploadFailed': 'No s’ha pogut pujar {name} — {reason}',
114
+ 'storage.errDeleteFailed': 'No s’ha pogut eliminar {name}{reason}',
115
+ 'modal.export': 'Exporta',
116
+ 'modal.exportTitle': 'HTML de correu basat en taules',
117
+ 'export.copy': 'Copia',
118
+ 'export.copied': 'Copiat',
119
+ 'action.download': 'Descarrega',
120
+ 'export.meta': '{kb} KB · taules + estils en línia · amplades segures per a Outlook',
121
+ 'modal.rawHtmlTitle': 'HTML en brut, previsualització en directe',
122
+ 'code.statusEdited': 'Vista de codi — editat — previsualització en directe, encara no aplicat',
123
+ 'code.statusSynced': 'Vista de codi — sincronitzat amb el llenç',
124
+ 'action.reload': 'Recarrega',
125
+ 'action.reloadHint': 'Recarrega la font des del llenç',
126
+ 'action.applyToCanvas': 'Aplica al llenç',
127
+ 'action.applyToCanvasHint': 'Torna a analitzar la font en files editables',
128
+ 'action.closeWithoutApplyingHint': 'Tanca sense aplicar',
129
+ 'code.source': 'Font',
130
+ 'code.livePreview': 'Previsualització en directe',
131
+ 'code.liveHtmlPreviewTitle': 'Previsualització d’HTML en directe',
132
+ 'code.applyNote':
133
+ 'Aplicar analitza cada fila de taula de nivell superior en una fila de llenç que encara podeu seleccionar, reordenar i eliminar — el marcatge escrit a mà sobreviu al procés.',
134
+ 'code.meta': '{kb} KB · {lines} línies',
135
+ 'toast.sourceReloaded': 'Font recarregada des del llenç',
136
+ 'toast.sourceAppliedOne': 'Font aplicada — 1 fila al llenç',
137
+ 'toast.sourceAppliedMany': 'Font aplicada {rows} files al llenç',
138
+ 'toast.parseError': 'No s’ha pogut analitzar aquest HTML',
139
+ 'modal.aiDraft': 'Assistent de redacció amb IA',
140
+ 'modal.aiDraftTitle': 'Redacta el teu correu amb IA',
141
+ 'ai.disclosure': 'La IA crea suggeriments a partir del teu resum. Revisa i edita el resultat abans d’enviar-lo.',
142
+ 'ai.goal': 'Objectiu',
143
+ 'ai.tone': 'To',
144
+ 'ai.briefLabel': 'De què tracta aquest correu?',
145
+ 'ai.briefPlaceholder': 'p. ex. Col·lecció de tardor, 15% per a subscriptors, enviament gratuït a partir de 150 €',
146
+ 'ai.generate': 'Genera text',
147
+ 'ai.writing': 'S’està escrivint…',
148
+ 'ai.kindHeadline': 'Titular',
149
+ 'ai.kindBody': 'Cos del text',
150
+ 'ai.kindButton': 'Text del botó',
151
+ 'ai.actionInsertHeading': 'Insereix com a capçalera',
152
+ 'ai.actionInsertText': 'Insereix com a bloc de text',
153
+ 'ai.actionInsertButton': 'Insereix com a botó',
154
+ 'toast.headingAdded': 'Capçalera afegida',
155
+ 'toast.textBlockAdded': 'Bloc de text afegit',
156
+ 'toast.buttonAdded': 'Botó afegit',
157
+ 'preview.kickerMobile': 'Previsualització — mòbil 375px',
158
+ 'preview.kickerDesktop': 'Previsualització — escriptori {width}px',
159
+ 'action.close': 'Tanca',
160
+ 'toast.duplicated': 'Duplicat',
161
+ 'toast.fileUploadedOne': '1 fitxer pujat',
162
+ 'toast.fileUploadedMany': '{count} fitxers pujats',
163
+ 'toast.imageReplaced': 'Imatge substituïda',
164
+ 'toast.imageAdded': 'Imatge afegida al llenç',
165
+ 'toast.htmlCopied': 'HTML copiat al porta-retalls',
166
+ 'toast.templateLoaded': '{name} carregat',
167
+ 'toast.snippetDefaultLabel': 'Fragment',
168
+ 'toast.snippetInserted': '{name} inserit',
169
+ 'toast.snippetCopied': '{name} copiat — seleccioneu un bloc de text per inserir-lo',
170
+ 'rte.textStyle': 'Estil del text',
171
+ 'rte.mergeTags': 'Camps de combinació',
172
+ 'rte.noMergeTags': 'No hi ha camps de combinació disponibles',
173
+ 'rte.textColor': 'Color del text',
174
+ 'rte.highlightColor': 'Color de ressaltat',
175
+ 'rte.removeHighlight': 'Treu el ressaltat',
176
+ 'rte.clearFormatting': 'Neteja el format',
177
+ 'action.downloadPng': 'Baixa el PNG',
178
+ 'action.screenshot': 'Captura',
179
+ 'action.screenshotHint': 'Previsualitza tota la plantilla com a imatge i baixa-la',
180
+ 'toast.pngSaved': 'Captura baixada',
181
+ 'toast.pngFailed': 'La captura ha fallat — no s’ha pogut carregar una imatge externa',
182
+ 'toast.pngCopied': 'Captura copiada al porta-retalls',
183
+ 'toast.pngCopyFailed': 'Aquest navegador no ha acceptat una imatge al porta-retalls',
184
+ 'story.kicker': 'Captura',
185
+ 'story.rendering': 'S’està generant la captura',
186
+ 'story.renderingHint': 'S’està dibuixant cada bloc a 2× — en una plantilla llarga triga un moment.',
187
+ 'story.failed': 'La captura ha fallat',
188
+ 'story.failedHint': 'No s’ha pogut carregar una imatge de la plantilla per capturar-la.',
189
+ 'story.retry': 'Torna-ho a provar',
190
+ 'story.play': 'Reprodueix',
191
+ 'story.pause': 'Pausa',
192
+ 'story.replay': 'Torna a reproduir',
193
+ 'story.copy': 'Copia',
194
+ 'story.meta': '{w}×{h} · pantalla {i} de {n}',
195
+ 'footer.poweredBy': 'Amb la tecnologia de SELISE Blocks © 2026',
196
+ };