@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
- /** 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 på ø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åndsvisning mobil 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 på 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.errNoMaxBytes': 'Opplasting er slått av: ingen maksimal filstørrelse er satt.',
106
+ 'storage.errTooLarge': '{name} er {size} grensen er {max}.',
107
+ 'storage.errFormat': '{name} er en {type}-fil, som ikke er tillatt her.',
108
+ 'storage.errSvg': '{name} er en SVG, som denne appen ikke godtar.',
109
+ 'storage.errDimensions': '{name} er {w}×{ht}px — grensen er {maxW}×{maxH}px.',
110
+ 'storage.errTooMany': 'Bare {max} filer kan lastes opp om gangen.',
111
+ 'storage.errUnreadable': '{name} er ikke et lesbart bilde.',
112
+ 'storage.errUploadFailed': '{name} kunne ikke lastes opp — {reason}',
113
+ 'storage.errDeleteFailed': '{name} kunne ikke slettes — {reason}',
114
+ 'modal.export': 'Eksporter',
115
+ 'modal.exportTitle': 'Tabellbasert e-post-HTML',
116
+ 'export.copy': 'Kopier',
117
+ 'export.copied': 'Kopiert',
118
+ 'action.download': 'Last ned',
119
+ 'export.meta': '{kb} KB · tabeller + inline-stiler · Outlook-sikre bredder',
120
+ 'modal.rawHtmlTitle': 'Rå HTML, direkte forhåndsvisning',
121
+ 'code.statusEdited': 'Kodevisning redigert forhåndsvisning live, ikke brukt ennå',
122
+ 'code.statusSynced': 'Kodevisning — synkronisert med lerretet',
123
+ 'action.reload': 'Last inn på nytt',
124
+ 'action.reloadHint': 'Last inn kilden nytt fra lerretet',
125
+ 'action.applyToCanvas': 'Bruk lerretet',
126
+ 'action.applyToCanvasHint': 'Tolk kilden på nytt til redigerbare rader',
127
+ 'action.closeWithoutApplyingHint': 'Lukk uten å bruke',
128
+ 'code.source': 'Kilde',
129
+ 'code.livePreview': 'Direkte forhåndsvisning',
130
+ 'code.liveHtmlPreviewTitle': 'Direkte HTML-forhåndsvisning',
131
+ 'code.applyNote':
132
+ 'Bruk tolker hver tabellrad på øverste nivå til en lerretsrad du fortsatt kan velge, omorganisere og slette — håndskrevet kode overlever prosessen uendret.',
133
+ 'code.meta': '{kb} KB · {lines} linjer',
134
+ 'toast.sourceReloaded': 'Kilden lastet inn på nytt fra lerretet',
135
+ 'toast.sourceAppliedOne': 'Kilde brukt — 1 rad på lerretet',
136
+ 'toast.sourceAppliedMany': 'Kilde brukt — {rows} rader på lerretet',
137
+ 'toast.parseError': 'Kunne ikke tolke den HTML-en',
138
+ 'modal.aiDraft': 'KI-skriveassistent',
139
+ 'modal.aiDraftTitle': 'Skriv e-posten din med KI',
140
+ 'ai.disclosure': 'KI lager forslag ut fra briefen din. Se gjennom og rediger resultatet før du sender.',
141
+ 'ai.goal': 'Mål',
142
+ 'ai.tone': 'Tone',
143
+ 'ai.briefLabel': 'Hva handler denne e-posten om?',
144
+ 'ai.briefPlaceholder': 'f.eks. Høstkolleksjon, 15% for abonnenter, fri frakt over 1500 kr',
145
+ 'ai.generate': 'Generer tekst',
146
+ 'ai.writing': 'Skriver…',
147
+ 'ai.kindHeadline': 'Overskrift',
148
+ 'ai.kindBody': 'Brødtekst',
149
+ 'ai.kindButton': 'Knappetekst',
150
+ 'ai.actionInsertHeading': 'Sett inn som overskrift',
151
+ 'ai.actionInsertText': 'Sett inn som tekstblokk',
152
+ 'ai.actionInsertButton': 'Sett inn som knapp',
153
+ 'toast.headingAdded': 'Overskrift lagt til',
154
+ 'toast.textBlockAdded': 'Tekstblokk lagt til',
155
+ 'toast.buttonAdded': 'Knapp lagt til',
156
+ 'preview.kickerMobile': 'Forhåndsvisning — mobil 375px',
157
+ 'preview.kickerDesktop': 'Forhåndsvisning — datamaskin {width}px',
158
+ 'action.close': 'Lukk',
159
+ 'toast.duplicated': 'Duplisert',
160
+ 'toast.fileUploadedOne': '1 fil lastet opp',
161
+ 'toast.fileUploadedMany': '{count} filer lastet opp',
162
+ 'toast.imageReplaced': 'Bilde erstattet',
163
+ 'toast.imageAdded': 'Bilde lagt til på lerretet',
164
+ 'toast.htmlCopied': 'HTML kopiert til utklippstavlen',
165
+ 'toast.templateLoaded': '{name} lastet inn',
166
+ 'toast.snippetDefaultLabel': 'Utdrag',
167
+ 'toast.snippetInserted': '{name} satt inn',
168
+ 'toast.snippetCopied': '{name} kopiert — velg en tekstblokk for å sette den inn',
169
+ 'rte.textStyle': 'Tekststil',
170
+ 'rte.mergeTags': 'Flettefelt',
171
+ 'rte.noMergeTags': 'Ingen flettefelt tilgjengelig',
172
+ 'rte.textColor': 'Tekstfarge',
173
+ 'rte.highlightColor': 'Uthevingsfarge',
174
+ 'rte.removeHighlight': 'Fjern utheving',
175
+ 'rte.clearFormatting': 'Fjern formatering',
176
+ 'action.downloadPng': 'Last ned PNG',
177
+ 'action.screenshot': 'Skjermbilde',
178
+ 'action.screenshotHint': 'Se hele malen som et bilde, og last det ned',
179
+ 'toast.pngSaved': 'Skjermbilde lastet ned',
180
+ 'toast.pngFailed': 'Skjermbildet mislyktes — et eksternt bilde kunne ikke lastes',
181
+ 'toast.pngCopied': 'Skjermbilde kopiert til utklippstavlen',
182
+ 'toast.pngCopyFailed': 'Denne nettleseren godtok ikke et bilde på utklippstavlen',
183
+ 'story.kicker': 'Skjermbilde',
184
+ 'story.rendering': 'Lager skjermbildet',
185
+ 'story.renderingHint': 'Hver blokk tegnes i 2× — på en lang mal tar det et øyeblikk.',
186
+ 'story.failed': 'Skjermbildet mislyktes',
187
+ 'story.failedHint': 'Et bilde i malen kunne ikke lastes for opptaket.',
188
+ 'story.retry': 'Prøv igjen',
189
+ 'story.play': 'Spill av',
190
+ 'story.pause': 'Pause',
191
+ 'story.replay': 'Spill av igjen',
192
+ 'story.copy': 'Kopier',
193
+ 'story.meta': '{w}×{h} · skjerm {i} av {n}',
194
+ 'footer.poweredBy': 'Drevet av SELISE Blocks © 2026',
195
+ };