@flozy/editor 3.9.0 → 3.9.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 (111) hide show
  1. package/dist/Editor/CommonEditor.js +177 -109
  2. package/dist/Editor/Editor.css +8 -12
  3. package/dist/Editor/Elements/AI/AIInput.js +17 -18
  4. package/dist/Editor/Elements/AI/CustomSelect.js +19 -12
  5. package/dist/Editor/Elements/AI/PopoverAIInput.js +23 -28
  6. package/dist/Editor/Elements/AI/Styles.js +2 -1
  7. package/dist/Editor/Elements/AI/VoiceToText/AudioWave.js +73 -0
  8. package/dist/Editor/Elements/AI/VoiceToText/index.js +177 -0
  9. package/dist/Editor/Elements/AI/VoiceToText/style.js +40 -0
  10. package/dist/Editor/Elements/Accordion/AccordionSummary.js +4 -15
  11. package/dist/Editor/Elements/AppHeader/AppHeader.js +26 -4
  12. package/dist/Editor/Elements/Button/EditorButton.js +28 -16
  13. package/dist/Editor/Elements/Color Picker/ColorButtons.js +60 -17
  14. package/dist/Editor/Elements/Color Picker/ColorPicker.css +25 -1
  15. package/dist/Editor/Elements/Color Picker/ColorPicker.js +4 -4
  16. package/dist/Editor/Elements/Color Picker/Styles.js +2 -1
  17. package/dist/Editor/Elements/Form/Workflow/FormWorkflow.js +12 -3
  18. package/dist/Editor/Elements/Form/Workflow/UserInputs.js +2 -1
  19. package/dist/Editor/Elements/Grid/Grid.js +27 -3
  20. package/dist/Editor/Elements/Grid/GridItem.js +3 -1
  21. package/dist/Editor/Elements/Link/Link.js +6 -1
  22. package/dist/Editor/Elements/Link/LinkButton.js +4 -2
  23. package/dist/Editor/Elements/Link/LinkPopup.js +10 -3
  24. package/dist/Editor/Elements/Link/LinkPopupStyles.js +28 -0
  25. package/dist/Editor/Elements/PageSettings/PageSettingsButton.js +3 -3
  26. package/dist/Editor/Elements/Redo/RedoButton.js +14 -0
  27. package/dist/Editor/Elements/Signature/SignaturePopup.js +14 -3
  28. package/dist/Editor/Elements/Table/Styles.js +23 -1
  29. package/dist/Editor/Elements/Table/Table.js +2 -1
  30. package/dist/Editor/Elements/Table/TableCell.js +69 -7
  31. package/dist/Editor/Elements/TableContextMenu/TableContextMenu.js +1 -0
  32. package/dist/Editor/Elements/Undo/UndoButton.js +14 -0
  33. package/dist/Editor/MiniEditor.js +3 -1
  34. package/dist/Editor/Styles/EditorStyles.js +1 -1
  35. package/dist/Editor/Toolbar/Basic/index.js +4 -2
  36. package/dist/Editor/Toolbar/FormatTools/Dropdown.js +26 -2
  37. package/dist/Editor/Toolbar/FormatTools/MarkButton.js +2 -2
  38. package/dist/Editor/Toolbar/FormatTools/TextSize.js +29 -18
  39. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +4 -2
  40. package/dist/Editor/Toolbar/Mini/Options/Options.js +10 -0
  41. package/dist/Editor/Toolbar/Mini/Styles.js +7 -0
  42. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectFontSize.js +4 -11
  43. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectTypography.js +213 -86
  44. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +2 -1
  45. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +22 -16
  46. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +52 -7
  47. package/dist/Editor/Toolbar/PopupTool/ThemeTextFormat.js +438 -0
  48. package/dist/Editor/Toolbar/PopupTool/index.js +7 -17
  49. package/dist/Editor/Toolbar/toolbarGroups.js +48 -6
  50. package/dist/Editor/assets/svg/AIIcons.js +153 -1
  51. package/dist/Editor/assets/svg/AddTemplateIcon.js +13 -10
  52. package/dist/Editor/assets/svg/RedoIcon.js +27 -0
  53. package/dist/Editor/assets/svg/SettingsIcon.js +28 -0
  54. package/dist/Editor/assets/svg/TextIcon.js +8 -5
  55. package/dist/Editor/assets/svg/ThemeIcons.js +291 -0
  56. package/dist/Editor/assets/svg/UndoIcon.js +27 -0
  57. package/dist/Editor/common/ColorPickerButton.js +25 -9
  58. package/dist/Editor/common/CustomColorPicker/index.js +106 -0
  59. package/dist/Editor/common/CustomColorPicker/style.js +53 -0
  60. package/dist/Editor/common/CustomDialog/index.js +94 -0
  61. package/dist/Editor/common/CustomDialog/style.js +67 -0
  62. package/dist/Editor/common/CustomSelect.js +33 -0
  63. package/dist/Editor/common/DnD/DragHandleButton.js +56 -47
  64. package/dist/Editor/common/Icon.js +43 -3
  65. package/dist/Editor/common/LinkSettings/NavComponents.js +5 -2
  66. package/dist/Editor/common/LinkSettings/index.js +4 -2
  67. package/dist/Editor/common/LinkSettings/navOptions.js +7 -2
  68. package/dist/Editor/common/LinkSettings/style.js +11 -8
  69. package/dist/Editor/common/Section/index.js +57 -7
  70. package/dist/Editor/common/Section/styles.js +11 -0
  71. package/dist/Editor/common/Shorthands/elements.js +54 -0
  72. package/dist/Editor/common/StyleBuilder/buttonStyle.js +4 -2
  73. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +33 -29
  74. package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +31 -25
  75. package/dist/Editor/common/StyleBuilder/fieldTypes/buttonLink.js +1 -1
  76. package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +31 -7
  77. package/dist/Editor/common/StyleBuilder/fieldTypes/fontSize.js +13 -4
  78. package/dist/Editor/common/StyleBuilder/fieldTypes/textOptions.js +14 -4
  79. package/dist/Editor/common/StyleBuilder/index.js +1 -1
  80. package/dist/Editor/common/iconslist.js +0 -31
  81. package/dist/Editor/helper/theme.js +189 -4
  82. package/dist/Editor/hooks/useEditorTheme.js +139 -0
  83. package/dist/Editor/hooks/useMouseMove.js +4 -1
  84. package/dist/Editor/hooks/useWindowMessage.js +10 -7
  85. package/dist/Editor/plugins/withEmbeds.js +1 -1
  86. package/dist/Editor/plugins/withHTML.js +1 -1
  87. package/dist/Editor/plugins/withTable.js +1 -1
  88. package/dist/Editor/theme/ThemeList.js +50 -173
  89. package/dist/Editor/theme/index.js +144 -0
  90. package/dist/Editor/themeSettings/ActiveTheme.js +72 -0
  91. package/dist/Editor/themeSettings/buttons/index.js +290 -0
  92. package/dist/Editor/themeSettings/buttons/style.js +21 -0
  93. package/dist/Editor/themeSettings/colorTheme/index.js +290 -0
  94. package/dist/Editor/themeSettings/colorTheme/style.js +77 -0
  95. package/dist/Editor/themeSettings/fonts/PreviewElement.js +123 -0
  96. package/dist/Editor/themeSettings/fonts/index.js +213 -0
  97. package/dist/Editor/themeSettings/fonts/style.js +44 -0
  98. package/dist/Editor/themeSettings/icons.js +60 -0
  99. package/dist/Editor/themeSettings/index.js +320 -0
  100. package/dist/Editor/themeSettings/style.js +152 -0
  101. package/dist/Editor/themeSettingsAI/icons.js +96 -0
  102. package/dist/Editor/themeSettingsAI/index.js +356 -0
  103. package/dist/Editor/themeSettingsAI/saveTheme.js +190 -0
  104. package/dist/Editor/themeSettingsAI/style.js +247 -0
  105. package/dist/Editor/utils/SlateUtilityFunctions.js +161 -25
  106. package/dist/Editor/utils/button.js +1 -17
  107. package/dist/Editor/utils/events.js +54 -2
  108. package/dist/Editor/utils/font.js +40 -37
  109. package/dist/Editor/utils/helper.js +31 -2
  110. package/dist/Editor/utils/table.js +51 -43
  111. package/package.json +4 -3
