@seliseblocks/mailcraft 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/DOCS.md +240 -12
  2. package/README.md +11 -3
  3. package/README.md.txt +134 -0
  4. package/dist/mailcraft-editor.bundle.js +51 -39
  5. package/dist/mailcraft-editor.bundle.js.map +3 -3
  6. package/examples/templates/order-confirmed.html +80 -80
  7. package/examples/vanilla.html +242 -23
  8. package/package.json +7 -2
  9. package/src/core/assets.js +10 -15
  10. package/src/core/binder.js +120 -118
  11. package/src/core/blocks.js +14 -1
  12. package/src/core/css-cascade.js +117 -117
  13. package/src/core/editor-core.js +1530 -1492
  14. package/src/core/export.js +142 -55
  15. package/src/core/i18n/ar.js +219 -177
  16. package/src/core/i18n/bg.js +196 -152
  17. package/src/core/i18n/bn.js +218 -176
  18. package/src/core/i18n/ca.js +196 -152
  19. package/src/core/i18n/cs.js +196 -152
  20. package/src/core/i18n/da.js +196 -152
  21. package/src/core/i18n/de-CH.js +196 -152
  22. package/src/core/i18n/de.js +196 -152
  23. package/src/core/i18n/dz.js +221 -179
  24. package/src/core/i18n/el.js +196 -152
  25. package/src/core/i18n/en.js +3 -10
  26. package/src/core/i18n/es.js +196 -152
  27. package/src/core/i18n/et.js +196 -152
  28. package/src/core/i18n/fi.js +196 -152
  29. package/src/core/i18n/fr.js +196 -152
  30. package/src/core/i18n/hr.js +196 -152
  31. package/src/core/i18n/hu.js +196 -152
  32. package/src/core/i18n/index.js +83 -83
  33. package/src/core/i18n/it.js +196 -152
  34. package/src/core/i18n/lt.js +196 -152
  35. package/src/core/i18n/lv.js +196 -152
  36. package/src/core/i18n/nb.js +196 -152
  37. package/src/core/i18n/nl.js +196 -152
  38. package/src/core/i18n/pl.js +196 -152
  39. package/src/core/i18n/pt.js +196 -152
  40. package/src/core/i18n/ro.js +196 -152
  41. package/src/core/i18n/ru.js +196 -152
  42. package/src/core/i18n/sk.js +196 -152
  43. package/src/core/i18n/sl.js +196 -152
  44. package/src/core/i18n/sv.js +196 -152
  45. package/src/core/i18n/tables.js +50 -50
  46. package/src/core/i18n/tr.js +196 -152
  47. package/src/core/i18n/uk.js +196 -152
  48. package/src/core/icons.js +237 -235
  49. package/src/core/ids.js +1 -1
  50. package/src/core/import-html.js +1025 -959
  51. package/src/core/layout-style.js +100 -100
  52. package/src/core/parse.js +10 -10
  53. package/src/core/placeholder.js +15 -15
  54. package/src/core/sanitize.js +141 -141
  55. package/src/core/storage-limits.js +184 -184
  56. package/src/core/storage.js +85 -85
  57. package/src/core/theme.js +1 -1
  58. package/src/core/variables.js +11 -11
  59. package/src/index.js +9 -9
  60. package/src/mailcraft-editor.js +26 -14
  61. package/src/render/block-body.js +49 -6
  62. package/src/render/canvas.js +31 -2
  63. package/src/render/fields.js +602 -588
  64. package/src/render/focus-preserve.js +158 -158
  65. package/src/render/rte.js +241 -212
  66. package/src/render/screenshot.js +132 -132
  67. package/src/render/story.js +415 -415
  68. package/src/render/style.js +8 -0
  69. package/types/index.d.ts +419 -0
