@seliseblocks/mailcraft 0.1.1 → 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 +238 -10
  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 +234 -22
  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
- /** Swedish (Svenska) — `sv`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const SV = {
3
- 'action.undoHint': 'Ångra — ⌘Z',
4
- 'action.redoHint': 'Gör om — ⌘⇧Z',
5
- 'action.chromeToDark': 'Mörkt',
6
- 'action.chromeToLight': 'Ljust',
7
- 'action.chromeHint': 'Redigerartema ljust / mörkt',
8
- 'action.aiCopy': 'Text',
9
- 'action.aiCopyHint': 'Skriv text med AI',
10
- 'action.code': 'Kod',
11
- 'action.codeHint': 'Redigera HTML med direktförhandsgranskning',
12
- 'action.preview': 'Förhandsgranskning',
13
- 'action.export': 'Exportera',
14
- 'device.desktop': 'Dator',
15
- 'device.desktopHint': 'Datorbredd',
16
- 'device.mobile': 'Mobil',
17
- 'device.mobileHint': 'Mobilbredd',
18
- 'device.dark': 'Mörkt',
19
- 'device.darkHint': 'Mörkt läge för inkorgen',
20
- 'status.autosaveOn': 'automatisk sparning på',
21
- 'status.saved': 'sparat {time}',
22
- 'status.saveFailed': 'sparades inte — lagringen är full',
23
- 'canvas.meta': '{rows} rader · {blocks} block · {width}px',
24
- 'tab.design': 'Stil',
25
- 'tab.designHint': 'Stila markeringen',
26
- 'tab.blocks': 'Block',
27
- 'tab.blocksHint': 'Innehållsblock och variabler',
28
- 'tab.rows': 'Sektioner',
29
- 'tab.rowsHint': 'Sektionslayouter och canvasmodell',
30
- 'tab.files': 'Filer',
31
- 'tab.filesHint': 'Resursbibliotek',
32
- 'tab.layers': 'Struktur',
33
- 'tab.layersHint': 'Dokumentstruktur',
34
- 'tab.theme': 'Tema',
35
- 'tab.themeHint': 'Globala stilar',
36
- 'tab.data': 'Var.',
37
- 'tab.dataHint': 'Variabler som tillhandahålls av din kod',
38
- 'inspector.blockProperties': 'Blockegenskaper',
39
- 'inspector.sectionProperties': 'Sektionsegenskaper',
40
- 'inspector.title': 'Inspektör',
41
- 'inspector.sectionLabel': 'Sektion',
42
- 'inspector.nothingSelected': 'Inget markerat',
43
- 'action.duplicateHint': 'Duplicera — ⌘D',
44
- 'action.deleteHint': 'Ta bort — ⌫',
45
- 'inspector.emptyBody':
46
- 'Välj en rad eller ett block på canvasen för att stila det här. Dra block från fliken <strong style="color: var(--ed-text); font-weight: 600;">Block</strong>; dubbelklicka på valfri text för att redigera direkt.',
47
- 'inspector.shortcuts': 'Genvägar',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z ångra, gör om',
49
- 'shortcut.duplicate': '⌘D — duplicera markering',
50
- 'shortcut.delete': 'ta bort markering',
51
- 'shortcut.export': '⌘Eexportera HTML',
52
- 'shortcut.escape': 'ESCavmarkera, stäng',
53
- 'blocks.dragHint': 'Dra till canvasen',
54
- 'blocks.count': '{count} block',
55
- 'rows.sectionLayouts': 'Sektionslayouter',
56
- 'rows.customMarkup': 'Anpassad kod',
57
- 'rows.htmlRowHint': 'Dra för att infoga, eller klicka för att lägga till — en rad i full bredd som du fyller med rå HTML',
58
- 'rows.rawHtmlSection': ' HTML-sektion',
59
- 'rows.rawHtmlDesc': 'Sektion i full bredd, din egen kod, fortfarande dragbar',
60
- 'rows.canvasModel': 'Canvasmodell',
61
- 'rows.modeRowBased': 'Radbaserad',
62
- 'rows.modeFreeStack': 'Fri stapel',
63
- 'rows.hintRows':
64
- 'Sektionsbaserad: släpp en layout först, sedan block i dess kolumner — varje sektion har egen bakgrund, kant, flex- eller rutnätsinställningar.',
65
- 'rows.hintStack': 'Fri stapel: utan layouter — varje block du släpper blir sin egen sektion i full bredd, staplad i ordning.',
66
- 'files.libraryCount': 'Bibliotek{count} filer',
67
- 'files.openManager': 'Öppna filhanteraren',
68
- 'files.dragToCanvas': 'Dra valfri fil direkt till canvasen för att placera den som ett bildblock.',
69
- 'layers.structure': 'Struktur',
70
- 'layers.sectionSingle': 'Sektion',
71
- 'layers.sectionMulti': 'Sektion · {count} kol.',
72
- 'layers.blockCount': '{count} block',
73
- 'theme.globalStyles': 'Globala stilar',
74
- 'vars.title': 'Variabler',
75
- 'vars.fromCode': '{count} från din kod',
76
- 'vars.declaredNote': 'Deklarerade av din applikation — canvasen visar alltid token, aldrig ett värde.',
77
- 'vars.filterPlaceholder': 'Filtrera variabler…',
78
- 'vars.insertHint': 'Klicka för att infoga i markerad text, rubrik eller knapp',
79
- 'vars.insert': 'infoga',
80
- 'vars.noMatch': 'Ingen variabel matchar det filtret.',
81
- 'vars.noneDeclared': 'Din applikation har ännu inte deklarerat några variabler.',
82
- 'vars.rteHint': 'När du redigerar text kan du också välja en variabel direkt från rullgardinsmenyn i den inbäddade verktygsfältet.',
83
- 'modal.fileManager': 'Filhanterare',
84
- 'modal.assetsTitle': 'Resurser',
85
- 'modal.replaceImage': 'Ersätt bild',
86
- 'library.searchPlaceholder': 'Sök filer…',
87
- 'action.upload': 'Ladda upp',
88
- 'library.clickToPlace': 'Klicka på en fil för att placera den · eller dra en fil till canvasen',
89
- 'library.clickToReplace': 'Klicka på en fil för att ersätta den markerade bilden',
90
- 'library.storageLabel': '{count} filer · {size}',
91
- 'library.folders': 'Mappar',
92
- 'library.dropHint': 'Släpp bildfiler här för att ladda upp — eller använd knappen Ladda upp.',
93
- 'library.deleteFileHint': 'Ta bort fil',
94
- 'library.del': 'RADERA',
95
- 'toast.assetDeleted': '{name} borttagen',
96
- 'modal.export': 'Exportera',
97
- 'modal.exportTitle': 'Tabellbaserad e-post-HTML',
98
- 'export.copy': 'Kopiera',
99
- 'export.copied': 'Kopierat',
100
- 'action.download': 'Ladda ner',
101
- 'export.meta': '{kb} KB · tabeller + inline-stilar · Outlook-säkra bredder',
102
- 'modal.rawHtmlTitle': ' HTML, direktförhandsgranskning',
103
- 'code.statusEdited': 'Kodvy redigeradförhandsgranskning live, inte tillämpad ännu',
104
- 'code.statusSynced': 'Kodvy synkroniserad med canvasen',
105
- 'action.reload': 'Läs om',
106
- 'action.reloadHint': 'Läs om källan från canvasen',
107
- 'action.applyToCanvas': 'Tillämpa canvas',
108
- 'action.applyToCanvasHint': 'Tolka källan tillbaka till redigerbara rader',
109
- 'action.closeWithoutApplyingHint': 'Stäng utan att tillämpa',
110
- 'code.source': 'Källa',
111
- 'code.livePreview': 'Direktförhandsgranskning',
112
- 'code.liveHtmlPreviewTitle': 'Direkt HTML-förhandsgranskning',
113
- 'code.applyNote':
114
- 'Tillämpa tolkar varje tabellrad toppnivå till en canvasrad som du fortfarande kan markera, ordna om och ta bort — handskriven kod överlever processen oförändrad.',
115
- 'code.meta': '{kb} KB · {lines} rader',
116
- 'toast.sourceReloaded': 'Källan omladdad från canvasen',
117
- 'toast.sourceAppliedOne': 'Källa tillämpad — 1 rad på canvasen',
118
- 'toast.sourceAppliedMany': 'Källa tillämpad — {rows} rader på canvasen',
119
- 'toast.parseError': 'Kunde inte tolka den HTML-koden',
120
- 'modal.copyAssist': 'Textassistent',
121
- 'modal.draftCopyTitle': 'Skriv text för denna kampanj',
122
- 'ai.goal': 'Mål',
123
- 'ai.tone': 'Ton',
124
- 'ai.briefLabel': 'Vad handlar det här mejlet om?',
125
- 'ai.briefPlaceholder': 't.ex. Höstkollektion, 15% för prenumeranter, fri frakt över 1500 kr',
126
- 'ai.generate': 'Generera text',
127
- 'ai.writing': 'Skriver…',
128
- 'ai.kindHeadline': 'Rubrik',
129
- 'ai.kindBody': 'Brödtext',
130
- 'ai.kindButton': 'Knapptext',
131
- 'ai.actionInsertHeading': 'Infoga som rubrik',
132
- 'ai.actionInsertText': 'Infoga som textblock',
133
- 'ai.actionInsertButton': 'Infoga som knapp',
134
- 'toast.headingAdded': 'Rubrik tillagd',
135
- 'toast.textBlockAdded': 'Textblock tillagt',
136
- 'toast.buttonAdded': 'Knapp tillagd',
137
- 'preview.kickerMobile': 'Förhandsgranskningmobil 375px',
138
- 'preview.kickerDark': 'Förhandsgranskning mörk inkorg',
139
- 'preview.kickerDesktop': 'Förhandsgranskning — dator {width}px',
140
- 'action.close': 'Stäng',
141
- 'toast.duplicated': 'Duplicerad',
142
- 'toast.fileUploadedOne': '1 fil uppladdad',
143
- 'toast.fileUploadedMany': '{count} filer uppladdade',
144
- 'toast.imageReplaced': 'Bild ersatt',
145
- 'toast.imageAdded': 'Bild tillagd canvasen',
146
- 'toast.htmlCopied': 'HTML kopierad till urklipp',
147
- 'toast.templateLoaded': '{name} inläst',
148
- 'toast.snippetDefaultLabel': 'Snutt',
149
- 'toast.snippetInserted': '{name} infogad',
150
- 'toast.snippetCopied': '{name} kopierad — markera ett textblock för att infoga den',
151
- };
152
-
1
+ /** Swedish (Svenska) — `sv`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const SV = {
3
+ 'action.undoHint': 'Ångra — ⌘Z',
4
+ 'action.redoHint': 'Gör om — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Mörkt',
6
+ 'action.chromeToLight': 'Ljust',
7
+ 'action.chromeHint': 'Redigerartema ljust / mörkt',
8
+ 'action.chromeHintToDark': 'Mörkt läge',
9
+ 'action.chromeHintToLight': 'Ljust läge',
10
+ 'action.aiDraft': 'Utkast',
11
+ 'action.aiDraftHint': 'Skriv e-postens innehåll med AI',
12
+ 'action.code': 'Kod',
13
+ 'action.codeHint': 'Redigera rå HTML med direktförhandsgranskning',
14
+ 'action.preview': 'Förhandsgranskning',
15
+ 'action.previewHint': 'Förhandsgranska e-posten',
16
+ 'action.export': 'Exportera',
17
+ 'action.exportHint': 'Exportera din e-post',
18
+ 'device.desktop': 'Dator',
19
+ 'device.desktopHint': 'Datorbredd',
20
+ 'device.mobile': 'Mobil',
21
+ 'device.mobileHint': 'Mobilbredd',
22
+ 'status.autosaveOn': 'automatisk sparning ',
23
+ 'status.saved': 'sparat {time}',
24
+ 'status.saveFailed': 'sparades inte — lagringen är full',
25
+ 'canvas.meta': '{rows} rader · {blocks} block · {width}px',
26
+ 'tab.design': 'Stil',
27
+ 'tab.designHint': 'Stila markeringen',
28
+ 'tab.blocks': 'Block',
29
+ 'tab.blocksHint': 'Innehållsblock och variabler',
30
+ 'tab.rows': 'Sektioner',
31
+ 'tab.rowsHint': 'Sektionslayouter och canvasmodell',
32
+ 'tab.files': 'Filer',
33
+ 'tab.filesHint': 'Resursbibliotek',
34
+ 'tab.layers': 'Struktur',
35
+ 'tab.layersHint': 'Dokumentstruktur',
36
+ 'tab.settings': 'Inställningar',
37
+ 'tab.settingsHint': 'E-postinställningar',
38
+ 'tab.data': 'Var.',
39
+ 'tab.dataHint': 'Variabler som tillhandahålls av din kod',
40
+ 'inspector.blockProperties': 'Blockegenskaper',
41
+ 'inspector.sectionProperties': 'Sektionsegenskaper',
42
+ 'inspector.title': 'Inspektör',
43
+ 'inspector.sectionLabel': 'Sektion',
44
+ 'inspector.nothingSelected': 'Inget markerat',
45
+ 'action.duplicateHint': 'Duplicera — ⌘D',
46
+ 'action.deleteHint': 'Ta bort ',
47
+ 'inspector.emptyBody':
48
+ 'Välj en rad eller ett block på canvasen för att stila det här. Dra block från fliken <strong style="color: var(--ed-text); font-weight: 600;">Block</strong>; dubbelklicka valfri text för att redigera direkt.',
49
+ 'inspector.shortcuts': 'Genvägar',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z ångra, gör om',
51
+ 'shortcut.duplicate': '⌘Dduplicera markering',
52
+ 'shortcut.delete': 'ta bort markering',
53
+ 'shortcut.export': '⌘E exportera HTML',
54
+ 'shortcut.escape': 'ESC — avmarkera, stäng',
55
+ 'blocks.dragHint': 'Dra till canvasen',
56
+ 'blocks.count': '{count} block',
57
+ 'rows.sectionLayouts': 'Sektionslayouter',
58
+ 'rows.customMarkup': 'Anpassad kod',
59
+ 'rows.htmlRowHint': 'Dra för att infoga, eller klicka för att lägga till — en rad i full bredd som du fyller med rå HTML',
60
+ 'rows.rawHtmlSection': 'Rå HTML-sektion',
61
+ 'rows.rawHtmlDesc': 'Sektion i full bredd, din egen kod, fortfarande dragbar',
62
+ 'rows.canvasModel': 'Canvasmodell',
63
+ 'rows.modeRowBased': 'Radbaserad',
64
+ 'rows.modeFreeStack': 'Fri stapel',
65
+ 'rows.hintRows':
66
+ 'Sektionsbaserad: släpp en layout först, sedan block i dess kolumner varje sektion har egen bakgrund, kant, flex- eller rutnätsinställningar.',
67
+ 'rows.hintStack': 'Fri stapel: utan layouter — varje block du släpper blir sin egen sektion i full bredd, staplad i ordning.',
68
+ 'files.libraryCount': 'Bibliotek {count} filer',
69
+ 'files.openManager': 'Öppna filhanteraren',
70
+ 'files.dragToCanvas': 'Dra valfri fil direkt till canvasen för att placera den som ett bildblock.',
71
+ 'layers.structure': 'Struktur',
72
+ 'layers.sectionSingle': 'Sektion',
73
+ 'layers.sectionMulti': 'Sektion · {count} kol.',
74
+ 'layers.column': 'Kolumn {index}',
75
+ 'layers.blockCount': '{count} block',
76
+ 'vars.title': 'Variabler',
77
+ 'vars.fromCode': '{count} från din kod',
78
+ 'vars.declaredNote': 'Deklarerade av din applikation canvasen visar alltid token, aldrig ett värde.',
79
+ 'vars.filterPlaceholder': 'Filtrera variabler…',
80
+ 'vars.insertHint': 'Klicka för att infoga i markerad text, rubrik eller knapp',
81
+ 'vars.insert': 'infoga',
82
+ 'vars.noMatch': 'Ingen variabel matchar det filtret.',
83
+ 'vars.noneDeclared': 'Din applikation har ännu inte deklarerat några variabler.',
84
+ 'vars.rteHint': 'När du redigerar text kan du också välja en variabel direkt från rullgardinsmenyn i den inbäddade verktygsfältet.',
85
+ 'modal.fileManager': 'Filhanterare',
86
+ 'modal.assetsTitle': 'Resurser',
87
+ 'modal.replaceImage': 'Ersätt bild',
88
+ 'library.searchPlaceholder': 'Sök filer…',
89
+ 'action.upload': 'Ladda upp',
90
+ 'library.clickToPlace': 'Klicka en fil för att placera den · eller dra en fil till canvasen',
91
+ 'library.clickToReplace': 'Klicka på en fil för att ersätta den markerade bilden',
92
+ 'library.storageLabel': '{count} filer · {size}',
93
+ 'library.folders': 'Mappar',
94
+ 'library.dropHint': 'Släpp bildfiler här för att ladda upp — eller använd knappen Ladda upp.',
95
+ 'library.deleteFileHint': 'Ta bort fil',
96
+ 'library.del': 'RADERA',
97
+ 'toast.assetDeleted': '{name} borttagen',
98
+ 'library.allFiles': 'Alla filer',
99
+ 'library.loadMore': 'Ladda fler',
100
+ 'library.empty': 'Det finns inga filer här ännu.',
101
+ 'storage.loading': 'Laddar filer…',
102
+ 'storage.uploading': 'Laddar upp {count}…',
103
+ 'storage.errLoadFailed': 'Filbiblioteket kunde inte laddas {reason}',
104
+ 'storage.errNoLimits': 'Uppladdning är avstängd: den här appen har inte satt några uppladdningsgränser.',
105
+ 'storage.errNoAccept': 'Uppladdning är avstängd: inga filformat har tillåtits.',
106
+ 'storage.errNoMaxBytes': 'Uppladdning är avstängd: ingen maximal filstorlek har angetts.',
107
+ 'storage.errTooLarge': '{name} är {size} — gränsen är {max}.',
108
+ 'storage.errFormat': '{name} är en {type}-fil, som inte tillåts här.',
109
+ 'storage.errSvg': '{name} är en SVG, som den här appen inte accepterar.',
110
+ 'storage.errDimensions': '{name} är {w}×{ht}px — gränsen är {maxW}×{maxH}px.',
111
+ 'storage.errTooMany': 'Bara {max} filer kan laddas upp åt gången.',
112
+ 'storage.errUnreadable': '{name} är inte en läsbar bild.',
113
+ 'storage.errUploadFailed': '{name} kunde inte laddas upp — {reason}',
114
+ 'storage.errDeleteFailed': '{name} kunde inte tas bort — {reason}',
115
+ 'modal.export': 'Exportera',
116
+ 'modal.exportTitle': 'Tabellbaserad e-post-HTML',
117
+ 'export.copy': 'Kopiera',
118
+ 'export.copied': 'Kopierat',
119
+ 'action.download': 'Ladda ner',
120
+ 'export.meta': '{kb} KB · tabeller + inline-stilar · Outlook-säkra bredder',
121
+ 'modal.rawHtmlTitle': ' HTML, direktförhandsgranskning',
122
+ 'code.statusEdited': 'Kodvy — redigerad — förhandsgranskning live, inte tillämpad ännu',
123
+ 'code.statusSynced': 'Kodvy — synkroniserad med canvasen',
124
+ 'action.reload': 'Läs om',
125
+ 'action.reloadHint': 'Läs om källan från canvasen',
126
+ 'action.applyToCanvas': 'Tillämpa på canvas',
127
+ 'action.applyToCanvasHint': 'Tolka källan tillbaka till redigerbara rader',
128
+ 'action.closeWithoutApplyingHint': 'Stäng utan att tillämpa',
129
+ 'code.source': 'Källa',
130
+ 'code.livePreview': 'Direktförhandsgranskning',
131
+ 'code.liveHtmlPreviewTitle': 'Direkt HTML-förhandsgranskning',
132
+ 'code.applyNote':
133
+ 'Tillämpa tolkar varje tabellrad på toppnivå till en canvasrad som du fortfarande kan markera, ordna om och ta bort — handskriven kod överlever processen oförändrad.',
134
+ 'code.meta': '{kb} KB · {lines} rader',
135
+ 'toast.sourceReloaded': 'Källan omladdad från canvasen',
136
+ 'toast.sourceAppliedOne': 'Källa tillämpad — 1 rad på canvasen',
137
+ 'toast.sourceAppliedMany': 'Källa tillämpad {rows} rader på canvasen',
138
+ 'toast.parseError': 'Kunde inte tolka den HTML-koden',
139
+ 'modal.aiDraft': 'AI-skrivassistent',
140
+ 'modal.aiDraftTitle': 'Skriv din e-post med AI',
141
+ 'ai.disclosure': 'AI skapar förslag utifrån din brief. Granska och redigera resultatet innan du skickar.',
142
+ 'ai.goal': 'Mål',
143
+ 'ai.tone': 'Ton',
144
+ 'ai.briefLabel': 'Vad handlar det här mejlet om?',
145
+ 'ai.briefPlaceholder': 't.ex. Höstkollektion, 15% för prenumeranter, fri frakt över 1500 kr',
146
+ 'ai.generate': 'Generera text',
147
+ 'ai.writing': 'Skriver…',
148
+ 'ai.kindHeadline': 'Rubrik',
149
+ 'ai.kindBody': 'Brödtext',
150
+ 'ai.kindButton': 'Knapptext',
151
+ 'ai.actionInsertHeading': 'Infoga som rubrik',
152
+ 'ai.actionInsertText': 'Infoga som textblock',
153
+ 'ai.actionInsertButton': 'Infoga som knapp',
154
+ 'toast.headingAdded': 'Rubrik tillagd',
155
+ 'toast.textBlockAdded': 'Textblock tillagt',
156
+ 'toast.buttonAdded': 'Knapp tillagd',
157
+ 'preview.kickerMobile': 'Förhandsgranskning — mobil 375px',
158
+ 'preview.kickerDesktop': 'Förhandsgranskning — dator {width}px',
159
+ 'action.close': 'Stäng',
160
+ 'toast.duplicated': 'Duplicerad',
161
+ 'toast.fileUploadedOne': '1 fil uppladdad',
162
+ 'toast.fileUploadedMany': '{count} filer uppladdade',
163
+ 'toast.imageReplaced': 'Bild ersatt',
164
+ 'toast.imageAdded': 'Bild tillagd på canvasen',
165
+ 'toast.htmlCopied': 'HTML kopierad till urklipp',
166
+ 'toast.templateLoaded': '{name} inläst',
167
+ 'toast.snippetDefaultLabel': 'Snutt',
168
+ 'toast.snippetInserted': '{name} infogad',
169
+ 'toast.snippetCopied': '{name} kopierad — markera ett textblock för att infoga den',
170
+ 'rte.textStyle': 'Textstil',
171
+ 'rte.mergeTags': 'Kopplingsfält',
172
+ 'rte.noMergeTags': 'Inga kopplingsfält tillgängliga',
173
+ 'rte.textColor': 'Textfärg',
174
+ 'rte.highlightColor': 'Överstrykningsfärg',
175
+ 'rte.removeHighlight': 'Ta bort överstrykning',
176
+ 'rte.clearFormatting': 'Rensa formatering',
177
+ 'action.downloadPng': 'Ladda ner PNG',
178
+ 'action.screenshot': 'Skärmbild',
179
+ 'action.screenshotHint': 'Se hela mallen som en bild och ladda ner den',
180
+ 'toast.pngSaved': 'Skärmbild nedladdad',
181
+ 'toast.pngFailed': 'Skärmbilden misslyckades — en extern bild kunde inte laddas',
182
+ 'toast.pngCopied': 'Skärmbild kopierad till urklipp',
183
+ 'toast.pngCopyFailed': 'Den här webbläsaren accepterade inte en bild i urklipp',
184
+ 'story.kicker': 'Skärmbild',
185
+ 'story.rendering': 'Skärmbilden skapas',
186
+ 'story.renderingHint': 'Varje block ritas i 2× — i en lång mall tar det ett ögonblick.',
187
+ 'story.failed': 'Skärmbilden misslyckades',
188
+ 'story.failedHint': 'En bild i mallen kunde inte laddas för fångsten.',
189
+ 'story.retry': 'Försök igen',
190
+ 'story.play': 'Spela upp',
191
+ 'story.pause': 'Pausa',
192
+ 'story.replay': 'Spela upp igen',
193
+ 'story.copy': 'Kopiera',
194
+ 'story.meta': '{w}×{h} · skärm {i} av {n}',
195
+ 'footer.poweredBy': 'Drivs av SELISE Blocks © 2026',
196
+ };
@@ -1,50 +1,50 @@
1
- import { EN } from './en.js';
2
- import { AR } from './ar.js';
3
- import { BG } from './bg.js';
4
- import { BN } from './bn.js';
5
- import { CA } from './ca.js';
6
- import { CS } from './cs.js';
7
- import { DA } from './da.js';
8
- import { DE } from './de.js';
9
- import { DE_CH } from './de-CH.js';
10
- import { DZ } from './dz.js';
11
- import { EL } from './el.js';
12
- import { ES } from './es.js';
13
- import { ET } from './et.js';
14
- import { FI } from './fi.js';
15
- import { FR } from './fr.js';
16
- import { HR } from './hr.js';
17
- import { HU } from './hu.js';
18
- import { IT } from './it.js';
19
- import { LT } from './lt.js';
20
- import { LV } from './lv.js';
21
- import { NB } from './nb.js';
22
- import { NL } from './nl.js';
23
- import { PL } from './pl.js';
24
- import { PT } from './pt.js';
25
- import { RO } from './ro.js';
26
- import { RU } from './ru.js';
27
- import { SK } from './sk.js';
28
- import { SL } from './sl.js';
29
- import { SV } from './sv.js';
30
- import { TR } from './tr.js';
31
- import { UK } from './uk.js';
32
-
33
- /**
34
- * Every shipped message table, keyed by the same tag `LOCALES` (index.js)
35
- * lists -- what lets the element resolve its `locale` attribute to a table on
36
- * its own, so a host switches language by setting one attribute instead of
37
- * importing and assigning a table by hand.
38
- *
39
- * Deliberately a separate module from index.js's metadata-only `LOCALES`:
40
- * importing this one pulls all translations in. The element accepts that
41
- * (host-driven language is worth it, and the demo bundle carries every module
42
- * anyway); a size-sensitive host that bypasses the attribute can still
43
- * deep-import a single `core/i18n/<tag>.js` and assign `.messages` itself.
44
- */
45
- export const LOCALE_TABLES = {
46
- en: EN, ar: AR, bg: BG, bn: BN, ca: CA, cs: CS, da: DA, de: DE, 'de-CH': DE_CH,
47
- dz: DZ, el: EL, es: ES, et: ET, fi: FI, fr: FR, hr: HR, hu: HU, it: IT,
48
- lt: LT, lv: LV, nb: NB, nl: NL, pl: PL, pt: PT, ro: RO, ru: RU, sk: SK,
49
- sl: SL, sv: SV, tr: TR, uk: UK,
50
- };
1
+ import { EN } from './en.js';
2
+ import { AR } from './ar.js';
3
+ import { BG } from './bg.js';
4
+ import { BN } from './bn.js';
5
+ import { CA } from './ca.js';
6
+ import { CS } from './cs.js';
7
+ import { DA } from './da.js';
8
+ import { DE } from './de.js';
9
+ import { DE_CH } from './de-CH.js';
10
+ import { DZ } from './dz.js';
11
+ import { EL } from './el.js';
12
+ import { ES } from './es.js';
13
+ import { ET } from './et.js';
14
+ import { FI } from './fi.js';
15
+ import { FR } from './fr.js';
16
+ import { HR } from './hr.js';
17
+ import { HU } from './hu.js';
18
+ import { IT } from './it.js';
19
+ import { LT } from './lt.js';
20
+ import { LV } from './lv.js';
21
+ import { NB } from './nb.js';
22
+ import { NL } from './nl.js';
23
+ import { PL } from './pl.js';
24
+ import { PT } from './pt.js';
25
+ import { RO } from './ro.js';
26
+ import { RU } from './ru.js';
27
+ import { SK } from './sk.js';
28
+ import { SL } from './sl.js';
29
+ import { SV } from './sv.js';
30
+ import { TR } from './tr.js';
31
+ import { UK } from './uk.js';
32
+
33
+ /**
34
+ * Every shipped message table, keyed by the same tag `LOCALES` (index.js)
35
+ * lists -- what lets the element resolve its `locale` attribute to a table on
36
+ * its own, so a host switches language by setting one attribute instead of
37
+ * importing and assigning a table by hand.
38
+ *
39
+ * Deliberately a separate module from index.js's metadata-only `LOCALES`:
40
+ * importing this one pulls all translations in. The element accepts that
41
+ * (host-driven language is worth it, and the demo bundle carries every module
42
+ * anyway); a size-sensitive host that bypasses the attribute can still
43
+ * deep-import a single `core/i18n/<tag>.js` and assign `.messages` itself.
44
+ */
45
+ export const LOCALE_TABLES = {
46
+ en: EN, ar: AR, bg: BG, bn: BN, ca: CA, cs: CS, da: DA, de: DE, 'de-CH': DE_CH,
47
+ dz: DZ, el: EL, es: ES, et: ET, fi: FI, fr: FR, hr: HR, hu: HU, it: IT,
48
+ lt: LT, lv: LV, nb: NB, nl: NL, pl: PL, pt: PT, ro: RO, ru: RU, sk: SK,
49
+ sl: SL, sv: SV, tr: TR, uk: UK,
50
+ };