@@ -1,4 +1,6 @@
1
- import { sizeMap } from "../utils/font";
1
+ import { ReactEditor } from "slate-react";
2
+ import { fontFamilyMap, sizeMap } from "../utils/font";
3
+ import { Editor, Node } from "slate";
2
4
  export const breakpoints = {
3
5
  small: 0,
4
6
  mobile: 600,
@@ -27,7 +29,7 @@ const overrideValues = (value, ot) => {
27
29
  return Object.keys(value).reduce((a, b) => {
28
30
  return {
29
31
  ...a,
30
- [b]: overrides[ot] ? overrides[ot](value[b]) : value
32
+ [b]: overrides[ot] ? overrides[ot](value[b], value) : value
31
33
  };
32
34
  }, {});
33
35
  };
@@ -44,7 +46,15 @@ const overrides = {
44
46
  overrideReSizeH: val => {
45
47
  return `${val?.height}px`;
46
48
  },
47
- overrideBorderRadius: val => {
49
+ overrideBorderRadius: (val, breakpointValues) => {
50
+ if (!val?.topLeft) {
51
+ Object.values(breakpointValues || {}).forEach(v => {
52
+ if (v) {
53
+ // Applying the values from breakpoints that exist to those that do not have
54
+ val = v;
55
+ }
56
+ });
57
+ }
48
58
  return `${val?.topLeft}px ${val?.topRight}px ${val?.bottomLeft}px ${val?.bottomRight}px`;
49
59
  }
50
60
  };
@@ -98,4 +108,179 @@ export const getTRBLBreakPoints = (value, breakpoint) => {
98
108
  console.log(err);
99
109
  }
100
110
  };
101
- export const getCustomizationValue = value => isNaN(parseInt(value)) ? null : parseInt(value);
111
+ export function getElementStyle(editor, element, stylePropertyName) {
112
+ try {
113
+ const path = ReactEditor.findPath(editor, element);
114
+ if (path?.length) {
115
+ const currentEle = Node.get(editor, path);
116
+ const dom = ReactEditor.toDOMNode(editor, currentEle);
117
+ const editorBtn = dom?.querySelector("button.theme-element");
118
+ const elementStyle = window.getComputedStyle(editorBtn);
119
+ const style = elementStyle[stylePropertyName];
120
+ if (stylePropertyName === "fontFamily") {
121
+ const val = Object.entries(fontFamilyMap).find(([key, value]) => value === style)?.[0];
122
+ return val;
123
+ }
124
+ return style;
125
+ }
126
+ } catch (err) {
127
+ // console.log(err);
128
+ }
129
+ }
130
+ export function getTextSizeVal(editor) {
131
+ try {
132
+ const currentNode = Node.get(editor, editor.selection.anchor.path);
133
+ const currentElement = ReactEditor.toDOMNode(editor, currentNode);
134
+ if (currentElement) {
135
+ const element = document.querySelector('span[data-slate-string="true"]');
136
+ const computedStyle = window.getComputedStyle(element);
137
+ return computedStyle.getPropertyValue("font-size") || "";
138
+ }
139
+ } catch (err) {
140
+ // console.log(err);
141
+ }
142
+ }
143
+ export function getVariableValue(val) {
144
+ const bodyElement = document.body;
145
+ const computedStyle = getComputedStyle(bodyElement);
146
+ const [, variableName] = val?.match(/var\((--[^)]+)\)/) || [];
147
+ const varValue = computedStyle.getPropertyValue(variableName).trim();
148
+ return varValue;
149
+ }
150
+ export const textThemeFields = ["fontFamily", "fontSize", "color", "bold", "italic"
151
+ // "underline",
152
+ // "strikethrough",
153
+ ];
154
+
155
+ const themeElements = ["headingOne", "headingTwo", "headingThree", "headingFour", "headingFive", "headingSix", "paragraphOne", "paragraphTwo", "paragraphThree"];
156
+ export const isTextCustomized = editor => {
157
+ try {
158
+ if (editor.selection) {
159
+ const currentElement = Node.parent(editor, editor?.selection?.anchor?.path);
160
+ if (!currentElement) {
161
+ return false;
162
+ }
163
+ const {
164
+ children,
165
+ type
166
+ } = currentElement;
167
+ if (!themeElements.includes(type)) {
168
+ return false;
169
+ }
170
+ if (children?.length > 1) {
171
+ return true;
172
+ }
173
+ const customized = textThemeFields.some(field => {
174
+ const element = children[0] || {};
175
+ const value = element[field];
176
+ if (field === "fontSize") {
177
+ return Object.keys(value || {}).length;
178
+ } else {
179
+ return value;
180
+ }
181
+ });
182
+ return customized;
183
+ } else {
184
+ return null;
185
+ }
186
+ } catch (err) {
187
+ return null;
188
+ }
189
+ };
190
+ const addToTheme = (field, value, element) => {
191
+ switch (field) {
192
+ case "fontFamily":
193
+ return {
194
+ fontFamily: fontFamilyMap[value]
195
+ };
196
+ case "fontSize":
197
+ return {
198
+ fontSize: value?.lg
199
+ };
200
+ case "color":
201
+ return {
202
+ color: value
203
+ };
204
+ case "bold":
205
+ return {
206
+ fontWeight: "bold"
207
+ };
208
+ case "italic":
209
+ return {
210
+ fontStyle: "italic"
211
+ };
212
+ // case "underline":
213
+ // case "strikethrough":
214
+ // let textDecoration = "";
215
+
216
+ // if (element.underline) {
217
+ // textDecoration = "underline";
218
+ // }
219
+
220
+ // if (element.strikethrough) {
221
+ // textDecoration += " strikethrough";
222
+ // }
223
+
224
+ // return { textDecoration };
225
+ default:
226
+ return {};
227
+ }
228
+ };
229
+ const MAP_TEXT_THEME_FIELD = {
230
+ headingOne: "h1",
231
+ headingTwo: "h2",
232
+ headingThree: "h3",
233
+ headingFour: "h4",
234
+ headingFive: "h5",
235
+ headingSix: "h6",
236
+ paragraphOne: "para1",
237
+ paragraphTwo: "para2",
238
+ paragraphThree: "para3"
239
+ };
240
+ export const saveToTheme = editor => {
241
+ try {
242
+ if (editor.selection) {
243
+ const currentElement = Node.parent(editor, editor?.selection?.anchor?.path);
244
+ if (!currentElement) {
245
+ return false;
246
+ }
247
+ const {
248
+ children
249
+ } = currentElement;
250
+ if (children?.length > 1) {
251
+ return true;
252
+ }
253
+ let theme = {};
254
+ textThemeFields.forEach(field => {
255
+ const element = children[0] || {};
256
+ const value = element[field];
257
+ let style = {};
258
+ let isValueExist = false;
259
+ if (value) {
260
+ isValueExist = true;
261
+ if (field === "fontSize") {
262
+ isValueExist = !!Object.keys(value).length;
263
+ }
264
+ }
265
+ if (isValueExist) {
266
+ style = addToTheme(field, value, element);
267
+ }
268
+ theme = {
269
+ ...theme,
270
+ ...style
271
+ };
272
+ });
273
+ textThemeFields.forEach(field => {
274
+ Editor.removeMark(editor, field);
275
+ });
276
+ return {
277
+ field: MAP_TEXT_THEME_FIELD[currentElement?.type],
278
+ theme
279
+ };
280
+ }
281
+ } catch (err) {
282
+ return;
283
+ }
284
+ };
285
+ export const HEADING_THEME_FIELDS = ["h1", "h2", "h3", "h4", "h5", "h6"];
286
+ export const PARAGRAPH_THEME_FIELDS = ["para1", "para2", "para3"];
@@ -0,0 +1,139 @@
1
+ import { useSlate } from "slate-react";
2
+ import { defaultTheme } from "../theme";
3
+ import { getPageSettings, updatePageSettings } from "../utils/pageSettings";
4
+ import { HEADING_THEME_FIELDS, PARAGRAPH_THEME_FIELDS } from "../helper/theme";
5
+ const MAP_FIELDS = {
6
+ HEADING: HEADING_THEME_FIELDS,
7
+ PARAGRAPH: PARAGRAPH_THEME_FIELDS
8
+ };
9
+ function getUpdatePayload(prevTheme = {}, update, actionData) {
10
+ const {
11
+ action,
12
+ fieldName
13
+ } = actionData || {};
14
+ const {
15
+ theme: prev
16
+ } = prevTheme;
17
+ let theme = {};
18
+ let themeProps = {};
19
+ switch (action) {
20
+ case "THEME_CHANGE":
21
+ theme = update;
22
+ break;
23
+ case "CSS_VAR_CHANGE":
24
+ const prevCssVars = prev?.cssVars || {};
25
+ const prevValue = prevCssVars[fieldName] || {};
26
+ themeProps = {
27
+ ...(prev || {}),
28
+ cssVars: {
29
+ ...prevCssVars,
30
+ [fieldName]: {
31
+ ...prevValue,
32
+ ...update
33
+ }
34
+ }
35
+ };
36
+ theme = {
37
+ ...prevTheme,
38
+ theme: themeProps
39
+ };
40
+ break;
41
+ case "ELEMENT_PROPS_CHANGE":
42
+ const prevEleProps = prev?.elementProps || {};
43
+ const prevEleValue = prevEleProps[fieldName] || {};
44
+ themeProps = {
45
+ ...(prev || {}),
46
+ elementProps: {
47
+ ...prevEleProps,
48
+ [fieldName]: {
49
+ ...prevEleValue,
50
+ ...update
51
+ }
52
+ }
53
+ };
54
+ theme = {
55
+ ...prevTheme,
56
+ theme: themeProps
57
+ };
58
+ break;
59
+ case "OTHER_PROPS_CHANGE":
60
+ themeProps = {
61
+ ...(prev || {}),
62
+ otherProps: {
63
+ ...(prev.otherProps || {}),
64
+ ...update
65
+ }
66
+ };
67
+ theme = {
68
+ ...prevTheme,
69
+ theme: themeProps
70
+ };
71
+ break;
72
+ case "FONT_CHANGE":
73
+ const {
74
+ elementProps = {},
75
+ otherProps = {}
76
+ } = prev;
77
+ const fields = MAP_FIELDS[actionData?.fieldType];
78
+ const headingUpdate = {};
79
+ fields?.forEach(field => {
80
+ const prevHeadingData = elementProps[field];
81
+ headingUpdate[field] = {
82
+ ...prevHeadingData,
83
+ ...update
84
+ };
85
+ });
86
+ themeProps = {
87
+ ...(prev || {}),
88
+ elementProps: {
89
+ ...elementProps,
90
+ ...headingUpdate
91
+ },
92
+ otherProps: {
93
+ ...otherProps,
94
+ headingFontFamily: update?.fontFamily
95
+ }
96
+ };
97
+ theme = {
98
+ ...prevTheme,
99
+ theme: themeProps
100
+ };
101
+ break;
102
+ default:
103
+ theme = {
104
+ ...prevTheme,
105
+ ...(update || {})
106
+ };
107
+ break;
108
+ }
109
+ return theme;
110
+ }
111
+ const updateTheme = (editor, pageSt, update, actionData) => {
112
+ const {
113
+ pageProps
114
+ } = pageSt || {};
115
+ const {
116
+ theme
117
+ } = pageProps || {};
118
+ updatePageSettings(editor, {
119
+ ...(pageProps || {}),
120
+ theme: getUpdatePayload(theme, update, actionData)
121
+ });
122
+ };
123
+ export const useEditorTheme = () => {
124
+ const editor = useSlate();
125
+ const {
126
+ element: pageSt
127
+ } = getPageSettings(editor) || {};
128
+ const {
129
+ pageProps
130
+ } = pageSt || {};
131
+ const {
132
+ theme
133
+ } = pageProps || {};
134
+ return {
135
+ selectedTheme: theme?.theme || defaultTheme?.theme,
136
+ updateTheme: (update, actionData) => updateTheme(editor, pageSt, update, actionData),
137
+ theme
138
+ };
139
+ };
@@ -29,6 +29,7 @@ export const EditorProvider = ({
29
29
  const path = event?.target?.getAttribute("data-path");
30
30
  const [popupType, setPopupType] = useState(""); // opened popup name in the editor will be stored
31
31
  const [openAI, setOpenAI] = useState("");
32
+ const [selectedTheme, setSelectedTheme] = useState({});
32
33
  const onDrop = () => {
33
34
  setDrop(drop + 1);
34
35
  };
@@ -55,7 +56,9 @@ export const EditorProvider = ({
55
56
  popupType,
56
57
  setPopupType,
57
58
  openAI,
58
- setOpenAI
59
+ setOpenAI,
60
+ selectedTheme,
61
+ setSelectedTheme
59
62
  },
60
63
  children: children
61
64
  });
@@ -4,9 +4,19 @@ const useWindowMessage = props => {
4
4
  type
5
5
  } = props;
6
6
  const [message, setMessage] = useState(null);
7
+ const sendMessage = action => {
8
+ if (window.parent) {
9
+ window.parent.postMessage({
10
+ ...action
11
+ }, "*");
12
+ }
13
+ };
7
14
  useEffect(() => {
8
15
  if (window.addEventListener) {
9
16
  window.addEventListener("message", onMessage, false);
17
+ sendMessage({
18
+ isLoaded: true
19
+ });
10
20
  } else {
11
21
  window.attachEvent("onmessage", onMessage);
12
22
  }
@@ -23,13 +33,6 @@ const useWindowMessage = props => {
23
33
  setMessage(e?.data[type]);
24
34
  }
25
35
  };
26
- const sendMessage = action => {
27
- if (window.parent) {
28
- window.parent.postMessage({
29
- ...action
30
- }, "*");
31
- }
32
- };
33
36
  return [message, sendMessage];
34
37
  };
35
38
  export default useWindowMessage;
@@ -1,5 +1,5 @@
1
1
  import { Transforms, Path, Node } from "slate";
2
- const AvoidCopying = ["headingOne", "headingTwo", "headingThree", "blockquote"];
2
+ const AvoidCopying = ["headingOne", "headingTwo", "headingThree", "headingFour", "headingFive", "headingSix", "paragraphOne", "paragraphTwo", "paragraphThree", "blockquote"];
3
3
  const withEmbeds = editor => {
4
4
  const {
5
5
  isVoid,
@@ -15,7 +15,7 @@ const loopChildren = (children = [], defaultInsert) => {
15
15
  }
16
16
  return defaultInsert;
17
17
  };
18
- const getCurrentElement = editor => {
18
+ export const getCurrentElement = editor => {
19
19
  try {
20
20
  if (editor.selection) {
21
21
  return Node.parent(editor, editor?.selection?.anchor?.path);
@@ -1,6 +1,6 @@
1
1
  import { Editor, Range, Point, Element, Transforms, Node } from "slate";
2
2
  import { TableUtil, createTableCell } from "../utils/table";
3
- const NON_DELETABLE_BLOCKS = ["table-cell", "carousel-item"];
3
+ const NON_DELETABLE_BLOCKS = ["table-cell", "carousel-item", "page-settings"];
4
4
  const withTable = editor => {
5
5
  const {
6
6
  deleteBackward,
@@ -1,181 +1,58 @@
1
- import { MenuItem, Select, useTheme } from "@mui/material";
2
- import { fontOptions } from "../utils/font";
3
- import { toolbarGroups } from "../Toolbar/toolbarGroups";
1
+ import { Box, MenuItem, Select } from "@mui/material";
2
+ import { defaultTheme } from ".";
3
+ import { useEditorTheme } from "../hooks/useEditorTheme";
4
+ import { useEffect, useState } from "react";
4
5
  import { jsx as _jsx } from "react/jsx-runtime";
5
6
  import { jsxs as _jsxs } from "react/jsx-runtime";
6
- const themes = [{
7
- label: "Theme 1",
8
- colors: ["#c90c1f", "#ff5d05"]
9
- }, {
10
- label: "Theme 2",
11
- colors: ["#4c0be3", "#43f7ee"]
12
- }, {
13
- label: "Theme 3",
14
- colors: ["#22f20f", "#fff705"]
15
- }];
16
- const allTools = toolbarGroups.flat();
17
- function ThemeList(props) {
7
+ function ThemeList({
8
+ editor,
9
+ services = () => {}
10
+ }) {
11
+ const [themes, setThemes] = useState([]);
12
+ const [loading, setLoading] = useState(false);
13
+ console.log("loading", loading);
14
+ const getThemesList = async () => {
15
+ setLoading(true);
16
+ try {
17
+ const result = await services("getThemes", {});
18
+ setThemes(result?.data || []);
19
+ } catch (err) {
20
+ console.log(err);
21
+ }
22
+ setLoading(false);
23
+ };
18
24
  const {
19
- selectedTheme,
20
- setSelectedTheme
21
- } = props;
22
- const fontWeight = allTools.find(f => f.format === "fontWeight");
23
- const fontStyles = [{
24
- text: "Bold",
25
- value: "bold",
26
- styleField: "fontWeight"
27
- }, {
28
- text: "Italic",
29
- value: "italic",
30
- styleField: "fontStyle"
31
- }
32
- // {
33
- // text: "Underline",
34
- // value: "underline",
35
- // styleField: "textDecoration",
36
- // },
37
- // {
38
- // text: "Line through",
39
- // value: "line-through",
40
- // styleField: "textDecoration",
41
- // },
42
- ];
43
-
44
- const theme = useTheme();
45
- const colorVars = theme?.vars?.colors || {};
46
- const handleTypographyTheme = (key, value, elementType) => {
47
- setSelectedTheme(prev => {
48
- const newValue = {
49
- ...prev,
50
- typography: {
51
- ...(prev.typography || {}),
52
- [elementType]: {
53
- ...(prev?.typography?.[elementType] || {}),
54
- [key]: value
55
- }
56
- }
57
- };
58
- if (!value) {
59
- delete newValue?.typography?.[elementType]?.[key];
60
- }
61
- return newValue;
62
- });
25
+ updateTheme
26
+ } = useEditorTheme();
27
+ useEffect(() => {
28
+ getThemesList();
29
+ }, []);
30
+ const handleThemeChange = e => {
31
+ const {
32
+ value
33
+ } = e.target;
34
+ const selectedTheme = themes.find(t => t.id === value) || defaultTheme;
35
+ updateTheme(selectedTheme, "THEME_CHANGE");
63
36
  };
64
- return /*#__PURE__*/_jsxs("div", {
65
- children: [themes.map((theme, i) => {
66
- return /*#__PURE__*/_jsxs("button", {
67
- style: {
68
- margin: "10px"
69
- },
70
- onClick: () => setSelectedTheme(prev => ({
71
- ...prev,
72
- colors: theme.colors
73
- })),
74
- children: [theme.label, /*#__PURE__*/_jsx("div", {
75
- children: theme.colors.map((c, j) => {
76
- return /*#__PURE__*/_jsx("div", {
77
- style: {
78
- width: "20px",
79
- height: "20px",
80
- background: c,
81
- margin: "10px"
82
- }
83
- }, j);
84
- })
85
- })]
86
- }, i);
87
- }), /*#__PURE__*/_jsxs("div", {
88
- children: ["Heading 1 Font Family", /*#__PURE__*/_jsx(Select
89
- // value={""}
90
- , {
91
- label: "Font Family",
92
- onChange: e => {
93
- handleTypographyTheme("fontFamily", e.target.value, "h1");
94
- },
95
- children: fontOptions.map((font, i) => {
96
- const {
97
- text,
98
- value
99
- } = font;
100
- return /*#__PURE__*/_jsx(MenuItem, {
101
- value: value,
102
- children: text
103
- }, i);
104
- })
105
- }), "Font Weight", /*#__PURE__*/_jsx(Select
106
- // value={""}
107
- , {
108
- label: "Font Weight",
109
- onChange: e => {
110
- handleTypographyTheme("fontWeight", e.target.value, "h1");
111
- },
112
- children: fontWeight.options.map((option, i) => {
113
- const {
114
- text,
115
- value
116
- } = option;
117
- return /*#__PURE__*/_jsx(MenuItem, {
118
- value: value,
119
- children: text
120
- }, i);
121
- })
122
- }), /*#__PURE__*/_jsx("input", {
123
- type: "number",
124
- placeholder: "font size",
125
- onChange: e => {
126
- handleTypographyTheme("fontSize", e.target.value, "h1");
127
- }
128
- }), /*#__PURE__*/_jsxs("div", {
129
- children: ["Text", /*#__PURE__*/_jsx("br", {}), "Theme color", Object.values(colorVars).map((colorVar, i) => {
130
- return /*#__PURE__*/_jsx("button", {
131
- style: {
132
- width: "20px",
133
- height: "20px",
134
- background: colorVar,
135
- margin: "10px",
136
- outline: "none"
137
- },
138
- onClick: () => handleTypographyTheme("color", colorVar, "h1")
139
- }, i);
140
- }), "normal color", /*#__PURE__*/_jsx("button", {
141
- style: {
142
- width: "20px",
143
- height: "20px",
144
- background: "#ff00e1",
145
- margin: "10px",
146
- outline: "none"
147
- },
148
- onClick: () => handleTypographyTheme("color", "#ff00e1", "h1")
149
- })]
150
- }), /*#__PURE__*/_jsxs("div", {
151
- children: ["Font styles", fontStyles.map((option, i) => {
152
- const styles = selectedTheme?.typography?.h1 || {};
153
- const {
154
- text,
155
- value,
156
- styleField
157
- } = option;
158
- return /*#__PURE__*/_jsxs("button", {
159
- onClick: () => {
160
- handleTypographyTheme(styleField, styles[styleField] === value ? null : value, "h1");
161
- },
162
- children: [text, " ", styles[styleField] === value]
163
- }, i);
164
- })]
165
- }), /*#__PURE__*/_jsx("input", {
166
- type: "number",
167
- placeholder: "Margin text Spacing",
168
- onChange: e => {
169
- handleTypographyTheme("letterSpacing", e.target.value, "h1");
170
- }
171
- }), /*#__PURE__*/_jsx("input", {
172
- type: "number",
173
- placeholder: "Line spacing",
174
- onChange: e => {
175
- handleTypographyTheme("lineHeight", e.target.value, "h1");
176
- }
37
+ return /*#__PURE__*/_jsx(Box, {
38
+ sx: {
39
+ padding: "10px",
40
+ background: "#efefef",
41
+ borderRadius: "6px"
42
+ },
43
+ children: /*#__PURE__*/_jsxs(Select, {
44
+ onChange: handleThemeChange,
45
+ defaultValue: 0,
46
+ children: [/*#__PURE__*/_jsx(MenuItem, {
47
+ value: 0,
48
+ children: "Default Theme"
49
+ }), themes.map((theme, i) => {
50
+ return /*#__PURE__*/_jsx(MenuItem, {
51
+ value: theme?.id,
52
+ children: theme?.name
53
+ }, i);
177
54
  })]
178
- })]
55
+ })
179
56
  });
180
57
  }
181
58
  export default ThemeList;