@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
- /** Polish (Polski) — `pl`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const PL = {
3
- 'action.undoHint': 'Cofnij — ⌘Z',
4
- 'action.redoHint': 'Ponów — ⌘⇧Z',
5
- 'action.chromeToDark': 'Ciemny',
6
- 'action.chromeToLight': 'Jasny',
7
- 'action.chromeHint': 'Motyw edytora jasny / ciemny',
8
- 'action.aiCopy': 'Tekst',
9
- 'action.aiCopyHint': 'Napisz tekst przy pomocy AI',
10
- 'action.code': 'Kod',
11
- 'action.codeHint': 'Edytuj surowy HTML z podglądem na żywo',
12
- 'action.preview': 'Podgląd',
13
- 'action.export': 'Eksportuj',
14
- 'device.desktop': 'Komputer',
15
- 'device.desktopHint': 'Szerokość na komputerze',
16
- 'device.mobile': 'Telefon',
17
- 'device.mobileHint': 'Szerokość na telefonie',
18
- 'device.dark': 'Ciemny',
19
- 'device.darkHint': 'Ciemny tryb skrzynki',
20
- 'status.autosaveOn': 'automatyczny zapis włączony',
21
- 'status.saved': 'zapisano {time}',
22
- 'status.saveFailed': 'nie zapisano — brak miejsca',
23
- 'canvas.meta': '{rows} wierszy · {blocks} bloków · {width}px',
24
- 'tab.design': 'Styl',
25
- 'tab.designHint': 'Stylizuj zaznaczenie',
26
- 'tab.blocks': 'Bloki',
27
- 'tab.blocksHint': 'Bloki treści i zmienne',
28
- 'tab.rows': 'Sekcje',
29
- 'tab.rowsHint': 'Układy sekcji i model płótna',
30
- 'tab.files': 'Pliki',
31
- 'tab.filesHint': 'Biblioteka zasobów',
32
- 'tab.layers': 'Struktura',
33
- 'tab.layersHint': 'Struktura dokumentu',
34
- 'tab.theme': 'Motyw',
35
- 'tab.themeHint': 'Style globalne',
36
- 'tab.data': 'Zmien.',
37
- 'tab.dataHint': 'Zmienne dostarczone przez Twój kod',
38
- 'inspector.blockProperties': 'Właściwości bloku',
39
- 'inspector.sectionProperties': 'Właściwości sekcji',
40
- 'inspector.title': 'Inspektor',
41
- 'inspector.sectionLabel': 'Sekcja',
42
- 'inspector.nothingSelected': 'Nic nie zaznaczono',
43
- 'action.duplicateHint': 'Duplikuj — ⌘D',
44
- 'action.deleteHint': 'Usuń ',
45
- 'inspector.emptyBody':
46
- 'Wybierz wiersz lub blok na płótnie, aby go tutaj stylizować. Przeciągnij bloki z zakładki <strong style="color: var(--ed-text); font-weight: 600;">Bloki</strong>; kliknij dwukrotnie dowolny tekst, aby edytować go w miejscu.',
47
- 'inspector.shortcuts': 'Skróty',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z cofnij, ponów',
49
- 'shortcut.duplicate': '⌘D — duplikuj zaznaczenie',
50
- 'shortcut.delete': 'usuń zaznaczenie',
51
- 'shortcut.export': '⌘Eeksportuj HTML',
52
- 'shortcut.escape': 'ESCodznacz, zamknij',
53
- 'blocks.dragHint': 'Przeciągnij na płótno',
54
- 'blocks.count': '{count} bloków',
55
- 'rows.sectionLayouts': 'Układy sekcji',
56
- 'rows.customMarkup': 'Własny znacznik',
57
- 'rows.htmlRowHint': 'Przeciągnij, aby wstawić, lub kliknij, aby dodać — pełnowymiarowy wiersz, który wypełniasz surowym HTML',
58
- 'rows.rawHtmlSection': 'Sekcja surowego HTML',
59
- 'rows.rawHtmlDesc': 'Pełnowymiarowa sekcja, Twój własny kod, wciąż przeciągalna',
60
- 'rows.canvasModel': 'Model płótna',
61
- 'rows.modeRowBased': 'Oparty na wierszach',
62
- 'rows.modeFreeStack': 'Wolny stos',
63
- 'rows.hintRows':
64
- 'Oparty na sekcjach: najpierw upuść układ, potem bloki w jego kolumnach — każda sekcja ma własne tło, obramowanie, ustawienia flex lub siatki.',
65
- 'rows.hintStack': 'Wolny stos: bez układów — każdy upuszczony blok staje się osobną, pełnowymiarową sekcją, ułożoną w kolejności.',
66
- 'files.libraryCount': 'Biblioteka{count} plików',
67
- 'files.openManager': 'Otwórz menedżera plików',
68
- 'files.dragToCanvas': 'Przeciągnij dowolny plik bezpośrednio na płótno, aby umieścić go jako blok obrazu.',
69
- 'layers.structure': 'Struktura',
70
- 'layers.sectionSingle': 'Sekcja',
71
- 'layers.sectionMulti': 'Sekcja · {count} kol.',
72
- 'layers.blockCount': '{count} bl.',
73
- 'theme.globalStyles': 'Style globalne',
74
- 'vars.title': 'Zmienne',
75
- 'vars.fromCode': '{count} z Twojego kodu',
76
- 'vars.declaredNote': 'Zadeklarowane przez Twoją aplikację — płótno zawsze pokazuje token, nigdy wartość.',
77
- 'vars.filterPlaceholder': 'Filtruj zmienne…',
78
- 'vars.insertHint': 'Kliknij, aby wstawić do zaznaczonego tekstu, nagłówka lub przycisku',
79
- 'vars.insert': 'wstaw',
80
- 'vars.noMatch': 'Żadna zmienna nie pasuje do tego filtra.',
81
- 'vars.noneDeclared': 'Twoja aplikacja nie zadeklarowała jeszcze żadnych zmiennych.',
82
- 'vars.rteHint': 'Podczas edycji tekstu możesz też wybrać zmienną bezpośrednio z rozwijanego menu paska narzędzi.',
83
- 'modal.fileManager': 'Menedżer plików',
84
- 'modal.assetsTitle': 'Zasoby',
85
- 'modal.replaceImage': 'Zastąp obraz',
86
- 'library.searchPlaceholder': 'Szukaj plików…',
87
- 'action.upload': 'Prześlij',
88
- 'library.clickToPlace': 'Kliknij plik, aby go umieścić · lub przeciągnij plik na płótno',
89
- 'library.clickToReplace': 'Kliknij plik, aby zastąpić zaznaczony obraz',
90
- 'library.storageLabel': '{count} plików · {size}',
91
- 'library.folders': 'Foldery',
92
- 'library.dropHint': 'Upuść tutaj pliki obrazów, aby je przesłać — lub użyj przycisku Prześlij.',
93
- 'library.deleteFileHint': 'Usuń plik',
94
- 'library.del': 'USUŃ',
95
- 'toast.assetDeleted': 'Usunięto {name}',
96
- 'modal.export': 'Eksportuj',
97
- 'modal.exportTitle': 'HTML e-maila oparty na tabelach',
98
- 'export.copy': 'Kopiuj',
99
- 'export.copied': 'Skopiowano',
100
- 'action.download': 'Pobierz',
101
- 'export.meta': '{kb} KB · tabele + style inline · szerokości bezpieczne dla Outlooka',
102
- 'modal.rawHtmlTitle': 'Surowy HTML, podgląd na żywo',
103
- 'code.statusEdited': 'Widok kodu edytowany podgląd na żywo, jeszcze nie zastosowano',
104
- 'code.statusSynced': 'Widok kodu zsynchronizowany z płótnem',
105
- 'action.reload': 'Odśwież',
106
- 'action.reloadHint': 'Odśwież źródło z płótna',
107
- 'action.applyToCanvas': 'Zastosuj do płótna',
108
- 'action.applyToCanvasHint': 'Przeanalizuj źródło z powrotem na edytowalne wiersze',
109
- 'action.closeWithoutApplyingHint': 'Zamknij bez zastosowania',
110
- 'code.source': 'Źródło',
111
- 'code.livePreview': 'Podgląd na żywo',
112
- 'code.liveHtmlPreviewTitle': 'Podgląd HTML na żywo',
113
- 'code.applyNote':
114
- 'Zastosowanie analizuje każdy wiersz tabeli najwyższego poziomu na wiersz płótna, który nadal można zaznaczać, zmieniać kolejność i usuwać ręcznie napisany kod przetrwa ten proces.',
115
- 'code.meta': '{kb} KB · {lines} wierszy',
116
- 'toast.sourceReloaded': 'Odświeżono źródło z płótna',
117
- 'toast.sourceAppliedOne': 'Zastosowano źródło — 1 wiersz na płótnie',
118
- 'toast.sourceAppliedMany': 'Zastosowano źródło — {rows} wierszy na płótnie',
119
- 'toast.parseError': 'Nie udało się przeanalizować tego HTML',
120
- 'modal.copyAssist': 'Asystent tekstu',
121
- 'modal.draftCopyTitle': 'Napisz tekst dla tej kampanii',
122
- 'ai.goal': 'Cel',
123
- 'ai.tone': 'Ton',
124
- 'ai.briefLabel': 'Czego dotyczy ten e-mail?',
125
- 'ai.briefPlaceholder': 'np. Kolekcja jesienna, 15% dla subskrybentów, darmowa dostawa od 150 zł',
126
- 'ai.generate': 'Generuj tekst',
127
- 'ai.writing': 'Piszę…',
128
- 'ai.kindHeadline': 'Nagłówek',
129
- 'ai.kindBody': 'Treść główna',
130
- 'ai.kindButton': 'Tekst przycisku',
131
- 'ai.actionInsertHeading': 'Wstaw jako nagłówek',
132
- 'ai.actionInsertText': 'Wstaw jako blok tekstu',
133
- 'ai.actionInsertButton': 'Wstaw jako przycisk',
134
- 'toast.headingAdded': 'Dodano nagłówek',
135
- 'toast.textBlockAdded': 'Dodano blok tekstu',
136
- 'toast.buttonAdded': 'Dodano przycisk',
137
- 'preview.kickerMobile': 'Podglądtelefon 375px',
138
- 'preview.kickerDark': 'Podgląd ciemna skrzynka',
139
- 'preview.kickerDesktop': 'Podgląd komputer {width}px',
140
- 'action.close': 'Zamknij',
141
- 'toast.duplicated': 'Zduplikowano',
142
- 'toast.fileUploadedOne': 'Przesłano 1 plik',
143
- 'toast.fileUploadedMany': 'Przesłano {count} plików',
144
- 'toast.imageReplaced': 'Zastąpiono obraz',
145
- 'toast.imageAdded': 'Dodano obraz do płótna',
146
- 'toast.htmlCopied': 'Skopiowano HTML do schowka',
147
- 'toast.templateLoaded': 'Wczytano {name}',
148
- 'toast.snippetDefaultLabel': 'Fragment',
149
- 'toast.snippetInserted': 'Wstawiono {name}',
150
- 'toast.snippetCopied': 'Skopiowano {name} — zaznacz blok tekstu, aby go wstawić',
151
- };
152
-
1
+ /** Polish (Polski) — `pl`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const PL = {
3
+ 'action.undoHint': 'Cofnij — ⌘Z',
4
+ 'action.redoHint': 'Ponów — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Ciemny',
6
+ 'action.chromeToLight': 'Jasny',
7
+ 'action.chromeHint': 'Motyw edytora jasny / ciemny',
8
+ 'action.chromeHintToDark': 'Tryb ciemny',
9
+ 'action.chromeHintToLight': 'Tryb jasny',
10
+ 'action.aiDraft': 'Szkic',
11
+ 'action.aiDraftHint': 'Napisz treść e-maila z pomocą AI',
12
+ 'action.code': 'Kod',
13
+ 'action.codeHint': 'Edytuj surowy HTML z podglądem na żywo',
14
+ 'action.preview': 'Podgląd',
15
+ 'action.previewHint': 'Podejrzyj e-mail',
16
+ 'action.export': 'Eksportuj',
17
+ 'action.exportHint': 'Wyeksportuj swój e-mail',
18
+ 'device.desktop': 'Komputer',
19
+ 'device.desktopHint': 'Szerokość na komputerze',
20
+ 'device.mobile': 'Telefon',
21
+ 'device.mobileHint': 'Szerokość na telefonie',
22
+ 'status.autosaveOn': 'automatyczny zapis włączony',
23
+ 'status.saved': 'zapisano {time}',
24
+ 'status.saveFailed': 'nie zapisano — brak miejsca',
25
+ 'canvas.meta': '{rows} wierszy · {blocks} bloków · {width}px',
26
+ 'tab.design': 'Styl',
27
+ 'tab.designHint': 'Stylizuj zaznaczenie',
28
+ 'tab.blocks': 'Bloki',
29
+ 'tab.blocksHint': 'Bloki treści i zmienne',
30
+ 'tab.rows': 'Sekcje',
31
+ 'tab.rowsHint': 'Układy sekcji i model płótna',
32
+ 'tab.files': 'Pliki',
33
+ 'tab.filesHint': 'Biblioteka zasobów',
34
+ 'tab.layers': 'Struktura',
35
+ 'tab.layersHint': 'Struktura dokumentu',
36
+ 'tab.settings': 'Ustawienia',
37
+ 'tab.settingsHint': 'Ustawienia e-maila',
38
+ 'tab.data': 'Zmien.',
39
+ 'tab.dataHint': 'Zmienne dostarczone przez Twój kod',
40
+ 'inspector.blockProperties': 'Właściwości bloku',
41
+ 'inspector.sectionProperties': 'Właściwości sekcji',
42
+ 'inspector.title': 'Inspektor',
43
+ 'inspector.sectionLabel': 'Sekcja',
44
+ 'inspector.nothingSelected': 'Nic nie zaznaczono',
45
+ 'action.duplicateHint': 'Duplikuj — ⌘D',
46
+ 'action.deleteHint': 'Usuń ',
47
+ 'inspector.emptyBody':
48
+ 'Wybierz wiersz lub blok na płótnie, aby go tutaj stylizować. Przeciągnij bloki z zakładki <strong style="color: var(--ed-text); font-weight: 600;">Bloki</strong>; kliknij dwukrotnie dowolny tekst, aby edytować go w miejscu.',
49
+ 'inspector.shortcuts': 'Skróty',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z cofnij, ponów',
51
+ 'shortcut.duplicate': '⌘Dduplikuj zaznaczenie',
52
+ 'shortcut.delete': 'usuń zaznaczenie',
53
+ 'shortcut.export': '⌘E eksportuj HTML',
54
+ 'shortcut.escape': 'ESC — odznacz, zamknij',
55
+ 'blocks.dragHint': 'Przeciągnij na płótno',
56
+ 'blocks.count': '{count} bloków',
57
+ 'rows.sectionLayouts': 'Układy sekcji',
58
+ 'rows.customMarkup': 'Własny znacznik',
59
+ 'rows.htmlRowHint': 'Przeciągnij, aby wstawić, lub kliknij, aby dodać — pełnowymiarowy wiersz, który wypełniasz surowym HTML',
60
+ 'rows.rawHtmlSection': 'Sekcja surowego HTML',
61
+ 'rows.rawHtmlDesc': 'Pełnowymiarowa sekcja, Twój własny kod, wciąż przeciągalna',
62
+ 'rows.canvasModel': 'Model płótna',
63
+ 'rows.modeRowBased': 'Oparty na wierszach',
64
+ 'rows.modeFreeStack': 'Wolny stos',
65
+ 'rows.hintRows':
66
+ 'Oparty na sekcjach: najpierw upuść układ, potem bloki w jego kolumnach każda sekcja ma własne tło, obramowanie, ustawienia flex lub siatki.',
67
+ 'rows.hintStack': 'Wolny stos: bez układów — każdy upuszczony blok staje się osobną, pełnowymiarową sekcją, ułożoną w kolejności.',
68
+ 'files.libraryCount': 'Biblioteka {count} plików',
69
+ 'files.openManager': 'Otwórz menedżera plików',
70
+ 'files.dragToCanvas': 'Przeciągnij dowolny plik bezpośrednio na płótno, aby umieścić go jako blok obrazu.',
71
+ 'layers.structure': 'Struktura',
72
+ 'layers.sectionSingle': 'Sekcja',
73
+ 'layers.sectionMulti': 'Sekcja · {count} kol.',
74
+ 'layers.column': 'Kolumna {index}',
75
+ 'layers.blockCount': '{count} bl.',
76
+ 'vars.title': 'Zmienne',
77
+ 'vars.fromCode': '{count} z Twojego kodu',
78
+ 'vars.declaredNote': 'Zadeklarowane przez Twoją aplikację płótno zawsze pokazuje token, nigdy wartość.',
79
+ 'vars.filterPlaceholder': 'Filtruj zmienne…',
80
+ 'vars.insertHint': 'Kliknij, aby wstawić do zaznaczonego tekstu, nagłówka lub przycisku',
81
+ 'vars.insert': 'wstaw',
82
+ 'vars.noMatch': 'Żadna zmienna nie pasuje do tego filtra.',
83
+ 'vars.noneDeclared': 'Twoja aplikacja nie zadeklarowała jeszcze żadnych zmiennych.',
84
+ 'vars.rteHint': 'Podczas edycji tekstu możesz też wybrać zmienną bezpośrednio z rozwijanego menu paska narzędzi.',
85
+ 'modal.fileManager': 'Menedżer plików',
86
+ 'modal.assetsTitle': 'Zasoby',
87
+ 'modal.replaceImage': 'Zastąp obraz',
88
+ 'library.searchPlaceholder': 'Szukaj plików…',
89
+ 'action.upload': 'Prześlij',
90
+ 'library.clickToPlace': 'Kliknij plik, aby go umieścić · lub przeciągnij plik na płótno',
91
+ 'library.clickToReplace': 'Kliknij plik, aby zastąpić zaznaczony obraz',
92
+ 'library.storageLabel': '{count} plików · {size}',
93
+ 'library.folders': 'Foldery',
94
+ 'library.dropHint': 'Upuść tutaj pliki obrazów, aby je przesłać — lub użyj przycisku Prześlij.',
95
+ 'library.deleteFileHint': 'Usuń plik',
96
+ 'library.del': 'USUŃ',
97
+ 'toast.assetDeleted': 'Usunięto {name}',
98
+ 'library.allFiles': 'Wszystkie pliki',
99
+ 'library.loadMore': 'Wczytaj więcej',
100
+ 'library.empty': 'Nie ma tu jeszcze plików.',
101
+ 'storage.loading': 'Wczytywanie plików…',
102
+ 'storage.uploading': 'Przesyłanie {count}…',
103
+ 'storage.errLoadFailed': 'Nie udało się wczytać biblioteki plików {reason}',
104
+ 'storage.errNoLimits': 'Przesyłanie jest wyłączone: ta aplikacja nie ustawiła żadnych limitów przesyłania.',
105
+ 'storage.errNoAccept': 'Przesyłanie jest wyłączone: nie dopuszczono żadnego formatu pliku.',
106
+ 'storage.errNoMaxBytes': 'Przesyłanie jest wyłączone: nie ustawiono maksymalnego rozmiaru pliku.',
107
+ 'storage.errTooLarge': '{name} ma {size} — limit to {max}.',
108
+ 'storage.errFormat': '{name} to plik {type}, który nie jest tu dozwolony.',
109
+ 'storage.errSvg': '{name} to SVG, którego ta aplikacja nie przyjmuje.',
110
+ 'storage.errDimensions': '{name} ma {w}×{ht}px — limit to {maxW}×{maxH}px.',
111
+ 'storage.errTooMany': 'Naraz można przesłać tylko {max} plików.',
112
+ 'storage.errUnreadable': '{name} nie jest czytelnym obrazem.',
113
+ 'storage.errUploadFailed': 'Nie udało się przesłać {name} — {reason}',
114
+ 'storage.errDeleteFailed': 'Nie udało się usunąć {name}{reason}',
115
+ 'modal.export': 'Eksportuj',
116
+ 'modal.exportTitle': 'HTML e-maila oparty na tabelach',
117
+ 'export.copy': 'Kopiuj',
118
+ 'export.copied': 'Skopiowano',
119
+ 'action.download': 'Pobierz',
120
+ 'export.meta': '{kb} KB · tabele + style inline · szerokości bezpieczne dla Outlooka',
121
+ 'modal.rawHtmlTitle': 'Surowy HTML, podgląd na żywo',
122
+ 'code.statusEdited': 'Widok kodu — edytowany — podgląd na żywo, jeszcze nie zastosowano',
123
+ 'code.statusSynced': 'Widok kodu — zsynchronizowany z płótnem',
124
+ 'action.reload': 'Odśwież',
125
+ 'action.reloadHint': 'Odśwież źródło z płótna',
126
+ 'action.applyToCanvas': 'Zastosuj do płótna',
127
+ 'action.applyToCanvasHint': 'Przeanalizuj źródło z powrotem na edytowalne wiersze',
128
+ 'action.closeWithoutApplyingHint': 'Zamknij bez zastosowania',
129
+ 'code.source': 'Źródło',
130
+ 'code.livePreview': 'Podgląd na żywo',
131
+ 'code.liveHtmlPreviewTitle': 'Podgląd HTML na żywo',
132
+ 'code.applyNote':
133
+ 'Zastosowanie analizuje każdy wiersz tabeli najwyższego poziomu na wiersz płótna, który nadal można zaznaczać, zmieniać kolejność i usuwać — ręcznie napisany kod przetrwa ten proces.',
134
+ 'code.meta': '{kb} KB · {lines} wierszy',
135
+ 'toast.sourceReloaded': 'Odświeżono źródło z płótna',
136
+ 'toast.sourceAppliedOne': 'Zastosowano źródło — 1 wiersz na płótnie',
137
+ 'toast.sourceAppliedMany': 'Zastosowano źródło {rows} wierszy na płótnie',
138
+ 'toast.parseError': 'Nie udało się przeanalizować tego HTML',
139
+ 'modal.aiDraft': 'Asystent pisania AI',
140
+ 'modal.aiDraftTitle': 'Napisz swój e-mail z pomocą AI',
141
+ 'ai.disclosure': 'AI tworzy propozycje na podstawie Twojego briefu. Sprawdź i popraw wynik przed wysyłką.',
142
+ 'ai.goal': 'Cel',
143
+ 'ai.tone': 'Ton',
144
+ 'ai.briefLabel': 'Czego dotyczy ten e-mail?',
145
+ 'ai.briefPlaceholder': 'np. Kolekcja jesienna, 15% dla subskrybentów, darmowa dostawa od 150 zł',
146
+ 'ai.generate': 'Generuj tekst',
147
+ 'ai.writing': 'Piszę…',
148
+ 'ai.kindHeadline': 'Nagłówek',
149
+ 'ai.kindBody': 'Treść główna',
150
+ 'ai.kindButton': 'Tekst przycisku',
151
+ 'ai.actionInsertHeading': 'Wstaw jako nagłówek',
152
+ 'ai.actionInsertText': 'Wstaw jako blok tekstu',
153
+ 'ai.actionInsertButton': 'Wstaw jako przycisk',
154
+ 'toast.headingAdded': 'Dodano nagłówek',
155
+ 'toast.textBlockAdded': 'Dodano blok tekstu',
156
+ 'toast.buttonAdded': 'Dodano przycisk',
157
+ 'preview.kickerMobile': 'Podgląd — telefon 375px',
158
+ 'preview.kickerDesktop': 'Podgląd — komputer {width}px',
159
+ 'action.close': 'Zamknij',
160
+ 'toast.duplicated': 'Zduplikowano',
161
+ 'toast.fileUploadedOne': 'Przesłano 1 plik',
162
+ 'toast.fileUploadedMany': 'Przesłano {count} plików',
163
+ 'toast.imageReplaced': 'Zastąpiono obraz',
164
+ 'toast.imageAdded': 'Dodano obraz do płótna',
165
+ 'toast.htmlCopied': 'Skopiowano HTML do schowka',
166
+ 'toast.templateLoaded': 'Wczytano {name}',
167
+ 'toast.snippetDefaultLabel': 'Fragment',
168
+ 'toast.snippetInserted': 'Wstawiono {name}',
169
+ 'toast.snippetCopied': 'Skopiowano {name} — zaznacz blok tekstu, aby go wstawić',
170
+ 'rte.textStyle': 'Styl tekstu',
171
+ 'rte.mergeTags': 'Pola scalania',
172
+ 'rte.noMergeTags': 'Brak dostępnych pól scalania',
173
+ 'rte.textColor': 'Kolor tekstu',
174
+ 'rte.highlightColor': 'Kolor wyróżnienia',
175
+ 'rte.removeHighlight': 'Usuń wyróżnienie',
176
+ 'rte.clearFormatting': 'Wyczyść formatowanie',
177
+ 'action.downloadPng': 'Pobierz PNG',
178
+ 'action.screenshot': 'Zrzut ekranu',
179
+ 'action.screenshotHint': 'Zobacz cały szablon jako obraz i pobierz go',
180
+ 'toast.pngSaved': 'Zrzut ekranu pobrany',
181
+ 'toast.pngFailed': 'Zrzut ekranu nie powiódł się — nie udało się wczytać zewnętrznego obrazu',
182
+ 'toast.pngCopied': 'Zrzut ekranu skopiowany do schowka',
183
+ 'toast.pngCopyFailed': 'Ta przeglądarka nie przyjęła obrazu do schowka',
184
+ 'story.kicker': 'Zrzut ekranu',
185
+ 'story.rendering': 'Tworzenie zrzutu ekranu',
186
+ 'story.renderingHint': 'Każdy blok jest rysowany w 2× — przy długim szablonie chwilę to trwa.',
187
+ 'story.failed': 'Zrzut ekranu nie powiódł się',
188
+ 'story.failedHint': 'Nie udało się wczytać obrazu z szablonu do przechwycenia.',
189
+ 'story.retry': 'Spróbuj ponownie',
190
+ 'story.play': 'Odtwórz',
191
+ 'story.pause': 'Wstrzymaj',
192
+ 'story.replay': 'Odtwórz ponownie',
193
+ 'story.copy': 'Kopiuj',
194
+ 'story.meta': '{w}×{h} · ekran {i} z {n}',
195
+ 'footer.poweredBy': 'Napędzane przez SELISE Blocks © 2026',
196
+ };