@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
- /** Norwegian Bokmål (Norsk bokmål) — `nb`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const NB = {
3
- 'action.undoHint': 'Angre — ⌘Z',
4
- 'action.redoHint': 'Gjør om — ⌘⇧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': 'Eksporter',
14
- 'device.desktop': 'Datamaskin',
15
- 'device.desktopHint': 'Bredde for datamaskin',
16
- 'device.mobile': 'Mobil',
17
- 'device.mobileHint': 'Bredde for mobil',
18
- 'device.dark': 'Mørk',
19
- 'device.darkHint': 'Mørk modus for innboks',
20
- 'status.autosaveOn': 'automatisk lagring på',
21
- 'status.saved': 'lagret {time}',
22
- 'status.saveFailed': 'ikke lagret — lagringsplassen er full',
23
- 'canvas.meta': '{rows} rader · {blocks} blokker · {width}px',
24
- 'tab.design': 'Stil',
25
- 'tab.designHint': 'Formater utvalget',
26
- 'tab.blocks': 'Blokker',
27
- 'tab.blocksHint': 'Innholdsblokker og variabler',
28
- 'tab.rows': 'Seksjoner',
29
- 'tab.rowsHint': 'Seksjonslayouter og lerretsmodell',
30
- 'tab.files': 'Filer',
31
- 'tab.filesHint': 'Ressursbibliotek',
32
- 'tab.layers': 'Struktur',
33
- 'tab.layersHint': 'Dokumentstruktur',
34
- 'tab.theme': 'Tema',
35
- 'tab.themeHint': 'Globale stiler',
36
- 'tab.data': 'Var.',
37
- 'tab.dataHint': 'Variabler levert av koden din',
38
- 'inspector.blockProperties': 'Blokkegenskaper',
39
- 'inspector.sectionProperties': 'Seksjonsegenskaper',
40
- 'inspector.title': 'Inspektør',
41
- 'inspector.sectionLabel': 'Seksjon',
42
- 'inspector.nothingSelected': 'Ingenting valgt',
43
- 'action.duplicateHint': 'Dupliser — ⌘D',
44
- 'action.deleteHint': 'Slett — ⌫',
45
- 'inspector.emptyBody':
46
- 'Velg en rad eller en blokk på lerretet for å formatere den her. Dra blokker fra fanen <strong style="color: var(--ed-text); font-weight: 600;">Blokker</strong>; dobbeltklikk på tekst for å redigere direkte.',
47
- 'inspector.shortcuts': 'Snarveier',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z angre, gjør om',
49
- 'shortcut.duplicate': '⌘D — dupliser utvalg',
50
- 'shortcut.delete': 'slett utvalg',
51
- 'shortcut.export': '⌘Eeksporter HTML',
52
- 'shortcut.escape': 'ESCfjern utvalg, lukk',
53
- 'blocks.dragHint': 'Dra til lerretet',
54
- 'blocks.count': '{count} blokker',
55
- 'rows.sectionLayouts': 'Seksjonslayouter',
56
- 'rows.customMarkup': 'Egendefinert kode',
57
- 'rows.htmlRowHint': 'Dra for å sette inn, eller klikk for å legge til — en fullbredde-rad du fyller med rå HTML',
58
- 'rows.rawHtmlSection': ' HTML-seksjon',
59
- 'rows.rawHtmlDesc': 'Fullbredde-seksjon, din egen kode, fortsatt drabar',
60
- 'rows.canvasModel': 'Lerretsmodell',
61
- 'rows.modeRowBased': 'Radbasert',
62
- 'rows.modeFreeStack': 'Fri stabel',
63
- 'rows.hintRows':
64
- 'Seksjonsbasert: slipp en layout først, deretter blokker i kolonnene — hver seksjon har egen bakgrunn, kant, flex- eller rutenettinnstillinger.',
65
- 'rows.hintStack': 'Fri stabel: uten layouter — hver blokk du slipper blir sin egen fullbredde-seksjon, stablet i rekkefølge.',
66
- 'files.libraryCount': 'Bibliotek{count} filer',
67
- 'files.openManager': 'Åpne filbehandling',
68
- 'files.dragToCanvas': 'Dra en hvilken som helst fil direkte til lerretet for å plassere den som en bildeblokk.',
69
- 'layers.structure': 'Struktur',
70
- 'layers.sectionSingle': 'Seksjon',
71
- 'layers.sectionMulti': 'Seksjon · {count} kol.',
72
- 'layers.blockCount': '{count} bl.',
73
- 'theme.globalStyles': 'Globale stiler',
74
- 'vars.title': 'Variabler',
75
- 'vars.fromCode': '{count} fra koden din',
76
- 'vars.declaredNote': 'Erklært av applikasjonen din — lerretet viser alltid tokenet, aldri en verdi.',
77
- 'vars.filterPlaceholder': 'Filtrer variabler…',
78
- 'vars.insertHint': 'Klikk for å sette inn i valgt tekst, overskrift eller knapp',
79
- 'vars.insert': 'sett inn',
80
- 'vars.noMatch': 'Ingen variabel samsvarer med dette filteret.',
81
- 'vars.noneDeclared': 'Applikasjonen din har ennå ikke erklært noen variabler.',
82
- 'vars.rteHint': 'Når du redigerer tekst kan du også velge en variabel direkte fra rullegardinmenyen i den innebygde verktøylinjen.',
83
- 'modal.fileManager': 'Filbehandling',
84
- 'modal.assetsTitle': 'Ressurser',
85
- 'modal.replaceImage': 'Erstatt bilde',
86
- 'library.searchPlaceholder': 'Søk i filer…',
87
- 'action.upload': 'Last opp',
88
- 'library.clickToPlace': 'Klikk en fil for å plassere den · eller dra en fil til lerretet',
89
- 'library.clickToReplace': 'Klikk på en fil for å erstatte det valgte bildet',
90
- 'library.storageLabel': '{count} filer · {size}',
91
- 'library.folders': 'Mapper',
92
- 'library.dropHint': 'Slipp bildefiler her for å laste opp — eller bruk Last opp-knappen.',
93
- 'library.deleteFileHint': 'Slett fil',
94
- 'library.del': 'SLETT',
95
- 'toast.assetDeleted': '{name} slettet',
96
- 'modal.export': 'Eksporter',
97
- 'modal.exportTitle': 'Tabellbasert e-post-HTML',
98
- 'export.copy': 'Kopier',
99
- 'export.copied': 'Kopiert',
100
- 'action.download': 'Last ned',
101
- 'export.meta': '{kb} KB · tabeller + inline-stiler · Outlook-sikre bredder',
102
- 'modal.rawHtmlTitle': ' HTML, direkte forhåndsvisning',
103
- 'code.statusEdited': 'Kodevisning redigertforhåndsvisning live, ikke brukt ennå',
104
- 'code.statusSynced': 'Kodevisning synkronisert med lerretet',
105
- 'action.reload': 'Last inn nytt',
106
- 'action.reloadHint': 'Last inn kilden nytt fra lerretet',
107
- 'action.applyToCanvas': 'Bruk lerretet',
108
- 'action.applyToCanvasHint': 'Tolk kilden nytt til redigerbare rader',
109
- 'action.closeWithoutApplyingHint': 'Lukk uten å bruke',
110
- 'code.source': 'Kilde',
111
- 'code.livePreview': 'Direkte forhåndsvisning',
112
- 'code.liveHtmlPreviewTitle': 'Direkte HTML-forhåndsvisning',
113
- 'code.applyNote':
114
- 'Bruk tolker hver tabellrad øverste nivå til en lerretsrad du fortsatt kan velge, omorganisere og slette håndskrevet kode overlever prosessen uendret.',
115
- 'code.meta': '{kb} KB · {lines} linjer',
116
- 'toast.sourceReloaded': 'Kilden lastet inn på nytt fra lerretet',
117
- 'toast.sourceAppliedOne': 'Kilde brukt — 1 rad på lerretet',
118
- 'toast.sourceAppliedMany': 'Kilde brukt — {rows} rader på lerretet',
119
- 'toast.parseError': 'Kunne ikke tolke den HTML-en',
120
- 'modal.copyAssist': 'Tekstassistent',
121
- 'modal.draftCopyTitle': 'Skriv tekst for denne kampanjen',
122
- 'ai.goal': 'Mål',
123
- 'ai.tone': 'Tone',
124
- 'ai.briefLabel': 'Hva handler denne e-posten om?',
125
- 'ai.briefPlaceholder': 'f.eks. Høstkolleksjon, 15% for abonnenter, fri frakt over 1500 kr',
126
- 'ai.generate': 'Generer tekst',
127
- 'ai.writing': 'Skriver…',
128
- 'ai.kindHeadline': 'Overskrift',
129
- 'ai.kindBody': 'Brødtekst',
130
- 'ai.kindButton': 'Knappetekst',
131
- 'ai.actionInsertHeading': 'Sett inn som overskrift',
132
- 'ai.actionInsertText': 'Sett inn som tekstblokk',
133
- 'ai.actionInsertButton': 'Sett inn som knapp',
134
- 'toast.headingAdded': 'Overskrift lagt til',
135
- 'toast.textBlockAdded': 'Tekstblokk lagt til',
136
- 'toast.buttonAdded': 'Knapp lagt til',
137
- 'preview.kickerMobile': 'Forhåndsvisningmobil 375px',
138
- 'preview.kickerDark': 'Forhåndsvisning mørk innboks',
139
- 'preview.kickerDesktop': 'Forhåndsvisning — datamaskin {width}px',
140
- 'action.close': 'Lukk',
141
- 'toast.duplicated': 'Duplisert',
142
- 'toast.fileUploadedOne': '1 fil lastet opp',
143
- 'toast.fileUploadedMany': '{count} filer lastet opp',
144
- 'toast.imageReplaced': 'Bilde erstattet',
145
- 'toast.imageAdded': 'Bilde lagt til lerretet',
146
- 'toast.htmlCopied': 'HTML kopiert til utklippstavlen',
147
- 'toast.templateLoaded': '{name} lastet inn',
148
- 'toast.snippetDefaultLabel': 'Utdrag',
149
- 'toast.snippetInserted': '{name} satt inn',
150
- 'toast.snippetCopied': '{name} kopiert — velg en tekstblokk for å sette den inn',
151
- };
152
-
1
+ /** Norwegian Bokmål (Norsk bokmål) — `nb`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const NB = {
3
+ 'action.undoHint': 'Angre — ⌘Z',
4
+ 'action.redoHint': 'Gjør om — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Mørk',
6
+ 'action.chromeToLight': 'Lys',
7
+ 'action.chromeHint': 'Redigeringstema lys / mørk',
8
+ 'action.chromeHintToDark': 'Mørk modus',
9
+ 'action.chromeHintToLight': 'Lys modus',
10
+ 'action.aiDraft': 'Utkast',
11
+ 'action.aiDraftHint': 'Skriv innholdet i e-posten med KI',
12
+ 'action.code': 'Kode',
13
+ 'action.codeHint': 'Rediger rå HTML med direkte forhåndsvisning',
14
+ 'action.preview': 'Forhåndsvisning',
15
+ 'action.previewHint': 'Forhåndsvis e-posten',
16
+ 'action.export': 'Eksporter',
17
+ 'action.exportHint': 'Eksporter e-posten din',
18
+ 'device.desktop': 'Datamaskin',
19
+ 'device.desktopHint': 'Bredde for datamaskin',
20
+ 'device.mobile': 'Mobil',
21
+ 'device.mobileHint': 'Bredde for mobil',
22
+ 'status.autosaveOn': 'automatisk lagring ',
23
+ 'status.saved': 'lagret {time}',
24
+ 'status.saveFailed': 'ikke lagret — lagringsplassen er full',
25
+ 'canvas.meta': '{rows} rader · {blocks} blokker · {width}px',
26
+ 'tab.design': 'Stil',
27
+ 'tab.designHint': 'Formater utvalget',
28
+ 'tab.blocks': 'Blokker',
29
+ 'tab.blocksHint': 'Innholdsblokker og variabler',
30
+ 'tab.rows': 'Seksjoner',
31
+ 'tab.rowsHint': 'Seksjonslayouter og lerretsmodell',
32
+ 'tab.files': 'Filer',
33
+ 'tab.filesHint': 'Ressursbibliotek',
34
+ 'tab.layers': 'Struktur',
35
+ 'tab.layersHint': 'Dokumentstruktur',
36
+ 'tab.settings': 'Innstillinger',
37
+ 'tab.settingsHint': 'E-postinnstillinger',
38
+ 'tab.data': 'Var.',
39
+ 'tab.dataHint': 'Variabler levert av koden din',
40
+ 'inspector.blockProperties': 'Blokkegenskaper',
41
+ 'inspector.sectionProperties': 'Seksjonsegenskaper',
42
+ 'inspector.title': 'Inspektør',
43
+ 'inspector.sectionLabel': 'Seksjon',
44
+ 'inspector.nothingSelected': 'Ingenting valgt',
45
+ 'action.duplicateHint': 'Dupliser — ⌘D',
46
+ 'action.deleteHint': 'Slett ',
47
+ 'inspector.emptyBody':
48
+ 'Velg en rad eller en blokk på lerretet for å formatere den her. Dra blokker fra fanen <strong style="color: var(--ed-text); font-weight: 600;">Blokker</strong>; dobbeltklikk tekst for å redigere direkte.',
49
+ 'inspector.shortcuts': 'Snarveier',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z angre, gjør om',
51
+ 'shortcut.duplicate': '⌘Ddupliser utvalg',
52
+ 'shortcut.delete': 'slett utvalg',
53
+ 'shortcut.export': '⌘E eksporter HTML',
54
+ 'shortcut.escape': 'ESC — fjern utvalg, lukk',
55
+ 'blocks.dragHint': 'Dra til lerretet',
56
+ 'blocks.count': '{count} blokker',
57
+ 'rows.sectionLayouts': 'Seksjonslayouter',
58
+ 'rows.customMarkup': 'Egendefinert kode',
59
+ 'rows.htmlRowHint': 'Dra for å sette inn, eller klikk for å legge til — en fullbredde-rad du fyller med rå HTML',
60
+ 'rows.rawHtmlSection': 'Rå HTML-seksjon',
61
+ 'rows.rawHtmlDesc': 'Fullbredde-seksjon, din egen kode, fortsatt drabar',
62
+ 'rows.canvasModel': 'Lerretsmodell',
63
+ 'rows.modeRowBased': 'Radbasert',
64
+ 'rows.modeFreeStack': 'Fri stabel',
65
+ 'rows.hintRows':
66
+ 'Seksjonsbasert: slipp en layout først, deretter blokker i kolonnene hver seksjon har egen bakgrunn, kant, flex- eller rutenettinnstillinger.',
67
+ 'rows.hintStack': 'Fri stabel: uten layouter — hver blokk du slipper blir sin egen fullbredde-seksjon, stablet i rekkefølge.',
68
+ 'files.libraryCount': 'Bibliotek {count} filer',
69
+ 'files.openManager': 'Åpne filbehandling',
70
+ 'files.dragToCanvas': 'Dra en hvilken som helst fil direkte til lerretet for å plassere den som en bildeblokk.',
71
+ 'layers.structure': 'Struktur',
72
+ 'layers.sectionSingle': 'Seksjon',
73
+ 'layers.sectionMulti': 'Seksjon · {count} kol.',
74
+ 'layers.column': 'Kolonne {index}',
75
+ 'layers.blockCount': '{count} bl.',
76
+ 'vars.title': 'Variabler',
77
+ 'vars.fromCode': '{count} fra koden din',
78
+ 'vars.declaredNote': 'Erklært av applikasjonen din lerretet viser alltid tokenet, aldri en verdi.',
79
+ 'vars.filterPlaceholder': 'Filtrer variabler…',
80
+ 'vars.insertHint': 'Klikk for å sette inn i valgt tekst, overskrift eller knapp',
81
+ 'vars.insert': 'sett inn',
82
+ 'vars.noMatch': 'Ingen variabel samsvarer med dette filteret.',
83
+ 'vars.noneDeclared': 'Applikasjonen din har ennå ikke erklært noen variabler.',
84
+ 'vars.rteHint': 'Når du redigerer tekst kan du også velge en variabel direkte fra rullegardinmenyen i den innebygde verktøylinjen.',
85
+ 'modal.fileManager': 'Filbehandling',
86
+ 'modal.assetsTitle': 'Ressurser',
87
+ 'modal.replaceImage': 'Erstatt bilde',
88
+ 'library.searchPlaceholder': 'Søk i filer…',
89
+ 'action.upload': 'Last opp',
90
+ 'library.clickToPlace': 'Klikk en fil for å plassere den · eller dra en fil til lerretet',
91
+ 'library.clickToReplace': 'Klikk på en fil for å erstatte det valgte bildet',
92
+ 'library.storageLabel': '{count} filer · {size}',
93
+ 'library.folders': 'Mapper',
94
+ 'library.dropHint': 'Slipp bildefiler her for å laste opp — eller bruk Last opp-knappen.',
95
+ 'library.deleteFileHint': 'Slett fil',
96
+ 'library.del': 'SLETT',
97
+ 'toast.assetDeleted': '{name} slettet',
98
+ 'library.allFiles': 'Alle filer',
99
+ 'library.loadMore': 'Last inn flere',
100
+ 'library.empty': 'Ingen filer her ennå.',
101
+ 'storage.loading': 'Laster filer…',
102
+ 'storage.uploading': 'Laster opp {count}…',
103
+ 'storage.errLoadFailed': 'Filbiblioteket kunne ikke lastes {reason}',
104
+ 'storage.errNoLimits': 'Opplasting er slått av: denne appen har ikke satt noen opplastingsgrenser.',
105
+ 'storage.errNoAccept': 'Opplasting er slått av: ingen filformater er tillatt.',
106
+ 'storage.errNoMaxBytes': 'Opplasting er slått av: ingen maksimal filstørrelse er satt.',
107
+ 'storage.errTooLarge': '{name} er {size} — grensen er {max}.',
108
+ 'storage.errFormat': '{name} er en {type}-fil, som ikke er tillatt her.',
109
+ 'storage.errSvg': '{name} er en SVG, som denne appen ikke godtar.',
110
+ 'storage.errDimensions': '{name} er {w}×{ht}px — grensen er {maxW}×{maxH}px.',
111
+ 'storage.errTooMany': 'Bare {max} filer kan lastes opp om gangen.',
112
+ 'storage.errUnreadable': '{name} er ikke et lesbart bilde.',
113
+ 'storage.errUploadFailed': '{name} kunne ikke lastes opp — {reason}',
114
+ 'storage.errDeleteFailed': '{name} kunne ikke slettes{reason}',
115
+ 'modal.export': 'Eksporter',
116
+ 'modal.exportTitle': 'Tabellbasert e-post-HTML',
117
+ 'export.copy': 'Kopier',
118
+ 'export.copied': 'Kopiert',
119
+ 'action.download': 'Last ned',
120
+ 'export.meta': '{kb} KB · tabeller + inline-stiler · Outlook-sikre bredder',
121
+ 'modal.rawHtmlTitle': ' HTML, direkte forhåndsvisning',
122
+ 'code.statusEdited': 'Kodevisning — redigert — forhåndsvisning live, ikke brukt ennå',
123
+ 'code.statusSynced': 'Kodevisning — synkronisert med lerretet',
124
+ 'action.reload': 'Last inn nytt',
125
+ 'action.reloadHint': 'Last inn kilden nytt fra lerretet',
126
+ 'action.applyToCanvas': 'Bruk på lerretet',
127
+ 'action.applyToCanvasHint': 'Tolk kilden på nytt til redigerbare rader',
128
+ 'action.closeWithoutApplyingHint': 'Lukk uten å bruke',
129
+ 'code.source': 'Kilde',
130
+ 'code.livePreview': 'Direkte forhåndsvisning',
131
+ 'code.liveHtmlPreviewTitle': 'Direkte HTML-forhåndsvisning',
132
+ 'code.applyNote':
133
+ 'Bruk tolker hver tabellrad på øverste nivå til en lerretsrad du fortsatt kan velge, omorganisere og slette — håndskrevet kode overlever prosessen uendret.',
134
+ 'code.meta': '{kb} KB · {lines} linjer',
135
+ 'toast.sourceReloaded': 'Kilden lastet inn på nytt fra lerretet',
136
+ 'toast.sourceAppliedOne': 'Kilde brukt — 1 rad på lerretet',
137
+ 'toast.sourceAppliedMany': 'Kilde brukt {rows} rader på lerretet',
138
+ 'toast.parseError': 'Kunne ikke tolke den HTML-en',
139
+ 'modal.aiDraft': 'KI-skriveassistent',
140
+ 'modal.aiDraftTitle': 'Skriv e-posten din med KI',
141
+ 'ai.disclosure': 'KI lager forslag ut fra briefen din. Se gjennom og rediger resultatet før du sender.',
142
+ 'ai.goal': 'Mål',
143
+ 'ai.tone': 'Tone',
144
+ 'ai.briefLabel': 'Hva handler denne e-posten om?',
145
+ 'ai.briefPlaceholder': 'f.eks. Høstkolleksjon, 15% for abonnenter, fri frakt over 1500 kr',
146
+ 'ai.generate': 'Generer tekst',
147
+ 'ai.writing': 'Skriver…',
148
+ 'ai.kindHeadline': 'Overskrift',
149
+ 'ai.kindBody': 'Brødtekst',
150
+ 'ai.kindButton': 'Knappetekst',
151
+ 'ai.actionInsertHeading': 'Sett inn som overskrift',
152
+ 'ai.actionInsertText': 'Sett inn som tekstblokk',
153
+ 'ai.actionInsertButton': 'Sett inn som knapp',
154
+ 'toast.headingAdded': 'Overskrift lagt til',
155
+ 'toast.textBlockAdded': 'Tekstblokk lagt til',
156
+ 'toast.buttonAdded': 'Knapp lagt til',
157
+ 'preview.kickerMobile': 'Forhåndsvisning — mobil 375px',
158
+ 'preview.kickerDesktop': 'Forhåndsvisning — datamaskin {width}px',
159
+ 'action.close': 'Lukk',
160
+ 'toast.duplicated': 'Duplisert',
161
+ 'toast.fileUploadedOne': '1 fil lastet opp',
162
+ 'toast.fileUploadedMany': '{count} filer lastet opp',
163
+ 'toast.imageReplaced': 'Bilde erstattet',
164
+ 'toast.imageAdded': 'Bilde lagt til på lerretet',
165
+ 'toast.htmlCopied': 'HTML kopiert til utklippstavlen',
166
+ 'toast.templateLoaded': '{name} lastet inn',
167
+ 'toast.snippetDefaultLabel': 'Utdrag',
168
+ 'toast.snippetInserted': '{name} satt inn',
169
+ 'toast.snippetCopied': '{name} kopiert — velg en tekstblokk for å sette den inn',
170
+ 'rte.textStyle': 'Tekststil',
171
+ 'rte.mergeTags': 'Flettefelt',
172
+ 'rte.noMergeTags': 'Ingen flettefelt tilgjengelig',
173
+ 'rte.textColor': 'Tekstfarge',
174
+ 'rte.highlightColor': 'Uthevingsfarge',
175
+ 'rte.removeHighlight': 'Fjern utheving',
176
+ 'rte.clearFormatting': 'Fjern formatering',
177
+ 'action.downloadPng': 'Last ned PNG',
178
+ 'action.screenshot': 'Skjermbilde',
179
+ 'action.screenshotHint': 'Se hele malen som et bilde, og last det ned',
180
+ 'toast.pngSaved': 'Skjermbilde lastet ned',
181
+ 'toast.pngFailed': 'Skjermbildet mislyktes — et eksternt bilde kunne ikke lastes',
182
+ 'toast.pngCopied': 'Skjermbilde kopiert til utklippstavlen',
183
+ 'toast.pngCopyFailed': 'Denne nettleseren godtok ikke et bilde på utklippstavlen',
184
+ 'story.kicker': 'Skjermbilde',
185
+ 'story.rendering': 'Lager skjermbildet',
186
+ 'story.renderingHint': 'Hver blokk tegnes i 2× — på en lang mal tar det et øyeblikk.',
187
+ 'story.failed': 'Skjermbildet mislyktes',
188
+ 'story.failedHint': 'Et bilde i malen kunne ikke lastes for opptaket.',
189
+ 'story.retry': 'Prøv igjen',
190
+ 'story.play': 'Spill av',
191
+ 'story.pause': 'Pause',
192
+ 'story.replay': 'Spill av igjen',
193
+ 'story.copy': 'Kopier',
194
+ 'story.meta': '{w}×{h} · skjerm {i} av {n}',
195
+ 'footer.poweredBy': 'Drevet av SELISE Blocks © 2026',
196
+ };