@flozy/editor 1.7.4 → 1.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. package/dist/Editor/CommonEditor.js +30 -12
  2. package/dist/Editor/DialogWrapper.js +2 -10
  3. package/dist/Editor/Editor.css +105 -0
  4. package/dist/Editor/Elements/Color Picker/ColorButtons.js +14 -4
  5. package/dist/Editor/Elements/Color Picker/ColorPicker.js +9 -6
  6. package/dist/Editor/Elements/Color Picker/LogoIcon.js +15 -49
  7. package/dist/Editor/Elements/Color Picker/Styles.js +25 -4
  8. package/dist/Editor/Elements/Color Picker/defaultColors.js +1 -1
  9. package/dist/Editor/Elements/Embed/Image.js +25 -31
  10. package/dist/Editor/Elements/Embed/Video.js +49 -40
  11. package/dist/Editor/Elements/Form/Workflow/FormWorkflow.js +49 -3
  12. package/dist/Editor/Elements/Form/Workflow/ListWorkflow.js +92 -75
  13. package/dist/Editor/Elements/Form/Workflow/MoreOptions.js +0 -1
  14. package/dist/Editor/Elements/Form/Workflow/Styles.js +19 -5
  15. package/dist/Editor/Elements/Form/Workflow/UserInputs.js +2 -4
  16. package/dist/Editor/Elements/Grid/Grid.js +67 -114
  17. package/dist/Editor/Elements/Grid/GridItem.js +9 -23
  18. package/dist/Editor/Elements/Grid/templates/default_grid.js +0 -23
  19. package/dist/Editor/Elements/Link/Link.js +58 -20
  20. package/dist/Editor/Elements/Link/LinkButton.js +37 -97
  21. package/dist/Editor/Elements/Link/LinkPopup.js +106 -0
  22. package/dist/Editor/Elements/List/CheckList.js +28 -22
  23. package/dist/Editor/Elements/Signature/SignatureOptions/TypeSignature.js +11 -5
  24. package/dist/Editor/Elements/Signature/SignaturePopup.js +15 -4
  25. package/dist/Editor/Elements/SimpleText.js +30 -26
  26. package/dist/Editor/MiniEditor.js +4 -6
  27. package/dist/Editor/Styles/EditorStyles.js +72 -1
  28. package/dist/Editor/Toolbar/FormatTools/TextSize.js +2 -1
  29. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +5 -1
  30. package/dist/Editor/Toolbar/PopupTool/AddTemplates.js +3 -1
  31. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +4 -0
  32. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +96 -19
  33. package/dist/Editor/Toolbar/toolbarGroups.js +1 -1
  34. package/dist/Editor/common/Section/index.js +118 -0
  35. package/dist/Editor/common/Shorthands/elements.js +1 -1
  36. package/dist/Editor/common/StyleBuilder/appHeaderStyle.js +5 -1
  37. package/dist/Editor/common/StyleBuilder/buttonStyle.js +44 -51
  38. package/dist/Editor/common/StyleBuilder/embedImageStyle.js +2 -24
  39. package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +0 -3
  40. package/dist/Editor/common/StyleBuilder/fieldStyle.js +0 -3
  41. package/dist/Editor/common/StyleBuilder/fieldTypes/alignment.js +52 -62
  42. package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +2 -1
  43. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +100 -74
  44. package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +41 -10
  45. package/dist/Editor/common/StyleBuilder/fieldTypes/buttonLink.js +3 -3
  46. package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +27 -77
  47. package/dist/Editor/common/StyleBuilder/fieldTypes/fontSize.js +7 -5
  48. package/dist/Editor/common/StyleBuilder/fieldTypes/gridSize.js +19 -15
  49. package/dist/Editor/common/StyleBuilder/fieldTypes/icons.js +2 -2
  50. package/dist/Editor/common/StyleBuilder/fieldTypes/menusArray.js +2 -2
  51. package/dist/Editor/common/StyleBuilder/fieldTypes/radiusStyle.js +67 -8
  52. package/dist/Editor/common/StyleBuilder/fieldTypes/saveAsTemplate.js +2 -3
  53. package/dist/Editor/common/StyleBuilder/fieldTypes/text.js +21 -32
  54. package/dist/Editor/common/StyleBuilder/fieldTypes/textAlign.js +37 -41
  55. package/dist/Editor/common/StyleBuilder/fieldTypes/textOptions.js +26 -24
  56. package/dist/Editor/common/StyleBuilder/formStyle.js +0 -6
  57. package/dist/Editor/common/StyleBuilder/gridItemStyle.js +38 -54
  58. package/dist/Editor/common/StyleBuilder/gridStyle.js +20 -26
  59. package/dist/Editor/common/StyleBuilder/index.js +14 -58
  60. package/dist/Editor/common/StyleBuilder/sectionStyle.js +16 -0
  61. package/dist/Editor/common/Uploader.js +0 -4
  62. package/dist/Editor/helper/index.js +63 -1
  63. package/dist/Editor/utils/Decorators/index.js +5 -0
  64. package/dist/Editor/utils/Decorators/link.js +26 -0
  65. package/dist/Editor/utils/SlateUtilityFunctions.js +36 -8
  66. package/dist/Editor/utils/accordion.js +17 -4
  67. package/dist/Editor/utils/button.js +15 -1
  68. package/dist/Editor/utils/customHooks/useElement.js +28 -0
  69. package/dist/Editor/utils/embed.js +1 -7
  70. package/dist/Editor/utils/events.js +92 -43
  71. package/dist/Editor/utils/gridItem.js +1 -1
  72. package/dist/Editor/utils/link.js +10 -9
  73. package/package.json +1 -1
