@markopolo_ai_inc/markopolo-email-editor 1.0.3

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 (91) hide show
  1. package/README.md +63 -0
  2. package/build/asset-manifest.json +12 -0
  3. package/build/favicon.ico +0 -0
  4. package/build/index.html +1 -0
  5. package/build/logo192.png +0 -0
  6. package/build/logo512.png +0 -0
  7. package/build/manifest.json +25 -0
  8. package/build/robots.txt +3 -0
  9. package/build/static/css/main.588cb535.css +9 -0
  10. package/build/static/js/206.a4343501.chunk.js +1 -0
  11. package/build/static/js/main.053d366a.js +2 -0
  12. package/build/static/js/main.053d366a.js.LICENSE.txt +56 -0
  13. package/package.json +64 -0
  14. package/public/favicon.ico +0 -0
  15. package/public/index.html +50 -0
  16. package/public/logo192.png +0 -0
  17. package/public/logo512.png +0 -0
  18. package/public/manifest.json +25 -0
  19. package/public/robots.txt +3 -0
  20. package/src/App.js +15 -0
  21. package/src/components/EmailEditor/assets/App.css +339 -0
  22. package/src/components/EmailEditor/assets/Columns.css +309 -0
  23. package/src/components/EmailEditor/assets/Header.css +174 -0
  24. package/src/components/EmailEditor/assets/ImageBlock.css +12 -0
  25. package/src/components/EmailEditor/assets/Preview.css +30 -0
  26. package/src/components/EmailEditor/assets/RichText.css +199 -0
  27. package/src/components/EmailEditor/assets/RightSettings.css +520 -0
  28. package/src/components/EmailEditor/assets/Sidebar.css +195 -0
  29. package/src/components/EmailEditor/components/BlockItems/ButtonBlock.js +25 -0
  30. package/src/components/EmailEditor/components/BlockItems/DividerBlock.js +19 -0
  31. package/src/components/EmailEditor/components/BlockItems/HeadingBlock.js +16 -0
  32. package/src/components/EmailEditor/components/BlockItems/ImageBlock.js +28 -0
  33. package/src/components/EmailEditor/components/BlockItems/MenuBlock.js +52 -0
  34. package/src/components/EmailEditor/components/BlockItems/SocialLinkBlocks.js +26 -0
  35. package/src/components/EmailEditor/components/BlockItems/SpacerBlock.js +23 -0
  36. package/src/components/EmailEditor/components/BlockItems/TextBlock.js +16 -0
  37. package/src/components/EmailEditor/components/BlockItems/index.js +25 -0
  38. package/src/components/EmailEditor/components/ColorPicker/index.js +26 -0
  39. package/src/components/EmailEditor/components/Column/index.js +253 -0
  40. package/src/components/EmailEditor/components/Header/index.js +243 -0
  41. package/src/components/EmailEditor/components/LeftSideBar/index.js +253 -0
  42. package/src/components/EmailEditor/components/Main/index.js +281 -0
  43. package/src/components/EmailEditor/components/Preview/index.js +97 -0
  44. package/src/components/EmailEditor/components/RichText/Bold.js +37 -0
  45. package/src/components/EmailEditor/components/RichText/FontColor.js +39 -0
  46. package/src/components/EmailEditor/components/RichText/InsertOrderedList.js +36 -0
  47. package/src/components/EmailEditor/components/RichText/InsertUnorderedList.js +36 -0
  48. package/src/components/EmailEditor/components/RichText/Italic.js +36 -0
  49. package/src/components/EmailEditor/components/RichText/Link.js +99 -0
  50. package/src/components/EmailEditor/components/RichText/RichTextLayout.js +53 -0
  51. package/src/components/EmailEditor/components/RichText/Strikethrough.js +36 -0
  52. package/src/components/EmailEditor/components/RichText/TextAlign.js +58 -0
  53. package/src/components/EmailEditor/components/RichText/Underline.js +36 -0
  54. package/src/components/EmailEditor/components/RichText/index.js +210 -0
  55. package/src/components/EmailEditor/components/RightSetting/index.js +126 -0
  56. package/src/components/EmailEditor/components/StyleSettings/ButtonStyleSettings.js +141 -0
  57. package/src/components/EmailEditor/components/StyleSettings/ColumnStyleSettings.js +241 -0
  58. package/src/components/EmailEditor/components/StyleSettings/DividerStyleSettings.js +111 -0
  59. package/src/components/EmailEditor/components/StyleSettings/HeadingStyleSettings.js +162 -0
  60. package/src/components/EmailEditor/components/StyleSettings/ImageStyleSettings.js +217 -0
  61. package/src/components/EmailEditor/components/StyleSettings/MenuStyleSettings.js +177 -0
  62. package/src/components/EmailEditor/components/StyleSettings/PaddingSettings.js +30 -0
  63. package/src/components/EmailEditor/components/StyleSettings/SocialLinkSettings.js +250 -0
  64. package/src/components/EmailEditor/components/StyleSettings/SpacerStyleSettings.js +38 -0
  65. package/src/components/EmailEditor/components/StyleSettings/TextStyleSettings.js +108 -0
  66. package/src/components/EmailEditor/components/StyleSettings/index.js +32 -0
  67. package/src/components/EmailEditor/configs/getBlockConfigsList.js +263 -0
  68. package/src/components/EmailEditor/configs/getColumnConfigFunc.js +59 -0
  69. package/src/components/EmailEditor/configs/getColumnsSettings.js +246 -0
  70. package/src/components/EmailEditor/configs/useDataSource.js +19 -0
  71. package/src/components/EmailEditor/index.js +93 -0
  72. package/src/components/EmailEditor/reducers/index.js +173 -0
  73. package/src/components/EmailEditor/translation/en.js +166 -0
  74. package/src/components/EmailEditor/translation/index.js +39 -0
  75. package/src/components/EmailEditor/translation/zh.js +166 -0
  76. package/src/components/EmailEditor/utils/classNames.js +5 -0
  77. package/src/components/EmailEditor/utils/dataToHTML.js +323 -0
  78. package/src/components/EmailEditor/utils/exportValidation.js +296 -0
  79. package/src/components/EmailEditor/utils/helpers.js +48 -0
  80. package/src/components/EmailEditor/utils/pexels.js +20 -0
  81. package/src/components/EmailEditor/utils/useSection.js +24 -0
  82. package/src/components/EmailEditor/utils/useStyleLayout.js +82 -0
  83. package/src/index.css +99 -0
  84. package/src/index.js +15 -0
  85. package/src/logo.svg +1 -0
  86. package/src/pages/AppPage/index.js +10 -0
  87. package/src/pages/Dashboard/Header.js +192 -0
  88. package/src/pages/Dashboard/defaultBlockList.json +1758 -0
  89. package/src/pages/Dashboard/index.js +48 -0
  90. package/src/reportWebVitals.js +13 -0
  91. package/src/setupTests.js +5 -0