@@ -1,176 +1,218 @@
1
- /**
2
- * Bangla (বাংলা) — `bn`.
3
- *
4
- * AI-drafted, not reviewed by a native speaker. Correctable one key at a
5
- * time via `.messages` overrides -- `createTranslator` falls back to
6
- * English per-key, so a partial fix is safe to ship incrementally.
7
- */
8
- export const BN = {
9
- 'action.undoHint': 'পূর্বাবস্থায় ফেরান — ⌘Z',
10
- 'action.redoHint': 'পুনরায় করুন — ⌘⇧Z',
11
- 'action.chromeToDark': 'ডার্ক',
12
- 'action.chromeToLight': 'লাইট',
13
- 'action.chromeHint': 'সম্পাদক থিম লাইট/ডার্ক',
14
- 'action.aiCopy': 'কপি',
15
- 'action.aiCopyHint': 'AI দিয়ে কপি লিখুন',
16
- 'action.code': 'কোড',
17
- 'action.codeHint': 'লাইভ প্রিভিউসহ HTML সম্পাদনা করুন',
18
- 'action.preview': 'প্রিভিউ',
19
- 'action.export': 'রপ্তানি',
20
-
21
- 'device.desktop': 'ডেস্কটপ',
22
- 'device.desktopHint': 'ডেস্কটপ প্রস্থ',
23
- 'device.mobile': 'মোবাইল',
24
- 'device.mobileHint': 'মোবাইল প্রস্থ',
25
- 'device.dark': 'ডার্ক',
26
- 'device.darkHint': 'ডার্ক-মোড ইনবক্স',
27
-
28
- 'status.autosaveOn': 'অটোসেভ চালু',
29
- 'status.saved': 'সংরক্ষিত হয়েছে {time}',
30
- 'status.saveFailed': 'সংরক্ষণ হয়নি — স্টোরেজ পূর্ণ',
31
-
32
- 'canvas.meta': '{rows}টি সারি · {blocks}টি ব্লক · {width}px',
33
-
34
- 'tab.design': 'স্টাইল',
35
- 'tab.designHint': 'নির্বাচিত অংশ স্টাইল করুন',
36
- 'tab.blocks': 'ব্লক',
37
- 'tab.blocksHint': 'কন্টেন্ট ব্লক ভেরিয়েবল',
38
- 'tab.rows': 'সেকশন',
39
- 'tab.rowsHint': 'সেকশন লেআউটক্যানভাস মডেল',
40
- 'tab.files': 'ফাইল',
41
- 'tab.filesHint': 'অ্যাসেট লাইব্রেরি',
42
- 'tab.layers': 'কাঠামো',
43
- 'tab.layersHint': 'ডকুমেন্ট কাঠামো',
44
- 'tab.theme': 'থিম',
45
- 'tab.themeHint': 'গ্লোবাল স্টাইল',
46
- 'tab.data': 'ভেরিয়েবল',
47
- 'tab.dataHint': 'আপনার কোড থেকে দেওয়া ভেরিয়েবল',
48
-
49
- 'inspector.blockProperties': 'ব্লকের বৈশিষ্ট্য',
50
- 'inspector.sectionProperties': 'সেকশনের বৈশিষ্ট্য',
51
- 'inspector.title': 'ইন্সপেক্টর',
52
- 'inspector.sectionLabel': 'সেকশন',
53
- 'inspector.nothingSelected': 'কিছু নির্বাচিত নয়',
54
- 'action.duplicateHint': 'নকল করুন — ⌘D',
55
- 'action.deleteHint': 'মুছুন ',
56
- 'inspector.emptyBody':
57
- 'ক্যানভাসে একটি সারি বা ব্লক নির্বাচন করে এখানে স্টাইল করুন। <strong style="color: var(--ed-text); font-weight: 600;">ব্লক</strong> ট্যাব থেকে ব্লক টেনে আনুন; সরাসরি সম্পাদনার জন্য যেকোনো লেখায় ডাবল-ক্লিক করুন।',
58
- 'inspector.shortcuts': 'শর্টকাট',
59
- 'shortcut.undoRedo': '⌘Z / ⌘⇧Z পূর্বাবস্থা, পুনরায়',
60
- 'shortcut.duplicate': '⌘D — নির্বাচন নকল করুন',
61
- 'shortcut.delete': 'নির্বাচন মুছুন',
62
- 'shortcut.export': '⌘EHTML রপ্তানি করুন',
63
- 'shortcut.escape': 'ESC — নির্বাচন বাতিল, বন্ধ করুন',
64
-
65
- 'blocks.dragHint': 'ক্যানভাসে টেনে আনুন',
66
- 'blocks.count': '{count}টি ব্লক',
67
-
68
- 'rows.sectionLayouts': 'সেকশন লেআউট',
69
- 'rows.customMarkup': 'কাস্টম মার্কআপ',
70
- 'rows.htmlRowHint': 'টেনে আনুন, বা যোগ করতে ক্লিক করুন — একটি ফুল-ব্লিড সারি যা আপনি raw HTML দিয়ে পূরণ করেন',
71
- 'rows.rawHtmlSection': 'Raw HTML সেকশন',
72
- 'rows.rawHtmlDesc': 'ফুল-ব্লিড সেকশন, আপনার নিজস্ব মার্কআপ, তবুও টানা যায়',
73
- 'rows.canvasModel': 'ক্যানভাস মডেল',
74
- 'rows.modeRowBased': 'সারি-ভিত্তিক',
75
- 'rows.modeFreeStack': 'ফ্রি স্ট্যাক',
76
- 'rows.hintRows':
77
- 'সেকশন-ভিত্তিক: প্রথমে একটি লেআউট রাখুন, তারপর এর কলামে ব্লক রাখুন — প্রতিটি সেকশনের নিজস্ব ব্যাকগ্রাউন্ড, বর্ডার, ফ্লেক্স বা গ্রিড সেটিংস থাকে।',
78
- 'rows.hintStack': 'ফ্রি স্ট্যাক: লেআউট ছাড়াই — আপনি যে ব্লকই রাখুন না কেন তা নিজেই একটি পূর্ণ-প্রস্থ সেকশন হয়ে ক্রমানুসারে সাজে।',
79
-
80
-
81
- 'files.libraryCount': 'লাইব্রেরি — {count}টি ফাইল',
82
- 'files.openManager': 'ফাইল ম্যানেজার খুলুন',
83
- 'files.dragToCanvas': 'একটি ইমেজ ব্লক হিসেবে বসাতে যেকোনো ফাইল সরাসরি ক্যানভাসে টেনে আনুন।',
84
-
85
- 'layers.structure': 'কাঠামো',
86
- 'layers.sectionSingle': 'সেকশন',
87
- 'layers.sectionMulti': 'সেকশন · {count}টি কলাম',
88
- 'layers.blockCount': '{count}টি ব্লক',
89
-
90
- 'theme.globalStyles': 'গ্লোবাল স্টাইল',
91
-
92
- 'vars.title': 'ভেরিয়েবল',
93
- 'vars.fromCode': 'আপনার কোড থেকে {count}টি',
94
- 'vars.declaredNote': 'আপনার অ্যাপ্লিকেশন দ্বারা ঘোষিত — ক্যানভাস সবসময় টোকেন দেখায়, কখনো মান নয়।',
95
- 'vars.filterPlaceholder': 'ভেরিয়েবল ফিল্টার করুন…',
96
- 'vars.insertHint': 'নির্বাচিত টেক্সট, হেডিং বা বাটনে বসাতে ক্লিক করুন',
97
- 'vars.insert': 'বসান',
98
- 'vars.noMatch': 'সেই ফিল্টারের সাথে কোনো ভেরিয়েবল মেলেনি।',
99
- 'vars.noneDeclared': 'আপনার অ্যাপ্লিকেশন এখনো কোনো ভেরিয়েবল ঘোষণা করেনি।',
100
- 'vars.rteHint': 'টেক্সট সম্পাদনার সময় আপনি ইনলাইন টুলবারের ড্রপডাউন থেকেও ভেরিয়েবল বেছে নিতে পারেন।',
101
-
102
- 'modal.fileManager': 'ফাইল ম্যানেজার',
103
- 'modal.assetsTitle': 'অ্যাসেট',
104
- 'modal.replaceImage': 'ইমেজ প্রতিস্থাপন করুন',
105
- 'library.searchPlaceholder': 'ফাইল খুঁজুন…',
106
- 'action.upload': 'আপলোড',
107
- 'library.clickToPlace': 'বসাতে একটি ফাইলে ক্লিক করুন · অথবা ক্যানভাসে ফাইল টেনে আনুন',
108
- 'library.clickToReplace': 'নির্বাচিত ইমেজ প্রতিস্থাপন করতে একটি ফাইলে ক্লিক করুন',
109
- 'library.storageLabel': '{count}টি ফাইল · {size}',
110
- 'library.folders': 'ফোল্ডার',
111
- 'library.dropHint': 'আপলোড করতে এখানে ইমেজ ফাইল ড্রপ করুন — অথবা আপলোড বোতাম ব্যবহার করুন।',
112
- 'library.deleteFileHint': 'ফাইল মুছুন',
113
- 'library.del': 'মুছুন',
114
- 'toast.assetDeleted': '{name} মুছে ফেলা হয়েছে',
115
-
116
- 'modal.export': 'রপ্তানি',
117
- 'modal.exportTitle': 'টেবিল-ভিত্তিক ইমেইল HTML',
118
- 'export.copy': 'কপি',
119
- 'export.copied': 'কপি হয়েছে',
120
- 'action.download': 'ডাউনলোড',
121
- 'export.meta': '{kb} KB · টেবিল + ইনলাইন স্টাইল · Outlook-নিরাপদ প্রস্থ',
122
-
123
- 'modal.rawHtmlTitle': 'Raw HTML, লাইভ প্রিভিউ',
124
- 'code.statusEdited': 'কোড ভিউ সম্পাদিতপ্রিভিউ লাইভ, এখনো প্রয়োগ হয়নি',
125
- 'code.statusSynced': 'কোড ভিউ ক্যানভাসের সাথে সিঙ্ক করা আছে',
126
- 'action.reload': 'রিলোড',
127
- 'action.reloadHint': 'ক্যানভাস থেকে সোর্স পুনরায় লোড করুন',
128
- 'action.applyToCanvas': 'ক্যানভাসে প্রয়োগ করুন',
129
- 'action.applyToCanvasHint': 'সোর্সটি সম্পাদনাযোগ্য সারিতে পার্স করুন',
130
- 'action.closeWithoutApplyingHint': 'প্রয়োগ না করে বন্ধ করুন',
131
- 'code.source': 'সোর্স',
132
- 'code.livePreview': 'লাইভ প্রিভিউ',
133
- 'code.liveHtmlPreviewTitle': 'লাইভ HTML প্রিভিউ',
134
- 'code.applyNote':
135
- 'প্রয়োগ করলে প্রতিটি টেবিল সারি একটি ক্যানভাস সারিতে পার্স হয় যা আপনি এখনও নির্বাচন, পুনর্বিন্যাস ও মুছতে পারবেন — হাতে-লেখা মার্কআপ অক্ষত থাকে।',
136
- 'code.meta': '{kb} KB · {lines}টি লাইন',
137
- 'toast.sourceReloaded': 'ক্যানভাস থেকে সোর্স পুনরায় লোড হয়েছে',
138
- 'toast.sourceAppliedOne': 'সোর্স প্রয়োগ হয়েছে ক্যানভাসে ১টি সারি',
139
- 'toast.sourceAppliedMany': 'সোর্স প্রয়োগ হয়েছে — ক্যানভাসে {rows}টি সারি',
140
- 'toast.parseError': 'সেই HTML পার্স করা যায়নি',
141
-
142
- 'modal.copyAssist': 'কপি সহায়ক',
143
- 'modal.draftCopyTitle': 'এই ক্যাম্পেইনের জন্য কপি লিখুন',
144
- 'ai.goal': 'লক্ষ্য',
145
- 'ai.tone': 'সুর',
146
- 'ai.briefLabel': 'এই ইমেইলটি কী সম্পর্কে?',
147
- 'ai.briefPlaceholder': 'যেমন: শরৎকালীন আউটারওয়্যার, সাবস্ক্রাইবারদের জন্য ১৫% ছাড়, $১৫০-এর উপরে ফ্রি শিপিং',
148
- 'ai.generate': 'কপি তৈরি করুন',
149
- 'ai.writing': 'লেখা হচ্ছে…',
150
- 'ai.kindHeadline': 'হেডলাইন',
151
- 'ai.kindBody': 'মূল লেখা',
152
- 'ai.kindButton': 'বাটন লেবেল',
153
- 'ai.actionInsertHeading': 'হেডিং হিসেবে বসান',
154
- 'ai.actionInsertText': 'টেক্সট ব্লক হিসেবে বসান',
155
- 'ai.actionInsertButton': 'বাটন হিসেবে বসান',
156
- 'toast.headingAdded': 'হেডিং যোগ হয়েছে',
157
- 'toast.textBlockAdded': 'টেক্সট ব্লক যোগ হয়েছে',
158
- 'toast.buttonAdded': 'বাটন যোগ হয়েছে',
159
-
160
- 'preview.kickerMobile': 'প্রিভিউ মোবাইল ৩৭৫px',
161
- 'preview.kickerDark': 'প্রিভিউ — ডার্ক ইনবক্স',
162
- 'preview.kickerDesktop': 'প্রিভিউ — ডেস্কটপ {width}px',
163
- 'action.close': 'বন্ধ করুন',
164
-
165
- 'toast.duplicated': 'নকল করা হয়েছে',
166
- 'toast.fileUploadedOne': '১টি ফাইল আপলোড হয়েছে',
167
- 'toast.fileUploadedMany': '{count}টি ফাইল আপলোড হয়েছে',
168
- 'toast.imageReplaced': 'ইমেজ প্রতিস্থাপিত হয়েছে',
169
- 'toast.imageAdded': 'ক্যানভাসে ইমেজ যোগ হয়েছে',
170
- 'toast.htmlCopied': 'HTML ক্লিপবোর্ডে কপি হয়েছে',
171
- 'toast.templateLoaded': '{name} লোড হয়েছে',
172
- 'toast.snippetDefaultLabel': 'স্নিপেট',
173
- 'toast.snippetInserted': '{name} বসানো হয়েছে',
174
- 'toast.snippetCopied': '{name} কপি হয়েছে — বসাতে একটি টেক্সট ব্লক নির্বাচন করুন',
175
- };
176
-
1
+ /**
2
+ * Bangla (বাংলা) — `bn`.
3
+ *
4
+ * AI-drafted, not reviewed by a native speaker. Correctable one key at a
5
+ * time via `.messages` overrides -- `createTranslator` falls back to
6
+ * English per-key, so a partial fix is safe to ship incrementally.
7
+ */
8
+ export const BN = {
9
+ 'action.undoHint': 'পূর্বাবস্থায় ফেরান — ⌘Z',
10
+ 'action.redoHint': 'পুনরায় করুন — ⌘⇧Z',
11
+ 'action.chromeToDark': 'ডার্ক',
12
+ 'action.chromeToLight': 'লাইট',
13
+ 'action.chromeHint': 'সম্পাদক থিম লাইট/ডার্ক',
14
+ 'action.chromeHintToDark': 'ডার্ক মোড',
15
+ 'action.chromeHintToLight': 'লাইট মোড',
16
+ 'action.aiDraft': 'ড্রাফট',
17
+ 'action.aiDraftHint': 'AI দিয়ে ইমেইলের কনটেন্ট লিখুন',
18
+ 'action.code': 'কোড',
19
+ 'action.codeHint': 'লাইভ প্রিভিউসহ HTML সম্পাদনা করুন',
20
+ 'action.preview': 'প্রিভিউ',
21
+ 'action.previewHint': 'ইমেইলের প্রিভিউ দেখুন',
22
+ 'action.export': 'রপ্তানি',
23
+ 'action.exportHint': 'আপনার ইমেইল রপ্তানি করুন',
24
+
25
+ 'device.desktop': 'ডেস্কটপ',
26
+ 'device.desktopHint': 'ডেস্কটপ প্রস্থ',
27
+ 'device.mobile': 'মোবাইল',
28
+ 'device.mobileHint': 'মোবাইল প্রস্থ',
29
+
30
+ 'status.autosaveOn': 'অটোসেভ চালু',
31
+ 'status.saved': 'সংরক্ষিত হয়েছে {time}',
32
+ 'status.saveFailed': 'সংরক্ষণ হয়নি স্টোরেজ পূর্ণ',
33
+
34
+ 'canvas.meta': '{rows}টি সারি · {blocks}টি ব্লক · {width}px',
35
+
36
+ 'tab.design': 'স্টাইল',
37
+ 'tab.designHint': 'নির্বাচিত অংশ স্টাইল করুন',
38
+ 'tab.blocks': 'ব্লক',
39
+ 'tab.blocksHint': 'কন্টেন্ট ব্লকভেরিয়েবল',
40
+ 'tab.rows': 'সেকশন',
41
+ 'tab.rowsHint': 'সেকশন লেআউট ও ক্যানভাস মডেল',
42
+ 'tab.files': 'ফাইল',
43
+ 'tab.filesHint': 'অ্যাসেট লাইব্রেরি',
44
+ 'tab.layers': 'কাঠামো',
45
+ 'tab.layersHint': 'ডকুমেন্ট কাঠামো',
46
+ 'tab.settings': 'সেটিংস',
47
+ 'tab.settingsHint': 'ইমেইল সেটিংস',
48
+ 'tab.data': 'ভেরিয়েবল',
49
+ 'tab.dataHint': 'আপনার কোড থেকে দেওয়া ভেরিয়েবল',
50
+
51
+ 'inspector.blockProperties': 'ব্লকের বৈশিষ্ট্য',
52
+ 'inspector.sectionProperties': 'সেকশনের বৈশিষ্ট্য',
53
+ 'inspector.title': 'ইন্সপেক্টর',
54
+ 'inspector.sectionLabel': 'সেকশন',
55
+ 'inspector.nothingSelected': 'কিছু নির্বাচিত নয়',
56
+ 'action.duplicateHint': 'নকল করুন — ⌘D',
57
+ 'action.deleteHint': 'মুছুন ',
58
+ 'inspector.emptyBody':
59
+ 'ক্যানভাসে একটি সারি বা ব্লক নির্বাচন করে এখানে স্টাইল করুন। <strong style="color: var(--ed-text); font-weight: 600;">ব্লক</strong> ট্যাব থেকে ব্লক টেনে আনুন; সরাসরি সম্পাদনার জন্য যেকোনো লেখায় ডাবল-ক্লিক করুন।',
60
+ 'inspector.shortcuts': 'শর্টকাট',
61
+ 'shortcut.undoRedo': '⌘Z / ⌘⇧Z পূর্বাবস্থা, পুনরায়',
62
+ 'shortcut.duplicate': '⌘Dনির্বাচন নকল করুন',
63
+ 'shortcut.delete': ' — নির্বাচন মুছুন',
64
+ 'shortcut.export': '⌘E — HTML রপ্তানি করুন',
65
+ 'shortcut.escape': 'ESC নির্বাচন বাতিল, বন্ধ করুন',
66
+
67
+ 'blocks.dragHint': 'ক্যানভাসে টেনে আনুন',
68
+ 'blocks.count': '{count}টি ব্লক',
69
+
70
+ 'rows.sectionLayouts': 'সেকশন লেআউট',
71
+ 'rows.customMarkup': 'কাস্টম মার্কআপ',
72
+ 'rows.htmlRowHint': 'টেনে আনুন, বা যোগ করতে ক্লিক করুন — একটি ফুল-ব্লিড সারি যা আপনি raw HTML দিয়ে পূরণ করেন',
73
+ 'rows.rawHtmlSection': 'Raw HTML সেকশন',
74
+ 'rows.rawHtmlDesc': 'ফুল-ব্লিড সেকশন, আপনার নিজস্ব মার্কআপ, তবুও টানা যায়',
75
+ 'rows.canvasModel': 'ক্যানভাস মডেল',
76
+ 'rows.modeRowBased': 'সারি-ভিত্তিক',
77
+ 'rows.modeFreeStack': 'ফ্রি স্ট্যাক',
78
+ 'rows.hintRows':
79
+ 'সেকশন-ভিত্তিক: প্রথমে একটি লেআউট রাখুন, তারপর এর কলামে ব্লক রাখুন — প্রতিটি সেকশনের নিজস্ব ব্যাকগ্রাউন্ড, বর্ডার, ফ্লেক্স বা গ্রিড সেটিংস থাকে।',
80
+ 'rows.hintStack': 'ফ্রি স্ট্যাক: লেআউট ছাড়াই — আপনি যে ব্লকই রাখুন না কেন তা নিজেই একটি পূর্ণ-প্রস্থ সেকশন হয়ে ক্রমানুসারে সাজে।',
81
+
82
+ 'files.libraryCount': 'লাইব্রেরি {count}টি ফাইল',
83
+ 'files.openManager': 'ফাইল ম্যানেজার খুলুন',
84
+ 'files.dragToCanvas': 'একটি ইমেজ ব্লক হিসেবে বসাতে যেকোনো ফাইল সরাসরি ক্যানভাসে টেনে আনুন।',
85
+
86
+ 'layers.structure': 'কাঠামো',
87
+ 'layers.sectionSingle': 'সেকশন',
88
+ 'layers.sectionMulti': 'সেকশন · {count}টি কলাম',
89
+ 'layers.column': 'কলাম {index}',
90
+ 'layers.blockCount': '{count}টি ব্লক',
91
+
92
+ 'vars.title': 'ভেরিয়েবল',
93
+ 'vars.fromCode': 'আপনার কোড থেকে {count}টি',
94
+ 'vars.declaredNote': 'আপনার অ্যাপ্লিকেশন দ্বারা ঘোষিত — ক্যানভাস সবসময় টোকেন দেখায়, কখনো মান নয়।',
95
+ 'vars.filterPlaceholder': 'ভেরিয়েবল ফিল্টার করুন…',
96
+ 'vars.insertHint': 'নির্বাচিত টেক্সট, হেডিং বা বাটনে বসাতে ক্লিক করুন',
97
+ 'vars.insert': 'বসান',
98
+ 'vars.noMatch': 'সেই ফিল্টারের সাথে কোনো ভেরিয়েবল মেলেনি।',
99
+ 'vars.noneDeclared': 'আপনার অ্যাপ্লিকেশন এখনো কোনো ভেরিয়েবল ঘোষণা করেনি।',
100
+ 'vars.rteHint': 'টেক্সট সম্পাদনার সময় আপনি ইনলাইন টুলবারের ড্রপডাউন থেকেও ভেরিয়েবল বেছে নিতে পারেন।',
101
+
102
+ 'modal.fileManager': 'ফাইল ম্যানেজার',
103
+ 'modal.assetsTitle': 'অ্যাসেট',
104
+ 'modal.replaceImage': 'ইমেজ প্রতিস্থাপন করুন',
105
+ 'library.searchPlaceholder': 'ফাইল খুঁজুন…',
106
+ 'action.upload': 'আপলোড',
107
+ 'library.clickToPlace': 'বসাতে একটি ফাইলে ক্লিক করুন · অথবা ক্যানভাসে ফাইল টেনে আনুন',
108
+ 'library.clickToReplace': 'নির্বাচিত ইমেজ প্রতিস্থাপন করতে একটি ফাইলে ক্লিক করুন',
109
+ 'library.storageLabel': '{count}টি ফাইল · {size}',
110
+ 'library.folders': 'ফোল্ডার',
111
+ 'library.dropHint': 'আপলোড করতে এখানে ইমেজ ফাইল ড্রপ করুন — অথবা আপলোড বোতাম ব্যবহার করুন।',
112
+ 'library.deleteFileHint': 'ফাইল মুছুন',
113
+ 'library.del': 'মুছুন',
114
+ 'toast.assetDeleted': '{name} মুছে ফেলা হয়েছে',
115
+ 'library.allFiles': 'সব ফাইল',
116
+ 'library.loadMore': 'আরও দেখুন',
117
+ 'library.empty': 'এখানে এখনও কোনো ফাইল নেই।',
118
+ 'storage.loading': 'ফাইল লোড হচ্ছে…',
119
+ 'storage.uploading': '{count}টি আপলোড হচ্ছে…',
120
+ 'storage.errLoadFailed': 'ফাইল লাইব্রেরি লোড করা যায়নি — {reason}',
121
+ 'storage.errNoLimits': 'আপলোড বন্ধ: এই অ্যাপ কোনো আপলোড সীমা নির্ধারণ করেনি।',
122
+ 'storage.errNoAccept': 'আপলোড বন্ধ: কোনো ফাইল ফরম্যাট অনুমোদন করা হয়নি।',
123
+ 'storage.errNoMaxBytes': 'আপলোড বন্ধ: সর্বোচ্চ ফাইল আকার নির্ধারণ করা হয়নি।',
124
+ 'storage.errTooLarge': '{name} এর আকার {size}সীমা {max}।',
125
+ 'storage.errFormat': '{name} একটি {type} ফাইল, যা এখানে অনুমোদিত নয়।',
126
+ 'storage.errSvg': '{name} একটি SVG, যা এই অ্যাপ গ্রহণ করে না।',
127
+ 'storage.errDimensions': '{name} এর মাপ {w}×{ht}px সীমা {maxW}×{maxH}px।',
128
+ 'storage.errTooMany': 'একসাথে সর্বোচ্চ {max}টি ফাইল আপলোড করা যায়।',
129
+ 'storage.errUnreadable': '{name} পাঠযোগ্য কোনো ছবি নয়।',
130
+ 'storage.errUploadFailed': '{name} আপলোড করা যায়নি — {reason}',
131
+ 'storage.errDeleteFailed': '{name} মুছে ফেলা যায়নি — {reason}',
132
+
133
+ 'modal.export': 'রপ্তানি',
134
+ 'modal.exportTitle': 'টেবিল-ভিত্তিক ইমেইল HTML',
135
+ 'export.copy': 'কপি',
136
+ 'export.copied': 'কপি হয়েছে',
137
+ 'action.download': 'ডাউনলোড',
138
+ 'export.meta': '{kb} KB · টেবিল + ইনলাইন স্টাইল · Outlook-নিরাপদ প্রস্থ',
139
+
140
+ 'modal.rawHtmlTitle': 'Raw HTML, লাইভ প্রিভিউ',
141
+ 'code.statusEdited': 'কোড ভিউ — সম্পাদিত — প্রিভিউ লাইভ, এখনো প্রয়োগ হয়নি',
142
+ 'code.statusSynced': 'কোড ভিউ — ক্যানভাসের সাথে সিঙ্ক করা আছে',
143
+ 'action.reload': 'রিলোড',
144
+ 'action.reloadHint': 'ক্যানভাস থেকে সোর্স পুনরায় লোড করুন',
145
+ 'action.applyToCanvas': 'ক্যানভাসে প্রয়োগ করুন',
146
+ 'action.applyToCanvasHint': 'সোর্সটি সম্পাদনাযোগ্য সারিতে পার্স করুন',
147
+ 'action.closeWithoutApplyingHint': 'প্রয়োগ না করে বন্ধ করুন',
148
+ 'code.source': 'সোর্স',
149
+ 'code.livePreview': 'লাইভ প্রিভিউ',
150
+ 'code.liveHtmlPreviewTitle': 'লাইভ HTML প্রিভিউ',
151
+ 'code.applyNote':
152
+ 'প্রয়োগ করলে প্রতিটি টেবিল সারি একটি ক্যানভাস সারিতে পার্স হয় যা আপনি এখনও নির্বাচন, পুনর্বিন্যাস ও মুছতে পারবেন — হাতে-লেখা মার্কআপ অক্ষত থাকে।',
153
+ 'code.meta': '{kb} KB · {lines}টি লাইন',
154
+ 'toast.sourceReloaded': 'ক্যানভাস থেকে সোর্স পুনরায় লোড হয়েছে',
155
+ 'toast.sourceAppliedOne': 'সোর্স প্রয়োগ হয়েছে — ক্যানভাসে ১টি সারি',
156
+ 'toast.sourceAppliedMany': 'সোর্স প্রয়োগ হয়েছে — ক্যানভাসে {rows}টি সারি',
157
+ 'toast.parseError': 'সেই HTML পার্স করা যায়নি',
158
+ 'modal.aiDraft': 'AI লেখার সহায়ক',
159
+ 'modal.aiDraftTitle': 'AI দিয়ে আপনার ইমেইল লিখুন',
160
+ 'ai.disclosure': 'আপনার সংক্ষিপ্ত বিবরণ থেকে AI পরামর্শ তৈরি করে। পাঠানোর আগে ফলাফল দেখে নিন ও সম্পাদনা করুন।',
161
+
162
+ 'ai.goal': 'লক্ষ্য',
163
+ 'ai.tone': 'সুর',
164
+ 'ai.briefLabel': 'এই ইমেইলটি কী সম্পর্কে?',
165
+ 'ai.briefPlaceholder': 'যেমন: শরৎকালীন আউটারওয়্যার, সাবস্ক্রাইবারদের জন্য ১৫% ছাড়, $১৫০-এর উপরে ফ্রি শিপিং',
166
+ 'ai.generate': 'কপি তৈরি করুন',
167
+ 'ai.writing': 'লেখা হচ্ছে…',
168
+ 'ai.kindHeadline': 'হেডলাইন',
169
+ 'ai.kindBody': 'মূল লেখা',
170
+ 'ai.kindButton': 'বাটন লেবেল',
171
+ 'ai.actionInsertHeading': 'হেডিং হিসেবে বসান',
172
+ 'ai.actionInsertText': 'টেক্সট ব্লক হিসেবে বসান',
173
+ 'ai.actionInsertButton': 'বাটন হিসেবে বসান',
174
+ 'toast.headingAdded': 'হেডিং যোগ হয়েছে',
175
+ 'toast.textBlockAdded': 'টেক্সট ব্লক যোগ হয়েছে',
176
+ 'toast.buttonAdded': 'বাটন যোগ হয়েছে',
177
+
178
+ 'preview.kickerMobile': 'প্রিভিউ — মোবাইল ৩৭৫px',
179
+ 'preview.kickerDesktop': 'প্রিভিউ — ডেস্কটপ {width}px',
180
+ 'action.close': 'বন্ধ করুন',
181
+
182
+ 'toast.duplicated': 'নকল করা হয়েছে',
183
+ 'toast.fileUploadedOne': '১টি ফাইল আপলোড হয়েছে',
184
+ 'toast.fileUploadedMany': '{count}টি ফাইল আপলোড হয়েছে',
185
+ 'toast.imageReplaced': 'ইমেজ প্রতিস্থাপিত হয়েছে',
186
+ 'toast.imageAdded': 'ক্যানভাসে ইমেজ যোগ হয়েছে',
187
+ 'toast.htmlCopied': 'HTML ক্লিপবোর্ডে কপি হয়েছে',
188
+ 'toast.templateLoaded': '{name} লোড হয়েছে',
189
+ 'toast.snippetDefaultLabel': 'স্নিপেট',
190
+ 'toast.snippetInserted': '{name} বসানো হয়েছে',
191
+ 'toast.snippetCopied': '{name} কপি হয়েছে — বসাতে একটি টেক্সট ব্লক নির্বাচন করুন',
192
+ 'rte.textStyle': 'লেখার স্টাইল',
193
+ 'rte.mergeTags': 'মার্জ ট্যাগ',
194
+ 'rte.noMergeTags': 'কোনো মার্জ ট্যাগ নেই',
195
+ 'rte.textColor': 'লেখার রং',
196
+ 'rte.highlightColor': 'হাইলাইট রং',
197
+ 'rte.removeHighlight': 'হাইলাইট সরান',
198
+ 'rte.clearFormatting': 'ফরম্যাটিং মুছুন',
199
+ 'action.downloadPng': 'PNG ডাউনলোড',
200
+ 'action.screenshot': 'স্ক্রিনশট',
201
+ 'action.screenshotHint': 'পুরো টেমপ্লেট ছবি হিসেবে দেখুন, তারপর ডাউনলোড করুন',
202
+ 'toast.pngSaved': 'স্ক্রিনশট ডাউনলোড হয়েছে',
203
+ 'toast.pngFailed': 'স্ক্রিনশট ব্যর্থ — একটি বাহ্যিক ছবি লোড করা যায়নি',
204
+ 'toast.pngCopied': 'স্ক্রিনশট ক্লিপবোর্ডে কপি হয়েছে',
205
+ 'toast.pngCopyFailed': 'এই ব্রাউজার ক্লিপবোর্ডে ছবি নিতে পারেনি',
206
+ 'story.kicker': 'স্ক্রিনশট',
207
+ 'story.rendering': 'স্ক্রিনশট তৈরি হচ্ছে',
208
+ 'story.renderingHint': 'প্রতিটি ব্লক 2× এ আঁকা হচ্ছে — লম্বা টেমপ্লেটে একটু সময় লাগে।',
209
+ 'story.failed': 'স্ক্রিনশট ব্যর্থ',
210
+ 'story.failedHint': 'টেমপ্লেটের একটি ছবি ক্যাপচারের জন্য লোড করা যায়নি।',
211
+ 'story.retry': 'আবার চেষ্টা করুন',
212
+ 'story.play': 'চালান',
213
+ 'story.pause': 'থামান',
214
+ 'story.replay': 'আবার চালান',
215
+ 'story.copy': 'কপি',
216
+ 'story.meta': '{w}×{h} · স্ক্রিন {i} / {n}',
217
+ 'footer.poweredBy': 'SELISE Blocks দ্বারা পরিচালিত © 2026',
218
+ };