@@ -8,23 +8,10 @@ const gridStyle = [{
8
8
  type: "text",
9
9
  placeholder: "Id should be unique for the page..."
10
10
  }]
11
- }, {
12
- tab: "Size",
13
- value: "gridSize",
14
- fields: [{
15
- label: "Grid Size",
16
- key: "gridSize",
17
- type: "gridSize"
18
- }]
19
11
  }, {
20
12
  tab: "Colors",
21
13
  value: "colors",
22
14
  fields: [{
23
- label: "Text Color",
24
- key: "textColor",
25
- type: "color",
26
- needPreview: false
27
- }, {
28
15
  label: "Background Color",
29
16
  key: "bgColor",
30
17
  type: "color"
@@ -37,14 +24,6 @@ const gridStyle = [{
37
24
  key: "borderColor",
38
25
  type: "color"
39
26
  }]
40
- }, {
41
- tab: "Position",
42
- value: "position",
43
- fields: [{
44
- label: "Set Postion (Vertical & Horizantal)",
45
- key: "alignment",
46
- type: "alignment"
47
- }]
48
27
  }, {
49
28
  tab: "Background",
50
29
  value: "backgroundImage",
@@ -57,11 +36,19 @@ const gridStyle = [{
57
36
  key: "backgroundImage",
58
37
  type: "backgroundImage"
59
38
  }]
39
+ }, {
40
+ tab: "Position",
41
+ value: "position",
42
+ fields: [{
43
+ label: "Set Postion (Vertical & Horizantal)",
44
+ key: "alignment",
45
+ type: "alignment"
46
+ }]
60
47
  }, {
61
48
  tab: "Padding",
62
49
  value: "bannerSpacing",
63
50
  fields: [{
64
- label: "Padding",
51
+ label: "Banner Spacing",
65
52
  key: "bannerSpacing",
66
53
  type: "bannerSpacing"
67
54
  }]
@@ -76,11 +63,13 @@ const gridStyle = [{
76
63
  label: "Border Width",
77
64
  key: "borderWidth",
78
65
  type: "text",
79
- placeholder: "1px"
66
+ placeholder: "1px",
67
+ width: 6
80
68
  }, {
81
69
  label: "Border Style",
82
70
  key: "borderStyle",
83
71
  type: "textOptions",
72
+ width: 6,
84
73
  options: [{
85
74
  text: "Solid",
86
75
  value: "solid"
@@ -93,13 +82,18 @@ const gridStyle = [{
93
82
  }],
94
83
  renderOption: option => {
95
84
  return /*#__PURE__*/_jsx("span", {
96
- style: {
97
- fontFamily: option.value
98
- },
99
85
  children: option.text
100
86
  });
101
87
  }
102
88
  }]
89
+ }, {
90
+ tab: "Size",
91
+ value: "gridSize",
92
+ fields: [{
93
+ label: "Grid Size",
94
+ key: "gridSize",
95
+ type: "gridSize"
96
+ }]
103
97
  }, {
104
98
  tab: "Save As Template",
105
99
  value: "saveAsTemplate",
@@ -1,10 +1,5 @@
1
1
  import React, { useEffect, useState } from "react";
2
- import {
3
- // Dialog,
4
- DialogTitle, DialogContent, DialogActions, Button,
5
- // Tabs,
6
- // Tab,
7
- Grid, IconButton, Typography, Drawer } from "@mui/material";
2
+ import { DialogTitle, DialogContent, DialogActions, Button, Grid, IconButton, Typography, Drawer } from "@mui/material";
8
3
  import FieldMap from "./fieldTypes";
9
4
  import CloseIcon from "@mui/icons-material/Close";
10
5
  import commonStyle from "../../commonStyle";
@@ -29,51 +24,20 @@ const StyleContent = props => {
29
24
  return /*#__PURE__*/_jsx(Grid, {
30
25
  container: true,
31
26
  spacing: 2,
32
- children: /*#__PURE__*/_jsx(Grid, {
33
- item: true,
34
- xs: 12,
35
- style: {
36
- marginTop: "12px"
37
- },
38
- children: [...fields].map((m, i) => {
39
- const FieldComponent = FieldMap[m.type];
40
- return FieldComponent ? /*#__PURE__*/_jsx(FieldComponent, {
41
- data: m,
42
- value: element[m.key],
43
- onChange: onChange,
44
- elementProps: element,
45
- customProps: customProps,
46
- handleClose: handleClose
47
- }, `ei_stt_tab_${value}_${m.key}_${i}`) : null;
48
- })
27
+ className: "sidebar-wrpr-eds",
28
+ children: [...fields].map((m, i) => {
29
+ const FieldComponent = FieldMap[m.type];
30
+ return FieldComponent ? /*#__PURE__*/_jsx(FieldComponent, {
31
+ data: m,
32
+ value: element[m.key],
33
+ onChange: onChange,
34
+ elementProps: element,
35
+ customProps: customProps,
36
+ handleClose: handleClose
37
+ }, `ei_stt_tab_${value}_${m.key}_${i}`) : null;
49
38
  })
50
39
  }, value);
51
40
  };
52
-
53
- // const StyleTabs = (props) => {
54
- // const { value, handleChange, renderTabs } = props;
55
- // return (
56
- // <Tabs
57
- // value={value}
58
- // onChange={handleChange}
59
- // variant="scrollable"
60
- // scrollButtons="auto"
61
- // aria-label="scrollable auto tabs example"
62
- // className="editorTabs"
63
- // >
64
- // {renderTabs.map((m, i) => {
65
- // return (
66
- // <Tab
67
- // key={`editor-stt-tab-${m.value}`}
68
- // value={m.value}
69
- // label={m.tab}
70
- // />
71
- // );
72
- // })}
73
- // </Tabs>
74
- // );
75
- // };
76
-
77
41
  const StyleBuilder = props => {
78
42
  const {
79
43
  title,
@@ -83,10 +47,8 @@ const StyleBuilder = props => {
83
47
  onClose,
84
48
  onDelete,
85
49
  customProps
86
- // className,
87
50
  } = props;
88
51
  const [elementProps, setElementProps] = useState(element);
89
- // const [tab, setTab] = useState(renderTabs[0]?.value);
90
52
  const [tab] = useState(renderTabs[0]?.value);
91
53
  const tabVal = renderTabs?.find(f => f.value === tab);
92
54
  const {
@@ -104,11 +66,6 @@ const StyleBuilder = props => {
104
66
  }
105
67
  };
106
68
  }, []);
107
-
108
- // const handleChange = (e, newValue) => {
109
- // setTab(newValue);
110
- // };
111
-
112
69
  const onElementPropsChange = data => {
113
70
  setElementProps({
114
71
  ...elementProps,
@@ -160,9 +117,8 @@ const StyleBuilder = props => {
160
117
  })
161
118
  }), /*#__PURE__*/_jsx(DialogContent, {
162
119
  sx: {
163
- p: 2,
164
- maxHeight: `${window.innerHeight - 125}px`
165
- // padding: "16px",
120
+ maxHeight: `${window.innerHeight - 125}px`,
121
+ padding: "8px"
166
122
  },
167
123
  children: renderTabs.map((m, i) => {
168
124
  return /*#__PURE__*/_jsx(StyleContent, {
@@ -34,5 +34,21 @@ const gridStyle = [{
34
34
  key: "sectionBorderRadius",
35
35
  type: "borderRadius"
36
36
  }]
37
+ }, {
38
+ tab: "Position",
39
+ value: "position",
40
+ fields: [{
41
+ label: "Set Postion (Vertical & Horizantal)",
42
+ key: "sectionAlignment",
43
+ type: "alignment"
44
+ }]
45
+ }, {
46
+ tab: "Size",
47
+ value: "gridSize",
48
+ fields: [{
49
+ label: "Grid Size",
50
+ key: "sectionGridSize",
51
+ type: "gridSize"
52
+ }]
37
53
  }];
38
54
  export default gridStyle;
@@ -9,14 +9,10 @@ import { jsxs as _jsxs } from "react/jsx-runtime";
9
9
  const Uploader = props => {
10
10
  const {
11
11
  value,
12
- data,
13
12
  onUploaded,
14
13
  customProps
15
14
  } = props;
16
15
  const classes = UploadStyles();
17
- const {
18
- key
19
- } = data;
20
16
  const [base64, setBase64] = useState(value?.url);
21
17
  const [uploading, setUploading] = useState(false);
22
18
  const handleChange = async e => {
@@ -1,5 +1,8 @@
1
1
  import html2canvas from "html2canvas";
2
2
  import { rectIntersection, closestCenter } from "@dnd-kit/core";
3
+ import { getQueryStrings } from "../utils/SlateUtilityFunctions";
4
+ import { Node } from "slate";
5
+ const HIDE_PLACHOLDERS = ["grid", "grid-item", "table"];
3
6
  export const getThumbnailImage = async (dom, options = {}) => {
4
7
  try {
5
8
  const canvas = await html2canvas(dom, options);
@@ -20,4 +23,63 @@ export function customCollisionDetectionAlgorithm(args) {
20
23
 
21
24
  // If there are no collisions with the pointer, return rectangle intersections
22
25
  return [];
23
- }
26
+ }
27
+ function componentToHex(c) {
28
+ var hex = Number(c).toString(16);
29
+ return hex.length === 1 ? "0" + hex : hex;
30
+ }
31
+ function rgbToHex(rgb) {
32
+ return "#" + rgb.match(/\d+/g).map(componentToHex).join("");
33
+ }
34
+ export function invertColor(hex) {
35
+ try {
36
+ if (hex?.indexOf("#") === -1) {
37
+ hex = rgbToHex(hex);
38
+ }
39
+ if (hex.indexOf("#") === 0) {
40
+ hex = hex.slice(1);
41
+ }
42
+ // convert 3-digit hex to 6-digits.
43
+ if (hex.length === 3) {
44
+ hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
45
+ }
46
+ if (hex.length !== 6) {
47
+ // throw new Error("Invalid HEX color.");
48
+ }
49
+ // invert color components
50
+ var r = (255 - parseInt(hex.slice(0, 2), 16)).toString(16),
51
+ g = (255 - parseInt(hex.slice(2, 4), 16)).toString(16),
52
+ b = (255 - parseInt(hex.slice(4, 6), 16)).toString(16);
53
+ // pad each with zeros and return
54
+ return "#" + padZero(r) + padZero(g) + padZero(b) + "80";
55
+ } catch (err) {
56
+ console.log(err);
57
+ return "#FFF";
58
+ }
59
+ }
60
+ function padZero(str, len) {
61
+ len = len || 2;
62
+ var zeros = new Array(len).join("0");
63
+ return (zeros + str).slice(-len);
64
+ }
65
+ export function getEmbedURL(element) {
66
+ let refUrl = element.href ? element.href : element.url;
67
+ refUrl = refUrl ? refUrl.includes("http") ? refUrl : `//${refUrl}` : "Link";
68
+ let embedUrl = refUrl;
69
+ if (embedUrl.includes("youtube")) embedUrl = getQueryStrings(embedUrl);
70
+ if (embedUrl.includes("youtu.be")) embedUrl = getQueryStrings(embedUrl);
71
+ if (embedUrl.includes("loom")) embedUrl = embedUrl.replace(/\/share\//, "/embed/");
72
+ if (embedUrl.includes("vimeo")) embedUrl = embedUrl.replace(/\/vimeo.com\//, "/player.vimeo.com/video/");
73
+ if (embedUrl.includes("dailymotion") && embedUrl.includes("video")) embedUrl = embedUrl.replace(/www.dailymotion.com\//, "www.dailymotion.com/embed/");
74
+ if (embedUrl.includes("dai.ly")) embedUrl = embedUrl.replace(/dai.ly\//, "www.dailymotion.com/embed/video/");
75
+ return embedUrl;
76
+ }
77
+ export const isEmptyTextNode = element => {
78
+ try {
79
+ const showPlaceholder = element?.children?.filter(f => HIDE_PLACHOLDERS.indexOf(f.type) > -1).length === 0;
80
+ return Node.string(element)?.length === 0 && showPlaceholder;
81
+ } catch (err) {
82
+ console.log(err);
83
+ return false;
84
+ }
85
+ };
@@ -0,0 +1,5 @@
1
+ import link from "./link";
2
+ const decorators = d => {
3
+ return [...link(d)];
4
+ };
5
+ export default decorators;
@@ -0,0 +1,26 @@
1
+ const findUrlsInText = text => {
2
+ const urlRegex =
3
+ // eslint-disable-next-line no-useless-escape
4
+ /(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/gim;
5
+ const matches = text.match(urlRegex);
6
+ return matches ? matches.map(m => [m.trim(), text.indexOf(m.trim())]) : [];
7
+ };
8
+ const link = ([node, path]) => {
9
+ const nodeText = node.text;
10
+ if (!nodeText) return [];
11
+ const urls = findUrlsInText(nodeText);
12
+ return urls.map(([url, index]) => {
13
+ return {
14
+ anchor: {
15
+ path,
16
+ offset: index
17
+ },
18
+ focus: {
19
+ path,
20
+ offset: index + url.length
21
+ },
22
+ decoration: "link"
23
+ };
24
+ });
25
+ };
26
+ export default link;
@@ -32,9 +32,14 @@ import InlineIcon from "../Elements/InlineIcon/InlineIcon";
32
32
  import EmbedLink from "../Elements/Embed/link";
33
33
  import SimpleText from "../Elements/SimpleText";
34
34
  import CheckList from "../Elements/List/CheckList";
35
+ import { isEmptyTextNode } from "../helper";
35
36
  import { jsx as _jsx } from "react/jsx-runtime";
36
37
  const alignment = ["alignLeft", "alignRight", "alignCenter"];
37
38
  const list_types = ["orderedList", "unorderedList"];
39
+ const LIST_FORMAT_TYPE = {
40
+ orderedList: "list-item",
41
+ unorderedList: "list-item"
42
+ };
38
43
  export const toggleBlock = (editor, format, selection = true, attr = {}) => {
39
44
  const isActive = isBlockActive(editor, format);
40
45
  const isList = list_types.includes(format);
@@ -68,7 +73,7 @@ export const toggleBlock = (editor, format, selection = true, attr = {}) => {
68
73
  Transforms.insertText(editor, "");
69
74
  }
70
75
  Transforms.setNodes(editor, {
71
- type: isActive ? "paragraph" : isList ? "list-item" : format,
76
+ type: isActive ? "paragraph" : isList ? LIST_FORMAT_TYPE[format] : format,
72
77
  ...attr
73
78
  });
74
79
  if (isList && !isActive) {
@@ -181,9 +186,9 @@ export const getMarked = (leaf, children) => {
181
186
  }
182
187
  if (leaf.color) {
183
188
  const textStyles = leaf?.color?.indexOf("gradient") >= 0 ? {
184
- background: leaf.color,
185
- "-webkit-background-clip": "text",
186
- "-webkit-text-fill-color": "transparent"
189
+ background: leaf?.color?.concat("text"),
190
+ WebkitBackgroundClip: "text",
191
+ WebkitTextFillColor: "transparent"
187
192
  } : {
188
193
  color: leaf.color
189
194
  };
@@ -228,6 +233,17 @@ export const getMarked = (leaf, children) => {
228
233
  children: children
229
234
  });
230
235
  }
236
+ if (leaf.decoration === "link") {
237
+ children = /*#__PURE__*/_jsx("a", {
238
+ style: {
239
+ cursor: "pointer"
240
+ },
241
+ rel: "noreferrer",
242
+ target: "_blank",
243
+ href: leaf.text,
244
+ children: children
245
+ });
246
+ }
231
247
  return children;
232
248
  };
233
249
  export const getBlock = props => {
@@ -236,23 +252,30 @@ export const getBlock = props => {
236
252
  children
237
253
  } = props;
238
254
  const attributes = props.attributes ?? {};
255
+ const isEmpty = isEmptyTextNode(element);
239
256
  switch (element.type) {
240
257
  case "headingOne":
241
258
  return /*#__PURE__*/_jsx("h1", {
242
259
  ...attributes,
243
260
  ...element.attr,
261
+ className: `content-editable ${isEmpty ? "empty" : ""}`,
262
+ placeholder: "Heading 1",
244
263
  children: children
245
264
  });
246
265
  case "headingTwo":
247
266
  return /*#__PURE__*/_jsx("h2", {
248
267
  ...attributes,
249
268
  ...element.attr,
269
+ className: `content-editable ${isEmpty ? "empty" : ""}`,
270
+ placeholder: "Heading 2",
250
271
  children: children
251
272
  });
252
273
  case "headingThree":
253
274
  return /*#__PURE__*/_jsx("h3", {
254
275
  ...attributes,
255
276
  ...element.attr,
277
+ className: `content-editable ${isEmpty ? "empty" : ""}`,
278
+ placeholder: "Heading 3",
256
279
  children: children
257
280
  });
258
281
  case "blockquote":
@@ -306,6 +329,8 @@ export const getBlock = props => {
306
329
  return /*#__PURE__*/_jsx("li", {
307
330
  ...attributes,
308
331
  ...element.attr,
332
+ className: `content-editable ${isEmpty ? "empty" : ""}`,
333
+ placeholder: "List",
309
334
  children: children
310
335
  });
311
336
  case "orderedList":
@@ -319,9 +344,10 @@ export const getBlock = props => {
319
344
  ...attributes,
320
345
  children: children
321
346
  });
322
- case "checkList":
347
+ case "check-list-item":
323
348
  return /*#__PURE__*/_jsx(CheckList, {
324
- ...props
349
+ ...props,
350
+ isEmpty: isEmpty
325
351
  });
326
352
  case "link":
327
353
  return /*#__PURE__*/_jsx(Link, {
@@ -373,7 +399,8 @@ export const getBlock = props => {
373
399
  });
374
400
  case "grid-item":
375
401
  return /*#__PURE__*/_jsx(GridItem, {
376
- ...props
402
+ ...props,
403
+ isEmpty: isEmpty
377
404
  });
378
405
  case "accordion":
379
406
  return /*#__PURE__*/_jsx(Accordion, {
@@ -445,7 +472,8 @@ export const getBlock = props => {
445
472
  });
446
473
  default:
447
474
  return /*#__PURE__*/_jsx(SimpleText, {
448
- ...props
475
+ ...props,
476
+ isEmpty: isEmpty
449
477
  });
450
478
  }
451
479
  };
@@ -1,6 +1,6 @@
1
1
  import { Transforms } from "slate";
2
2
  import insertNewLine from "./insertNewLine";
3
- export const insertAccordion = editor => {
3
+ export const insertAccordion = (editor, path) => {
4
4
  try {
5
5
  const accordion = {
6
6
  type: "accordion",
@@ -22,9 +22,22 @@ export const insertAccordion = editor => {
22
22
  }]
23
23
  }]
24
24
  };
25
- Transforms.insertNodes(editor, accordion);
26
- Transforms.move(editor, {
27
- at: editor.selection.anchor.path
25
+ const props = path ? {
26
+ at: path,
27
+ select: true
28
+ } : {
29
+ select: true
30
+ };
31
+ Transforms.insertNodes(editor, accordion, props);
32
+ const curPath = [...editor?.selection?.anchor?.path];
33
+ const upPath = [...curPath];
34
+ // get title index
35
+ const summaryIndex = upPath.length - 3;
36
+ upPath[summaryIndex] = upPath[summaryIndex] === 0 ? 0 : upPath[summaryIndex] - 1;
37
+ // select accordion title by default
38
+ Transforms.select(editor, {
39
+ path: upPath,
40
+ offset: 0
28
41
  });
29
42
  insertNewLine(editor);
30
43
  } catch (err) {
@@ -8,7 +8,21 @@ export const insertButton = editor => {
8
8
  buttonLink: {
9
9
  linkType: "webAddress"
10
10
  },
11
- iconPosition: "start"
11
+ iconPosition: "start",
12
+ bgColor: "#2563EB",
13
+ textColor: "#FFF",
14
+ borderRadius: {
15
+ topLeft: 8,
16
+ topRight: 8,
17
+ bottomLeft: 8,
18
+ bottomRight: 8
19
+ },
20
+ bannerSpacing: {
21
+ left: 16,
22
+ top: 8,
23
+ right: 16,
24
+ bottom: 8
25
+ }
12
26
  };
13
27
  Transforms.insertNodes(editor, button);
14
28
  Transforms.move(editor);
@@ -0,0 +1,28 @@
1
+ import { useEffect, useState } from "react";
2
+ import { Editor, Element } from "slate";
3
+
4
+ // This hook returns if the node in the current selection matches the format passed to it.
5
+ const useElement = (editor, format) => {
6
+ const [isElement, setIsElement] = useState(false);
7
+ const matchFormat = n => {
8
+ if (format) {
9
+ return format.indexOf(n.type) > -1;
10
+ } else {
11
+ return true;
12
+ }
13
+ };
14
+ useEffect(() => {
15
+ if (editor.selection) {
16
+ // It matches at the editor.selection location by default, so if null handle it seperately.
17
+ const [node] = Editor.nodes(editor, {
18
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && matchFormat(n)
19
+ });
20
+ setIsElement(node);
21
+ } else {
22
+ setIsElement(null);
23
+ }
24
+ // eslint-disable-next-line react-hooks/exhaustive-deps
25
+ }, [editor.selection]);
26
+ return isElement;
27
+ };
28
+ export default useElement;
@@ -1,7 +1,7 @@
1
1
  import { Transforms } from "slate";
2
2
  import insertNewLine from "./insertNewLine";
3
3
  export const insertDefaultEmbed = (editor, type, defaultURL = "") => {
4
- const url = defaultURL ? defaultURL : type === "image" ? "https://developers.elementor.com/docs/assets/img/elementor-placeholder-image.png" : "https://www.youtube.com/embed/a_feKqxjY-4?si=da6PxCxKEUYqadRn";
4
+ const url = defaultURL ? defaultURL : type === "image" ? "" : "";
5
5
  insertEmbed(editor, {
6
6
  url,
7
7
  images: []
@@ -29,13 +29,7 @@ export const createEmbedNode = (type, {
29
29
  });
30
30
  export const insertEmbed = (editor, embedData, format) => {
31
31
  try {
32
- const {
33
- url,
34
- images
35
- } = embedData;
36
- if (!url && images.length === 0) return;
37
32
  const embed = createEmbedNode(format, embedData);
38
- console.log(embed);
39
33
  Transforms.insertNodes(editor, embed, {
40
34
  at: editor.selection.anchor.path
41
35
  });