@@ -0,0 +1,246 @@
1
+ const getColumnsSettings = (t) => {
2
+ const defaultStyles = {
3
+ desktop: {
4
+ textAlign: "center",
5
+ paddingTop: 12,
6
+ paddingBottom: 12,
7
+ paddingLeft: 12,
8
+ paddingRight: 12,
9
+ },
10
+ mobile: {},
11
+ };
12
+
13
+ return {
14
+ full: {
15
+ columns: 1,
16
+ type: "full",
17
+ children: [
18
+ {
19
+ name: t("drag_block_here"),
20
+ width: "100%",
21
+ styles: defaultStyles,
22
+ key: "empty",
23
+ },
24
+ ],
25
+ },
26
+ "1-1": {
27
+ columns: 2,
28
+ type: "1-1",
29
+ children: Array.from({ length: 2 }).map(() => {
30
+ return {
31
+ name: t("content"),
32
+ key: "content",
33
+ width: "50%",
34
+ styles: {
35
+ key: "column",
36
+ desktop: {
37
+ backgroundColor: "transparent",
38
+ paddingTop: 0,
39
+ paddingLeft: 0,
40
+ paddingRight: 0,
41
+ paddingBottom: 0,
42
+ contentBackground: "transparent",
43
+ },
44
+ mobile: {},
45
+ },
46
+ children: [
47
+ {
48
+ name: t("drag_block_here"),
49
+ key: "empty",
50
+ width: "100%",
51
+ styles: defaultStyles,
52
+ },
53
+ ],
54
+ };
55
+ }),
56
+ },
57
+ "1-1-1": {
58
+ columns: 3,
59
+ type: "1-1-1",
60
+ children: Array.from({ length: 3 }).map(() => {
61
+ return {
62
+ name: t("content"),
63
+ key: "content",
64
+ width: "33.3%",
65
+ styles: {
66
+ key: "column",
67
+ desktop: {
68
+ backgroundColor: "transparent",
69
+ paddingTop: 0,
70
+ paddingLeft: 0,
71
+ paddingRight: 0,
72
+ paddingBottom: 0,
73
+ contentBackground: "transparent",
74
+ },
75
+ mobile: {},
76
+ },
77
+ children: [
78
+ {
79
+ name: t("drag_block_here"),
80
+ key: "empty",
81
+ width: "100%",
82
+ styles: defaultStyles,
83
+ },
84
+ ],
85
+ };
86
+ }),
87
+ },
88
+ "1-1-1-1": {
89
+ columns: 4,
90
+ type: "1-1-1-1",
91
+ children: Array.from({ length: 4 }).map(() => {
92
+ return {
93
+ name: t("content"),
94
+ key: "content",
95
+ width: "25%",
96
+ styles: {
97
+ key: "column",
98
+ desktop: {
99
+ backgroundColor: "transparent",
100
+ paddingTop: 0,
101
+ paddingLeft: 0,
102
+ paddingRight: 0,
103
+ paddingBottom: 0,
104
+ contentBackground: "transparent",
105
+ },
106
+ mobile: {},
107
+ },
108
+ children: [
109
+ {
110
+ name: t("drag_block_here"),
111
+ key: "empty",
112
+ width: "100%",
113
+ styles: defaultStyles,
114
+ },
115
+ ],
116
+ };
117
+ }),
118
+ },
119
+ "1-2": {
120
+ columns: 2,
121
+ type: "1-2",
122
+ children: Array.from({ length: 2 }).map((item, index) => {
123
+ return {
124
+ name: t("content"),
125
+ key: "content",
126
+ width: index === 0 ? "33.3%" : "66.6%",
127
+ styles: {
128
+ key: "column",
129
+ desktop: {
130
+ backgroundColor: "transparent",
131
+ paddingTop: 0,
132
+ paddingLeft: 0,
133
+ paddingRight: 0,
134
+ paddingBottom: 0,
135
+ contentBackground: "transparent",
136
+ },
137
+ mobile: {},
138
+ },
139
+ children: [
140
+ {
141
+ name: t("drag_block_here"),
142
+ key: "empty",
143
+ width: "100%",
144
+ styles: defaultStyles,
145
+ },
146
+ ],
147
+ };
148
+ }),
149
+ },
150
+ "2-1": {
151
+ columns: 2,
152
+ type: "2-1",
153
+ children: Array.from({ length: 2 }).map((item, index) => {
154
+ return {
155
+ name: t("content"),
156
+ key: "content",
157
+ width: index === 0 ? "66.6%" : "33.3%",
158
+ styles: {
159
+ key: "column",
160
+ desktop: {
161
+ backgroundColor: "transparent",
162
+ paddingTop: 0,
163
+ paddingLeft: 0,
164
+ paddingRight: 0,
165
+ paddingBottom: 0,
166
+ contentBackground: "transparent",
167
+ },
168
+ mobile: {},
169
+ },
170
+ children: [
171
+ {
172
+ name: t("drag_block_here"),
173
+ key: "empty",
174
+ width: "100%",
175
+ styles: defaultStyles,
176
+ },
177
+ ],
178
+ };
179
+ }),
180
+ },
181
+ "2-4-2-4": {
182
+ columns: 4,
183
+ type: "2-4-2-4",
184
+ children: Array.from({ length: 4 }).map((item, index) => {
185
+ return {
186
+ name: t("content"),
187
+ key: "content",
188
+ width: index % 2 === 0 ? "16.6%" : "33.3%",
189
+ styles: {
190
+ key: "column",
191
+ desktop: {
192
+ backgroundColor: "transparent",
193
+ paddingTop: 0,
194
+ paddingLeft: 0,
195
+ paddingRight: 0,
196
+ paddingBottom: 0,
197
+ contentBackground: "transparent",
198
+ },
199
+ mobile: {},
200
+ },
201
+ children: [
202
+ {
203
+ name: t("drag_block_here"),
204
+ key: "empty",
205
+ width: "100%",
206
+ styles: defaultStyles,
207
+ },
208
+ ],
209
+ };
210
+ }),
211
+ },
212
+ "4-2-4-2": {
213
+ columns: 4,
214
+ type: "4-2-4-2",
215
+ children: Array.from({ length: 4 }).map((item, index) => {
216
+ return {
217
+ name: t("content"),
218
+ key: "content",
219
+ width: index % 2 === 0 ? "33.3%" : "16.6%",
220
+ styles: {
221
+ key: "column",
222
+ desktop: {
223
+ backgroundColor: "transparent",
224
+ paddingTop: 0,
225
+ paddingLeft: 0,
226
+ paddingRight: 0,
227
+ paddingBottom: 0,
228
+ contentBackground: "transparent",
229
+ },
230
+ mobile: {},
231
+ },
232
+ children: [
233
+ {
234
+ name: t("drag_block_here"),
235
+ key: "empty",
236
+ width: "100%",
237
+ styles: defaultStyles,
238
+ },
239
+ ],
240
+ };
241
+ }),
242
+ },
243
+ };
244
+ };
245
+
246
+ export default getColumnsSettings;
@@ -0,0 +1,19 @@
1
+ import useTranslation from "../translation";
2
+ import getBlockConfigsList from "./getBlockConfigsList";
3
+ import getColumnsSettings from "./getColumnsSettings";
4
+ import getColumnConfigFunc from "./getColumnConfigFunc";
5
+
6
+ const useDataSource = () => {
7
+ const { t } = useTranslation();
8
+ const blockConfigsList = getBlockConfigsList(t);
9
+ const columnsSetting = getColumnsSettings(t);
10
+ const getColumnConfig = getColumnConfigFunc(t);
11
+
12
+ return {
13
+ blockConfigsList,
14
+ columnsSetting,
15
+ getColumnConfig,
16
+ };
17
+ };
18
+
19
+ export default useDataSource;
@@ -0,0 +1,93 @@
1
+ import { useReducer, forwardRef, useImperativeHandle } from "react";
2
+ import {
3
+ GlobalContext,
4
+ reducer,
5
+ setBlockList,
6
+ setActionType,
7
+ setPreviewMode,
8
+ setCurrentItem,
9
+ setBodySettings,
10
+ setIsDragStart,
11
+ setSelectionRange,
12
+ setTextRange,
13
+ defaultState,
14
+ setLanguage,
15
+ setLanguageLibraries,
16
+ } from "./reducers";
17
+ import dataToHtml from "./utils/dataToHTML";
18
+ import Main from "./components/Main";
19
+ import "./assets/App.css";
20
+
21
+ const EmailEditor = forwardRef(
22
+ ({ defaultBlockList, defaultBodySettings, language = "en", customLanguageLibraries }, ref) => {
23
+ const [state, dispatch] = useReducer(reducer, {
24
+ ...defaultState,
25
+ blockList: defaultBlockList ? defaultBlockList : defaultState.blockList,
26
+ bodySettings: defaultBodySettings ? defaultBodySettings : defaultState.bodySettings,
27
+ languageLibraries: customLanguageLibraries,
28
+ });
29
+ useImperativeHandle(ref, () => ({
30
+ blockList: state.blockList,
31
+ bodySettings: state.bodySettings,
32
+ actionType: state.actionType,
33
+ exportHtml: () =>
34
+ dataToHtml({
35
+ bodySettings: state.bodySettings,
36
+ blockList: state.blockList,
37
+ }),
38
+ }));
39
+
40
+ return (
41
+ <GlobalContext.Provider
42
+ value={{
43
+ blockList: state.blockList,
44
+ actionType: state.actionType,
45
+ previewMode: state.previewMode,
46
+ currentItem: state.currentItem,
47
+ bodySettings: state.bodySettings,
48
+ isDragStart: state.isDragStart,
49
+ selectionRange: state.selectionRange,
50
+ textRange: state.textRange,
51
+ language: state.language,
52
+ languageLibraries: state.languageLibraries,
53
+ setIsDragStart: (isDragStart) => {
54
+ dispatch(setIsDragStart(isDragStart));
55
+ },
56
+ setBodySettings: (bodySettings, actionType) => {
57
+ actionType && dispatch(setActionType(actionType));
58
+ dispatch(setBodySettings(bodySettings));
59
+ },
60
+ setBlockList: (blockList, actionType) => {
61
+ actionType && dispatch(setActionType(actionType));
62
+ dispatch(setBlockList(blockList));
63
+ },
64
+ setPreviewMode: (previewMode) => {
65
+ dispatch(setPreviewMode(previewMode));
66
+ },
67
+ setCurrentItem: (currentItem) => {
68
+ dispatch(setCurrentItem(currentItem));
69
+ },
70
+ setSelectionRange: (selectionRange) => {
71
+ dispatch(setSelectionRange(selectionRange));
72
+ },
73
+ setTextRange: (textRange) => {
74
+ dispatch(setTextRange(textRange));
75
+ },
76
+ setActionType: (actionType) => {
77
+ dispatch(setActionType(actionType));
78
+ },
79
+ setLanguage: (language) => {
80
+ dispatch(setLanguage(language));
81
+ },
82
+ setLanguageLibraries: (languageLibraries) => {
83
+ dispatch(setLanguageLibraries(languageLibraries));
84
+ },
85
+ }}
86
+ >
87
+ <Main language={language} />
88
+ </GlobalContext.Provider>
89
+ );
90
+ }
91
+ );
92
+
93
+ export default EmailEditor;
@@ -0,0 +1,173 @@
1
+ import { createContext } from "react";
2
+
3
+ const SET_BLOCK_LIST = "SET_BLOCK_LIST";
4
+ const SET_IS_DRAG_START = "SET_IS_DRAG_START";
5
+ const SET_ACTION_TYPE = "SET_ACTION_TYPE";
6
+ const SET_PREVIEW_MODE = "SET_PREVIEW_MODE";
7
+ const SET_CURRENT_ITEM = "SET_CURRENT_ITEM";
8
+ const SET_BODY_SETTINGS = "SET_BODY_SETTINGS";
9
+ const SET_SELECTION_RANGE = "SET_SELECTION_RANGE";
10
+ const SET_TEXT_RANGE = "SET_TEXT_RANGE";
11
+ const SET_LANGUAGE = "SET_LANGUAGE";
12
+ const SET_LANGUAGE_LIBRARIES = "SET_LANGUAGE_LIBRARIES";
13
+
14
+ export const setTextRange = (textRange) => {
15
+ return {
16
+ type: SET_TEXT_RANGE,
17
+ textRange: textRange,
18
+ };
19
+ };
20
+
21
+ export const setSelectionRange = (selectionRange) => {
22
+ return {
23
+ type: SET_SELECTION_RANGE,
24
+ selectionRange: selectionRange,
25
+ };
26
+ };
27
+
28
+ export const setBlockList = (blockList) => {
29
+ return {
30
+ type: SET_BLOCK_LIST,
31
+ blockList: blockList,
32
+ };
33
+ };
34
+
35
+ export const setIsDragStart = (isDragStart) => {
36
+ return {
37
+ type: SET_IS_DRAG_START,
38
+ isDragStart: isDragStart,
39
+ };
40
+ };
41
+
42
+ export const setActionType = (actionType) => {
43
+ return {
44
+ type: SET_ACTION_TYPE,
45
+ actionType: actionType,
46
+ };
47
+ };
48
+
49
+ export const setPreviewMode = (previewMode) => {
50
+ return {
51
+ type: SET_PREVIEW_MODE,
52
+ previewMode: previewMode,
53
+ };
54
+ };
55
+
56
+ export const setCurrentItem = (currentItem) => {
57
+ return {
58
+ type: SET_CURRENT_ITEM,
59
+ currentItem: currentItem,
60
+ };
61
+ };
62
+
63
+ export const setBodySettings = (bodySettings) => {
64
+ return {
65
+ type: SET_BODY_SETTINGS,
66
+ bodySettings: bodySettings,
67
+ };
68
+ };
69
+
70
+ export const setLanguage = (language) => {
71
+ return {
72
+ type: SET_LANGUAGE,
73
+ language: language,
74
+ };
75
+ };
76
+
77
+ export const setLanguageLibraries = (languageLibraries) => {
78
+ return {
79
+ type: SET_LANGUAGE_LIBRARIES,
80
+ languageLibraries: languageLibraries,
81
+ };
82
+ };
83
+
84
+ export const defaultLanguage = "en";
85
+ export const defaultBlockList = [];
86
+ export const defaultIsDragStart = false;
87
+ export const defaultActionType = "firstRender"; // firstRender, add, move, delete,edit, set_history_${index}, edit_${Date.now()}
88
+ export const defaultPreviewMode = "desktop";
89
+ export const defaultCurrentItem = null;
90
+ export const defaultBodySettings = {
91
+ preHeader: "",
92
+ contentWidth: 600,
93
+ styles: {
94
+ backgroundColor: "#f5f5f5",
95
+ color: "#152b2a",
96
+ fontFamily: "Arial",
97
+ },
98
+ };
99
+ export const defaultSelectionRange = null;
100
+ export const textRange = null;
101
+ export const defaultLanguageLibraries = {};
102
+
103
+ export const defaultState = {
104
+ blockList: defaultBlockList,
105
+ isDragStart: defaultIsDragStart,
106
+ actionType: defaultActionType,
107
+ previewMode: defaultPreviewMode,
108
+ currentItem: defaultCurrentItem,
109
+ bodySettings: defaultBodySettings,
110
+ selectionRange: defaultSelectionRange,
111
+ textRange: textRange,
112
+ language: defaultLanguage,
113
+ languageLibraries: defaultLanguageLibraries,
114
+ };
115
+
116
+ export const GlobalContext = createContext();
117
+
118
+ export function reducer(state, action) {
119
+ switch (action.type) {
120
+ case SET_BLOCK_LIST:
121
+ return {
122
+ ...state,
123
+ blockList: action.blockList,
124
+ };
125
+ case SET_IS_DRAG_START:
126
+ return {
127
+ ...state,
128
+ isDragStart: action.isDragStart,
129
+ };
130
+ case SET_ACTION_TYPE:
131
+ return {
132
+ ...state,
133
+ actionType: action.actionType,
134
+ };
135
+ case SET_PREVIEW_MODE:
136
+ return {
137
+ ...state,
138
+ previewMode: action.previewMode,
139
+ };
140
+ case SET_CURRENT_ITEM:
141
+ return {
142
+ ...state,
143
+ currentItem: action.currentItem,
144
+ };
145
+ case SET_BODY_SETTINGS:
146
+ return {
147
+ ...state,
148
+ bodySettings: action.bodySettings,
149
+ };
150
+ case SET_SELECTION_RANGE:
151
+ return {
152
+ ...state,
153
+ selectionRange: action.selectionRange,
154
+ };
155
+ case SET_TEXT_RANGE:
156
+ return {
157
+ ...state,
158
+ textRange: action.textRange,
159
+ };
160
+ case SET_LANGUAGE:
161
+ return {
162
+ ...state,
163
+ language: action.language,
164
+ };
165
+ case SET_LANGUAGE_LIBRARIES:
166
+ return {
167
+ ...state,
168
+ languageLibraries: action.languageLibraries,
169
+ };
170
+ default:
171
+ return state;
172
+ }
173
+ }
@@ -0,0 +1,166 @@
1
+ const en = {
2
+ drag_block_here: "Drag block here",
3
+ blocks: "Blocks",
4
+ photos: "Photos",
5
+ powered_by_pexels: "Powered by Pexels",
6
+ loading: "Loading...",
7
+ content: "Content",
8
+ body_settings: "Theme Settings",
9
+ pre_header: "Pre-header",
10
+ pre_header_description: "The pre-header is a short summary text that follows the subject line when viewing an email in the inbox.",
11
+ confirm: "Confirm",
12
+ cancel: "Cancel",
13
+ add_blocks: "Add blocks",
14
+
15
+ // column block
16
+ column: "Column",
17
+ columns: "Columns",
18
+ column_settings: "Column Settings",
19
+ column_styles: "Column Styles",
20
+ column_delete: "Delete Column",
21
+ column_delete_desc: "Are you sure you want to delete {{count}} extra columns? ",
22
+
23
+ // text block
24
+ text: "Text",
25
+ text_content: "This is a text, click to edit text",
26
+ text_settings: "Text Settings",
27
+ text_styles: "Text Styles",
28
+ text_align: "Text Align",
29
+
30
+ // heading block
31
+ heading: "Heading",
32
+ heading_content: "This is a heading, click to edit heading",
33
+ heading_settings: "Heading Settings",
34
+ heading_type: "Heading Type",
35
+
36
+ // button block
37
+ button: "Button",
38
+ button_settings: "Button Settings",
39
+ button_action: "Button Action",
40
+ button_styles: "Button Styles",
41
+ button_padding: "Button Padding",
42
+
43
+ // spacer block
44
+ spacer: "Spacer",
45
+ spacer_block: "SPACER BLOCK",
46
+ spacer_settings: "Spacer Settings",
47
+ // divider block
48
+ divider: "Divider",
49
+ divider_settings: "Divider Settings",
50
+ divider_type: "Divider Type",
51
+ divider_styles: "Divider Styles",
52
+
53
+ // image block
54
+ image: "Image",
55
+ image_action: "Image Action",
56
+ image_url: "Image URL",
57
+ image_alt: "Image Alt",
58
+ image_styles: "Image Styles",
59
+ image_settings: "Image Settings",
60
+ image_source: "Image source",
61
+ image_source_url: "Enter URL",
62
+ image_source_upload: "Upload image",
63
+ image_upload: "Upload",
64
+ image_upload_click: "Click to upload",
65
+
66
+ // menu block
67
+ menu: "Menu",
68
+ menu_settings: "Menu Settings",
69
+ menu_items: "Menu Items",
70
+ menu_item: "Menu Item",
71
+ menu_styles: "Menu Styles",
72
+ add_new_item: "Add New Item",
73
+ label: "Label",
74
+ page: "Page",
75
+ url: "URL",
76
+ target: "Target",
77
+ same_tab: "Same Tab",
78
+ new_tab: "New Tab",
79
+ separator: "Separator",
80
+ letter_spacing: "Letter Spacing",
81
+ link_color: "Link Color",
82
+
83
+ // social link block
84
+ social_link: "Social Link",
85
+ social_link_settings: "Social Link Settings",
86
+ add_social_link: "Add Social Link",
87
+ social_link_size: "Social Link Size",
88
+ social_links: "Social Links",
89
+
90
+ // colors
91
+ content_background_color: "Content Background Color",
92
+ background_color: "Background Color",
93
+ text_color: "Text Color",
94
+ email_theme_background_color: "Email Theme Background Color",
95
+ font_color: "Font Color",
96
+ button_color: "Button Color",
97
+ divider_color: "Divider Color",
98
+
99
+ //styles
100
+ action_type: "Action Type",
101
+ top: "Top",
102
+ right: "Right",
103
+ left: "Left",
104
+ bottom: "Bottom",
105
+ line_height: "Line Height",
106
+ link: "Link",
107
+ link_url: "Link URL",
108
+ padding_settings: "Padding Settings",
109
+ width: "Width",
110
+ height: "Height",
111
+ width_auto: "Width Auto",
112
+ font_size: "Font Size",
113
+ font_family: "Font Family",
114
+ solid: "Solid",
115
+ dotted: "Dotted",
116
+ dashed: "Dashed",
117
+ align: "Align",
118
+ spacing: "Spacing",
119
+
120
+ // Dashboard / export
121
+ export_html: "Export HTML",
122
+ export_json: "Export JSON",
123
+ language_zh: "中文",
124
+
125
+ // Export validation modal
126
+ export_validation_title: "Export validation",
127
+ export_validation_issues_found: "Issues found before export",
128
+ export_validation_errors: "Errors",
129
+ export_validation_warnings: "Warnings",
130
+ export_validation_info: "Info",
131
+ export_anyway: "Export anyway",
132
+ validation_body_content_width_invalid: "Body content width must be a positive number.",
133
+ validation_body_background_color_missing: "Theme background color is missing.",
134
+ validation_body_text_color_missing: "Theme text color is missing.",
135
+ validation_body_font_family_missing: "Theme font family is missing.",
136
+ validation_image_empty_src: "Image URL is empty; the image will not display.",
137
+ validation_image_invalid_src: "Image URL format is invalid.",
138
+ validation_image_empty_alt: "Image alt text is empty; consider adding for accessibility.",
139
+ validation_button_empty_link: "Button link URL is empty; will export as href=\"https://\".",
140
+ validation_button_invalid_link: "Button link URL format is invalid.",
141
+ validation_menu_empty_label: "Menu item label is empty; will show as \"Link\".",
142
+ validation_menu_empty_url: "Menu item URL is empty; will export as href=\"#\".",
143
+ validation_menu_invalid_url: "Menu item URL format is invalid.",
144
+ validation_menu_no_items: "Menu block has no items.",
145
+ validation_social_empty_link: "Social link URL is empty; will export as href=\"https://\".",
146
+ validation_social_invalid_link: "Social link URL format is invalid.",
147
+ validation_social_empty_icon: "Social link icon URL is empty; icon will not display.",
148
+ validation_social_invalid_icon: "Social link icon URL format is invalid.",
149
+ validation_social_no_links: "Social link block has no links.",
150
+
151
+ // Rich text tooltips
152
+ tooltip_bold: "Bold",
153
+ tooltip_italic: "Italic",
154
+ tooltip_underline: "Underline",
155
+ tooltip_strikethrough: "Strikethrough",
156
+ tooltip_align_left: "Align left",
157
+ tooltip_align_center: "Align center",
158
+ tooltip_align_right: "Align right",
159
+ tooltip_ordered_list: "Ordered list",
160
+ tooltip_unordered_list: "Unordered list",
161
+ tooltip_link: "Link",
162
+ tooltip_remove_link: "Remove link",
163
+ add_link_modal_title: "Add link",
164
+ };
165
+
166
+ export default en;