@flozy/editor 4.0.3 → 4.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. package/dist/Editor/CommonEditor.js +85 -13
  2. package/dist/Editor/DialogWrapper.js +4 -3
  3. package/dist/Editor/Editor.css +28 -2
  4. package/dist/Editor/Elements/AI/AIInput.js +31 -33
  5. package/dist/Editor/Elements/AI/CustomSelect.js +19 -12
  6. package/dist/Editor/Elements/AI/PopoverAIInput.js +119 -132
  7. package/dist/Editor/Elements/AI/Styles.js +2 -2
  8. package/dist/Editor/Elements/AI/VoiceToText/AudioWave.js +73 -0
  9. package/dist/Editor/Elements/AI/VoiceToText/index.js +184 -0
  10. package/dist/Editor/Elements/AI/VoiceToText/style.js +40 -0
  11. package/dist/Editor/Elements/AI/helper.js +5 -3
  12. package/dist/Editor/Elements/AppHeader/AppHeader.js +36 -23
  13. package/dist/Editor/Elements/Button/EditorButton.js +23 -16
  14. package/dist/Editor/Elements/Carousel/CarouselButton.js +2 -2
  15. package/dist/Editor/Elements/Color Picker/ColorButtons.js +1 -1
  16. package/dist/Editor/Elements/Color Picker/Styles.js +1 -0
  17. package/dist/Editor/Elements/Embed/Image.js +15 -14
  18. package/dist/Editor/Elements/Embed/Video.js +12 -8
  19. package/dist/Editor/Elements/Emoji/EmojiButton.js +11 -7
  20. package/dist/Editor/Elements/Form/Form.js +43 -27
  21. package/dist/Editor/Elements/Form/FormField.js +21 -10
  22. package/dist/Editor/Elements/Form/Workflow/index.js +5 -2
  23. package/dist/Editor/Elements/FreeGrid/FreeGrid.js +437 -0
  24. package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +206 -0
  25. package/dist/Editor/Elements/FreeGrid/FreeGridButton.js +23 -0
  26. package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +236 -0
  27. package/dist/Editor/Elements/FreeGrid/Options/AddElement.js +44 -0
  28. package/dist/Editor/Elements/FreeGrid/Options/More.js +24 -0
  29. package/dist/Editor/Elements/FreeGrid/Options/SectionSettings.js +47 -0
  30. package/dist/Editor/Elements/FreeGrid/Options/sectionItemOptions.js +19 -0
  31. package/dist/Editor/Elements/FreeGrid/breakpointConstants.js +75 -0
  32. package/dist/Editor/Elements/FreeGrid/styles.js +214 -0
  33. package/dist/Editor/Elements/Grid/Grid.js +12 -8
  34. package/dist/Editor/Elements/Grid/GridItem.js +31 -21
  35. package/dist/Editor/Elements/Link/LinkPopup.js +69 -13
  36. package/dist/Editor/Elements/Link/LinkPopupStyles.js +28 -0
  37. package/dist/Editor/Elements/NewLine/NewLineButton.js +2 -2
  38. package/dist/Editor/Elements/Signature/Signature.css +13 -6
  39. package/dist/Editor/Elements/Signature/SignatureOptions/UploadSignature.js +2 -1
  40. package/dist/Editor/Elements/Signature/SignaturePopup.js +186 -31
  41. package/dist/Editor/Elements/SimpleText/index.js +19 -7
  42. package/dist/Editor/Elements/SimpleText/style.js +44 -1
  43. package/dist/Editor/ErrorBoundary.js +30 -0
  44. package/dist/Editor/Styles/EditorStyles.js +28 -0
  45. package/dist/Editor/Toolbar/FormatTools/Dropdown.js +1 -1
  46. package/dist/Editor/Toolbar/FormatTools/TextSize.js +2 -2
  47. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +33 -5
  48. package/dist/Editor/Toolbar/PopupTool/ButtonTemplatesCard.js +12 -13
  49. package/dist/Editor/Toolbar/PopupTool/FullViewCard.js +12 -13
  50. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/CustomSelectTool.js +3 -0
  51. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectSuperSubscript.js +59 -0
  52. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +2 -1
  53. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +107 -40
  54. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +57 -61
  55. package/dist/Editor/Toolbar/PopupTool/index.js +13 -3
  56. package/dist/Editor/Toolbar/Toolbar.js +7 -0
  57. package/dist/Editor/Toolbar/toolbarGroups.js +15 -5
  58. package/dist/Editor/assets/svg/AIIcons.js +153 -1
  59. package/dist/Editor/common/EditorCmds.js +0 -3
  60. package/dist/Editor/common/EditorIcons.js +7 -7
  61. package/dist/Editor/common/Icon.js +39 -30
  62. package/dist/Editor/common/ImageList.js +16 -3
  63. package/dist/Editor/common/ImageSelector/ImageSelector.js +30 -9
  64. package/dist/Editor/common/ImageSelector/Styles.js +2 -1
  65. package/dist/Editor/common/LinkSettings/index.js +2 -1
  66. package/dist/Editor/common/LinkSettings/style.js +11 -8
  67. package/dist/Editor/common/MentionsPopup/Styles.js +1 -1
  68. package/dist/Editor/common/MentionsPopup/index.js +12 -8
  69. package/dist/Editor/common/RnD/ContextMenu/CMenus.js +142 -0
  70. package/dist/Editor/common/RnD/ContextMenu/index.js +38 -0
  71. package/dist/Editor/common/RnD/ContextMenu/styles.js +21 -0
  72. package/dist/Editor/common/RnD/DragInfo/index.js +31 -0
  73. package/dist/Editor/common/RnD/DragInfo/styles.js +15 -0
  74. package/dist/Editor/common/RnD/DragOver/index.js +55 -0
  75. package/dist/Editor/common/RnD/DragOver/styles.js +23 -0
  76. package/dist/Editor/common/RnD/ElementOptions/Actions.js +102 -0
  77. package/dist/Editor/common/RnD/ElementOptions/Icons/LinkIcon.js +26 -0
  78. package/dist/Editor/common/RnD/ElementOptions/index.js +95 -0
  79. package/dist/Editor/common/RnD/ElementOptions/styles.js +41 -0
  80. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Link.js +153 -0
  81. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/SaveAsTemplate.js +36 -0
  82. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +60 -0
  83. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/index.js +9 -0
  84. package/dist/Editor/common/RnD/ElementSettings/Settings/AppHeaderSettings.js +47 -0
  85. package/dist/Editor/common/RnD/ElementSettings/Settings/BoxSettings.js +47 -0
  86. package/dist/Editor/common/RnD/ElementSettings/Settings/ButtonSettings.js +47 -0
  87. package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +48 -0
  88. package/dist/Editor/common/RnD/ElementSettings/Settings/ImageSettings.js +47 -0
  89. package/dist/Editor/common/RnD/ElementSettings/Settings/TextSettings.js +30 -0
  90. package/dist/Editor/common/RnD/ElementSettings/Settings/VideoSettings.js +47 -0
  91. package/dist/Editor/common/RnD/ElementSettings/Settings/index.js +17 -0
  92. package/dist/Editor/common/RnD/ElementSettings/index.js +17 -0
  93. package/dist/Editor/common/RnD/ElementSettings/settingsConstants.js +18 -0
  94. package/dist/Editor/common/RnD/ElementSettings/styles.js +94 -0
  95. package/dist/Editor/common/RnD/GuideLines/BoundaryLine.js +52 -0
  96. package/dist/Editor/common/RnD/GuideLines/index.js +33 -0
  97. package/dist/Editor/common/RnD/GuideLines/styles.js +62 -0
  98. package/dist/Editor/common/RnD/OptionsPopup/index.js +50 -0
  99. package/dist/Editor/common/RnD/OptionsPopup/style.js +36 -0
  100. package/dist/Editor/common/RnD/RnDCopy.js +23 -0
  101. package/dist/Editor/common/RnD/ShadowElement.js +34 -0
  102. package/dist/Editor/common/RnD/SwitchViewport/SwitchViewport.js +40 -0
  103. package/dist/Editor/common/RnD/SwitchViewport/styles.js +24 -0
  104. package/dist/Editor/common/RnD/Theme/ViewportStimulator.js +63 -0
  105. package/dist/Editor/common/RnD/TransformHandles/CornerHandle.js +19 -0
  106. package/dist/Editor/common/RnD/TransformHandles/Icons/BottomRightIcon.js +13 -0
  107. package/dist/Editor/common/RnD/TransformHandles/SizeHandle.js +20 -0
  108. package/dist/Editor/common/RnD/TransformHandles/index.js +67 -0
  109. package/dist/Editor/common/RnD/Utils/alignmentDetection.js +26 -0
  110. package/dist/Editor/common/RnD/Utils/calculateDropItem.js +98 -0
  111. package/dist/Editor/common/RnD/Utils/collisionDetection.js +52 -0
  112. package/dist/Editor/common/RnD/Utils/gridDropItem.js +181 -0
  113. package/dist/Editor/common/RnD/Utils/index.js +251 -0
  114. package/dist/Editor/common/RnD/VirtualElement/index.js +77 -0
  115. package/dist/Editor/common/RnD/VirtualElement/styles.js +27 -0
  116. package/dist/Editor/common/RnD/VirtualElement/updateAutoProps.js +28 -0
  117. package/dist/Editor/common/RnD/index.js +567 -0
  118. package/dist/Editor/common/RnD/styles.js +4 -0
  119. package/dist/Editor/common/Section/index.js +21 -12
  120. package/dist/Editor/common/Section/styles.js +7 -4
  121. package/dist/Editor/common/Shorthands/elements.js +21 -9
  122. package/dist/Editor/common/StyleBuilder/boxStyle.js +30 -0
  123. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +18 -10
  124. package/dist/Editor/common/StyleBuilder/fieldTypes/saveAsTemplate.js +18 -5
  125. package/dist/Editor/common/StyleBuilder/fieldTypes/text.js +4 -2
  126. package/dist/Editor/common/StyleBuilder/index.js +6 -4
  127. package/dist/Editor/common/StyleBuilder/sectionStyle.js +13 -2
  128. package/dist/Editor/common/iconListV2.js +843 -0
  129. package/dist/Editor/commonStyle.js +6 -0
  130. package/dist/Editor/helper/RnD/focusOnNewItem.js +39 -0
  131. package/dist/Editor/helper/RnD/scrollToNewSection.js +24 -0
  132. package/dist/Editor/helper/breakpoint.js +5 -0
  133. package/dist/Editor/helper/index.js +139 -0
  134. package/dist/Editor/helper/theme.js +50 -1
  135. package/dist/Editor/hooks/useBreakpoints.js +34 -0
  136. package/dist/Editor/hooks/useMouseMove.js +36 -8
  137. package/dist/Editor/hooks/useWindowMessage.js +10 -7
  138. package/dist/Editor/hooks/withCommon.js +2 -1
  139. package/dist/Editor/hooks/withErrorHandling.js +14 -0
  140. package/dist/Editor/utils/RnD/RnDCtrlCmds.js +197 -0
  141. package/dist/Editor/utils/SlateUtilityFunctions.js +36 -4
  142. package/dist/Editor/utils/events.js +5 -0
  143. package/dist/Editor/utils/form.js +7 -2
  144. package/dist/Editor/utils/formfield.js +1 -1
  145. package/dist/Editor/utils/freegrid.js +91 -0
  146. package/dist/Editor/utils/helper.js +43 -0
  147. package/dist/Editor/utils/insertAppHeader.js +47 -40
  148. package/package.json +6 -2
