@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
- /** Danish (Dansk) — `da`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const DA = {
3
- 'action.undoHint': 'Fortryd — ⌘Z',
4
- 'action.redoHint': 'Gentag — ⌘⇧Z',
5
- 'action.chromeToDark': 'Mørk',
6
- 'action.chromeToLight': 'Lys',
7
- 'action.chromeHint': 'Redigeringstema lys / mørk',
8
- 'action.aiCopy': 'Tekst',
9
- 'action.aiCopyHint': 'Skriv tekst med AI',
10
- 'action.code': 'Kode',
11
- 'action.codeHint': 'Rediger HTML med direkte forhåndsvisning',
12
- 'action.preview': 'Forhåndsvisning',
13
- 'action.export': 'Eksportér',
14
- 'device.desktop': 'Computer',
15
- 'device.desktopHint': 'Bredde til computer',
16
- 'device.mobile': 'Mobil',
17
- 'device.mobileHint': 'Bredde til mobil',
18
- 'device.dark': 'Mørk',
19
- 'device.darkHint': 'Mørk tilstand for indbakke',
20
- 'status.autosaveOn': 'automatisk gemning slået til',
21
- 'status.saved': 'gemt {time}',
22
- 'status.saveFailed': 'ikke gemt lagerplads fuld',
23
- 'canvas.meta': '{rows} rækker · {blocks} blokke · {width}px',
24
- 'tab.design': 'Stil',
25
- 'tab.designHint': 'Formatér markeringen',
26
- 'tab.blocks': 'Blokke',
27
- 'tab.blocksHint': 'Indholdsblokke og variabler',
28
- 'tab.rows': 'Sektioner',
29
- 'tab.rowsHint': 'Sektionslayouts og lærredsmodel',
30
- 'tab.files': 'Filer',
31
- 'tab.filesHint': 'Ressourcebibliotek',
32
- 'tab.layers': 'Struktur',
33
- 'tab.layersHint': 'Dokumentstruktur',
34
- 'tab.theme': 'Tema',
35
- 'tab.themeHint': 'Globale stilarter',
36
- 'tab.data': 'Var.',
37
- 'tab.dataHint': 'Variabler leveret af din kode',
38
- 'inspector.blockProperties': 'Blokegenskaber',
39
- 'inspector.sectionProperties': 'Sektionsegenskaber',
40
- 'inspector.title': 'Inspektør',
41
- 'inspector.sectionLabel': 'Sektion',
42
- 'inspector.nothingSelected': 'Intet valgt',
43
- 'action.duplicateHint': 'Dupliker — ⌘D',
44
- 'action.deleteHint': 'Slet — ⌫',
45
- 'inspector.emptyBody':
46
- 'Vælg en række eller en blok på lærredet for at formatere den her. Træk blokke fra fanen <strong style="color: var(--ed-text); font-weight: 600;">Blokke</strong>; dobbeltklik på tekst for at redigere direkte.',
47
- 'inspector.shortcuts': 'Genveje',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z fortryd, gentag',
49
- 'shortcut.duplicate': '⌘D — dupliker markering',
50
- 'shortcut.delete': 'slet markering',
51
- 'shortcut.export': '⌘Eeksportér HTML',
52
- 'shortcut.escape': 'ESCfjern markering, luk',
53
- 'blocks.dragHint': 'Træk til lærredet',
54
- 'blocks.count': '{count} blokke',
55
- 'rows.sectionLayouts': 'Sektionslayouts',
56
- 'rows.customMarkup': 'Tilpasset kode',
57
- 'rows.htmlRowHint': 'Træk for at indsætte, eller klik for at tilføje — en fuldbredde-række, du fylder med rå HTML',
58
- 'rows.rawHtmlSection': ' HTML-sektion',
59
- 'rows.rawHtmlDesc': 'Fuldbredde-sektion, din egen kode, stadig trækbar',
60
- 'rows.canvasModel': 'Lærredsmodel',
61
- 'rows.modeRowBased': 'Rækkebaseret',
62
- 'rows.modeFreeStack': 'Fri stak',
63
- 'rows.hintRows':
64
- 'Sektionsbaseret: slip et layout først, derefter blokke i dets kolonner — hver sektion har sin egen baggrund, kant, flex- eller gitterindstillinger.',
65
- 'rows.hintStack': 'Fri stak: uden layouts — hver blok, du slipper, bliver sin egen fuldbredde-sektion, stablet i rækkefølge.',
66
- 'files.libraryCount': 'Bibliotek{count} filer',
67
- 'files.openManager': 'Åbn filhåndtering',
68
- 'files.dragToCanvas': 'Træk en vilkårlig fil direkte til lærredet for at placere den som en billedblok.',
69
- 'layers.structure': 'Struktur',
70
- 'layers.sectionSingle': 'Sektion',
71
- 'layers.sectionMulti': 'Sektion · {count} kol.',
72
- 'layers.blockCount': '{count} bl.',
73
- 'theme.globalStyles': 'Globale stilarter',
74
- 'vars.title': 'Variabler',
75
- 'vars.fromCode': '{count} fra din kode',
76
- 'vars.declaredNote': 'Erklæret af din applikation — lærredet viser altid tokenet, aldrig en værdi.',
77
- 'vars.filterPlaceholder': 'Filtrér variabler…',
78
- 'vars.insertHint': 'Klik for at indsætte i markeret tekst, overskrift eller knap',
79
- 'vars.insert': 'indsæt',
80
- 'vars.noMatch': 'Ingen variabel matcher det filter.',
81
- 'vars.noneDeclared': 'Din applikation har endnu ikke erklæret nogen variabler.',
82
- 'vars.rteHint': 'Når du redigerer tekst, kan du også vælge en variabel direkte fra rullemenuen i den indlejrede værktøjslinje.',
83
- 'modal.fileManager': 'Filhåndtering',
84
- 'modal.assetsTitle': 'Ressourcer',
85
- 'modal.replaceImage': 'Erstat billede',
86
- 'library.searchPlaceholder': 'Søg i filer…',
87
- 'action.upload': 'Upload',
88
- 'library.clickToPlace': 'Klik en fil for at placere den · eller træk en fil til lærredet',
89
- 'library.clickToReplace': 'Klik på en fil for at erstatte det markerede billede',
90
- 'library.storageLabel': '{count} filer · {size}',
91
- 'library.folders': 'Mapper',
92
- 'library.dropHint': 'Slip billedfiler her for at uploade — eller brug knappen Upload.',
93
- 'library.deleteFileHint': 'Slet fil',
94
- 'library.del': 'SLET',
95
- 'toast.assetDeleted': '{name} slettet',
96
- 'modal.export': 'Eksportér',
97
- 'modal.exportTitle': 'Tabelbaseret e-mail-HTML',
98
- 'export.copy': 'Kopiér',
99
- 'export.copied': 'Kopieret',
100
- 'action.download': 'Download',
101
- 'export.meta': '{kb} KB · tabeller + inline-stilarter · Outlook-sikre bredder',
102
- 'modal.rawHtmlTitle': ' HTML, direkte forhåndsvisning',
103
- 'code.statusEdited': 'Kodevisning redigeretforhåndsvisning live, endnu ikke anvendt',
104
- 'code.statusSynced': 'Kodevisning synkroniseret med lærredet',
105
- 'action.reload': 'Genindlæs',
106
- 'action.reloadHint': 'Genindlæs kilde fra lærredet',
107
- 'action.applyToCanvas': 'Anvend lærred',
108
- 'action.applyToCanvasHint': 'Fortolk kilden tilbage til redigerbare rækker',
109
- 'action.closeWithoutApplyingHint': 'Luk uden at anvende',
110
- 'code.source': 'Kilde',
111
- 'code.livePreview': 'Direkte forhåndsvisning',
112
- 'code.liveHtmlPreviewTitle': 'Direkte HTML-forhåndsvisning',
113
- 'code.applyNote':
114
- 'Anvend fortolker hver tabelrække øverste niveau til en lærredsrække, du stadig kan markere, omarrangere og slette håndskrevet kode overlever processen uændret.',
115
- 'code.meta': '{kb} KB · {lines} linjer',
116
- 'toast.sourceReloaded': 'Kilde genindlæst fra lærredet',
117
- 'toast.sourceAppliedOne': 'Kilde anvendt — 1 række på lærredet',
118
- 'toast.sourceAppliedMany': 'Kilde anvendt — {rows} rækker på lærredet',
119
- 'toast.parseError': 'Kunne ikke fortolke den HTML',
120
- 'modal.copyAssist': 'Tekstassistent',
121
- 'modal.draftCopyTitle': 'Skriv tekst til denne kampagne',
122
- 'ai.goal': 'Mål',
123
- 'ai.tone': 'Tone',
124
- 'ai.briefLabel': 'Hvad handler denne e-mail om?',
125
- 'ai.briefPlaceholder': 'f.eks. Efterårskollektion, 15% til abonnenter, fragtfrit over 150 kr',
126
- 'ai.generate': 'Generér tekst',
127
- 'ai.writing': 'Skriver…',
128
- 'ai.kindHeadline': 'Overskrift',
129
- 'ai.kindBody': 'Brødtekst',
130
- 'ai.kindButton': 'Knaptekst',
131
- 'ai.actionInsertHeading': 'Indsæt som overskrift',
132
- 'ai.actionInsertText': 'Indsæt som tekstblok',
133
- 'ai.actionInsertButton': 'Indsæt som knap',
134
- 'toast.headingAdded': 'Overskrift tilføjet',
135
- 'toast.textBlockAdded': 'Tekstblok tilføjet',
136
- 'toast.buttonAdded': 'Knap tilføjet',
137
- 'preview.kickerMobile': 'Forhåndsvisningmobil 375px',
138
- 'preview.kickerDark': 'Forhåndsvisning mørk indbakke',
139
- 'preview.kickerDesktop': 'Forhåndsvisning — computer {width}px',
140
- 'action.close': 'Luk',
141
- 'toast.duplicated': 'Duplikeret',
142
- 'toast.fileUploadedOne': '1 fil uploadet',
143
- 'toast.fileUploadedMany': '{count} filer uploadet',
144
- 'toast.imageReplaced': 'Billede erstattet',
145
- 'toast.imageAdded': 'Billede tilføjet til lærredet',
146
- 'toast.htmlCopied': 'HTML kopieret til udklipsholder',
147
- 'toast.templateLoaded': '{name} indlæst',
148
- 'toast.snippetDefaultLabel': 'Uddrag',
149
- 'toast.snippetInserted': '{name} indsat',
150
- 'toast.snippetCopied': '{name} kopieret — vælg en tekstblok for at indsætte den',
151
- };
152
-
1
+ /** Danish (Dansk) — `da`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const DA = {
3
+ 'action.undoHint': 'Fortryd — ⌘Z',
4
+ 'action.redoHint': 'Gentag — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Mørk',
6
+ 'action.chromeToLight': 'Lys',
7
+ 'action.chromeHint': 'Redigeringstema lys / mørk',
8
+ 'action.chromeHintToDark': 'Mørk tilstand',
9
+ 'action.chromeHintToLight': 'Lys tilstand',
10
+ 'action.aiDraft': 'Udkast',
11
+ 'action.aiDraftHint': 'Skriv e-mailens indhold med AI',
12
+ 'action.code': 'Kode',
13
+ 'action.codeHint': 'Rediger rå HTML med direkte forhåndsvisning',
14
+ 'action.preview': 'Forhåndsvisning',
15
+ 'action.previewHint': 'Se e-mailen',
16
+ 'action.export': 'Eksportér',
17
+ 'action.exportHint': 'Eksportér din e-mail',
18
+ 'device.desktop': 'Computer',
19
+ 'device.desktopHint': 'Bredde til computer',
20
+ 'device.mobile': 'Mobil',
21
+ 'device.mobileHint': 'Bredde til mobil',
22
+ 'status.autosaveOn': 'automatisk gemning slået til',
23
+ 'status.saved': 'gemt {time}',
24
+ 'status.saveFailed': 'ikke gemt — lagerplads fuld',
25
+ 'canvas.meta': '{rows} rækker · {blocks} blokke · {width}px',
26
+ 'tab.design': 'Stil',
27
+ 'tab.designHint': 'Formatér markeringen',
28
+ 'tab.blocks': 'Blokke',
29
+ 'tab.blocksHint': 'Indholdsblokke og variabler',
30
+ 'tab.rows': 'Sektioner',
31
+ 'tab.rowsHint': 'Sektionslayouts og lærredsmodel',
32
+ 'tab.files': 'Filer',
33
+ 'tab.filesHint': 'Ressourcebibliotek',
34
+ 'tab.layers': 'Struktur',
35
+ 'tab.layersHint': 'Dokumentstruktur',
36
+ 'tab.settings': 'Indstillinger',
37
+ 'tab.settingsHint': 'E-mailindstillinger',
38
+ 'tab.data': 'Var.',
39
+ 'tab.dataHint': 'Variabler leveret af din kode',
40
+ 'inspector.blockProperties': 'Blokegenskaber',
41
+ 'inspector.sectionProperties': 'Sektionsegenskaber',
42
+ 'inspector.title': 'Inspektør',
43
+ 'inspector.sectionLabel': 'Sektion',
44
+ 'inspector.nothingSelected': 'Intet valgt',
45
+ 'action.duplicateHint': 'Dupliker — ⌘D',
46
+ 'action.deleteHint': 'Slet ',
47
+ 'inspector.emptyBody':
48
+ 'Vælg en række eller en blok på lærredet for at formatere den her. Træk blokke fra fanen <strong style="color: var(--ed-text); font-weight: 600;">Blokke</strong>; dobbeltklik tekst for at redigere direkte.',
49
+ 'inspector.shortcuts': 'Genveje',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z fortryd, gentag',
51
+ 'shortcut.duplicate': '⌘Ddupliker markering',
52
+ 'shortcut.delete': 'slet markering',
53
+ 'shortcut.export': '⌘E eksportér HTML',
54
+ 'shortcut.escape': 'ESC — fjern markering, luk',
55
+ 'blocks.dragHint': 'Træk til lærredet',
56
+ 'blocks.count': '{count} blokke',
57
+ 'rows.sectionLayouts': 'Sektionslayouts',
58
+ 'rows.customMarkup': 'Tilpasset kode',
59
+ 'rows.htmlRowHint': 'Træk for at indsætte, eller klik for at tilføje — en fuldbredde-række, du fylder med rå HTML',
60
+ 'rows.rawHtmlSection': 'Rå HTML-sektion',
61
+ 'rows.rawHtmlDesc': 'Fuldbredde-sektion, din egen kode, stadig trækbar',
62
+ 'rows.canvasModel': 'Lærredsmodel',
63
+ 'rows.modeRowBased': 'Rækkebaseret',
64
+ 'rows.modeFreeStack': 'Fri stak',
65
+ 'rows.hintRows':
66
+ 'Sektionsbaseret: slip et layout først, derefter blokke i dets kolonner hver sektion har sin egen baggrund, kant, flex- eller gitterindstillinger.',
67
+ 'rows.hintStack': 'Fri stak: uden layouts — hver blok, du slipper, bliver sin egen fuldbredde-sektion, stablet i rækkefølge.',
68
+ 'files.libraryCount': 'Bibliotek {count} filer',
69
+ 'files.openManager': 'Åbn filhåndtering',
70
+ 'files.dragToCanvas': 'Træk en vilkårlig fil direkte til lærredet for at placere den som en billedblok.',
71
+ 'layers.structure': 'Struktur',
72
+ 'layers.sectionSingle': 'Sektion',
73
+ 'layers.sectionMulti': 'Sektion · {count} kol.',
74
+ 'layers.column': 'Kolonne {index}',
75
+ 'layers.blockCount': '{count} bl.',
76
+ 'vars.title': 'Variabler',
77
+ 'vars.fromCode': '{count} fra din kode',
78
+ 'vars.declaredNote': 'Erklæret af din applikation lærredet viser altid tokenet, aldrig en værdi.',
79
+ 'vars.filterPlaceholder': 'Filtrér variabler…',
80
+ 'vars.insertHint': 'Klik for at indsætte i markeret tekst, overskrift eller knap',
81
+ 'vars.insert': 'indsæt',
82
+ 'vars.noMatch': 'Ingen variabel matcher det filter.',
83
+ 'vars.noneDeclared': 'Din applikation har endnu ikke erklæret nogen variabler.',
84
+ 'vars.rteHint': 'Når du redigerer tekst, kan du også vælge en variabel direkte fra rullemenuen i den indlejrede værktøjslinje.',
85
+ 'modal.fileManager': 'Filhåndtering',
86
+ 'modal.assetsTitle': 'Ressourcer',
87
+ 'modal.replaceImage': 'Erstat billede',
88
+ 'library.searchPlaceholder': 'Søg i filer…',
89
+ 'action.upload': 'Upload',
90
+ 'library.clickToPlace': 'Klik en fil for at placere den · eller træk en fil til lærredet',
91
+ 'library.clickToReplace': 'Klik på en fil for at erstatte det markerede billede',
92
+ 'library.storageLabel': '{count} filer · {size}',
93
+ 'library.folders': 'Mapper',
94
+ 'library.dropHint': 'Slip billedfiler her for at uploade — eller brug knappen Upload.',
95
+ 'library.deleteFileHint': 'Slet fil',
96
+ 'library.del': 'SLET',
97
+ 'toast.assetDeleted': '{name} slettet',
98
+ 'library.allFiles': 'Alle filer',
99
+ 'library.loadMore': 'Indlæs flere',
100
+ 'library.empty': 'Der er ingen filer her endnu.',
101
+ 'storage.loading': 'Indlæser filer…',
102
+ 'storage.uploading': 'Uploader {count}…',
103
+ 'storage.errLoadFailed': 'Filbiblioteket kunne ikke indlæses {reason}',
104
+ 'storage.errNoLimits': 'Upload er slået fra: denne app har ikke sat nogen uploadgrænser.',
105
+ 'storage.errNoAccept': 'Upload er slået fra: ingen filformater er tilladt.',
106
+ 'storage.errNoMaxBytes': 'Upload er slået fra: der er ikke sat nogen maksimal filstørrelse.',
107
+ 'storage.errTooLarge': '{name} er {size} — grænsen er {max}.',
108
+ 'storage.errFormat': '{name} er en {type}-fil, som ikke er tilladt her.',
109
+ 'storage.errSvg': '{name} er en SVG, som denne app ikke accepterer.',
110
+ 'storage.errDimensions': '{name} er {w}×{ht}px — grænsen er {maxW}×{maxH}px.',
111
+ 'storage.errTooMany': 'Der kan kun uploades {max} filer ad gangen.',
112
+ 'storage.errUnreadable': '{name} er ikke et læsbart billede.',
113
+ 'storage.errUploadFailed': '{name} kunne ikke uploades — {reason}',
114
+ 'storage.errDeleteFailed': '{name} kunne ikke slettes{reason}',
115
+ 'modal.export': 'Eksportér',
116
+ 'modal.exportTitle': 'Tabelbaseret e-mail-HTML',
117
+ 'export.copy': 'Kopiér',
118
+ 'export.copied': 'Kopieret',
119
+ 'action.download': 'Download',
120
+ 'export.meta': '{kb} KB · tabeller + inline-stilarter · Outlook-sikre bredder',
121
+ 'modal.rawHtmlTitle': ' HTML, direkte forhåndsvisning',
122
+ 'code.statusEdited': 'Kodevisning — redigeret — forhåndsvisning live, endnu ikke anvendt',
123
+ 'code.statusSynced': 'Kodevisning — synkroniseret med lærredet',
124
+ 'action.reload': 'Genindlæs',
125
+ 'action.reloadHint': 'Genindlæs kilde fra lærredet',
126
+ 'action.applyToCanvas': 'Anvend på lærred',
127
+ 'action.applyToCanvasHint': 'Fortolk kilden tilbage til redigerbare rækker',
128
+ 'action.closeWithoutApplyingHint': 'Luk uden at anvende',
129
+ 'code.source': 'Kilde',
130
+ 'code.livePreview': 'Direkte forhåndsvisning',
131
+ 'code.liveHtmlPreviewTitle': 'Direkte HTML-forhåndsvisning',
132
+ 'code.applyNote':
133
+ 'Anvend fortolker hver tabelrække på øverste niveau til en lærredsrække, du stadig kan markere, omarrangere og slette — håndskrevet kode overlever processen uændret.',
134
+ 'code.meta': '{kb} KB · {lines} linjer',
135
+ 'toast.sourceReloaded': 'Kilde genindlæst fra lærredet',
136
+ 'toast.sourceAppliedOne': 'Kilde anvendt — 1 række på lærredet',
137
+ 'toast.sourceAppliedMany': 'Kilde anvendt {rows} rækker på lærredet',
138
+ 'toast.parseError': 'Kunne ikke fortolke den HTML',
139
+ 'modal.aiDraft': 'AI-skriveassistent',
140
+ 'modal.aiDraftTitle': 'Skriv din e-mail med AI',
141
+ 'ai.disclosure': 'AI skaber forslag ud fra din brief. Gennemgå og redigér resultatet, før du sender.',
142
+ 'ai.goal': 'Mål',
143
+ 'ai.tone': 'Tone',
144
+ 'ai.briefLabel': 'Hvad handler denne e-mail om?',
145
+ 'ai.briefPlaceholder': 'f.eks. Efterårskollektion, 15% til abonnenter, fragtfrit over 150 kr',
146
+ 'ai.generate': 'Generér tekst',
147
+ 'ai.writing': 'Skriver…',
148
+ 'ai.kindHeadline': 'Overskrift',
149
+ 'ai.kindBody': 'Brødtekst',
150
+ 'ai.kindButton': 'Knaptekst',
151
+ 'ai.actionInsertHeading': 'Indsæt som overskrift',
152
+ 'ai.actionInsertText': 'Indsæt som tekstblok',
153
+ 'ai.actionInsertButton': 'Indsæt som knap',
154
+ 'toast.headingAdded': 'Overskrift tilføjet',
155
+ 'toast.textBlockAdded': 'Tekstblok tilføjet',
156
+ 'toast.buttonAdded': 'Knap tilføjet',
157
+ 'preview.kickerMobile': 'Forhåndsvisning — mobil 375px',
158
+ 'preview.kickerDesktop': 'Forhåndsvisning — computer {width}px',
159
+ 'action.close': 'Luk',
160
+ 'toast.duplicated': 'Duplikeret',
161
+ 'toast.fileUploadedOne': '1 fil uploadet',
162
+ 'toast.fileUploadedMany': '{count} filer uploadet',
163
+ 'toast.imageReplaced': 'Billede erstattet',
164
+ 'toast.imageAdded': 'Billede tilføjet til lærredet',
165
+ 'toast.htmlCopied': 'HTML kopieret til udklipsholder',
166
+ 'toast.templateLoaded': '{name} indlæst',
167
+ 'toast.snippetDefaultLabel': 'Uddrag',
168
+ 'toast.snippetInserted': '{name} indsat',
169
+ 'toast.snippetCopied': '{name} kopieret — vælg en tekstblok for at indsætte den',
170
+ 'rte.textStyle': 'Tekststil',
171
+ 'rte.mergeTags': 'Flettefelter',
172
+ 'rte.noMergeTags': 'Ingen flettefelter tilgængelige',
173
+ 'rte.textColor': 'Tekstfarve',
174
+ 'rte.highlightColor': 'Fremhævningsfarve',
175
+ 'rte.removeHighlight': 'Fjern fremhævning',
176
+ 'rte.clearFormatting': 'Ryd formatering',
177
+ 'action.downloadPng': 'Hent PNG',
178
+ 'action.screenshot': 'Skærmbillede',
179
+ 'action.screenshotHint': 'Se hele skabelonen som et billede, og hent det',
180
+ 'toast.pngSaved': 'Skærmbillede hentet',
181
+ 'toast.pngFailed': 'Skærmbilledet mislykkedes — et eksternt billede kunne ikke indlæses',
182
+ 'toast.pngCopied': 'Skærmbillede kopieret til udklipsholderen',
183
+ 'toast.pngCopyFailed': 'Denne browser ville ikke acceptere et billede i udklipsholderen',
184
+ 'story.kicker': 'Skærmbillede',
185
+ 'story.rendering': 'Skærmbilledet gengives',
186
+ 'story.renderingHint': 'Hver blok tegnes i 2× — det tager et øjeblik ved en lang skabelon.',
187
+ 'story.failed': 'Skærmbilledet mislykkedes',
188
+ 'story.failedHint': 'Et billede i skabelonen kunne ikke indlæses til optagelsen.',
189
+ 'story.retry': 'Prøv igen',
190
+ 'story.play': 'Afspil',
191
+ 'story.pause': 'Pause',
192
+ 'story.replay': 'Afspil igen',
193
+ 'story.copy': 'Kopiér',
194
+ 'story.meta': '{w}×{h} · skærm {i} af {n}',
195
+ 'footer.poweredBy': 'Drevet af SELISE Blocks © 2026',
196
+ };