@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
- /** 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ó dHTML 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.errNoMaxBytes': 'Les pujades estan desactivades: no s’ha definit cap mida màxima de fitxer.',
106
+ 'storage.errTooLarge': '{name} fa {size} el límit és {max}.',
107
+ 'storage.errFormat': '{name} és un fitxer {type}, que no s’admet aquí.',
108
+ 'storage.errSvg': '{name} és un SVG, i aquesta aplicació no l’accepta.',
109
+ 'storage.errDimensions': '{name} fa {w}×{ht}px — el límit és {maxW}×{maxH}px.',
110
+ 'storage.errTooMany': 'Només es poden pujar {max} fitxers alhora.',
111
+ 'storage.errUnreadable': '{name} no és una imatge llegible.',
112
+ 'storage.errUploadFailed': 'No sha pogut pujar {name} — {reason}',
113
+ 'storage.errDeleteFailed': 'No s’ha pogut eliminar {name} — {reason}',
114
+ 'modal.export': 'Exporta',
115
+ 'modal.exportTitle': 'HTML de correu basat en taules',
116
+ 'export.copy': 'Copia',
117
+ 'export.copied': 'Copiat',
118
+ 'action.download': 'Descarrega',
119
+ 'export.meta': '{kb} KB · taules + estils en línia · amplades segures per a Outlook',
120
+ 'modal.rawHtmlTitle': 'HTML en brut, previsualització en directe',
121
+ 'code.statusEdited': 'Vista de codi editat — previsualització en directe, encara no aplicat',
122
+ 'code.statusSynced': 'Vista de codi — sincronitzat amb el llenç',
123
+ 'action.reload': 'Recarrega',
124
+ 'action.reloadHint': 'Recarrega la font des del llenç',
125
+ 'action.applyToCanvas': 'Aplica al llenç',
126
+ 'action.applyToCanvasHint': 'Torna a analitzar la font en files editables',
127
+ 'action.closeWithoutApplyingHint': 'Tanca sense aplicar',
128
+ 'code.source': 'Font',
129
+ 'code.livePreview': 'Previsualització en directe',
130
+ 'code.liveHtmlPreviewTitle': 'Previsualització d’HTML en directe',
131
+ 'code.applyNote':
132
+ '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.',
133
+ 'code.meta': '{kb} KB · {lines} línies',
134
+ 'toast.sourceReloaded': 'Font recarregada des del llenç',
135
+ 'toast.sourceAppliedOne': 'Font aplicada 1 fila al llenç',
136
+ 'toast.sourceAppliedMany': 'Font aplicada — {rows} files al llenç',
137
+ 'toast.parseError': 'No s’ha pogut analitzar aquest HTML',
138
+ 'modal.aiDraft': 'Assistent de redacció amb IA',
139
+ 'modal.aiDraftTitle': 'Redacta el teu correu amb IA',
140
+ 'ai.disclosure': 'La IA crea suggeriments a partir del teu resum. Revisa i edita el resultat abans d’enviar-lo.',
141
+ 'ai.goal': 'Objectiu',
142
+ 'ai.tone': 'To',
143
+ 'ai.briefLabel': 'De què tracta aquest correu?',
144
+ 'ai.briefPlaceholder': 'p. ex. Col·lecció de tardor, 15% per a subscriptors, enviament gratuït a partir de 150 €',
145
+ 'ai.generate': 'Genera text',
146
+ 'ai.writing': 'S’està escrivint…',
147
+ 'ai.kindHeadline': 'Titular',
148
+ 'ai.kindBody': 'Cos del text',
149
+ 'ai.kindButton': 'Text del botó',
150
+ 'ai.actionInsertHeading': 'Insereix com a capçalera',
151
+ 'ai.actionInsertText': 'Insereix com a bloc de text',
152
+ 'ai.actionInsertButton': 'Insereix com a botó',
153
+ 'toast.headingAdded': 'Capçalera afegida',
154
+ 'toast.textBlockAdded': 'Bloc de text afegit',
155
+ 'toast.buttonAdded': 'Botó afegit',
156
+ 'preview.kickerMobile': 'Previsualització — mòbil 375px',
157
+ 'preview.kickerDesktop': 'Previsualització — escriptori {width}px',
158
+ 'action.close': 'Tanca',
159
+ 'toast.duplicated': 'Duplicat',
160
+ 'toast.fileUploadedOne': '1 fitxer pujat',
161
+ 'toast.fileUploadedMany': '{count} fitxers pujats',
162
+ 'toast.imageReplaced': 'Imatge substituïda',
163
+ 'toast.imageAdded': 'Imatge afegida al llenç',
164
+ 'toast.htmlCopied': 'HTML copiat al porta-retalls',
165
+ 'toast.templateLoaded': '{name} carregat',
166
+ 'toast.snippetDefaultLabel': 'Fragment',
167
+ 'toast.snippetInserted': '{name} inserit',
168
+ 'toast.snippetCopied': '{name} copiat — seleccioneu un bloc de text per inserir-lo',
169
+ 'rte.textStyle': 'Estil del text',
170
+ 'rte.mergeTags': 'Camps de combinació',
171
+ 'rte.noMergeTags': 'No hi ha camps de combinació disponibles',
172
+ 'rte.textColor': 'Color del text',
173
+ 'rte.highlightColor': 'Color de ressaltat',
174
+ 'rte.removeHighlight': 'Treu el ressaltat',
175
+ 'rte.clearFormatting': 'Neteja el format',
176
+ 'action.downloadPng': 'Baixa el PNG',
177
+ 'action.screenshot': 'Captura',
178
+ 'action.screenshotHint': 'Previsualitza tota la plantilla com a imatge i baixa-la',
179
+ 'toast.pngSaved': 'Captura baixada',
180
+ 'toast.pngFailed': 'La captura ha fallat — no s’ha pogut carregar una imatge externa',
181
+ 'toast.pngCopied': 'Captura copiada al porta-retalls',
182
+ 'toast.pngCopyFailed': 'Aquest navegador no ha acceptat una imatge al porta-retalls',
183
+ 'story.kicker': 'Captura',
184
+ 'story.rendering': 'S’està generant la captura',
185
+ 'story.renderingHint': 'S’està dibuixant cada bloc a 2× — en una plantilla llarga triga un moment.',
186
+ 'story.failed': 'La captura ha fallat',
187
+ 'story.failedHint': 'No s’ha pogut carregar una imatge de la plantilla per capturar-la.',
188
+ 'story.retry': 'Torna-ho a provar',
189
+ 'story.play': 'Reprodueix',
190
+ 'story.pause': 'Pausa',
191
+ 'story.replay': 'Torna a reproduir',
192
+ 'story.copy': 'Copia',
193
+ 'story.meta': '{w}×{h} · pantalla {i} de {n}',
194
+ 'footer.poweredBy': 'Amb la tecnologia de SELISE Blocks © 2026',
195
+ };