@@ -0,0 +1,34 @@
1
+ import React from "react";
2
+ import { Box, useTheme } from "@mui/material";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ const useShadowElementStyles = ({
5
+ theme,
6
+ style
7
+ }) => ({
8
+ root: {
9
+ ...style,
10
+ position: "relative",
11
+ backgroundColor: "rgba(0,0,0,0)",
12
+ marginLeft: `calc((100% - 980px) * 0.5)`,
13
+ [theme.breakpoints.between("xs", "md")]: {
14
+ marginLeft: `calc((100% - 320px) * 0.5)`
15
+ }
16
+ }
17
+ });
18
+ const ShadowElement = props => {
19
+ const theme = useTheme();
20
+ const {
21
+ type,
22
+ enable,
23
+ style
24
+ } = props;
25
+ const classes = useShadowElementStyles({
26
+ theme,
27
+ style
28
+ });
29
+ return type === "child" && enable === 1 ? /*#__PURE__*/_jsx(Box, {
30
+ component: "div",
31
+ sx: classes.root
32
+ }) : null;
33
+ };
34
+ export default ShadowElement;
@@ -0,0 +1,40 @@
1
+ import { Box, IconButton, Tooltip } from "@mui/material";
2
+ import PersonalVideoIcon from "@mui/icons-material/PersonalVideo";
3
+ import PhoneIphoneIcon from "@mui/icons-material/PhoneIphone";
4
+ import useSwitchViewport from "./styles";
5
+ import { useEffect } from "react";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ import { jsxs as _jsxs } from "react/jsx-runtime";
8
+ const SwitchViewport = props => {
9
+ const {
10
+ breakpoint,
11
+ onChange
12
+ } = props;
13
+ const classes = useSwitchViewport();
14
+ useEffect(() => {
15
+ console.log(breakpoint);
16
+ }, [breakpoint]);
17
+ return /*#__PURE__*/_jsxs(Box, {
18
+ sx: classes.root,
19
+ children: [/*#__PURE__*/_jsx(Tooltip, {
20
+ title: "Desktop View",
21
+ children: /*#__PURE__*/_jsx(IconButton, {
22
+ className: `${!breakpoint || breakpoint === "lg" ? "active" : ""}`,
23
+ onClick: () => {
24
+ onChange("");
25
+ },
26
+ children: /*#__PURE__*/_jsx(PersonalVideoIcon, {})
27
+ })
28
+ }), /*#__PURE__*/_jsx(Tooltip, {
29
+ title: "Mobile View",
30
+ children: /*#__PURE__*/_jsx(IconButton, {
31
+ className: `${breakpoint === "xs" ? "active" : ""}`,
32
+ onClick: () => {
33
+ onChange("xs");
34
+ },
35
+ children: /*#__PURE__*/_jsx(PhoneIphoneIcon, {})
36
+ })
37
+ })]
38
+ });
39
+ };
40
+ export default SwitchViewport;
@@ -0,0 +1,24 @@
1
+ const useSwitchViewport = () => ({
2
+ root: {
3
+ position: "absolute",
4
+ right: 4,
5
+ top: 4,
6
+ margin: "auto",
7
+ padding: "4px",
8
+ zIndex: 100,
9
+ backgroundColor: "#FFF",
10
+ borderRadius: "12px",
11
+ display: "flex",
12
+ justifyContent: "center",
13
+ "& .MuiIconButton-root": {
14
+ padding: "4px",
15
+ "&.active": {
16
+ color: "#2563EB"
17
+ },
18
+ "& svg": {
19
+ height: "20px"
20
+ }
21
+ }
22
+ }
23
+ });
24
+ export default useSwitchViewport;
@@ -0,0 +1,63 @@
1
+ import React from "react";
2
+ import { useTheme, ThemeProvider, createTheme } from "@mui/material";
3
+ import { isStimulator, STIMULATOR_MOCK } from "../../../hooks/useBreakpoints";
4
+
5
+ // Custom breakpoints functions
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const customUp = (key, breakpoints) => {
8
+ const MOCK_BREAKPOINT = isStimulator();
9
+ if (key === "xs") {
10
+ // Simulate xs 'up' as being up from 0px (xs)
11
+ return "@media (min-width: 0px)";
12
+ }
13
+ if (MOCK_BREAKPOINT && key === "lg") {
14
+ return `@media (min-width: 10000px)`;
15
+ }
16
+ return `@media (min-width: ${breakpoints[key]}px)`;
17
+ };
18
+ const customDown = (key, breakpoints) => {
19
+ if (key === "md") {
20
+ // Simulate 'down' from md
21
+ return "@media (max-width: 960px)";
22
+ }
23
+ return `@media (max-width: ${breakpoints[key]}px)`;
24
+ };
25
+ const customBetween = (start, end, breakpoints) => {
26
+ // Custom logic for between, simulating xs for demonstration
27
+ const MOCK_BREAKPOINT = isStimulator();
28
+ if (MOCK_BREAKPOINT && start === "xs" && end === "md") {
29
+ return STIMULATOR_MOCK[MOCK_BREAKPOINT];
30
+ }
31
+ return `@media (min-width: ${breakpoints[start]}px) and (max-width: ${breakpoints[end]}px)`;
32
+ };
33
+ const customOnly = (key, breakpoints) => {
34
+ // Custom logic for between, simulating xs for demonstration
35
+ const MOCK_BREAKPOINT = isStimulator();
36
+ if (MOCK_BREAKPOINT && key === "xs") {
37
+ return STIMULATOR_MOCK[MOCK_BREAKPOINT];
38
+ }
39
+ return `@media (min-width: ${breakpoints[key]}px) and (max-width: ${breakpoints[key + 1]}px)`;
40
+ };
41
+
42
+ // Extend the existing theme with custom breakpoint functions
43
+ const extendedTheme = prevTheme => createTheme({
44
+ ...prevTheme,
45
+ breakpoints: {
46
+ ...prevTheme.breakpoints,
47
+ up: key => customUp(key, prevTheme.breakpoints.values),
48
+ down: key => customDown(key, prevTheme.breakpoints.values),
49
+ between: (start, end) => customBetween(start, end, prevTheme.breakpoints.values),
50
+ only: key => customOnly(key, prevTheme.breakpoints.values)
51
+ }
52
+ });
53
+ const ViewportStimulator = ({
54
+ children
55
+ }) => {
56
+ const theme = useTheme();
57
+ const viewportTheme = extendedTheme(theme);
58
+ return /*#__PURE__*/_jsx(ThemeProvider, {
59
+ theme: viewportTheme,
60
+ children: children
61
+ });
62
+ };
63
+ export default ViewportStimulator;
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ const CornerHandle = ({
4
+ style
5
+ }) => {
6
+ return /*#__PURE__*/_jsx("div", {
7
+ style: {
8
+ width: "8px",
9
+ height: "8px",
10
+ background: "#FFF",
11
+ border: "1px solid #2563EB",
12
+ position: "absolute",
13
+ left: "6px",
14
+ top: "6px",
15
+ ...style
16
+ }
17
+ });
18
+ };
19
+ export default CornerHandle;
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ const BottomRightIcon = () => /*#__PURE__*/_jsx("svg", {
4
+ width: "20px",
5
+ height: "20px",
6
+ version: "1.1",
7
+ viewBox: "0 0 100 100",
8
+ xmlns: "http://www.w3.org/2000/svg",
9
+ children: /*#__PURE__*/_jsx("path", {
10
+ d: "m70.129 67.086l1.75-36.367c-0.035156-2.6523-2.9414-3.6523-4.8164-1.7773l-8.4531 8.4531-17.578-17.574c-2.3438-2.3438-5.7188-1.5625-8.0586 0.78125l-13.078 13.078c-2.3438 2.3438-2.4141 5.0117-0.074219 7.3516l17.574 17.574-8.4531 8.4531c-1.875 1.875-0.83594 4.8203 1.8164 4.8555l36.258-1.8594c1.6836 0.019531 3.1328-1.2812 3.1133-2.9688z"
11
+ })
12
+ });
13
+ export default BottomRightIcon;
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ const SizeHandle = ({
4
+ style,
5
+ className
6
+ }) => {
7
+ return /*#__PURE__*/_jsx("div", {
8
+ className: className,
9
+ style: {
10
+ width: "8px",
11
+ height: "8px",
12
+ background: "#FFF",
13
+ border: "1px solid #2563EB",
14
+ position: "absolute",
15
+ margin: "auto",
16
+ ...style
17
+ }
18
+ });
19
+ };
20
+ export default SizeHandle;
@@ -0,0 +1,67 @@
1
+ import CornerHandle from "./CornerHandle";
2
+ import SizeHandle from "./SizeHandle";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ const Handles = ({
5
+ type
6
+ }) => {
7
+ return {
8
+ top: /*#__PURE__*/_jsx(SizeHandle, {
9
+ style: {
10
+ left: 0,
11
+ right: 0
12
+ }
13
+ }),
14
+ bottom: /*#__PURE__*/_jsx(SizeHandle, {
15
+ className: `bottom-handle ${type}`,
16
+ style: {
17
+ left: 0,
18
+ right: 0,
19
+ bottom: 0
20
+ }
21
+ }),
22
+ right: /*#__PURE__*/_jsx(SizeHandle, {
23
+ style: {
24
+ top: 0,
25
+ right: "0px",
26
+ bottom: 0,
27
+ width: "8px",
28
+ height: "8px"
29
+ }
30
+ }),
31
+ left: /*#__PURE__*/_jsx(SizeHandle, {
32
+ style: {
33
+ top: 0,
34
+ left: "0px",
35
+ bottom: 0,
36
+ width: "8px",
37
+ height: "8px"
38
+ }
39
+ }),
40
+ topLeft: /*#__PURE__*/_jsx(CornerHandle, {
41
+ style: {
42
+ left: "6px",
43
+ top: "6px",
44
+ display: "none"
45
+ }
46
+ }),
47
+ topRight: /*#__PURE__*/_jsx(CornerHandle, {
48
+ style: {
49
+ right: "6px",
50
+ top: "6px"
51
+ }
52
+ }),
53
+ bottomLeft: /*#__PURE__*/_jsx(CornerHandle, {
54
+ style: {
55
+ left: "6px",
56
+ top: "6px"
57
+ }
58
+ }),
59
+ bottomRight: /*#__PURE__*/_jsx(CornerHandle, {
60
+ style: {
61
+ left: "6px",
62
+ top: "6px"
63
+ }
64
+ })
65
+ };
66
+ };
67
+ export default Handles;
@@ -0,0 +1,26 @@
1
+ function horizantalAlignment(rect1, rect2) {
2
+ const diff = Math.abs(rect2.top - rect1.bottom);
3
+ return {
4
+ horizantal: rect2.top < rect1.bottom,
5
+ hdiff: diff,
6
+ hpercent: diff / rect2.height * 100
7
+ };
8
+ }
9
+ function verticalAlignment(rect1, rect2) {
10
+ const diff = Math.abs(rect1.right - rect2.left);
11
+ return {
12
+ vertical: rect2.left > rect1.left && rect2.left < rect1.right,
13
+ vdiff: diff,
14
+ vpercent: diff / rect2.width * 100
15
+ };
16
+ }
17
+ export function alignmentDetection(rect1, rect2) {
18
+ try {
19
+ return {
20
+ ...horizantalAlignment(rect1, rect2),
21
+ ...verticalAlignment(rect1, rect2)
22
+ };
23
+ } catch (err) {
24
+ console.log(err);
25
+ }
26
+ }
@@ -0,0 +1,98 @@
1
+ import { Transforms, Node } from "slate";
2
+ import { ReactEditor } from "slate-react";
3
+ import { alignmentDetection } from "./alignmentDetection";
4
+
5
+ /**
6
+ * This method will return the list of items inside the give section
7
+ * @param {*} sectionPath - paresent section path to get items
8
+ */
9
+ export function getItems(editor, sectionPath = []) {
10
+ try {
11
+ const parentNode = Node.get(editor, sectionPath);
12
+ let doms = parentNode?.children?.map((item, itemIndex) => {
13
+ const itemDom = ReactEditor.toDOMNode(editor, item)?.closest(".freegrid-item");
14
+ const {
15
+ left,
16
+ top,
17
+ width,
18
+ height,
19
+ right,
20
+ bottom
21
+ } = itemDom?.getBoundingClientRect();
22
+ return {
23
+ node: itemDom,
24
+ rect: {
25
+ left,
26
+ top,
27
+ width,
28
+ height,
29
+ right,
30
+ bottom
31
+ },
32
+ path: [...sectionPath, itemIndex],
33
+ item
34
+ };
35
+ });
36
+ // sort by top position
37
+ doms = doms.sort((a, b) => a.rect.top - b.rect.top);
38
+ return {
39
+ items: parentNode?.children,
40
+ doms
41
+ };
42
+ } catch (err) {
43
+ console.log(err);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * This method will get the nearest top element
49
+ * @param {*} editor
50
+ * @param {*} sectionPath
51
+ * @param {*} props
52
+ */
53
+ export function getNearestItem(editor, sectionPath = [], props) {
54
+ try {
55
+ const {
56
+ items,
57
+ doms
58
+ } = getItems(editor, sectionPath);
59
+ console.log(items, doms);
60
+ for (let i = 0; i < doms.length; i++) {
61
+ const prev = doms[i - 1];
62
+ const current = doms[i];
63
+ if (i > 0) {
64
+ const res = alignmentDetection(prev.rect, current.rect);
65
+ console.log(res, current?.path);
66
+ const {
67
+ vertical,
68
+ horizantal,
69
+ hpercent
70
+ } = res;
71
+ if (!vertical && !horizantal) {
72
+ const row = i + 1;
73
+ Transforms.setNodes(editor, {
74
+ gridArea: `${i + 1} / 1 / ${row + 1} / 2`,
75
+ top: 0,
76
+ marginTop: 0
77
+ }, {
78
+ at: current?.path
79
+ });
80
+ } else if (horizantal && hpercent > 5) {
81
+ Transforms.setNodes(editor, {
82
+ gridArea: `${i - 1 || 1} / 1 / ${(i - 1 || 1) + 1} / 2`
83
+ }, {
84
+ at: current?.path
85
+ });
86
+ }
87
+ } else {
88
+ Transforms.setNodes(editor, {
89
+ gridArea: `1 / 1 / 2 / 2`
90
+ }, {
91
+ at: current?.path
92
+ });
93
+ }
94
+ }
95
+ } catch (err) {
96
+ console.log(err);
97
+ }
98
+ }
@@ -0,0 +1,52 @@
1
+ function isColliding(rect1, rect2) {
2
+ return !(rect1.right < rect2.left || rect1.left > rect2.right || rect1.bottom < rect2.top || rect1.top > rect2.bottom);
3
+ }
4
+ function getCollisionSides(rect1, rect2) {
5
+ const collisionSides = {
6
+ top: rect1.top < rect2.bottom && rect1.bottom > rect2.top && rect1.left < rect2.right && rect1.right > rect2.left && rect1.top <= rect2.top,
7
+ bottom: rect1.top < rect2.bottom && rect1.bottom > rect2.top && rect1.left < rect2.right && rect1.right > rect2.left && rect1.bottom >= rect2.bottom,
8
+ left: rect1.top < rect2.bottom && rect1.bottom > rect2.top && rect1.left <= rect2.left && rect1.right > rect2.left,
9
+ right: rect1.top < rect2.bottom && rect1.bottom > rect2.top && rect1.right >= rect2.right && rect1.left < rect2.right
10
+ };
11
+ return collisionSides;
12
+ }
13
+ function getCollisionDetails(rect1, rect2) {
14
+ if (!isColliding(rect1, rect2)) {
15
+ return null;
16
+ }
17
+ const overlapX = Math.min(rect1.right, rect2.right) - Math.max(rect1.left, rect2.left);
18
+ const overlapY = Math.min(rect1.bottom, rect2.bottom) - Math.max(rect1.top, rect2.top);
19
+ let collisionSide = "";
20
+ let penetrationDepth = Math.min(overlapX, overlapY); // Basic depth calculation
21
+
22
+ if (overlapX < overlapY) {
23
+ collisionSide = rect1.left < rect2.left ? "right" : "left";
24
+ penetrationDepth = overlapX;
25
+ } else {
26
+ collisionSide = rect1.top < rect2.top ? "bottom" : "top";
27
+ penetrationDepth = overlapY;
28
+ }
29
+ return {
30
+ collision: true,
31
+ side: collisionSide,
32
+ depth: penetrationDepth
33
+ };
34
+ }
35
+ export function detectCollisionAndSides(rect1, rect2) {
36
+ const isColliding = !(rect1.right < rect2.left || rect1.left > rect2.right || rect1.bottom < rect2.top || rect1.top > rect2.bottom);
37
+ if (isColliding) {
38
+ const sides = getCollisionSides(rect1, rect2);
39
+ const collisionDetails = getCollisionDetails(rect1, rect2);
40
+ return {
41
+ isColliding,
42
+ sides,
43
+ collisionDetails
44
+ };
45
+ } else {
46
+ return {
47
+ isColliding,
48
+ sides: {},
49
+ collisionDetails: null
50
+ };
51
+ }
52
+ }
@@ -0,0 +1,181 @@
1
+ import { Transforms, Node, Path } from "slate";
2
+ import { ReactEditor } from "slate-react";
3
+ export const ROW_HEIGHT = 50;
4
+ const MARGIN_OF = {
5
+ xs: 160,
6
+ lg: 490
7
+ };
8
+
9
+ /**
10
+ * This method will update the grid template rows of parent section based on height
11
+ * @param {*} path
12
+ */
13
+ export function updateRows() {}
14
+
15
+ /**
16
+ * This method will update the grid template columns of parent section based on height
17
+ * @param {*} path
18
+ */
19
+ export function updateCols() {}
20
+ const handleMoveNode = (editor, path, newPath, {
21
+ isEmpty
22
+ }) => {
23
+ try {
24
+ const replaceNode = Node.get(editor, path);
25
+ if (isEmpty) {
26
+ const toPath = [...newPath, 0];
27
+ Transforms.insertNodes(editor, [{
28
+ ...replaceNode
29
+ }], {
30
+ at: toPath
31
+ });
32
+ Transforms.removeNodes(editor, {
33
+ at: path
34
+ });
35
+ return toPath;
36
+ } else {
37
+ Transforms.insertNodes(editor, [{
38
+ ...replaceNode
39
+ }], {
40
+ at: newPath
41
+ });
42
+ Transforms.removeNodes(editor, {
43
+ at: path
44
+ });
45
+ return newPath;
46
+ }
47
+ } catch (err) {
48
+ console.log(err);
49
+ console.log("Drop Node error");
50
+ return null;
51
+ }
52
+ };
53
+
54
+ /**
55
+ * This method will update prop in child node so it will re-render and update the path
56
+ * @param {*} path - contains the parent section path
57
+ */
58
+ const reRenderChildNodes = (editor, path) => {
59
+ try {
60
+ const sectionNode = Node.get(editor, path);
61
+ // parent node
62
+ Transforms.setNodes(editor, {
63
+ updated_at: new Date().getTime()
64
+ }, {
65
+ at: path
66
+ });
67
+ sectionNode?.children?.forEach((item, itemIndex) => {
68
+ Transforms.setNodes(editor, {
69
+ updated_at: new Date().getTime()
70
+ }, {
71
+ at: [...path, itemIndex]
72
+ });
73
+ });
74
+ } catch (err) {
75
+ console.log(err);
76
+ }
77
+ };
78
+ function isContainerElement(editor, moveTopath, props) {
79
+ try {
80
+ const dragItemPath = props.path;
81
+ const dragItem = Node.get(editor, dragItemPath);
82
+ let parentNode = null;
83
+ // if freegrid item
84
+ if (dragItem?.type === "freegridItem" || dragItem?.type === "freegridBox") {
85
+ // get parent node
86
+ parentNode = Node.get(editor, Path.parent(dragItemPath));
87
+ }
88
+ const moveToNode = Node.get(editor, moveTopath);
89
+ console.log(parentNode, moveToNode);
90
+ if (moveToNode.type === "freegridBox") {
91
+ if (parentNode.type === "freegridBox") {
92
+ return props.calX;
93
+ } else {
94
+ return props.calX - moveToNode?.left;
95
+ }
96
+ } else if (moveToNode.type === "freegrid") {
97
+ if (parentNode.type === "freegridBox") {
98
+ console.log(props.x);
99
+ return parseInt(props.x - window.innerWidth / 2 + MARGIN_OF[props.breakpoint] - props.diffX);
100
+ } else {
101
+ return props.calX;
102
+ }
103
+ }
104
+ } catch (err) {
105
+ console.log(err);
106
+ }
107
+ }
108
+ export function onDropItem(props, parentClass) {
109
+ try {
110
+ const {
111
+ editor,
112
+ startPosition,
113
+ endPosition,
114
+ dragOver,
115
+ parentPath,
116
+ path,
117
+ diffX,
118
+ x: cx,
119
+ breakpoint
120
+ // calX,
121
+ } = props;
122
+ const needMove = dragOver !== parentPath;
123
+ const moveTo = dragOver.split("|").map(m => parseInt(m));
124
+ const from = parentPath.split("|").map(m => parseInt(m));
125
+ let newPath = [];
126
+ newPath = moveTo;
127
+ const cCalx = isContainerElement(editor, moveTo, props);
128
+ const posX = parseInt(cx - window.innerWidth / 2 + MARGIN_OF[breakpoint] - diffX);
129
+ const toSectionNode = Node.get(editor, newPath);
130
+ const addToSectionDOM = ReactEditor.toDOMNode(editor, toSectionNode);
131
+ const rect = addToSectionDOM.getBoundingClientRect();
132
+ const y = endPosition.y - startPosition.diffY - rect.top;
133
+
134
+ // Calculate grid position
135
+ const row = Math.floor(y / ROW_HEIGHT) + 1;
136
+
137
+ // to calculate difference inside the grid
138
+ const marginTop = Math.abs((row - 1) * ROW_HEIGHT - y);
139
+
140
+ // Update grid area
141
+ const gridArea = `${row} / 1 / ${row + 1} / 2`;
142
+ const appenBp = breakpoint === "lg" ? "" : `_${breakpoint}`;
143
+ console.log(breakpoint, path);
144
+ Transforms.setNodes(editor, {
145
+ [`gridArea${appenBp}`]: gridArea,
146
+ [`left${appenBp}`]: cCalx,
147
+ [`marginTop${appenBp}`]: marginTop,
148
+ // to avoid auto position / resize of the element
149
+ [`${breakpoint}_updatedOn`]: new Date().getTime()
150
+ }, {
151
+ at: path
152
+ });
153
+ reRenderChildNodes(editor, from);
154
+
155
+ // move the node if section parent changed
156
+ if (needMove) {
157
+ // move the node
158
+ const isEmpty = toSectionNode?.children[0]?.type === undefined;
159
+ if (!isEmpty) {
160
+ newPath = [...newPath, toSectionNode?.children?.length];
161
+ }
162
+ const rPath = handleMoveNode(editor, path, newPath, {
163
+ isEmpty
164
+ });
165
+ reRenderChildNodes(editor, moveTo);
166
+ return {
167
+ updated_at: rPath
168
+ };
169
+ } else {
170
+ return {
171
+ updated_at: path
172
+ };
173
+ }
174
+ } catch (err) {
175
+ console.log(err);
176
+ }
177
+ }
178
+ export function calculateGridArea(y) {
179
+ const row = Math.floor(y / ROW_HEIGHT) + 1;
180
+ return `${row} / 1 / ${row + 1} / 2`;
181
+ }