@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
- /** 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': 'Esikatselumobiili 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.errNoAccept': 'Lataukset on poistettu käytöstä: yhtään tiedostomuotoa ei ole sallittu.',
106
+ 'storage.errNoMaxBytes': 'Lataukset on poistettu käytöstä: tiedoston enimmäiskokoa ei ole asetettu.',
107
+ 'storage.errTooLarge': '{name} on {size} — raja on {max}.',
108
+ 'storage.errFormat': '{name} on {type}-tiedosto, jota ei sallita tässä.',
109
+ 'storage.errSvg': '{name} on SVG, jota tämä sovellus ei hyväksy.',
110
+ 'storage.errDimensions': '{name} on {w}×{ht}px — raja on {maxW}×{maxH}px.',
111
+ 'storage.errTooMany': 'Kerralla voi ladata vain {max} tiedostoa.',
112
+ 'storage.errUnreadable': '{name} ei ole luettava kuva.',
113
+ 'storage.errUploadFailed': 'Tiedostoa {name} ei voitu ladata — {reason}',
114
+ 'storage.errDeleteFailed': 'Tiedostoa {name} ei voitu poistaa — {reason}',
115
+ 'modal.export': 'Vie',
116
+ 'modal.exportTitle': 'Taulukkopohjainen sähköposti-HTML',
117
+ 'export.copy': 'Kopioi',
118
+ 'export.copied': 'Kopioitu',
119
+ 'action.download': 'Lataa',
120
+ 'export.meta': '{kb} kt · taulukot + inline-tyylit · Outlook-turvalliset leveydet',
121
+ 'modal.rawHtmlTitle': 'Raaka HTML, suora esikatselu',
122
+ 'code.statusEdited': 'Koodinäkymä — muokattu — esikatselu suorana, ei vielä käytössä',
123
+ 'code.statusSynced': 'Koodinäkymä — synkronoitu kankaan kanssa',
124
+ 'action.reload': 'Lataa uudelleen',
125
+ 'action.reloadHint': 'Lataa lähde uudelleen kankaalta',
126
+ 'action.applyToCanvas': 'Käytä kankaalla',
127
+ 'action.applyToCanvasHint': 'Jäsennä lähde takaisin muokattaviksi riveiksi',
128
+ 'action.closeWithoutApplyingHint': 'Sulje käyttämättä',
129
+ 'code.source': 'Lähde',
130
+ 'code.livePreview': 'Suora esikatselu',
131
+ 'code.liveHtmlPreviewTitle': 'Suora HTML-esikatselu',
132
+ 'code.applyNote':
133
+ '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.',
134
+ 'code.meta': '{kb} kt · {lines} riviä',
135
+ 'toast.sourceReloaded': 'Lähde ladattu uudelleen kankaalta',
136
+ 'toast.sourceAppliedOne': 'Lähde käytössä — 1 rivi kankaalla',
137
+ 'toast.sourceAppliedMany': 'Lähde käytössä {rows} riviä kankaalla',
138
+ 'toast.parseError': 'Tätä HTML:ää ei voitu jäsentää',
139
+ 'modal.aiDraft': 'Tekoälyn kirjoitusapuri',
140
+ 'modal.aiDraftTitle': 'Kirjoita sähköpostisi tekoälyllä',
141
+ 'ai.disclosure': 'Tekoäly luo ehdotuksia briefisi pohjalta. Tarkista ja muokkaa tulos ennen lähettämistä.',
142
+ 'ai.goal': 'Tavoite',
143
+ 'ai.tone': 'Sävy',
144
+ 'ai.briefLabel': 'Mistä tämä sähköposti kertoo?',
145
+ 'ai.briefPlaceholder': 'esim. Syyskokoelma, 15 % tilaajille, ilmainen toimitus yli 150 €',
146
+ 'ai.generate': 'Luo teksti',
147
+ 'ai.writing': 'Kirjoitetaan…',
148
+ 'ai.kindHeadline': 'Otsikko',
149
+ 'ai.kindBody': 'Leipäteksti',
150
+ 'ai.kindButton': 'Painikkeen teksti',
151
+ 'ai.actionInsertHeading': 'Lisää otsikkona',
152
+ 'ai.actionInsertText': 'Lisää tekstilohkona',
153
+ 'ai.actionInsertButton': 'Lisää painikkeena',
154
+ 'toast.headingAdded': 'Otsikko lisätty',
155
+ 'toast.textBlockAdded': 'Tekstilohko lisätty',
156
+ 'toast.buttonAdded': 'Painike lisätty',
157
+ 'preview.kickerMobile': 'Esikatselu — mobiili 375px',
158
+ 'preview.kickerDesktop': 'Esikatselu — työpöytä {width}px',
159
+ 'action.close': 'Sulje',
160
+ 'toast.duplicated': 'Monistettu',
161
+ 'toast.fileUploadedOne': '1 tiedosto ladattu',
162
+ 'toast.fileUploadedMany': '{count} tiedostoa ladattu',
163
+ 'toast.imageReplaced': 'Kuva korvattu',
164
+ 'toast.imageAdded': 'Kuva lisätty kankaalle',
165
+ 'toast.htmlCopied': 'HTML kopioitu leikepöydälle',
166
+ 'toast.templateLoaded': '{name} ladattu',
167
+ 'toast.snippetDefaultLabel': 'Katkelma',
168
+ 'toast.snippetInserted': '{name} lisätty',
169
+ 'toast.snippetCopied': '{name} kopioitu — valitse tekstilohko lisätäksesi sen',
170
+ 'rte.textStyle': 'Tekstityyli',
171
+ 'rte.mergeTags': 'Yhdistämiskentät',
172
+ 'rte.noMergeTags': 'Yhdistämiskenttiä ei ole saatavilla',
173
+ 'rte.textColor': 'Tekstin väri',
174
+ 'rte.highlightColor': 'Korostusväri',
175
+ 'rte.removeHighlight': 'Poista korostus',
176
+ 'rte.clearFormatting': 'Poista muotoilut',
177
+ 'action.downloadPng': 'Lataa PNG',
178
+ 'action.screenshot': 'Kuvakaappaus',
179
+ 'action.screenshotHint': 'Katso koko pohja kuvana ja lataa se',
180
+ 'toast.pngSaved': 'Kuvakaappaus ladattiin',
181
+ 'toast.pngFailed': 'Kuvakaappaus epäonnistui — ulkoista kuvaa ei voitu ladata',
182
+ 'toast.pngCopied': 'Kuvakaappaus kopioitiin leikepöydälle',
183
+ 'toast.pngCopyFailed': 'Tämä selain ei hyväksynyt kuvaa leikepöydälle',
184
+ 'story.kicker': 'Kuvakaappaus',
185
+ 'story.rendering': 'Kuvakaappausta luodaan',
186
+ 'story.renderingHint': 'Jokainen lohko piirretään 2× tarkkuudella — pitkässä pohjassa se vie hetken.',
187
+ 'story.failed': 'Kuvakaappaus epäonnistui',
188
+ 'story.failedHint': 'Pohjan yhtä kuvaa ei voitu ladata kaappausta varten.',
189
+ 'story.retry': 'Yritä uudelleen',
190
+ 'story.play': 'Toista',
191
+ 'story.pause': 'Keskeytä',
192
+ 'story.replay': 'Toista uudelleen',
193
+ 'story.copy': 'Kopioi',
194
+ 'story.meta': '{w}×{h} · näkymä {i}/{n}',
195
+ 'footer.poweredBy': 'Taustalla SELISE Blocks © 2026',
196
+ };