@flozy/editor 10.3.2 → 10.3.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 (163) hide show
  1. package/dist/Editor/ChatEditor.js +17 -16
  2. package/dist/Editor/CommonEditor.js +131 -16
  3. package/dist/Editor/DialogWrapper.js +31 -25
  4. package/dist/Editor/Editor.css +46 -8
  5. package/dist/Editor/Elements/AI/PopoverAIInput.js +11 -3
  6. package/dist/Editor/Elements/Accordion/Accordion.js +30 -7
  7. package/dist/Editor/Elements/Accordion/AccordionSummary.js +1 -23
  8. package/dist/Editor/Elements/AppHeader/AppHeader.js +10 -5
  9. package/dist/Editor/Elements/Button/EditorButton.js +27 -9
  10. package/dist/Editor/Elements/Carousel/CarouselItem.js +2 -1
  11. package/dist/Editor/Elements/Color Picker/ColorButtons.js +61 -14
  12. package/dist/Editor/Elements/Color Picker/ColorPicker.css +25 -1
  13. package/dist/Editor/Elements/Color Picker/ColorPicker.js +10 -7
  14. package/dist/Editor/Elements/Color Picker/Styles.js +15 -13
  15. package/dist/Editor/Elements/DataView/Layouts/ColumnView.js +4 -2
  16. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/MultiSelect.js +30 -28
  17. package/dist/Editor/Elements/DataView/Layouts/DataTypes/MultiSelectType.js +9 -7
  18. package/dist/Editor/Elements/DataView/Layouts/Options/AddOptions.js +0 -1
  19. package/dist/Editor/Elements/DataView/Layouts/ViewData.js +8 -4
  20. package/dist/Editor/Elements/Embed/Video.js +1 -1
  21. package/dist/Editor/Elements/Form/Form.js +1 -3
  22. package/dist/Editor/Elements/Form/FormElements/FormTextArea.js +0 -1
  23. package/dist/Editor/Elements/Form/FormField.js +3 -2
  24. package/dist/Editor/Elements/Form/Workflow/Styles.js +24 -22
  25. package/dist/Editor/Elements/FreeGrid/FreeGrid.js +35 -31
  26. package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +7 -4
  27. package/dist/Editor/Elements/FreeGrid/Options/More.js +7 -7
  28. package/dist/Editor/Elements/FreeGrid/helper.js +113 -0
  29. package/dist/Editor/Elements/FreeGrid/styles.js +14 -0
  30. package/dist/Editor/Elements/Grid/Grid.js +14 -2
  31. package/dist/Editor/Elements/Grid/GridItem.js +1 -1
  32. package/dist/Editor/Elements/Signature/Signature.css +2 -1
  33. package/dist/Editor/Elements/Signature/SignatureOptions/DrawSignature.js +18 -5
  34. package/dist/Editor/Elements/Signature/SignatureOptions/UploadSignature.js +16 -3
  35. package/dist/Editor/Elements/SimpleText/style.js +2 -2
  36. package/dist/Editor/Elements/Table/DragButton.js +0 -1
  37. package/dist/Editor/Elements/Table/Draggable.js +6 -2
  38. package/dist/Editor/Elements/Table/Styles.js +7 -0
  39. package/dist/Editor/Elements/Table/Table.js +3 -3
  40. package/dist/Editor/Elements/Table/TableCell.js +24 -5
  41. package/dist/Editor/Elements/Title/title.js +6 -6
  42. package/dist/Editor/Elements/Variables/VariableButton.js +10 -1
  43. package/dist/Editor/MiniEditor.js +2 -1
  44. package/dist/Editor/Styles/EditorStyles.js +5 -5
  45. package/dist/Editor/Toolbar/FormatTools/Dropdown.js +27 -3
  46. package/dist/Editor/Toolbar/FormatTools/FontFamilyAutocomplete.js +4 -3
  47. package/dist/Editor/Toolbar/FormatTools/MarkButton.js +2 -2
  48. package/dist/Editor/Toolbar/FormatTools/TextSize.js +10 -13
  49. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +2 -1
  50. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/MiniColorPicker.js +4 -2
  51. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectFontSize.js +6 -13
  52. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectTypography.js +167 -42
  53. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +7 -4
  54. package/dist/Editor/Toolbar/PopupTool/PopperHeader.js +2 -1
  55. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +72 -12
  56. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +58 -10
  57. package/dist/Editor/Toolbar/PopupTool/ThemeTextFormat.js +439 -0
  58. package/dist/Editor/Toolbar/PopupTool/index.js +1 -1
  59. package/dist/Editor/Toolbar/toolbarGroups.js +48 -6
  60. package/dist/Editor/assets/svg/BackIcon.js +18 -0
  61. package/dist/Editor/assets/svg/ThemeIcons.js +293 -0
  62. package/dist/Editor/common/Checkbox/index.js +46 -0
  63. package/dist/Editor/common/Checkbox/styles.js +45 -0
  64. package/dist/Editor/common/ColorPickerButton.js +41 -16
  65. package/dist/Editor/common/CustomColorPicker/index.js +130 -0
  66. package/dist/Editor/common/CustomColorPicker/style.js +53 -0
  67. package/dist/Editor/common/CustomDialog2/index.js +94 -0
  68. package/dist/Editor/common/CustomDialog2/style.js +67 -0
  69. package/dist/Editor/common/CustomSelect.js +43 -0
  70. package/dist/Editor/common/DnD/DragHandleButton.js +1 -1
  71. package/dist/Editor/common/FontLoader/FontLoader.js +3 -0
  72. package/dist/Editor/common/Icon.js +28 -0
  73. package/dist/Editor/common/ImageSelector/ImageSelector.js +2 -2
  74. package/dist/Editor/common/ImageSelector/Styles.js +3 -9
  75. package/dist/Editor/common/LinkSettings/NavComponents.js +45 -65
  76. package/dist/Editor/common/LinkSettings/index.js +13 -26
  77. package/dist/Editor/common/LinkSettings/navOptions.js +2 -2
  78. package/dist/Editor/common/LinkSettings/style.js +164 -244
  79. package/dist/Editor/common/RadioGroup/index.js +48 -0
  80. package/dist/Editor/common/RadioGroup/styles.js +29 -0
  81. package/dist/Editor/common/RnD/ElementOptions/Actions.js +4 -5
  82. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +2 -1
  83. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Signature.js +4 -3
  84. package/dist/Editor/common/RnD/ElementSettings/Settings/AppHeaderSettings.js +3 -2
  85. package/dist/Editor/common/RnD/ElementSettings/Settings/BoxSettings.js +3 -2
  86. package/dist/Editor/common/RnD/ElementSettings/Settings/ButtonSettings.js +3 -2
  87. package/dist/Editor/common/RnD/ElementSettings/Settings/CodeSettings.js +3 -2
  88. package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +4 -2
  89. package/dist/Editor/common/RnD/ElementSettings/Settings/ImageSettings.js +3 -2
  90. package/dist/Editor/common/RnD/ElementSettings/Settings/TableSettings.js +3 -2
  91. package/dist/Editor/common/RnD/ElementSettings/Settings/TextSettings.js +3 -1
  92. package/dist/Editor/common/RnD/ElementSettings/Settings/VideoSettings.js +3 -2
  93. package/dist/Editor/common/RnD/ElementSettings/styles.js +0 -1
  94. package/dist/Editor/common/RnD/OptionsPopup/style.js +0 -1
  95. package/dist/Editor/common/RnD/SwitchViewport/SwitchViewport.js +11 -2
  96. package/dist/Editor/common/RnD/Theme/MainThemeProvider.js +17 -0
  97. package/dist/Editor/common/RnD/Theme/ViewportStimulator.js +6 -3
  98. package/dist/Editor/common/RnD/Utils/gridDropItem.js +28 -19
  99. package/dist/Editor/common/RnD/Utils/index.js +3 -1
  100. package/dist/Editor/common/RnD/VirtualElement/VirtualTextElement.js +42 -58
  101. package/dist/Editor/common/RnD/VirtualElement/helper.js +321 -131
  102. package/dist/Editor/common/RnD/VirtualElement/styles.js +16 -0
  103. package/dist/Editor/common/RnD/index.js +26 -12
  104. package/dist/Editor/common/Select/index.js +44 -7
  105. package/dist/Editor/common/Select/styles.js +30 -2
  106. package/dist/Editor/common/Shorthands/elements.js +54 -0
  107. package/dist/Editor/common/StyleBuilder/accordionTitleBtnStyle.js +2 -2
  108. package/dist/Editor/common/StyleBuilder/accordionTitleStyle.js +12 -9
  109. package/dist/Editor/common/StyleBuilder/buttonStyle.js +4 -2
  110. package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +4 -0
  111. package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +5 -0
  112. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +12 -2
  113. package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +15 -7
  114. package/dist/Editor/common/StyleBuilder/fieldTypes/card.js +16 -8
  115. package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +36 -10
  116. package/dist/Editor/common/StyleBuilder/fieldTypes/embedUpload.js +115 -0
  117. package/dist/Editor/common/StyleBuilder/fieldTypes/fontSize.js +16 -7
  118. package/dist/Editor/common/StyleBuilder/fieldTypes/index.js +3 -1
  119. package/dist/Editor/common/StyleBuilder/fieldTypes/textOptions.js +15 -7
  120. package/dist/Editor/common/SwipeableDrawer/style.js +14 -12
  121. package/dist/Editor/common/Uploader.js +16 -0
  122. package/dist/Editor/common/iconListV2.js +76 -0
  123. package/dist/Editor/common/iconslist.js +21 -0
  124. package/dist/Editor/commonStyle.js +116 -61
  125. package/dist/Editor/helper/index.js +4 -0
  126. package/dist/Editor/helper/textIndeces.js +58 -0
  127. package/dist/Editor/helper/theme.js +203 -2
  128. package/dist/Editor/hooks/useEditorTheme.js +153 -0
  129. package/dist/Editor/hooks/useMouseMove.js +9 -3
  130. package/dist/Editor/hooks/useTable.js +5 -4
  131. package/dist/Editor/hooks/useThemeValues.js +63 -0
  132. package/dist/Editor/plugins/withEmbeds.js +1 -1
  133. package/dist/Editor/plugins/withHTML.js +3 -1
  134. package/dist/Editor/plugins/withTable.js +1 -1
  135. package/dist/Editor/theme/ThemeList.js +50 -173
  136. package/dist/Editor/theme/index.js +149 -0
  137. package/dist/Editor/themeSettings/ActiveTheme.js +82 -0
  138. package/dist/Editor/themeSettings/buttons/index.js +300 -0
  139. package/dist/Editor/themeSettings/buttons/style.js +23 -0
  140. package/dist/Editor/themeSettings/colorTheme/index.js +310 -0
  141. package/dist/Editor/themeSettings/colorTheme/style.js +81 -0
  142. package/dist/Editor/themeSettings/fonts/PreviewElement.js +121 -0
  143. package/dist/Editor/themeSettings/fonts/index.js +240 -0
  144. package/dist/Editor/themeSettings/fonts/style.js +62 -0
  145. package/dist/Editor/themeSettings/icons.js +60 -0
  146. package/dist/Editor/themeSettings/index.js +380 -0
  147. package/dist/Editor/themeSettings/style.js +299 -0
  148. package/dist/Editor/themeSettingsAI/icons.js +96 -0
  149. package/dist/Editor/themeSettingsAI/index.js +355 -0
  150. package/dist/Editor/themeSettingsAI/saveTheme.js +202 -0
  151. package/dist/Editor/themeSettingsAI/style.js +332 -0
  152. package/dist/Editor/utils/SlateUtilityFunctions.js +161 -37
  153. package/dist/Editor/utils/accordion.js +14 -4
  154. package/dist/Editor/utils/button.js +1 -17
  155. package/dist/Editor/utils/customHooks/useTableResize.js +49 -9
  156. package/dist/Editor/utils/draftToSlate.js +3 -2
  157. package/dist/Editor/utils/events.js +50 -6
  158. package/dist/Editor/utils/font.js +40 -37
  159. package/dist/Editor/utils/helper.js +188 -26
  160. package/dist/Editor/utils/insertAppHeader.js +1 -1
  161. package/dist/Editor/utils/signature.js +2 -9
  162. package/dist/Editor/utils/updateFormName.js +22 -0
  163. package/package.json +4 -4
