@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
- /** Turkish (Türkçe) — `tr`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
- export const TR = {
3
- 'action.undoHint': 'Geri al — ⌘Z',
4
- 'action.redoHint': 'Yinele — ⌘⇧Z',
5
- 'action.chromeToDark': 'Koyu',
6
- 'action.chromeToLight': 'Açık',
7
- 'action.chromeHint': 'Düzenleyici teması açık / koyu',
8
- 'action.aiCopy': 'Metin',
9
- 'action.aiCopyHint': 'Yapay zeka ile metin yaz',
10
- 'action.code': 'Kod',
11
- 'action.codeHint': 'Ham HTML’yi canlı önizlemeyle düzenle',
12
- 'action.preview': 'Önizleme',
13
- 'action.export': 'Dışa aktar',
14
- 'device.desktop': 'Masaüstü',
15
- 'device.desktopHint': 'Masaüstü genişliği',
16
- 'device.mobile': 'Mobil',
17
- 'device.mobileHint': 'Mobil genişliği',
18
- 'device.dark': 'Koyu',
19
- 'device.darkHint': 'Koyu gelen kutusu modu',
20
- 'status.autosaveOn': 'otomatik kayıt açık',
21
- 'status.saved': 'kaydedildi {time}',
22
- 'status.saveFailed': 'kaydedilmedi depolama alanı dolu',
23
- 'canvas.meta': '{rows} satır · {blocks} blok · {width}px',
24
- 'tab.design': 'Stil',
25
- 'tab.designHint': 'Seçimi biçimlendir',
26
- 'tab.blocks': 'Bloklar',
27
- 'tab.blocksHint': 'İçerik blokları ve değişkenler',
28
- 'tab.rows': 'Bölümler',
29
- 'tab.rowsHint': 'Bölüm düzenleri ve tuval modeli',
30
- 'tab.files': 'Dosyalar',
31
- 'tab.filesHint': 'Varlık kitaplığı',
32
- 'tab.layers': 'Yapı',
33
- 'tab.layersHint': 'Belge yapısı',
34
- 'tab.theme': 'Tema',
35
- 'tab.themeHint': 'Genel stiller',
36
- 'tab.data': 'Değ.',
37
- 'tab.dataHint': 'Kodunuz tarafından sağlanan değişkenler',
38
- 'inspector.blockProperties': 'Blok özellikleri',
39
- 'inspector.sectionProperties': 'Bölüm özellikleri',
40
- 'inspector.title': 'Denetçi',
41
- 'inspector.sectionLabel': 'Bölüm',
42
- 'inspector.nothingSelected': 'Hiçbir şey seçilmedi',
43
- 'action.duplicateHint': 'Çoğalt — ⌘D',
44
- 'action.deleteHint': 'Sil ',
45
- 'inspector.emptyBody':
46
- 'Burada biçimlendirmek için tuval üzerinde bir satır veya blok seçin. Blokları <strong style="color: var(--ed-text); font-weight: 600;">Bloklar</strong> sekmesinden sürükleyin; herhangi bir metni doğrudan düzenlemek için üzerine çift tıklayın.',
47
- 'inspector.shortcuts': 'Kısayollar',
48
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z geri al, yinele',
49
- 'shortcut.duplicate': '⌘D — seçimi çoğalt',
50
- 'shortcut.delete': 'seçimi sil',
51
- 'shortcut.export': '⌘EHTML dışa aktar',
52
- 'shortcut.escape': 'ESC — seçimi kaldır, kapat',
53
- 'blocks.dragHint': 'Tuvale sürükleyin',
54
- 'blocks.count': '{count} blok',
55
- 'rows.sectionLayouts': 'Bölüm düzenleri',
56
- 'rows.customMarkup': 'Özel işaretleme',
57
- 'rows.htmlRowHint': 'Eklemek için sürükleyin veya eklemek için tıklayın — ham HTML ile doldurduğunuz tam genişlikte bir satır',
58
- 'rows.rawHtmlSection': 'Ham HTML bölümü',
59
- 'rows.rawHtmlDesc': 'Tam genişlikte bölüm, kendi işaretlemeniz, hâlâ sürüklenebilir',
60
- 'rows.canvasModel': 'Tuval modeli',
61
- 'rows.modeRowBased': 'Satır tabanlı',
62
- 'rows.modeFreeStack': 'Serbest yığın',
63
- 'rows.hintRows':
64
- 'Bölüm tabanlı: önce bir düzen bırakın, ardından sütunlarına bloklar bırakın — her bölümün kendi arka planı, kenarlığı, flex veya ızgara ayarları vardır.',
65
- 'rows.hintStack': 'Serbest yığın: düzen olmadan — bıraktığınız her blok, sırayla istiflenen kendi tam genişlikteki bölümü haline gelir.',
66
- 'files.libraryCount': 'Kitaplık{count} dosya',
67
- 'files.openManager': 'Dosya yöneticisini ',
68
- 'files.dragToCanvas': 'Görsel blok olarak yerleştirmek için herhangi bir dosyayı doğrudan tuvale sürükleyin.',
69
- 'layers.structure': 'Yapı',
70
- 'layers.sectionSingle': 'Bölüm',
71
- 'layers.sectionMulti': 'Bölüm · {count} sütun',
72
- 'layers.blockCount': '{count} blok',
73
- 'theme.globalStyles': 'Genel stiller',
74
- 'vars.title': 'Değişkenler',
75
- 'vars.fromCode': 'Kodunuzdan {count}',
76
- 'vars.declaredNote': 'Uygulamanız tarafından tanımlandı — tuval her zaman değeri değil, jetonu gösterir.',
77
- 'vars.filterPlaceholder': 'Değişkenleri filtrele…',
78
- 'vars.insertHint': 'Seçili metne, başlığa veya düğmeye eklemek için tıklayın',
79
- 'vars.insert': 'ekle',
80
- 'vars.noMatch': 'Bu filtreyle eşleşen değişken yok.',
81
- 'vars.noneDeclared': 'Uygulamanız henüz herhangi bir değişken tanımlamadı.',
82
- 'vars.rteHint': 'Metni düzenlerken, satır içi araç çubuğunun açılır menüsünden doğrudan bir değişken de seçebilirsiniz.',
83
- 'modal.fileManager': 'Dosya yöneticisi',
84
- 'modal.assetsTitle': 'Varlıklar',
85
- 'modal.replaceImage': 'Görseli değiştir',
86
- 'library.searchPlaceholder': 'Dosyaları ara…',
87
- 'action.upload': 'Yükle',
88
- 'library.clickToPlace': 'Yerleştirmek için bir dosyaya tıklayın · veya bir dosyayı tuvale sürükleyin',
89
- 'library.clickToReplace': 'Seçili görseli değiştirmek için bir dosyaya tıklayın',
90
- 'library.storageLabel': '{count} dosya · {size}',
91
- 'library.folders': 'Klasörler',
92
- 'library.dropHint': 'Yüklemek için görsel dosyalarını buraya bırakın — veya Yükle düğmesini kullanın.',
93
- 'library.deleteFileHint': 'Dosyayı sil',
94
- 'library.del': 'SİL',
95
- 'toast.assetDeleted': '{name} silindi',
96
- 'modal.export': 'Dışa aktar',
97
- 'modal.exportTitle': 'Tabloya dayalı e-posta HTML’si',
98
- 'export.copy': 'Kopyala',
99
- 'export.copied': 'Kopyalandı',
100
- 'action.download': 'İndir',
101
- 'export.meta': '{kb} KB · tablolar + satır içi stiller · Outlook için güvenli genişlikler',
102
- 'modal.rawHtmlTitle': 'Ham HTML, canlı önizleme',
103
- 'code.statusEdited': 'Kod görünümü düzenlendi önizleme canlı, henüz uygulanmadı',
104
- 'code.statusSynced': 'Kod görünümü tuvalle senkronize',
105
- 'action.reload': 'Yeniden yükle',
106
- 'action.reloadHint': 'Kaynağı tuvalden yeniden yükle',
107
- 'action.applyToCanvas': 'Tuvale uygula',
108
- 'action.applyToCanvasHint': 'Kaynağı tekrar düzenlenebilir satırlara ayrıştır',
109
- 'action.closeWithoutApplyingHint': 'Uygulamadan kapat',
110
- 'code.source': 'Kaynak',
111
- 'code.livePreview': 'Canlı önizleme',
112
- 'code.liveHtmlPreviewTitle': 'Canlı HTML önizlemesi',
113
- 'code.applyNote':
114
- 'Uygulama, en üst düzey her tablo satırını, hâlâ seçebileceğiniz, yeniden sıralayabileceğiniz ve silebileceğiniz bir tuval satırına ayrıştırır — elle yazılmış kod bu süreçten değişmeden çıkar.',
115
- 'code.meta': '{kb} KB · {lines} satır',
116
- 'toast.sourceReloaded': 'Kaynak tuvalden yeniden yüklendi',
117
- 'toast.sourceAppliedOne': 'Kaynak uygulandı — tuvalde 1 satır',
118
- 'toast.sourceAppliedMany': 'Kaynak uygulandı — tuvalde {rows} satır',
119
- 'toast.parseError': 'Bu HTML ayrıştırılamadı',
120
- 'modal.copyAssist': 'Metin asistanı',
121
- 'modal.draftCopyTitle': 'Bu kampanya için metin yazın',
122
- 'ai.goal': 'Hedef',
123
- 'ai.tone': 'Ton',
124
- 'ai.briefLabel': 'Bu e-posta ne hakkında?',
125
- 'ai.briefPlaceholder': 'örn. Sonbahar koleksiyonu, aboneler için %15, 150₺ üzeri ücretsiz kargo',
126
- 'ai.generate': 'Metin oluştur',
127
- 'ai.writing': 'Yazılıyor…',
128
- 'ai.kindHeadline': 'Başlık',
129
- 'ai.kindBody': 'Gövde metni',
130
- 'ai.kindButton': 'Düğme metni',
131
- 'ai.actionInsertHeading': 'Başlık olarak ekle',
132
- 'ai.actionInsertText': 'Metin bloğu olarak ekle',
133
- 'ai.actionInsertButton': 'Düğme olarak ekle',
134
- 'toast.headingAdded': 'Başlık eklendi',
135
- 'toast.textBlockAdded': 'Metin bloğu eklendi',
136
- 'toast.buttonAdded': 'Düğme eklendi',
137
- 'preview.kickerMobile': 'Önizleme mobil 375px',
138
- 'preview.kickerDark': 'Önizleme koyu gelen kutusu',
139
- 'preview.kickerDesktop': 'Önizleme masaüstü {width}px',
140
- 'action.close': 'Kapat',
141
- 'toast.duplicated': 'Çoğaltıldı',
142
- 'toast.fileUploadedOne': '1 dosya yüklendi',
143
- 'toast.fileUploadedMany': '{count} dosya yüklendi',
144
- 'toast.imageReplaced': 'Görsel değiştirildi',
145
- 'toast.imageAdded': 'Görsel tuvale eklendi',
146
- 'toast.htmlCopied': 'HTML panoya kopyalandı',
147
- 'toast.templateLoaded': '{name} yüklendi',
148
- 'toast.snippetDefaultLabel': 'Snippet',
149
- 'toast.snippetInserted': '{name} eklendi',
150
- 'toast.snippetCopied': '{name} kopyalandı — eklemek için bir metin bloğu seçin',
151
- };
152
-
1
+ /** Turkish (Türkçe) — `tr`. AI-drafted, not reviewed by a native speaker. Correctable one key at a time via `.messages` overrides. */
2
+ export const TR = {
3
+ 'action.undoHint': 'Geri al — ⌘Z',
4
+ 'action.redoHint': 'Yinele — ⌘⇧Z',
5
+ 'action.chromeToDark': 'Koyu',
6
+ 'action.chromeToLight': 'Açık',
7
+ 'action.chromeHint': 'Düzenleyici teması açık / koyu',
8
+ 'action.chromeHintToDark': 'Koyu mod',
9
+ 'action.chromeHintToLight': 'Açık mod',
10
+ 'action.aiDraft': 'Taslak',
11
+ 'action.aiDraftHint': 'E-posta içeriğini yapay zekâ ile yaz',
12
+ 'action.code': 'Kod',
13
+ 'action.codeHint': 'Ham HTML’yi canlı önizlemeyle düzenle',
14
+ 'action.preview': 'Önizleme',
15
+ 'action.previewHint': 'E-postayı önizleyin',
16
+ 'action.export': 'Dışa aktar',
17
+ 'action.exportHint': 'E-postanızı dışa aktarın',
18
+ 'device.desktop': 'Masaüstü',
19
+ 'device.desktopHint': 'Masaüstü genişliği',
20
+ 'device.mobile': 'Mobil',
21
+ 'device.mobileHint': 'Mobil genişliği',
22
+ 'status.autosaveOn': 'otomatik kayıt açık',
23
+ 'status.saved': 'kaydedildi {time}',
24
+ 'status.saveFailed': 'kaydedilmedi — depolama alanı dolu',
25
+ 'canvas.meta': '{rows} satır · {blocks} blok · {width}px',
26
+ 'tab.design': 'Stil',
27
+ 'tab.designHint': 'Seçimi biçimlendir',
28
+ 'tab.blocks': 'Bloklar',
29
+ 'tab.blocksHint': 'İçerik blokları ve değişkenler',
30
+ 'tab.rows': 'Bölümler',
31
+ 'tab.rowsHint': 'Bölüm düzenleri ve tuval modeli',
32
+ 'tab.files': 'Dosyalar',
33
+ 'tab.filesHint': 'Varlık kitaplığı',
34
+ 'tab.layers': 'Yapı',
35
+ 'tab.layersHint': 'Belge yapısı',
36
+ 'tab.settings': 'Ayarlar',
37
+ 'tab.settingsHint': 'E-posta ayarları',
38
+ 'tab.data': 'Değ.',
39
+ 'tab.dataHint': 'Kodunuz tarafından sağlanan değişkenler',
40
+ 'inspector.blockProperties': 'Blok özellikleri',
41
+ 'inspector.sectionProperties': 'Bölüm özellikleri',
42
+ 'inspector.title': 'Denetçi',
43
+ 'inspector.sectionLabel': 'Bölüm',
44
+ 'inspector.nothingSelected': 'Hiçbir şey seçilmedi',
45
+ 'action.duplicateHint': 'Çoğalt — ⌘D',
46
+ 'action.deleteHint': 'Sil ',
47
+ 'inspector.emptyBody':
48
+ 'Burada biçimlendirmek için tuval üzerinde bir satır veya blok seçin. Blokları <strong style="color: var(--ed-text); font-weight: 600;">Bloklar</strong> sekmesinden sürükleyin; herhangi bir metni doğrudan düzenlemek için üzerine çift tıklayın.',
49
+ 'inspector.shortcuts': 'Kısayollar',
50
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z geri al, yinele',
51
+ 'shortcut.duplicate': '⌘Dseçimi çoğalt',
52
+ 'shortcut.delete': ' — seçimi sil',
53
+ 'shortcut.export': '⌘E — HTML dışa aktar',
54
+ 'shortcut.escape': 'ESC — seçimi kaldır, kapat',
55
+ 'blocks.dragHint': 'Tuvale sürükleyin',
56
+ 'blocks.count': '{count} blok',
57
+ 'rows.sectionLayouts': 'Bölüm düzenleri',
58
+ 'rows.customMarkup': 'Özel işaretleme',
59
+ 'rows.htmlRowHint': 'Eklemek için sürükleyin veya eklemek için tıklayın — ham HTML ile doldurduğunuz tam genişlikte bir satır',
60
+ 'rows.rawHtmlSection': 'Ham HTML bölümü',
61
+ 'rows.rawHtmlDesc': 'Tam genişlikte bölüm, kendi işaretlemeniz, hâlâ sürüklenebilir',
62
+ 'rows.canvasModel': 'Tuval modeli',
63
+ 'rows.modeRowBased': 'Satır tabanlı',
64
+ 'rows.modeFreeStack': 'Serbest yığın',
65
+ 'rows.hintRows':
66
+ 'Bölüm tabanlı: önce bir düzen bırakın, ardından sütunlarına bloklar bırakın her bölümün kendi arka planı, kenarlığı, flex veya ızgara ayarları vardır.',
67
+ 'rows.hintStack': 'Serbest yığın: düzen olmadan — bıraktığınız her blok, sırayla istiflenen kendi tam genişlikteki bölümü haline gelir.',
68
+ 'files.libraryCount': 'Kitaplık {count} dosya',
69
+ 'files.openManager': 'Dosya yöneticisini aç',
70
+ 'files.dragToCanvas': 'Görsel blok olarak yerleştirmek için herhangi bir dosyayı doğrudan tuvale sürükleyin.',
71
+ 'layers.structure': 'Yapı',
72
+ 'layers.sectionSingle': 'Bölüm',
73
+ 'layers.sectionMulti': 'Bölüm · {count} sütun',
74
+ 'layers.column': 'Sütun {index}',
75
+ 'layers.blockCount': '{count} blok',
76
+ 'vars.title': 'Değişkenler',
77
+ 'vars.fromCode': 'Kodunuzdan {count}',
78
+ 'vars.declaredNote': 'Uygulamanız tarafından tanımlandı tuval her zaman değeri değil, jetonu gösterir.',
79
+ 'vars.filterPlaceholder': 'Değişkenleri filtrele…',
80
+ 'vars.insertHint': 'Seçili metne, başlığa veya düğmeye eklemek için tıklayın',
81
+ 'vars.insert': 'ekle',
82
+ 'vars.noMatch': 'Bu filtreyle eşleşen değişken yok.',
83
+ 'vars.noneDeclared': 'Uygulamanız henüz herhangi bir değişken tanımlamadı.',
84
+ 'vars.rteHint': 'Metni düzenlerken, satır içi araç çubuğunun açılır menüsünden doğrudan bir değişken de seçebilirsiniz.',
85
+ 'modal.fileManager': 'Dosya yöneticisi',
86
+ 'modal.assetsTitle': 'Varlıklar',
87
+ 'modal.replaceImage': 'Görseli değiştir',
88
+ 'library.searchPlaceholder': 'Dosyaları ara…',
89
+ 'action.upload': 'Yükle',
90
+ 'library.clickToPlace': 'Yerleştirmek için bir dosyaya tıklayın · veya bir dosyayı tuvale sürükleyin',
91
+ 'library.clickToReplace': 'Seçili görseli değiştirmek için bir dosyaya tıklayın',
92
+ 'library.storageLabel': '{count} dosya · {size}',
93
+ 'library.folders': 'Klasörler',
94
+ 'library.dropHint': 'Yüklemek için görsel dosyalarını buraya bırakın — veya Yükle düğmesini kullanın.',
95
+ 'library.deleteFileHint': 'Dosyayı sil',
96
+ 'library.del': 'SİL',
97
+ 'toast.assetDeleted': '{name} silindi',
98
+ 'library.allFiles': 'Tüm dosyalar',
99
+ 'library.loadMore': 'Daha fazla yükle',
100
+ 'library.empty': 'Burada henüz dosya yok.',
101
+ 'storage.loading': 'Dosyalar yükleniyor…',
102
+ 'storage.uploading': '{count} yükleniyor…',
103
+ 'storage.errLoadFailed': 'Dosya kitaplığı yüklenemedi{reason}',
104
+ 'storage.errNoLimits': 'Yüklemeler kapalı: bu uygulama hiçbir yükleme sınırı belirlemedi.',
105
+ 'storage.errNoMaxBytes': 'Yüklemeler kapalı: en büyük dosya boyutu belirlenmedi.',
106
+ 'storage.errTooLarge': '{name} {size} sınır {max}.',
107
+ 'storage.errFormat': '{name} bir {type} dosyası ve burada izin verilmiyor.',
108
+ 'storage.errSvg': '{name} bir SVG ve bu uygulama SVG kabul etmiyor.',
109
+ 'storage.errDimensions': '{name} {w}×{ht}px — sınır {maxW}×{maxH}px.',
110
+ 'storage.errTooMany': 'Bir seferde yalnızca {max} dosya yüklenebilir.',
111
+ 'storage.errUnreadable': '{name} okunabilir bir görsel değil.',
112
+ 'storage.errUploadFailed': '{name} yüklenemedi — {reason}',
113
+ 'storage.errDeleteFailed': '{name} silinemedi — {reason}',
114
+ 'modal.export': 'Dışa aktar',
115
+ 'modal.exportTitle': 'Tabloya dayalı e-posta HTML’si',
116
+ 'export.copy': 'Kopyala',
117
+ 'export.copied': 'Kopyalandı',
118
+ 'action.download': 'İndir',
119
+ 'export.meta': '{kb} KB · tablolar + satır içi stiller · Outlook için güvenli genişlikler',
120
+ 'modal.rawHtmlTitle': 'Ham HTML, canlı önizleme',
121
+ 'code.statusEdited': 'Kod görünümü düzenlendi — önizleme canlı, henüz uygulanmadı',
122
+ 'code.statusSynced': 'Kod görünümü — tuvalle senkronize',
123
+ 'action.reload': 'Yeniden yükle',
124
+ 'action.reloadHint': 'Kaynağı tuvalden yeniden yükle',
125
+ 'action.applyToCanvas': 'Tuvale uygula',
126
+ 'action.applyToCanvasHint': 'Kaynağı tekrar düzenlenebilir satırlara ayrıştır',
127
+ 'action.closeWithoutApplyingHint': 'Uygulamadan kapat',
128
+ 'code.source': 'Kaynak',
129
+ 'code.livePreview': 'Canlı önizleme',
130
+ 'code.liveHtmlPreviewTitle': 'Canlı HTML önizlemesi',
131
+ 'code.applyNote':
132
+ 'Uygulama, en üst düzey her tablo satırını, hâlâ seçebileceğiniz, yeniden sıralayabileceğiniz ve silebileceğiniz bir tuval satırına ayrıştırır — elle yazılmış kod bu süreçten değişmeden çıkar.',
133
+ 'code.meta': '{kb} KB · {lines} satır',
134
+ 'toast.sourceReloaded': 'Kaynak tuvalden yeniden yüklendi',
135
+ 'toast.sourceAppliedOne': 'Kaynak uygulandı — tuvalde 1 satır',
136
+ 'toast.sourceAppliedMany': 'Kaynak uygulandı — tuvalde {rows} satır',
137
+ 'toast.parseError': 'Bu HTML ayrıştırılamadı',
138
+ 'modal.aiDraft': 'Yapay zekâ yazma asistanı',
139
+ 'modal.aiDraftTitle': 'E-postanızı yapay zekâ ile yazın',
140
+ 'ai.disclosure': 'Yapay zekâ, özetinizden öneriler üretir. Göndermeden önce sonucu gözden geçirin ve düzenleyin.',
141
+ 'ai.goal': 'Hedef',
142
+ 'ai.tone': 'Ton',
143
+ 'ai.briefLabel': 'Bu e-posta ne hakkında?',
144
+ 'ai.briefPlaceholder': 'örn. Sonbahar koleksiyonu, aboneler için %15, 150₺ üzeri ücretsiz kargo',
145
+ 'ai.generate': 'Metin oluştur',
146
+ 'ai.writing': 'Yazılıyor…',
147
+ 'ai.kindHeadline': 'Başlık',
148
+ 'ai.kindBody': 'Gövde metni',
149
+ 'ai.kindButton': 'Düğme metni',
150
+ 'ai.actionInsertHeading': 'Başlık olarak ekle',
151
+ 'ai.actionInsertText': 'Metin bloğu olarak ekle',
152
+ 'ai.actionInsertButton': 'Düğme olarak ekle',
153
+ 'toast.headingAdded': 'Başlık eklendi',
154
+ 'toast.textBlockAdded': 'Metin bloğu eklendi',
155
+ 'toast.buttonAdded': 'Düğme eklendi',
156
+ 'preview.kickerMobile': 'Önizleme — mobil 375px',
157
+ 'preview.kickerDesktop': 'Önizleme — masaüstü {width}px',
158
+ 'action.close': 'Kapat',
159
+ 'toast.duplicated': 'Çoğaltıldı',
160
+ 'toast.fileUploadedOne': '1 dosya yüklendi',
161
+ 'toast.fileUploadedMany': '{count} dosya yüklendi',
162
+ 'toast.imageReplaced': 'Görsel değiştirildi',
163
+ 'toast.imageAdded': 'Görsel tuvale eklendi',
164
+ 'toast.htmlCopied': 'HTML panoya kopyalandı',
165
+ 'toast.templateLoaded': '{name} yüklendi',
166
+ 'toast.snippetDefaultLabel': 'Snippet',
167
+ 'toast.snippetInserted': '{name} eklendi',
168
+ 'toast.snippetCopied': '{name} kopyalandı — eklemek için bir metin bloğu seçin',
169
+ 'rte.textStyle': 'Metin stili',
170
+ 'rte.mergeTags': 'Birleştirme alanları',
171
+ 'rte.noMergeTags': 'Kullanılabilir birleştirme alanı yok',
172
+ 'rte.textColor': 'Metin rengi',
173
+ 'rte.highlightColor': 'Vurgu rengi',
174
+ 'rte.removeHighlight': 'Vurguyu kaldır',
175
+ 'rte.clearFormatting': 'Biçimlendirmeyi temizle',
176
+ 'action.downloadPng': 'PNG indir',
177
+ 'action.screenshot': 'Ekran görüntüsü',
178
+ 'action.screenshotHint': 'Şablonun tamamını görsel olarak görün, sonra indirin',
179
+ 'toast.pngSaved': 'Ekran görüntüsü indirildi',
180
+ 'toast.pngFailed': 'Ekran görüntüsü alınamadı — dış bir görsel yüklenemedi',
181
+ 'toast.pngCopied': 'Ekran görüntüsü panoya kopyalandı',
182
+ 'toast.pngCopyFailed': 'Bu tarayıcı panoya görsel almayı kabul etmedi',
183
+ 'story.kicker': 'Ekran görüntüsü',
184
+ 'story.rendering': 'Ekran görüntüsü oluşturuluyor',
185
+ 'story.renderingHint': 'Her blok 2× çiziliyor — uzun bir şablonda bu biraz sürer.',
186
+ 'story.failed': 'Ekran görüntüsü alınamadı',
187
+ 'story.failedHint': 'Şablondaki bir görsel, yakalama için yüklenemedi.',
188
+ 'story.retry': 'Yeniden deneyin',
189
+ 'story.play': 'Oynat',
190
+ 'story.pause': 'Duraklat',
191
+ 'story.replay': 'Yeniden oynat',
192
+ 'story.copy': 'Kopyala',
193
+ 'story.meta': '{w}×{h} · ekran {i}/{n}',
194
+ 'footer.poweredBy': 'SELISE Blocks tarafından desteklenir © 2026',
195
+ };