@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
- /** Finnish (Suomi) — `fi`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const FI = {
3
- 'action.undoHint': 'Kumoa — ⌘Z',
4
- 'action.redoHint': 'Tee uudelleen — ⌘⇧Z',
5
- 'action.chromeToDark': 'Tumma',
6
- 'action.chromeToLight': 'Vaalea',
7
- 'action.chromeHint': 'Editorin teema vaalea / tumma',
8
- 'action.aiCopy': 'Teksti',
9
- 'action.aiCopyHint': 'Kirjoita teksti tekoälyllä',
10
- 'action.code': 'Koodi',
11
- 'action.codeHint': 'Muokkaa raakaa HTML:ää suoralla esikatselulla',
12
- 'action.preview': 'Esikatselu',
13
- 'action.export': 'Vie',
14
- 'device.desktop': 'Työpöytä',
15
- 'device.desktopHint': 'Työpöydän leveys',
16
- 'device.mobile': 'Mobiili',
17
- 'device.mobileHint': 'Mobiilin leveys',
18
- 'device.dark': 'Tumma',
19
- 'device.darkHint': 'Saapuneet-tumma tila',
20
- 'status.autosaveOn': 'automaattitallennus päällä',
21
- 'status.saved': 'tallennettu {time}',
22
- 'status.saveFailed': 'ei tallennettu — tallennustila täynnä',
23
- 'canvas.meta': '{rows} riviä · {blocks} lohkoa · {width}px',
24
- 'tab.design': 'Tyyli',
25
- 'tab.designHint': 'Muotoile valinta',
26
- 'tab.blocks': 'Lohkot',
27
- 'tab.blocksHint': 'Sisältölohkot ja muuttujat',
28
- 'tab.rows': 'Osiot',
29
- 'tab.rowsHint': 'Osioiden asettelut ja kangasmalli',
30
- 'tab.files': 'Tiedostot',
31
- 'tab.filesHint': 'Resurssikirjasto',
32
- 'tab.layers': 'Rakenne',
33
- 'tab.layersHint': 'Asiakirjan rakenne',
34
- 'tab.theme': 'Teema',
35
- 'tab.themeHint': 'Yleiset tyylit',
36
- 'tab.data': 'Muutt.',
37
- 'tab.dataHint': 'Koodisi tarjoamat muuttujat',
38
- 'inspector.blockProperties': 'Lohkon ominaisuudet',
39
- 'inspector.sectionProperties': 'Osion ominaisuudet',
40
- 'inspector.title': 'Tarkastaja',
41
- 'inspector.sectionLabel': 'Osio',
42
- 'inspector.nothingSelected': 'Ei valintaa',
43
- 'action.duplicateHint': 'Monista — ⌘D',
44
- 'action.deleteHint': 'Poista — ⌫',
45
- 'inspector.emptyBody':
46
- 'Valitse rivi tai lohko kankaalta muotoillaksesi sen tässä. Vedä lohkoja välilehdeltä <strong style="color: var(--ed-text); font-weight: 600;">Lohkot</strong>; kaksoisnapsauta tekstiä muokataksesi sitä suoraan.',
47
- 'inspector.shortcuts': 'Pikanäppäimet',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z kumoa, tee uudelleen',
49
- 'shortcut.duplicate': '⌘D — monista valinta',
50
- 'shortcut.delete': 'poista valinta',
51
- 'shortcut.export': '⌘Evie HTML',
52
- 'shortcut.escape': 'ESC — poista valinta, sulje',
53
- 'blocks.dragHint': 'Vedä kankaalle',
54
- 'blocks.count': '{count} lohkoa',
55
- 'rows.sectionLayouts': 'Osioiden asettelut',
56
- 'rows.customMarkup': 'Mukautettu koodi',
57
- 'rows.htmlRowHint': 'Vedä lisätäksesi, tai napsauta lisätäksesi — täysleveä rivi, jonka täytät raa’alla HTML:llä',
58
- 'rows.rawHtmlSection': 'Raaka HTML-osio',
59
- 'rows.rawHtmlDesc': 'Täysleveä osio, oma koodisi, edelleen vedettävissä',
60
- 'rows.canvasModel': 'Kangasmalli',
61
- 'rows.modeRowBased': 'Riveihin perustuva',
62
- 'rows.modeFreeStack': 'Vapaa pino',
63
- 'rows.hintRows':
64
- 'Osioihin perustuva: pudota ensin asettelu, sitten lohkoja sen sarakkeisiin — jokaisella osiolla on oma tausta, reunus, flex- tai ruudukkoasetukset.',
65
- 'rows.hintStack': 'Vapaa pino: ilman asetteluja — jokaisesta pudottamastasi lohkosta tulee oma täysleveä osio, pinottuna järjestyksessä.',
66
- 'files.libraryCount': 'Kirjasto{count} tiedostoa',
67
- 'files.openManager': 'Avaa tiedostonhallinta',
68
- 'files.dragToCanvas': 'Vedä mikä tahansa tiedosto suoraan kankaalle asettaaksesi sen kuvalohkona.',
69
- 'layers.structure': 'Rakenne',
70
- 'layers.sectionSingle': 'Osio',
71
- 'layers.sectionMulti': 'Osio · {count} saraketta',
72
- 'layers.blockCount': '{count} lohkoa',
73
- 'theme.globalStyles': 'Yleiset tyylit',
74
- 'vars.title': 'Muuttujat',
75
- 'vars.fromCode': '{count} koodistasi',
76
- 'vars.declaredNote': 'Sovelluksesi määrittelemiä — kangas näyttää aina tokenin, ei koskaan arvoa.',
77
- 'vars.filterPlaceholder': 'Suodata muuttujia…',
78
- 'vars.insertHint': 'Napsauta lisätäksesi valittuun tekstiin, otsikkoon tai painikkeeseen',
79
- 'vars.insert': 'lisää',
80
- 'vars.noMatch': 'Yksikään muuttuja ei vastaa tätä suodatinta.',
81
- 'vars.noneDeclared': 'Sovelluksesi ei ole vielä määritellyt muuttujia.',
82
- 'vars.rteHint': 'Tekstiä muokatessasi voit myös valita muuttujan suoraan sisäisen työkalurivin pudotusvalikosta.',
83
- 'modal.fileManager': 'Tiedostonhallinta',
84
- 'modal.assetsTitle': 'Resurssit',
85
- 'modal.replaceImage': 'Korvaa kuva',
86
- 'library.searchPlaceholder': 'Etsi tiedostoja…',
87
- 'action.upload': 'Lataa',
88
- 'library.clickToPlace': 'Napsauta tiedostoa asettaaksesi sen · tai vedä tiedosto kankaalle',
89
- 'library.clickToReplace': 'Napsauta tiedostoa korvataksesi valitun kuvan',
90
- 'library.storageLabel': '{count} tiedostoa · {size}',
91
- 'library.folders': 'Kansiot',
92
- 'library.dropHint': 'Pudota kuvatiedostoja tähän ladataksesi ne — tai käytä Lataa-painiketta.',
93
- 'library.deleteFileHint': 'Poista tiedosto',
94
- 'library.del': 'POISTA',
95
- 'toast.assetDeleted': '{name} poistettu',
96
- 'modal.export': 'Vie',
97
- 'modal.exportTitle': 'Taulukkopohjainen sähköposti-HTML',
98
- 'export.copy': 'Kopioi',
99
- 'export.copied': 'Kopioitu',
100
- 'action.download': 'Lataa',
101
- 'export.meta': '{kb} kt · taulukot + inline-tyylit · Outlook-turvalliset leveydet',
102
- 'modal.rawHtmlTitle': 'Raaka HTML, suora esikatselu',
103
- 'code.statusEdited': 'Koodinäkymä muokattuesikatselu suorana, ei vielä käytössä',
104
- 'code.statusSynced': 'Koodinäkymä synkronoitu kankaan kanssa',
105
- 'action.reload': 'Lataa uudelleen',
106
- 'action.reloadHint': 'Lataa lähde uudelleen kankaalta',
107
- 'action.applyToCanvas': 'Käytä kankaalla',
108
- 'action.applyToCanvasHint': 'Jäsennä lähde takaisin muokattaviksi riveiksi',
109
- 'action.closeWithoutApplyingHint': 'Sulje käyttämättä',
110
- 'code.source': 'Lähde',
111
- 'code.livePreview': 'Suora esikatselu',
112
- 'code.liveHtmlPreviewTitle': 'Suora HTML-esikatselu',
113
- 'code.applyNote':
114
- 'Käytä jäsentää jokaisen ylimmän tason taulukkorivin kangasriviksi, jonka voit yhä valita, järjestää uudelleen ja poistaa — käsin kirjoitettu koodi säilyy prosessin läpi muuttumattomana.',
115
- 'code.meta': '{kb} kt · {lines} riviä',
116
- 'toast.sourceReloaded': 'Lähde ladattu uudelleen kankaalta',
117
- 'toast.sourceAppliedOne': 'Lähde käytössä — 1 rivi kankaalla',
118
- 'toast.sourceAppliedMany': 'Lähde käytössä — {rows} riviä kankaalla',
119
- 'toast.parseError': 'Tätä HTML:ää ei voitu jäsentää',
120
- 'modal.copyAssist': 'Tekstiavustaja',
121
- 'modal.draftCopyTitle': 'Kirjoita teksti tälle kampanjalle',
122
- 'ai.goal': 'Tavoite',
123
- 'ai.tone': 'Sävy',
124
- 'ai.briefLabel': 'Mistä tämä sähköposti kertoo?',
125
- 'ai.briefPlaceholder': 'esim. Syyskokoelma, 15 % tilaajille, ilmainen toimitus yli 150 €',
126
- 'ai.generate': 'Luo teksti',
127
- 'ai.writing': 'Kirjoitetaan…',
128
- 'ai.kindHeadline': 'Otsikko',
129
- 'ai.kindBody': 'Leipäteksti',
130
- 'ai.kindButton': 'Painikkeen teksti',
131
- 'ai.actionInsertHeading': 'Lisää otsikkona',
132
- 'ai.actionInsertText': 'Lisää tekstilohkona',
133
- 'ai.actionInsertButton': 'Lisää painikkeena',
134
- 'toast.headingAdded': 'Otsikko lisätty',
135
- 'toast.textBlockAdded': 'Tekstilohko lisätty',
136
- 'toast.buttonAdded': 'Painike lisätty',
137
- 'preview.kickerMobile': 'Esikatselu mobiili 375px',
138
- 'preview.kickerDark': 'Esikatselu — tumma saapuneet',
139
- 'preview.kickerDesktop': 'Esikatselu työpöytä {width}px',
140
- 'action.close': 'Sulje',
141
- 'toast.duplicated': 'Monistettu',
142
- 'toast.fileUploadedOne': '1 tiedosto ladattu',
143
- 'toast.fileUploadedMany': '{count} tiedostoa ladattu',
144
- 'toast.imageReplaced': 'Kuva korvattu',
145
- 'toast.imageAdded': 'Kuva lisätty kankaalle',
146
- 'toast.htmlCopied': 'HTML kopioitu leikepöydälle',
147
- 'toast.templateLoaded': '{name} ladattu',
148
- 'toast.snippetDefaultLabel': 'Katkelma',
149
- 'toast.snippetInserted': '{name} lisätty',
150
- 'toast.snippetCopied': '{name} kopioitu — valitse tekstilohko lisätäksesi sen',
151
- };
152
-
1
+ /** Finnish (Suomi) — `fi`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const FI = {
3
+ 'action.undoHint': 'Kumoa — ⌘Z',
4
+ 'action.redoHint': 'Tee uudelleen — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Tumma',
6
+ 'action.chromeToLight': 'Vaalea',
7
+ 'action.chromeHint': 'Editorin teema vaalea / tumma',
8
+ 'action.chromeHintToDark': 'Tumma tila',
9
+ 'action.chromeHintToLight': 'Vaalea tila',
10
+ 'action.aiDraft': 'Luonnos',
11
+ 'action.aiDraftHint': 'Kirjoita sähköpostin sisältö tekoälyllä',
12
+ 'action.code': 'Koodi',
13
+ 'action.codeHint': 'Muokkaa raakaa HTML:ää suoralla esikatselulla',
14
+ 'action.preview': 'Esikatselu',
15
+ 'action.previewHint': 'Esikatsele sähköpostia',
16
+ 'action.export': 'Vie',
17
+ 'action.exportHint': 'Vie sähköpostisi',
18
+ 'device.desktop': 'Työpöytä',
19
+ 'device.desktopHint': 'Työpöydän leveys',
20
+ 'device.mobile': 'Mobiili',
21
+ 'device.mobileHint': 'Mobiilin leveys',
22
+ 'status.autosaveOn': 'automaattitallennus päällä',
23
+ 'status.saved': 'tallennettu {time}',
24
+ 'status.saveFailed': 'ei tallennettu — tallennustila täynnä',
25
+ 'canvas.meta': '{rows} riviä · {blocks} lohkoa · {width}px',
26
+ 'tab.design': 'Tyyli',
27
+ 'tab.designHint': 'Muotoile valinta',
28
+ 'tab.blocks': 'Lohkot',
29
+ 'tab.blocksHint': 'Sisältölohkot ja muuttujat',
30
+ 'tab.rows': 'Osiot',
31
+ 'tab.rowsHint': 'Osioiden asettelut ja kangasmalli',
32
+ 'tab.files': 'Tiedostot',
33
+ 'tab.filesHint': 'Resurssikirjasto',
34
+ 'tab.layers': 'Rakenne',
35
+ 'tab.layersHint': 'Asiakirjan rakenne',
36
+ 'tab.settings': 'Asetukset',
37
+ 'tab.settingsHint': 'Sähköpostin asetukset',
38
+ 'tab.data': 'Muutt.',
39
+ 'tab.dataHint': 'Koodisi tarjoamat muuttujat',
40
+ 'inspector.blockProperties': 'Lohkon ominaisuudet',
41
+ 'inspector.sectionProperties': 'Osion ominaisuudet',
42
+ 'inspector.title': 'Tarkastaja',
43
+ 'inspector.sectionLabel': 'Osio',
44
+ 'inspector.nothingSelected': 'Ei valintaa',
45
+ 'action.duplicateHint': 'Monista — ⌘D',
46
+ 'action.deleteHint': 'Poista ',
47
+ 'inspector.emptyBody':
48
+ 'Valitse rivi tai lohko kankaalta muotoillaksesi sen tässä. Vedä lohkoja välilehdeltä <strong style="color: var(--ed-text); font-weight: 600;">Lohkot</strong>; kaksoisnapsauta tekstiä muokataksesi sitä suoraan.',
49
+ 'inspector.shortcuts': 'Pikanäppäimet',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z kumoa, tee uudelleen',
51
+ 'shortcut.duplicate': '⌘Dmonista valinta',
52
+ 'shortcut.delete': ' — poista valinta',
53
+ 'shortcut.export': '⌘E — vie HTML',
54
+ 'shortcut.escape': 'ESC — poista valinta, sulje',
55
+ 'blocks.dragHint': 'Vedä kankaalle',
56
+ 'blocks.count': '{count} lohkoa',
57
+ 'rows.sectionLayouts': 'Osioiden asettelut',
58
+ 'rows.customMarkup': 'Mukautettu koodi',
59
+ 'rows.htmlRowHint': 'Vedä lisätäksesi, tai napsauta lisätäksesi — täysleveä rivi, jonka täytät raa’alla HTML:llä',
60
+ 'rows.rawHtmlSection': 'Raaka HTML-osio',
61
+ 'rows.rawHtmlDesc': 'Täysleveä osio, oma koodisi, edelleen vedettävissä',
62
+ 'rows.canvasModel': 'Kangasmalli',
63
+ 'rows.modeRowBased': 'Riveihin perustuva',
64
+ 'rows.modeFreeStack': 'Vapaa pino',
65
+ 'rows.hintRows':
66
+ 'Osioihin perustuva: pudota ensin asettelu, sitten lohkoja sen sarakkeisiin jokaisella osiolla on oma tausta, reunus, flex- tai ruudukkoasetukset.',
67
+ 'rows.hintStack': 'Vapaa pino: ilman asetteluja — jokaisesta pudottamastasi lohkosta tulee oma täysleveä osio, pinottuna järjestyksessä.',
68
+ 'files.libraryCount': 'Kirjasto {count} tiedostoa',
69
+ 'files.openManager': 'Avaa tiedostonhallinta',
70
+ 'files.dragToCanvas': 'Vedä mikä tahansa tiedosto suoraan kankaalle asettaaksesi sen kuvalohkona.',
71
+ 'layers.structure': 'Rakenne',
72
+ 'layers.sectionSingle': 'Osio',
73
+ 'layers.sectionMulti': 'Osio · {count} saraketta',
74
+ 'layers.column': 'Sarake {index}',
75
+ 'layers.blockCount': '{count} lohkoa',
76
+ 'vars.title': 'Muuttujat',
77
+ 'vars.fromCode': '{count} koodistasi',
78
+ 'vars.declaredNote': 'Sovelluksesi määrittelemiä kangas näyttää aina tokenin, ei koskaan arvoa.',
79
+ 'vars.filterPlaceholder': 'Suodata muuttujia…',
80
+ 'vars.insertHint': 'Napsauta lisätäksesi valittuun tekstiin, otsikkoon tai painikkeeseen',
81
+ 'vars.insert': 'lisää',
82
+ 'vars.noMatch': 'Yksikään muuttuja ei vastaa tätä suodatinta.',
83
+ 'vars.noneDeclared': 'Sovelluksesi ei ole vielä määritellyt muuttujia.',
84
+ 'vars.rteHint': 'Tekstiä muokatessasi voit myös valita muuttujan suoraan sisäisen työkalurivin pudotusvalikosta.',
85
+ 'modal.fileManager': 'Tiedostonhallinta',
86
+ 'modal.assetsTitle': 'Resurssit',
87
+ 'modal.replaceImage': 'Korvaa kuva',
88
+ 'library.searchPlaceholder': 'Etsi tiedostoja…',
89
+ 'action.upload': 'Lataa',
90
+ 'library.clickToPlace': 'Napsauta tiedostoa asettaaksesi sen · tai vedä tiedosto kankaalle',
91
+ 'library.clickToReplace': 'Napsauta tiedostoa korvataksesi valitun kuvan',
92
+ 'library.storageLabel': '{count} tiedostoa · {size}',
93
+ 'library.folders': 'Kansiot',
94
+ 'library.dropHint': 'Pudota kuvatiedostoja tähän ladataksesi ne — tai käytä Lataa-painiketta.',
95
+ 'library.deleteFileHint': 'Poista tiedosto',
96
+ 'library.del': 'POISTA',
97
+ 'toast.assetDeleted': '{name} poistettu',
98
+ 'library.allFiles': 'Kaikki tiedostot',
99
+ 'library.loadMore': 'Lataa lisää',
100
+ 'library.empty': 'Täällä ei ole vielä tiedostoja.',
101
+ 'storage.loading': 'Ladataan tiedostoja…',
102
+ 'storage.uploading': 'Ladataan {count}…',
103
+ 'storage.errLoadFailed': 'Tiedostokirjastoa ei voitu ladata {reason}',
104
+ 'storage.errNoLimits': 'Lataukset on poistettu käytöstä: tämä sovellus ei ole asettanut latausrajoja.',
105
+ 'storage.errNoMaxBytes': 'Lataukset on poistettu käytöstä: tiedoston enimmäiskokoa ei ole asetettu.',
106
+ 'storage.errTooLarge': '{name} on {size} — raja on {max}.',
107
+ 'storage.errFormat': '{name} on {type}-tiedosto, jota ei sallita tässä.',
108
+ 'storage.errSvg': '{name} on SVG, jota tämä sovellus ei hyväksy.',
109
+ 'storage.errDimensions': '{name} on {w}×{ht}px — raja on {maxW}×{maxH}px.',
110
+ 'storage.errTooMany': 'Kerralla voi ladata vain {max} tiedostoa.',
111
+ 'storage.errUnreadable': '{name} ei ole luettava kuva.',
112
+ 'storage.errUploadFailed': 'Tiedostoa {name} ei voitu ladata — {reason}',
113
+ 'storage.errDeleteFailed': 'Tiedostoa {name} ei voitu poistaa — {reason}',
114
+ 'modal.export': 'Vie',
115
+ 'modal.exportTitle': 'Taulukkopohjainen sähköposti-HTML',
116
+ 'export.copy': 'Kopioi',
117
+ 'export.copied': 'Kopioitu',
118
+ 'action.download': 'Lataa',
119
+ 'export.meta': '{kb} kt · taulukot + inline-tyylit · Outlook-turvalliset leveydet',
120
+ 'modal.rawHtmlTitle': 'Raaka HTML, suora esikatselu',
121
+ 'code.statusEdited': 'Koodinäkymä muokattu — esikatselu suorana, ei vielä käytössä',
122
+ 'code.statusSynced': 'Koodinäkymä — synkronoitu kankaan kanssa',
123
+ 'action.reload': 'Lataa uudelleen',
124
+ 'action.reloadHint': 'Lataa lähde uudelleen kankaalta',
125
+ 'action.applyToCanvas': 'Käytä kankaalla',
126
+ 'action.applyToCanvasHint': 'Jäsennä lähde takaisin muokattaviksi riveiksi',
127
+ 'action.closeWithoutApplyingHint': 'Sulje käyttämättä',
128
+ 'code.source': 'Lähde',
129
+ 'code.livePreview': 'Suora esikatselu',
130
+ 'code.liveHtmlPreviewTitle': 'Suora HTML-esikatselu',
131
+ 'code.applyNote':
132
+ 'Käytä jäsentää jokaisen ylimmän tason taulukkorivin kangasriviksi, jonka voit yhä valita, järjestää uudelleen ja poistaa — käsin kirjoitettu koodi säilyy prosessin läpi muuttumattomana.',
133
+ 'code.meta': '{kb} kt · {lines} riviä',
134
+ 'toast.sourceReloaded': 'Lähde ladattu uudelleen kankaalta',
135
+ 'toast.sourceAppliedOne': 'Lähde käytössä — 1 rivi kankaalla',
136
+ 'toast.sourceAppliedMany': 'Lähde käytössä — {rows} riviä kankaalla',
137
+ 'toast.parseError': 'Tätä HTML:ää ei voitu jäsentää',
138
+ 'modal.aiDraft': 'Tekoälyn kirjoitusapuri',
139
+ 'modal.aiDraftTitle': 'Kirjoita sähköpostisi tekoälyllä',
140
+ 'ai.disclosure': 'Tekoäly luo ehdotuksia briefisi pohjalta. Tarkista ja muokkaa tulos ennen lähettämistä.',
141
+ 'ai.goal': 'Tavoite',
142
+ 'ai.tone': 'Sävy',
143
+ 'ai.briefLabel': 'Mistä tämä sähköposti kertoo?',
144
+ 'ai.briefPlaceholder': 'esim. Syyskokoelma, 15 % tilaajille, ilmainen toimitus yli 150 €',
145
+ 'ai.generate': 'Luo teksti',
146
+ 'ai.writing': 'Kirjoitetaan…',
147
+ 'ai.kindHeadline': 'Otsikko',
148
+ 'ai.kindBody': 'Leipäteksti',
149
+ 'ai.kindButton': 'Painikkeen teksti',
150
+ 'ai.actionInsertHeading': 'Lisää otsikkona',
151
+ 'ai.actionInsertText': 'Lisää tekstilohkona',
152
+ 'ai.actionInsertButton': 'Lisää painikkeena',
153
+ 'toast.headingAdded': 'Otsikko lisätty',
154
+ 'toast.textBlockAdded': 'Tekstilohko lisätty',
155
+ 'toast.buttonAdded': 'Painike lisätty',
156
+ 'preview.kickerMobile': 'Esikatselu — mobiili 375px',
157
+ 'preview.kickerDesktop': 'Esikatselu — työpöytä {width}px',
158
+ 'action.close': 'Sulje',
159
+ 'toast.duplicated': 'Monistettu',
160
+ 'toast.fileUploadedOne': '1 tiedosto ladattu',
161
+ 'toast.fileUploadedMany': '{count} tiedostoa ladattu',
162
+ 'toast.imageReplaced': 'Kuva korvattu',
163
+ 'toast.imageAdded': 'Kuva lisätty kankaalle',
164
+ 'toast.htmlCopied': 'HTML kopioitu leikepöydälle',
165
+ 'toast.templateLoaded': '{name} ladattu',
166
+ 'toast.snippetDefaultLabel': 'Katkelma',
167
+ 'toast.snippetInserted': '{name} lisätty',
168
+ 'toast.snippetCopied': '{name} kopioitu — valitse tekstilohko lisätäksesi sen',
169
+ 'rte.textStyle': 'Tekstityyli',
170
+ 'rte.mergeTags': 'Yhdistämiskentät',
171
+ 'rte.noMergeTags': 'Yhdistämiskenttiä ei ole saatavilla',
172
+ 'rte.textColor': 'Tekstin väri',
173
+ 'rte.highlightColor': 'Korostusväri',
174
+ 'rte.removeHighlight': 'Poista korostus',
175
+ 'rte.clearFormatting': 'Poista muotoilut',
176
+ 'action.downloadPng': 'Lataa PNG',
177
+ 'action.screenshot': 'Kuvakaappaus',
178
+ 'action.screenshotHint': 'Katso koko pohja kuvana ja lataa se',
179
+ 'toast.pngSaved': 'Kuvakaappaus ladattiin',
180
+ 'toast.pngFailed': 'Kuvakaappaus epäonnistui — ulkoista kuvaa ei voitu ladata',
181
+ 'toast.pngCopied': 'Kuvakaappaus kopioitiin leikepöydälle',
182
+ 'toast.pngCopyFailed': 'Tämä selain ei hyväksynyt kuvaa leikepöydälle',
183
+ 'story.kicker': 'Kuvakaappaus',
184
+ 'story.rendering': 'Kuvakaappausta luodaan',
185
+ 'story.renderingHint': 'Jokainen lohko piirretään 2× tarkkuudella — pitkässä pohjassa se vie hetken.',
186
+ 'story.failed': 'Kuvakaappaus epäonnistui',
187
+ 'story.failedHint': 'Pohjan yhtä kuvaa ei voitu ladata kaappausta varten.',
188
+ 'story.retry': 'Yritä uudelleen',
189
+ 'story.play': 'Toista',
190
+ 'story.pause': 'Keskeytä',
191
+ 'story.replay': 'Toista uudelleen',
192
+ 'story.copy': 'Kopioi',
193
+ 'story.meta': '{w}×{h} · näkymä {i}/{n}',
194
+ 'footer.poweredBy': 'Taustalla SELISE Blocks © 2026',
195
+ };