@@ -1,6 +1,13 @@
1
1
  import { Transforms } from "slate";
2
2
  import insertNewLine from "./insertNewLine";
3
3
  import { getSelectedText } from "./helper";
4
+ import { isMobileWindow } from "../helper";
5
+ const focusAccordion = (editor, upPath) => {
6
+ Transforms.select(editor, {
7
+ path: upPath,
8
+ offset: 0
9
+ });
10
+ };
4
11
  export const insertAccordion = (editor, path) => {
5
12
  try {
6
13
  const selectedText = getSelectedText(editor);
@@ -36,11 +43,14 @@ export const insertAccordion = (editor, path) => {
36
43
  // get title index
37
44
  const summaryIndex = upPath.length - 3;
38
45
  upPath[summaryIndex] = upPath[summaryIndex] === 0 ? 0 : upPath[summaryIndex] - 1;
46
+
39
47
  // select accordion title by default
40
- Transforms.select(editor, {
41
- path: upPath,
42
- offset: 0
43
- });
48
+ if (isMobileWindow()) {
49
+ // timeout to resolve focus issue in mobile
50
+ setTimeout(() => focusAccordion(editor, upPath), 0);
51
+ } else {
52
+ focusAccordion(editor, upPath);
53
+ }
44
54
  insertNewLine(editor);
45
55
  } catch (err) {
46
56
  console.log(err);
@@ -1,6 +1,5 @@
1
1
  import { Path, Transforms } from "slate";
2
2
  import insertNewLine from "./insertNewLine";
3
- import { windowVar } from "./helper";
4
3
  import { getCurrentElementText } from "../plugins/withHTML";
5
4
  export const insertButton = editor => {
6
5
  const button = {
@@ -11,22 +10,7 @@ export const insertButton = editor => {
11
10
  buttonLink: {
12
11
  linkType: "webAddress"
13
12
  },
14
- iconPosition: "start",
15
- bgColor: "#2563EB",
16
- textColor: "#FFF",
17
- borderRadius: {
18
- topLeft: 30,
19
- topRight: 30,
20
- bottomLeft: 30,
21
- bottomRight: 30
22
- },
23
- bannerSpacing: {
24
- left: 16,
25
- top: 8,
26
- right: 16,
27
- bottom: 8
28
- },
29
- ...(windowVar.lastButtonProps || {})
13
+ iconPosition: "start"
30
14
  };
31
15
  const hasText = getCurrentElementText(editor);
32
16
  const insertPath = hasText ? Path.next(Path.parent(editor?.selection.focus.path)) : editor?.selection.focus.path;
@@ -1,9 +1,10 @@
1
- import { useState } from "react";
1
+ import { useRef, useState } from "react";
2
2
  const useTableResize = ({
3
3
  parentDOM,
4
4
  size: defaultSize,
5
5
  onDone,
6
- minMaxProps = {}
6
+ minMaxProps = {},
7
+ isMobile
7
8
  }) => {
8
9
  const {
9
10
  width
@@ -18,6 +19,10 @@ const useTableResize = ({
18
19
  });
19
20
  const [resizing, setResizing] = useState(false);
20
21
  const [isDone, setIsDone] = useState(0);
22
+ const lastTouch = useRef({
23
+ x: 0,
24
+ y: 0
25
+ });
21
26
  const onLoad = defaultSize => {
22
27
  setSize({
23
28
  widthInPercent: 100,
@@ -25,29 +30,64 @@ const useTableResize = ({
25
30
  ...defaultSize
26
31
  });
27
32
  };
33
+ const handleEventListeners = type => {
34
+ const listener = type === "add" ? document.addEventListener : document.removeEventListener;
35
+ const onMoveListener = isMobile ? "touchmove" : "pointermove";
36
+ const onEndListener = isMobile ? "touchend" : "pointerup";
37
+ listener(onMoveListener, onMouseMove);
38
+ listener(onEndListener, onMouseUp);
39
+ };
40
+ const updateLastTouch = ({
41
+ clientX,
42
+ clientY
43
+ }) => {
44
+ lastTouch.current.x = clientX;
45
+ lastTouch.current.y = clientY;
46
+ };
28
47
  const onMouseDown = e => {
29
- e.preventDefault();
30
- document.addEventListener("pointermove", onMouseMove);
31
- document.addEventListener("pointerup", onMouseUp);
48
+ if (isMobile) {
49
+ updateLastTouch(e.touches[0]);
50
+ } else {
51
+ e.preventDefault();
52
+ }
53
+ handleEventListeners("add");
32
54
  setResizing(true);
33
55
  setIsDone(0);
34
56
  };
35
57
  const onMouseUp = () => {
36
- document.removeEventListener("pointermove", onMouseMove);
37
- document.removeEventListener("pointerup", onMouseUp);
58
+ handleEventListeners("remove");
38
59
  setResizing(false);
39
60
  setIsDone(1);
40
61
  };
41
62
  const onMouseMove = e => {
63
+ let {
64
+ movementX,
65
+ movementY
66
+ } = e || {};
67
+ if (e.type === "touchmove") {
68
+ // for mobile
69
+ const {
70
+ x,
71
+ y
72
+ } = lastTouch.current || {};
73
+ const touches = e.touches[0];
74
+ const {
75
+ clientX,
76
+ clientY
77
+ } = touches;
78
+ movementX = clientX - x;
79
+ movementY = clientY - y;
80
+ updateLastTouch(touches);
81
+ }
42
82
  const {
43
83
  minWidth
44
84
  } = minMaxProps || {};
45
85
  setSize(currentSize => {
46
86
  const width = currentSize?.width || parentDOM?.clientWidth;
47
- const calcWidth = width + e.movementX;
87
+ const calcWidth = width + movementX;
48
88
  return {
49
89
  width: minWidth && calcWidth < minWidth ? minWidth : calcWidth,
50
- height: currentSize.height + e.movementY,
90
+ height: currentSize.height + movementY,
51
91
  widthInPercent: calcWidth / width * 100
52
92
  };
53
93
  });
@@ -82,7 +82,8 @@ const splitInlineStyleRanges = (text, inlineStyleRanges, data) => {
82
82
  };
83
83
  export const draftToSlate = props => {
84
84
  const {
85
- data
85
+ data,
86
+ needLayout
86
87
  } = props;
87
88
  if (data?.blocks && data?.blocks?.length > 0) {
88
89
  const converted = data?.blocks?.reduce((a, b) => {
@@ -104,7 +105,7 @@ export const draftToSlate = props => {
104
105
  return data;
105
106
  } else {
106
107
  return [{
107
- type: "paragraph",
108
+ type: needLayout ? "title" : "paragraph",
108
109
  children: [{
109
110
  text: ""
110
111
  }]
@@ -1,10 +1,11 @@
1
- import { Editor, Transforms, Element, Node, Path, Range } from "slate";
1
+ import { Editor, Transforms, Element, Node, Path, Range, Point } from "slate";
2
2
  import { toggleBlock } from "./SlateUtilityFunctions";
3
3
  import insertNewLine from "./insertNewLine";
4
4
  import { insertAccordion } from "./accordion";
5
- import { isListItem } from "./helper";
5
+ import { getNodeWithType, isListItem } from "./helper";
6
6
  import RnDCtrlCmds from "./RnD/RnDCtrlCmds";
7
7
  import EDITORCMDS from "../common/EditorCmds";
8
+ import { ReactEditor } from "slate-react";
8
9
  const HOTKEYS = {
9
10
  b: "bold",
10
11
  i: "italic",
@@ -183,6 +184,20 @@ const checkListEnterEvent = (editor, type) => {
183
184
  insertNewLine(editor);
184
185
  }
185
186
  };
187
+ const removeAccordion = (editor, accordionPath) => {
188
+ Transforms.removeNodes(editor, {
189
+ at: accordionPath
190
+ });
191
+ Transforms.insertNodes(editor, {
192
+ type: "paragraph",
193
+ children: [{
194
+ text: ""
195
+ }]
196
+ }, {
197
+ at: accordionPath,
198
+ select: true
199
+ });
200
+ };
186
201
  export const enterEvent = (e, editor, isMobile) => {
187
202
  try {
188
203
  const ele = isListItem(editor);
@@ -225,9 +240,7 @@ export const enterEvent = (e, editor, isMobile) => {
225
240
  e.preventDefault();
226
241
  if (!text) {
227
242
  const accordionIndex = ele[1].slice(0, Math.max(ele[1].length - 1));
228
- Transforms.removeNodes(editor, {
229
- at: accordionIndex
230
- });
243
+ removeAccordion(editor, accordionIndex);
231
244
  } else {
232
245
  const nextPath = Path.next(Path.parent(ele[1]));
233
246
  insertAccordion(editor, nextPath);
@@ -329,6 +342,37 @@ export const enterEvent = (e, editor, isMobile) => {
329
342
  console.log(err);
330
343
  }
331
344
  };
345
+ export const handleAccordionOnBackspace = (e, editor) => {
346
+ try {
347
+ let isAccordion = false;
348
+ const [accordionDetails] = getNodeWithType(editor, "accordion-details");
349
+ const [accordionDetailsNode] = accordionDetails || [];
350
+ if (accordionDetailsNode) {
351
+ const dom = ReactEditor.toDOMNode(editor, accordionDetailsNode);
352
+ if (dom?.parentElement) {
353
+ dom.parentElement.style.display = "block";
354
+ }
355
+ }
356
+ const [accordionSummary] = getNodeWithType(editor, "accordion-summary");
357
+ const [accordionTitle, accordionTitlePath] = accordionSummary || [];
358
+ if (accordionTitle) {
359
+ // no selection
360
+ if (Range.isCollapsed(editor.selection)) {
361
+ const start = Editor.start(editor, accordionTitlePath);
362
+ const isCursorAtStart = Point.equals(editor.selection.focus, start);
363
+ if (isCursorAtStart) {
364
+ e.preventDefault();
365
+ const parentPath = Path.parent(accordionTitlePath);
366
+ removeAccordion(editor, parentPath);
367
+ isAccordion = true;
368
+ }
369
+ }
370
+ }
371
+ return isAccordion;
372
+ } catch (err) {
373
+ console.log(err);
374
+ }
375
+ };
332
376
  export const upDownArrowKeyEvents = (e, editor) => {
333
377
  try {
334
378
  const {
@@ -348,7 +392,7 @@ export const upDownArrowKeyEvents = (e, editor) => {
348
392
  }
349
393
  Transforms.move(editor, {
350
394
  distance: 0,
351
- unit: 'offset',
395
+ unit: "offset",
352
396
  reverse: false
353
397
  });
354
398
  Transforms.select(editor, {
@@ -7,43 +7,43 @@ export const sizeMap = {
7
7
  export const fontFamilyMap = {
8
8
  PoppinsRegular: "PoppinsRegular",
9
9
  PoppinsBold: "PoppinsBold",
10
- sans: "Helvetica,Arial, sans serif",
11
- serif: "Georgia, Times New Roaman,serif",
12
- monospace: "Monaco, Courier New,monospace",
13
- roboto: "'Roboto', sans-serif",
14
- qwitcher: "'Qwitcher Grypen', cursive",
15
- garamond: "'EB Garamond', serif",
16
- anton: "'Anton', sans-serif",
17
- dmserif: "'DM Serif Text', serif",
18
- inter: "'Inter', sans-serif",
19
- libre: "'Libre Baskerville', serif",
20
- montserrat: "'Montserrat', sans-serif",
21
- opensans: "'Open Sans', sans-serif",
22
- publicsans: "'Public Sans', sans-serif",
23
- raleway: "'Raleway', sans-serif",
24
- spacemono: "'Space Mono', sans-serif",
25
- bulgarian: "'Bulgarian Garamond', monospace",
26
- impact: "'Impact', serif",
27
- redacted: "'Redacted Script', cursive",
28
- greatVibes: "'Great Vibes', cursive",
29
- zeyada: "'Zeyada', cursive",
30
- allura: "'Allura', cursive",
31
- pinyon: "'Pinyon Script', cursive",
32
- muellerhoff: "'Herr Von Muellerhoff', cursive",
33
- dawning: "'Dawning of a New Day', cursive",
10
+ sans: 'Helvetica, Arial, "sans serif"',
11
+ serif: 'Georgia, "Times New Roaman", serif',
12
+ monospace: 'Monaco, "Courier New", monospace',
13
+ roboto: "Roboto, sans-serif",
14
+ qwitcher: '"Qwitcher Grypen", cursive',
15
+ garamond: '"EB Garamond", serif',
16
+ anton: "Anton, sans-serif",
17
+ dmserif: '"DM Serif Text", serif',
18
+ inter: "Inter, sans-serif",
19
+ libre: '"Libre Baskerville", serif',
20
+ montserrat: "Montserrat, sans-serif",
21
+ opensans: '"Open Sans", sans-serif',
22
+ publicsans: '"Public Sans", sans-serif',
23
+ raleway: "Raleway, sans-serif",
24
+ spacemono: '"Space Mono", sans-serif',
25
+ bulgarian: '"Bulgarian Garamond", monospace',
26
+ impact: "Impact, serif",
27
+ redacted: '"Redacted Script", cursive',
28
+ greatVibes: '"Great Vibes", cursive',
29
+ zeyada: "Zeyada, cursive",
30
+ allura: "Allura, cursive",
31
+ pinyon: '"Pinyon Script", cursive',
32
+ muellerhoff: '"Herr Von Muellerhoff", cursive',
33
+ dawning: '"Dawning of a New Day", cursive',
34
34
  // New Font Added for Type Signature
35
- comingsoon: "'Coming Soon', cursive",
36
- dancingScript: "'Dancing Script', cursive",
37
- engagement: "'Engagement', cursive",
38
- gaegu: "'Gaegu', cursive",
39
- ingridDarling: "'Ingrid Darling', cursive",
40
- kitaOne: "'Kite One', sans - serif",
41
- laBelleAurore: "'La Belle Aurore', cursive",
42
- lobster: "'Lobster', cursive",
43
- meaCulpa: "'Mea Culpa', cursive",
44
- meddon: "'Meddon', cursive",
45
- merriWeather: "'Merriweather', serif",
46
- theGirlNextDoor: "'The Girl Next Door', cursive"
35
+ comingsoon: '"Coming Soon", cursive',
36
+ dancingScript: '"Dancing Script", cursive',
37
+ engagement: "Engagement, cursive",
38
+ gaegu: "Gaegu, cursive",
39
+ ingridDarling: '"Ingrid Darling", cursive',
40
+ kitaOne: "Times",
41
+ laBelleAurore: '"La Belle Aurore", cursive',
42
+ lobster: "Lobster, cursive",
43
+ meaCulpa: '"Mea Culpa", cursive',
44
+ meddon: "Meddon, cursive",
45
+ merriWeather: "Merriweather, serif",
46
+ theGirlNextDoor: '"The Girl Next Door", cursive'
47
47
  };
48
48
  export const fontOptions = Object.keys(fontFamilyMap).map(m => {
49
49
  return {
@@ -62,7 +62,10 @@ export const signedTextFonts = Object.keys(fontFamilyMap).slice(-12).map(m => {
62
62
  export const headingMap = {
63
63
  headingOne: "32px",
64
64
  headingTwo: "24px",
65
- headingThree: "19px"
65
+ headingThree: "19px",
66
+ headingFour: "16px",
67
+ headingFive: "13px",
68
+ headingSix: "11px"
66
69
  };
67
70
  export const fontWeightOptions = [{
68
71
  text: "Bold",
@@ -2,6 +2,8 @@ import { Editor, Node, Transforms, Element, Path, Range, Text } from "slate";
2
2
  import { ReactEditor } from "slate-react";
3
3
  import insertNewLine from "./insertNewLine";
4
4
  import { getDevice } from "../helper/theme";
5
+ import { activeMark, getSelectedElementStyle } from "./SlateUtilityFunctions";
6
+ import { getCurrentElementText } from "../plugins/withHTML";
5
7
  export const windowVar = {};
6
8
  let ST_TIMEOUT = null;
7
9
  const BLOCKS = ["grid", "dataView"];
@@ -333,7 +335,8 @@ const handleLinkBtnClick = (e, props, isMobilePreview, metadata) => {
333
335
  }
334
336
  }
335
337
  };
336
- export const handleLinkType = (url, linkType, readOnly, openInNewTab, onClick = () => {}, metadata = {}) => {
338
+ export const handleLinkType = (url, linkType, readOnly, openInNewTab, onClick = () => {}, metadata = {}, isEditMode, isCustomMobile // for drawer in App Header
339
+ ) => {
337
340
  const props = {};
338
341
  if (!readOnly) {
339
342
  return {
@@ -365,6 +368,9 @@ export const handleLinkType = (url, linkType, readOnly, openInNewTab, onClick =
365
368
  case "page":
366
369
  const [page = "", section] = url?.split("#") || [];
367
370
  const sec = section ? `#${section}` : "";
371
+ if (isEditMode) {
372
+ break;
373
+ }
368
374
  if (page === "_currentPage") {
369
375
  props.component = "button";
370
376
  props.onClick = () => {
@@ -385,11 +391,12 @@ export const handleLinkType = (url, linkType, readOnly, openInNewTab, onClick =
385
391
  const currentUserPage = getCurrentUserPage();
386
392
  props.href = isCurrentPage(page) ? `./${currentUserPage}${sec}` : `./${url}`;
387
393
  if (openInNewTab) {
388
- if (isCurrentPage(page)) {
389
- // temp fix, if user is presented in current page, open in new tab option is restricted, we will scroll to the element in current page
390
- } else {
391
- props.target = "_blank";
392
- }
394
+ // if (isCurrentPage(page)) {
395
+ // // temp fix, if user is presented in current page, open in new tab option is restricted, we will scroll to the element in current page
396
+ // } else {
397
+ // props.target = "_blank";
398
+ // }
399
+ props.target = "_blank";
393
400
  }
394
401
  }
395
402
  break;
@@ -424,7 +431,7 @@ export const handleLinkType = (url, linkType, readOnly, openInNewTab, onClick =
424
431
 
425
432
  // for iphone fix
426
433
  if (props.component === "a" && props.href) {
427
- const isMobile = getDevice(window.innerWidth) === "xs";
434
+ const isMobile = isCustomMobile || getDevice(window.innerWidth) === "xs";
428
435
  if (isMobile) {
429
436
  props.component = "button"; // iphone is opening two tabs, on open in new tab because of a tag.
430
437
  }
@@ -485,6 +492,34 @@ export const decodeString = str => {
485
492
  console.log(err);
486
493
  }
487
494
  };
495
+ export const getContrastColor = color => {
496
+ let r, g, b;
497
+
498
+ // Check if the color is in hex format
499
+ if (color.startsWith("#")) {
500
+ r = parseInt(color.substring(1, 3), 16);
501
+ g = parseInt(color.substring(3, 5), 16);
502
+ b = parseInt(color.substring(5, 7), 16);
503
+ }
504
+ // Check if the color is in RGB/RGBA format
505
+ else if (color.startsWith("rgb")) {
506
+ const rgbValues = color.replace(/^rgba?\(|\s+|\)$/g, "") // Remove the rgb/rgba and spaces
507
+ .split(","); // Split the values into an array
508
+
509
+ r = parseInt(rgbValues[0]);
510
+ g = parseInt(rgbValues[1]);
511
+ b = parseInt(rgbValues[2]);
512
+ } else {
513
+ // If the format is not recognized, default to black text
514
+ return "#000000";
515
+ }
516
+
517
+ // Calculate relative luminance
518
+ const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
519
+
520
+ // Return black for light colors, white for dark colors
521
+ return luminance > 0.5 ? "#000000" : "#FFFFFF";
522
+ };
488
523
  export const onDeleteKey = (event, {
489
524
  editor
490
525
  }) => {
@@ -702,6 +737,10 @@ export const isRestrictedNode = (event, editor) => {
702
737
  return isNodeRestricted;
703
738
  }
704
739
  };
740
+ export function capitalizeFirstLetter(str) {
741
+ if (!str) return str;
742
+ return str.charAt(0).toUpperCase() + str.slice(1);
743
+ }
705
744
  export const insertLineBreakAtEndOfPath = (editor, path) => {
706
745
  try {
707
746
  const [node, nodePath] = Editor.node(editor, path); // Get the node at the specified path
@@ -720,6 +759,13 @@ export const insertLineBreakAtEndOfPath = (editor, path) => {
720
759
  console.log(err);
721
760
  }
722
761
  };
762
+ export function isHavingSelection(editor) {
763
+ try {
764
+ return editor?.selection && !Range.isCollapsed(editor.selection);
765
+ } catch (err) {
766
+ console.log(err);
767
+ }
768
+ }
723
769
  const omitNodes = ["site-settings", "page-settings"];
724
770
  export function getInitialValue(value = [], readOnly) {
725
771
  if (readOnly === "readonly" && value?.length) {
@@ -750,20 +796,17 @@ export function getInitialValue(value = [], readOnly) {
750
796
  }
751
797
  return value;
752
798
  }
753
- export function capitalizeFirstLetter(str) {
754
- if (!str) return str;
755
- return str.charAt(0).toUpperCase() + str.slice(1);
756
- }
757
- export function isHavingSelection(editor) {
758
- try {
759
- return editor?.selection && !Range.isCollapsed(editor.selection);
760
- } catch (err) {
761
- console.log(err);
762
- }
763
- }
764
799
  export function getSelectedCls(defaultCls = "", selected, selectedClsName = "selected") {
765
800
  return `${defaultCls} ${selected ? selectedClsName : ""}`;
766
801
  }
802
+ export function handleNegativeInteger(val) {
803
+ return val < 0 ? 0 : val;
804
+ }
805
+ export const containsSurrogatePair = text => {
806
+ // Match surrogate pairs (high and low surrogate)
807
+ const surrogatePairRegex = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
808
+ return surrogatePairRegex.test(text);
809
+ };
767
810
  export const getNodeWithType = (editor, nodeType = "", otherOptions) => {
768
811
  try {
769
812
  const options = {
@@ -777,11 +820,6 @@ export const getNodeWithType = (editor, nodeType = "", otherOptions) => {
777
820
  return [];
778
821
  }
779
822
  };
780
- export const containsSurrogatePair = text => {
781
- // Match surrogate pairs (high and low surrogate)
782
- const surrogatePairRegex = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
783
- return surrogatePairRegex.test(text);
784
- };
785
823
  export const getSlateDom = (editor, range) => {
786
824
  try {
787
825
  const slateDom = ReactEditor.toDOMRange(editor, range);
@@ -831,9 +869,24 @@ export const hideSlateSelection = () => {
831
869
  const root = document.documentElement;
832
870
  root.style.setProperty("--slate-highlight-bg", "none");
833
871
  };
834
- export function handleNegativeInteger(val) {
835
- return val < 0 ? 0 : val;
836
- }
872
+ export const insertSlashNode = (editor, insertNode) => {
873
+ try {
874
+ // Delete the currently selected text
875
+ editor.deleteFragment();
876
+ const currentText = getCurrentElementText(editor);
877
+ const currentPath = editor?.selection?.anchor?.path;
878
+ let insertAt = currentPath;
879
+ if (currentText?.trim()) {
880
+ const parentPath = Path.parent(currentPath);
881
+ insertAt = Path.next(parentPath);
882
+ }
883
+ Transforms.insertNodes(editor, insertNode, {
884
+ at: insertAt
885
+ });
886
+ } catch (err) {
887
+ console.log(err);
888
+ }
889
+ };
837
890
  export const isEverythingSelected = editor => {
838
891
  const {
839
892
  selection
@@ -863,4 +916,113 @@ export const getCurrentNodeText = editor => {
863
916
  } catch (error) {
864
917
  console.log("Error:", error);
865
918
  }
919
+ };
920
+ function convertColorToRgb(color) {
921
+ if (color?.startsWith("#")) {
922
+ // HEX to RGB
923
+ let hex = color.replace("#", "");
924
+ let r, g, b;
925
+ if (hex.length === 3) {
926
+ hex = hex.split("").map(x => x + x).join("");
927
+ }
928
+ if (hex.length === 6) {
929
+ [r, g, b] = [hex.substring(0, 2), hex.substring(2, 4), hex.substring(4, 6)].map(val => parseInt(val, 16));
930
+ return `rgb(${r}, ${g}, ${b})`;
931
+ }
932
+ } else {
933
+ return color;
934
+ }
935
+ }
936
+ export const getSelectedColor = (selectedColor, theme, hideThemeColors) => {
937
+ const colorVars = hideThemeColors ? null : theme?.vars?.colors;
938
+ let selectedValue = selectedColor;
939
+ if (colorVars) {
940
+ const convertedColor = convertColorToRgb(selectedColor);
941
+ Object.entries(theme.colors).forEach(([key, value]) => {
942
+ const convertedThemeColor = convertColorToRgb(value);
943
+ if (convertedThemeColor === convertedColor) {
944
+ selectedValue = colorVars[key];
945
+ }
946
+ });
947
+ }
948
+ return selectedValue;
949
+ };
950
+ const themeTextFormats = ["headingOne", "headingTwo", "headingThree", "headingFour", "headingFive", "headingSix", "paragraphOne", "paragraphTwo", "paragraphThree"];
951
+ export const getSelectedElementColor = (editor, format, theme) => {
952
+ const [isThemeText] = Editor.nodes(editor, {
953
+ at: editor.selection,
954
+ match: n => themeTextFormats.includes(n?.type)
955
+ });
956
+ if (!isThemeText) {
957
+ return activeMark(editor, "color") || "#000000";
958
+ }
959
+ const color = getSelectedElementStyle(format, editor, format);
960
+ return getSelectedColor(color, theme);
961
+ };
962
+ export const isHavingColor = color => {
963
+ if (!color) {
964
+ return false;
965
+ }
966
+ if (color.includes("rgba")) {
967
+ const match = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+),?\s*(\d*\.?\d+)?\)/);
968
+ if (!match) return false; // Invalid format
969
+
970
+ const alpha = match[4] !== undefined ? parseFloat(match[4]) : 1; // Default alpha = 1
971
+ return alpha !== 0;
972
+ }
973
+ return true;
974
+ };
975
+ const getCopiedTextFormat = domRange => {
976
+ const contents = domRange.cloneContents();
977
+ const div = document.createElement("div");
978
+ div.appendChild(contents);
979
+
980
+ // Replace <br> with newlines
981
+ div.querySelectorAll("br").forEach(br => br.replaceWith("\n"));
982
+ const BLOCK_TAGS = ["DIV", "P", "LI", "H1", "H2", "H3", "H4", "H5", "H6"];
983
+ div.querySelectorAll(BLOCK_TAGS.join(",")).forEach(el => {
984
+ el.insertAdjacentText("beforeend", "\n");
985
+ });
986
+ let text = div.textContent || "";
987
+ text = text
988
+ // Remove spaces or tabs that appear just before a newline
989
+ // e.g., "text \n" → "text\n"
990
+ .replace(/[ \t]+\n/g, "\n")
991
+
992
+ // Collapse multiple consecutive newlines into a single newline
993
+ // e.g., "\n\n\n" → "\n"
994
+ .replace(/\n{2,}/g, "\n")
995
+
996
+ // Remove leading and trailing whitespace from the final text
997
+ .trim();
998
+ return text;
999
+ };
1000
+ const getCopiedHTMLFormat = domRange => {
1001
+ const htmlContents = domRange.cloneContents();
1002
+ const container = document.createElement("div");
1003
+ container.appendChild(htmlContents);
1004
+ const html = container.innerHTML;
1005
+ return html;
1006
+ };
1007
+ const getCopiedSlateFormat = editor => {
1008
+ // Get Slate fragment
1009
+ const fragment = JSON.stringify(Editor.fragment(editor, editor.selection));
1010
+ const encodedFragment = window.btoa(decodeURIComponent(encodeURIComponent(fragment)));
1011
+ return encodedFragment;
1012
+ };
1013
+ export const handleCopy = (event, editor) => {
1014
+ const {
1015
+ selection
1016
+ } = editor;
1017
+ if (!selection || Range.isCollapsed(selection)) return;
1018
+ event.preventDefault();
1019
+ const domRange = ReactEditor.toDOMRange(editor, selection);
1020
+ const text = getCopiedTextFormat(domRange);
1021
+ const html = getCopiedHTMLFormat(domRange);
1022
+ const encodedFragment = getCopiedSlateFormat(editor);
1023
+
1024
+ // Set all formats manually
1025
+ event.clipboardData?.setData("text/html", html);
1026
+ event.clipboardData?.setData("text/plain", text);
1027
+ event.clipboardData?.setData("application/x-slate-fragment", encodedFragment);
866
1028
  };
@@ -51,7 +51,7 @@ export const createAppHeaderNode = ({
51
51
  children: [{
52
52
  type: "grid-item",
53
53
  grid: 12,
54
- children: [...appHeaderNode({
54
+ children: [appHeaderNode({
55
55
  menus
56
56
  })],
57
57
  bgColor: "rgba(255, 255, 255, 0)",