@contentstack/live-preview-utils 3.2.4 → 3.3.0

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 (216) hide show
  1. package/README.md +1 -1
  2. package/dist/legacy/index.d.cts +1 -1
  3. package/dist/legacy/index.d.ts +1 -1
  4. package/dist/legacy/light-sdk.cjs +1 -1
  5. package/dist/legacy/light-sdk.js +1 -1
  6. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
  7. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js +1 -1
  8. package/dist/legacy/livePreview/live-preview.cjs +6 -2
  9. package/dist/legacy/livePreview/live-preview.cjs.map +1 -1
  10. package/dist/legacy/livePreview/live-preview.js +6 -2
  11. package/dist/legacy/livePreview/live-preview.js.map +1 -1
  12. package/dist/legacy/preview/contentstack-live-preview-HOC.cjs +1 -1
  13. package/dist/legacy/preview/contentstack-live-preview-HOC.js +1 -1
  14. package/dist/legacy/utils/index.cjs +10 -0
  15. package/dist/legacy/utils/index.cjs.map +1 -1
  16. package/dist/legacy/utils/index.d.cts +2 -1
  17. package/dist/legacy/utils/index.d.ts +2 -1
  18. package/dist/legacy/utils/index.js +9 -0
  19. package/dist/legacy/utils/index.js.map +1 -1
  20. package/dist/legacy/visualBuilder/components/Tooltip.cjs +167 -0
  21. package/dist/legacy/visualBuilder/components/Tooltip.cjs.map +1 -0
  22. package/dist/legacy/visualBuilder/components/Tooltip.d.cts +26 -0
  23. package/dist/legacy/visualBuilder/components/Tooltip.d.ts +26 -0
  24. package/dist/legacy/visualBuilder/components/Tooltip.js +140 -0
  25. package/dist/legacy/visualBuilder/components/Tooltip.js.map +1 -0
  26. package/dist/legacy/visualBuilder/components/VisualBuilder.cjs +4 -0
  27. package/dist/legacy/visualBuilder/components/VisualBuilder.cjs.map +1 -1
  28. package/dist/legacy/visualBuilder/components/VisualBuilder.d.cts +1 -1
  29. package/dist/legacy/visualBuilder/components/VisualBuilder.d.ts +1 -1
  30. package/dist/legacy/visualBuilder/components/VisualBuilder.js +4 -0
  31. package/dist/legacy/visualBuilder/components/VisualBuilder.js.map +1 -1
  32. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.cjs +115 -15
  33. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.cjs.map +1 -1
  34. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.js +117 -17
  35. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.js.map +1 -1
  36. package/dist/legacy/visualBuilder/components/icons/index.cjs +44 -0
  37. package/dist/legacy/visualBuilder/components/icons/index.cjs.map +1 -1
  38. package/dist/legacy/visualBuilder/components/icons/index.d.cts +3 -1
  39. package/dist/legacy/visualBuilder/components/icons/index.d.ts +3 -1
  40. package/dist/legacy/visualBuilder/components/icons/index.js +32 -0
  41. package/dist/legacy/visualBuilder/components/icons/index.js.map +1 -1
  42. package/dist/legacy/visualBuilder/components/index.cjs +3 -1
  43. package/dist/legacy/visualBuilder/components/index.cjs.map +1 -1
  44. package/dist/legacy/visualBuilder/components/index.js +3 -1
  45. package/dist/legacy/visualBuilder/components/index.js.map +1 -1
  46. package/dist/legacy/visualBuilder/generators/generateOverlay.cjs +1 -0
  47. package/dist/legacy/visualBuilder/generators/generateOverlay.cjs.map +1 -1
  48. package/dist/legacy/visualBuilder/generators/generateOverlay.js +1 -0
  49. package/dist/legacy/visualBuilder/generators/generateOverlay.js.map +1 -1
  50. package/dist/legacy/visualBuilder/generators/generateStartEditingButton.cjs +10 -6
  51. package/dist/legacy/visualBuilder/generators/generateStartEditingButton.cjs.map +1 -1
  52. package/dist/legacy/visualBuilder/generators/generateStartEditingButton.d.cts +2 -3
  53. package/dist/legacy/visualBuilder/generators/generateStartEditingButton.d.ts +2 -3
  54. package/dist/legacy/visualBuilder/generators/generateStartEditingButton.js +10 -6
  55. package/dist/legacy/visualBuilder/generators/generateStartEditingButton.js.map +1 -1
  56. package/dist/legacy/visualBuilder/generators/generateToolbar.cjs +43 -10
  57. package/dist/legacy/visualBuilder/generators/generateToolbar.cjs.map +1 -1
  58. package/dist/legacy/visualBuilder/generators/generateToolbar.d.cts +11 -4
  59. package/dist/legacy/visualBuilder/generators/generateToolbar.d.ts +11 -4
  60. package/dist/legacy/visualBuilder/generators/generateToolbar.js +41 -9
  61. package/dist/legacy/visualBuilder/generators/generateToolbar.js.map +1 -1
  62. package/dist/legacy/visualBuilder/index.cjs +7 -3
  63. package/dist/legacy/visualBuilder/index.cjs.map +1 -1
  64. package/dist/legacy/visualBuilder/index.d.cts +2 -0
  65. package/dist/legacy/visualBuilder/index.d.ts +2 -0
  66. package/dist/legacy/visualBuilder/index.js +7 -3
  67. package/dist/legacy/visualBuilder/index.js.map +1 -1
  68. package/dist/legacy/visualBuilder/listeners/index.cjs +3 -1
  69. package/dist/legacy/visualBuilder/listeners/index.cjs.map +1 -1
  70. package/dist/legacy/visualBuilder/listeners/index.js +3 -1
  71. package/dist/legacy/visualBuilder/listeners/index.js.map +1 -1
  72. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs +7 -3
  73. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  74. package/dist/legacy/visualBuilder/listeners/mouseClick.d.cts +4 -1
  75. package/dist/legacy/visualBuilder/listeners/mouseClick.d.ts +4 -1
  76. package/dist/legacy/visualBuilder/listeners/mouseClick.js +5 -2
  77. package/dist/legacy/visualBuilder/listeners/mouseClick.js.map +1 -1
  78. package/dist/legacy/visualBuilder/listeners/mouseHover.cjs +183 -133
  79. package/dist/legacy/visualBuilder/listeners/mouseHover.cjs.map +1 -1
  80. package/dist/legacy/visualBuilder/listeners/mouseHover.d.cts +5 -3
  81. package/dist/legacy/visualBuilder/listeners/mouseHover.d.ts +5 -3
  82. package/dist/legacy/visualBuilder/listeners/mouseHover.js +182 -133
  83. package/dist/legacy/visualBuilder/listeners/mouseHover.js.map +1 -1
  84. package/dist/legacy/visualBuilder/utils/getPsuedoEditableEssentialStyles.cjs +58 -0
  85. package/dist/legacy/visualBuilder/utils/getPsuedoEditableEssentialStyles.cjs.map +1 -0
  86. package/dist/legacy/visualBuilder/utils/getPsuedoEditableEssentialStyles.d.cts +18 -0
  87. package/dist/legacy/visualBuilder/utils/getPsuedoEditableEssentialStyles.d.ts +18 -0
  88. package/dist/legacy/visualBuilder/utils/getPsuedoEditableEssentialStyles.js +25 -0
  89. package/dist/legacy/visualBuilder/utils/getPsuedoEditableEssentialStyles.js.map +1 -0
  90. package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.cjs +4 -8
  91. package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.cjs.map +1 -1
  92. package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.js +4 -8
  93. package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.js.map +1 -1
  94. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs +2 -23
  95. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  96. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js +2 -13
  97. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  98. package/dist/legacy/visualBuilder/utils/types/postMessage.types.cjs +2 -0
  99. package/dist/legacy/visualBuilder/utils/types/postMessage.types.cjs.map +1 -1
  100. package/dist/legacy/visualBuilder/utils/types/postMessage.types.d.cts +2 -0
  101. package/dist/legacy/visualBuilder/utils/types/postMessage.types.d.ts +2 -0
  102. package/dist/legacy/visualBuilder/utils/types/postMessage.types.js +2 -0
  103. package/dist/legacy/visualBuilder/utils/types/postMessage.types.js.map +1 -1
  104. package/dist/legacy/visualBuilder/visualBuilder.style.cjs +66 -1
  105. package/dist/legacy/visualBuilder/visualBuilder.style.cjs.map +1 -1
  106. package/dist/legacy/visualBuilder/visualBuilder.style.d.cts +7 -0
  107. package/dist/legacy/visualBuilder/visualBuilder.style.d.ts +7 -0
  108. package/dist/legacy/visualBuilder/visualBuilder.style.js +66 -1
  109. package/dist/legacy/visualBuilder/visualBuilder.style.js.map +1 -1
  110. package/dist/modern/light-sdk.cjs +1 -1
  111. package/dist/modern/light-sdk.js +1 -1
  112. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
  113. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js +1 -1
  114. package/dist/modern/livePreview/live-preview.cjs +6 -2
  115. package/dist/modern/livePreview/live-preview.cjs.map +1 -1
  116. package/dist/modern/livePreview/live-preview.js +6 -2
  117. package/dist/modern/livePreview/live-preview.js.map +1 -1
  118. package/dist/modern/preview/contentstack-live-preview-HOC.cjs +1 -1
  119. package/dist/modern/preview/contentstack-live-preview-HOC.js +1 -1
  120. package/dist/modern/utils/index.cjs +10 -0
  121. package/dist/modern/utils/index.cjs.map +1 -1
  122. package/dist/modern/utils/index.d.cts +2 -1
  123. package/dist/modern/utils/index.d.ts +2 -1
  124. package/dist/modern/utils/index.js +9 -0
  125. package/dist/modern/utils/index.js.map +1 -1
  126. package/dist/modern/visualBuilder/components/Tooltip.cjs +167 -0
  127. package/dist/modern/visualBuilder/components/Tooltip.cjs.map +1 -0
  128. package/dist/modern/visualBuilder/components/Tooltip.d.cts +26 -0
  129. package/dist/modern/visualBuilder/components/Tooltip.d.ts +26 -0
  130. package/dist/modern/visualBuilder/components/Tooltip.js +140 -0
  131. package/dist/modern/visualBuilder/components/Tooltip.js.map +1 -0
  132. package/dist/modern/visualBuilder/components/VisualBuilder.cjs +4 -0
  133. package/dist/modern/visualBuilder/components/VisualBuilder.cjs.map +1 -1
  134. package/dist/modern/visualBuilder/components/VisualBuilder.d.cts +1 -1
  135. package/dist/modern/visualBuilder/components/VisualBuilder.d.ts +1 -1
  136. package/dist/modern/visualBuilder/components/VisualBuilder.js +4 -0
  137. package/dist/modern/visualBuilder/components/VisualBuilder.js.map +1 -1
  138. package/dist/modern/visualBuilder/components/fieldLabelWrapper.cjs +113 -15
  139. package/dist/modern/visualBuilder/components/fieldLabelWrapper.cjs.map +1 -1
  140. package/dist/modern/visualBuilder/components/fieldLabelWrapper.js +115 -17
  141. package/dist/modern/visualBuilder/components/fieldLabelWrapper.js.map +1 -1
  142. package/dist/modern/visualBuilder/components/icons/index.cjs +44 -0
  143. package/dist/modern/visualBuilder/components/icons/index.cjs.map +1 -1
  144. package/dist/modern/visualBuilder/components/icons/index.d.cts +3 -1
  145. package/dist/modern/visualBuilder/components/icons/index.d.ts +3 -1
  146. package/dist/modern/visualBuilder/components/icons/index.js +32 -0
  147. package/dist/modern/visualBuilder/components/icons/index.js.map +1 -1
  148. package/dist/modern/visualBuilder/components/index.cjs +3 -1
  149. package/dist/modern/visualBuilder/components/index.cjs.map +1 -1
  150. package/dist/modern/visualBuilder/components/index.js +3 -1
  151. package/dist/modern/visualBuilder/components/index.js.map +1 -1
  152. package/dist/modern/visualBuilder/generators/generateOverlay.cjs +1 -0
  153. package/dist/modern/visualBuilder/generators/generateOverlay.cjs.map +1 -1
  154. package/dist/modern/visualBuilder/generators/generateOverlay.js +1 -0
  155. package/dist/modern/visualBuilder/generators/generateOverlay.js.map +1 -1
  156. package/dist/modern/visualBuilder/generators/generateStartEditingButton.cjs +10 -6
  157. package/dist/modern/visualBuilder/generators/generateStartEditingButton.cjs.map +1 -1
  158. package/dist/modern/visualBuilder/generators/generateStartEditingButton.d.cts +2 -3
  159. package/dist/modern/visualBuilder/generators/generateStartEditingButton.d.ts +2 -3
  160. package/dist/modern/visualBuilder/generators/generateStartEditingButton.js +10 -6
  161. package/dist/modern/visualBuilder/generators/generateStartEditingButton.js.map +1 -1
  162. package/dist/modern/visualBuilder/generators/generateToolbar.cjs +42 -10
  163. package/dist/modern/visualBuilder/generators/generateToolbar.cjs.map +1 -1
  164. package/dist/modern/visualBuilder/generators/generateToolbar.d.cts +11 -4
  165. package/dist/modern/visualBuilder/generators/generateToolbar.d.ts +11 -4
  166. package/dist/modern/visualBuilder/generators/generateToolbar.js +40 -9
  167. package/dist/modern/visualBuilder/generators/generateToolbar.js.map +1 -1
  168. package/dist/modern/visualBuilder/index.cjs +7 -3
  169. package/dist/modern/visualBuilder/index.cjs.map +1 -1
  170. package/dist/modern/visualBuilder/index.d.cts +2 -0
  171. package/dist/modern/visualBuilder/index.d.ts +2 -0
  172. package/dist/modern/visualBuilder/index.js +7 -3
  173. package/dist/modern/visualBuilder/index.js.map +1 -1
  174. package/dist/modern/visualBuilder/listeners/index.cjs +3 -1
  175. package/dist/modern/visualBuilder/listeners/index.cjs.map +1 -1
  176. package/dist/modern/visualBuilder/listeners/index.js +3 -1
  177. package/dist/modern/visualBuilder/listeners/index.js.map +1 -1
  178. package/dist/modern/visualBuilder/listeners/mouseClick.cjs +7 -3
  179. package/dist/modern/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  180. package/dist/modern/visualBuilder/listeners/mouseClick.d.cts +4 -1
  181. package/dist/modern/visualBuilder/listeners/mouseClick.d.ts +4 -1
  182. package/dist/modern/visualBuilder/listeners/mouseClick.js +5 -2
  183. package/dist/modern/visualBuilder/listeners/mouseClick.js.map +1 -1
  184. package/dist/modern/visualBuilder/listeners/mouseHover.cjs +183 -133
  185. package/dist/modern/visualBuilder/listeners/mouseHover.cjs.map +1 -1
  186. package/dist/modern/visualBuilder/listeners/mouseHover.d.cts +5 -3
  187. package/dist/modern/visualBuilder/listeners/mouseHover.d.ts +5 -3
  188. package/dist/modern/visualBuilder/listeners/mouseHover.js +182 -133
  189. package/dist/modern/visualBuilder/listeners/mouseHover.js.map +1 -1
  190. package/dist/modern/visualBuilder/utils/getPsuedoEditableEssentialStyles.cjs +58 -0
  191. package/dist/modern/visualBuilder/utils/getPsuedoEditableEssentialStyles.cjs.map +1 -0
  192. package/dist/modern/visualBuilder/utils/getPsuedoEditableEssentialStyles.d.cts +18 -0
  193. package/dist/modern/visualBuilder/utils/getPsuedoEditableEssentialStyles.d.ts +18 -0
  194. package/dist/modern/visualBuilder/utils/getPsuedoEditableEssentialStyles.js +25 -0
  195. package/dist/modern/visualBuilder/utils/getPsuedoEditableEssentialStyles.js.map +1 -0
  196. package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.cjs +4 -8
  197. package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.cjs.map +1 -1
  198. package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.js +4 -8
  199. package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.js.map +1 -1
  200. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs +2 -22
  201. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  202. package/dist/modern/visualBuilder/utils/handleIndividualFields.js +2 -12
  203. package/dist/modern/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  204. package/dist/modern/visualBuilder/utils/types/postMessage.types.cjs +2 -0
  205. package/dist/modern/visualBuilder/utils/types/postMessage.types.cjs.map +1 -1
  206. package/dist/modern/visualBuilder/utils/types/postMessage.types.d.cts +2 -0
  207. package/dist/modern/visualBuilder/utils/types/postMessage.types.d.ts +2 -0
  208. package/dist/modern/visualBuilder/utils/types/postMessage.types.js +2 -0
  209. package/dist/modern/visualBuilder/utils/types/postMessage.types.js.map +1 -1
  210. package/dist/modern/visualBuilder/visualBuilder.style.cjs +66 -1
  211. package/dist/modern/visualBuilder/visualBuilder.style.cjs.map +1 -1
  212. package/dist/modern/visualBuilder/visualBuilder.style.d.cts +7 -0
  213. package/dist/modern/visualBuilder/visualBuilder.style.d.ts +7 -0
  214. package/dist/modern/visualBuilder/visualBuilder.style.js +66 -1
  215. package/dist/modern/visualBuilder/visualBuilder.style.js.map +1 -1
  216. package/package.json +2 -1
@@ -34,17 +34,21 @@ __export(generateStartEditingButton_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(generateStartEditingButton_exports);
36
36
  var import_preact = require("preact");
37
- var import_logger = require("../../logger/logger.cjs");
38
37
  var import_startEditingButton = __toESM(require("../components/startEditingButton.cjs"), 1);
39
38
  var import_jsx_runtime = require("preact/jsx-runtime");
40
- function generateStartEditingButton(visualBuilderContainer) {
41
- if (!visualBuilderContainer) {
42
- import_logger.PublicLogger.warn("Visual builder overlay not found.");
43
- return;
39
+ function generateStartEditingButton() {
40
+ const existingButton = document.querySelector(
41
+ ".visual-builder__start-editing-btn"
42
+ );
43
+ if (existingButton) {
44
+ return existingButton;
44
45
  }
45
46
  const wrapper = document.createDocumentFragment();
46
47
  (0, import_preact.render)(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_startEditingButton.default, {}), wrapper);
47
- visualBuilderContainer?.appendChild(wrapper);
48
+ if (wrapper.children.length === 0) {
49
+ return void 0;
50
+ }
51
+ document.body.appendChild(wrapper);
48
52
  const startEditingButton = document.querySelector(
49
53
  ".visual-builder__start-editing-btn"
50
54
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/generators/generateStartEditingButton.tsx"],"sourcesContent":["import { render } from \"preact\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport StartEditingButtonComponent from \"../components/startEditingButton\";\n\n/**\n * Generates a start editing button for the visual builder.\n *\n * @param visualBuilderContainer - The HTMLDivElement that wraps the visual builder.\n * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the visualBuilderContainer is null.\n */\nexport function generateStartEditingButton(\n visualBuilderContainer: HTMLDivElement | null\n): HTMLAnchorElement | undefined {\n if (!visualBuilderContainer) {\n PublicLogger.warn(\"Visual builder overlay not found.\");\n return;\n }\n\n const wrapper = document.createDocumentFragment();\n render(<StartEditingButtonComponent />, wrapper);\n\n visualBuilderContainer?.appendChild(wrapper);\n\n const startEditingButton = document.querySelector(\n \".visual-builder__start-editing-btn\"\n ) as HTMLAnchorElement;\n\n return startEditingButton;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AACvB,oBAA6B;AAC7B,gCAAwC;AAiB7B;AATJ,SAAS,2BACZ,wBAC6B;AAC7B,MAAI,CAAC,wBAAwB;AACzB,+BAAa,KAAK,mCAAmC;AACrD;AAAA,EACJ;AAEA,QAAM,UAAU,SAAS,uBAAuB;AAChD,4BAAO,4CAAC,0BAAAA,SAAA,EAA4B,GAAI,OAAO;AAE/C,0BAAwB,YAAY,OAAO;AAE3C,QAAM,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACJ;AAEA,SAAO;AACX;","names":["StartEditingButtonComponent"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/generators/generateStartEditingButton.tsx"],"sourcesContent":["import { render } from \"preact\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport StartEditingButtonComponent from \"../components/startEditingButton\";\n\n/**\n * Generates a start editing button for the visual builder.\n *\n * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the button cannot be created.\n */\nexport function generateStartEditingButton(): HTMLAnchorElement | undefined {\n const existingButton = document.querySelector(\n \".visual-builder__start-editing-btn\"\n ) as HTMLAnchorElement;\n\n if (existingButton) {\n return existingButton;\n }\n\n const wrapper = document.createDocumentFragment();\n render(<StartEditingButtonComponent />, wrapper);\n\n if (wrapper.children.length === 0) {\n return undefined;\n }\n\n document.body.appendChild(wrapper);\n\n const startEditingButton = document.querySelector(\n \".visual-builder__start-editing-btn\"\n ) as HTMLAnchorElement;\n\n return startEditingButton;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AAEvB,gCAAwC;AAiB7B;AAVJ,SAAS,6BAA4D;AACxE,QAAM,iBAAiB,SAAS;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,gBAAgB;AAChB,WAAO;AAAA,EACX;AAEA,QAAM,UAAU,SAAS,uBAAuB;AAChD,4BAAO,4CAAC,0BAAAA,SAAA,EAA4B,GAAI,OAAO;AAE/C,MAAI,QAAQ,SAAS,WAAW,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,WAAS,KAAK,YAAY,OAAO;AAEjC,QAAM,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACJ;AAEA,SAAO;AACX;","names":["StartEditingButtonComponent"]}
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Generates a start editing button for the visual builder.
3
3
  *
4
- * @param visualBuilderContainer - The HTMLDivElement that wraps the visual builder.
5
- * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the visualBuilderContainer is null.
4
+ * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the button cannot be created.
6
5
  */
7
- declare function generateStartEditingButton(visualBuilderContainer: HTMLDivElement | null): HTMLAnchorElement | undefined;
6
+ declare function generateStartEditingButton(): HTMLAnchorElement | undefined;
8
7
 
9
8
  export { generateStartEditingButton };
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Generates a start editing button for the visual builder.
3
3
  *
4
- * @param visualBuilderContainer - The HTMLDivElement that wraps the visual builder.
5
- * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the visualBuilderContainer is null.
4
+ * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the button cannot be created.
6
5
  */
7
- declare function generateStartEditingButton(visualBuilderContainer: HTMLDivElement | null): HTMLAnchorElement | undefined;
6
+ declare function generateStartEditingButton(): HTMLAnchorElement | undefined;
8
7
 
9
8
  export { generateStartEditingButton };
@@ -2,17 +2,21 @@ import "../../chunk-5WRI5ZAA.js";
2
2
 
3
3
  // src/visualBuilder/generators/generateStartEditingButton.tsx
4
4
  import { render } from "preact";
5
- import { PublicLogger } from "../../logger/logger.js";
6
5
  import StartEditingButtonComponent from "../components/startEditingButton.js";
7
6
  import { jsx } from "preact/jsx-runtime";
8
- function generateStartEditingButton(visualBuilderContainer) {
9
- if (!visualBuilderContainer) {
10
- PublicLogger.warn("Visual builder overlay not found.");
11
- return;
7
+ function generateStartEditingButton() {
8
+ const existingButton = document.querySelector(
9
+ ".visual-builder__start-editing-btn"
10
+ );
11
+ if (existingButton) {
12
+ return existingButton;
12
13
  }
13
14
  const wrapper = document.createDocumentFragment();
14
15
  render(/* @__PURE__ */ jsx(StartEditingButtonComponent, {}), wrapper);
15
- visualBuilderContainer?.appendChild(wrapper);
16
+ if (wrapper.children.length === 0) {
17
+ return void 0;
18
+ }
19
+ document.body.appendChild(wrapper);
16
20
  const startEditingButton = document.querySelector(
17
21
  ".visual-builder__start-editing-btn"
18
22
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/generators/generateStartEditingButton.tsx"],"sourcesContent":["import { render } from \"preact\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport StartEditingButtonComponent from \"../components/startEditingButton\";\n\n/**\n * Generates a start editing button for the visual builder.\n *\n * @param visualBuilderContainer - The HTMLDivElement that wraps the visual builder.\n * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the visualBuilderContainer is null.\n */\nexport function generateStartEditingButton(\n visualBuilderContainer: HTMLDivElement | null\n): HTMLAnchorElement | undefined {\n if (!visualBuilderContainer) {\n PublicLogger.warn(\"Visual builder overlay not found.\");\n return;\n }\n\n const wrapper = document.createDocumentFragment();\n render(<StartEditingButtonComponent />, wrapper);\n\n visualBuilderContainer?.appendChild(wrapper);\n\n const startEditingButton = document.querySelector(\n \".visual-builder__start-editing-btn\"\n ) as HTMLAnchorElement;\n\n return startEditingButton;\n}\n"],"mappings":";;;AAAA,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,OAAO,iCAAiC;AAiB7B;AATJ,SAAS,2BACZ,wBAC6B;AAC7B,MAAI,CAAC,wBAAwB;AACzB,iBAAa,KAAK,mCAAmC;AACrD;AAAA,EACJ;AAEA,QAAM,UAAU,SAAS,uBAAuB;AAChD,SAAO,oBAAC,+BAA4B,GAAI,OAAO;AAE/C,0BAAwB,YAAY,OAAO;AAE3C,QAAM,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACJ;AAEA,SAAO;AACX;","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/generators/generateStartEditingButton.tsx"],"sourcesContent":["import { render } from \"preact\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport StartEditingButtonComponent from \"../components/startEditingButton\";\n\n/**\n * Generates a start editing button for the visual builder.\n *\n * @returns The generated HTMLAnchorElement representing the start editing button, or undefined if the button cannot be created.\n */\nexport function generateStartEditingButton(): HTMLAnchorElement | undefined {\n const existingButton = document.querySelector(\n \".visual-builder__start-editing-btn\"\n ) as HTMLAnchorElement;\n\n if (existingButton) {\n return existingButton;\n }\n\n const wrapper = document.createDocumentFragment();\n render(<StartEditingButtonComponent />, wrapper);\n\n if (wrapper.children.length === 0) {\n return undefined;\n }\n\n document.body.appendChild(wrapper);\n\n const startEditingButton = document.querySelector(\n \".visual-builder__start-editing-btn\"\n ) as HTMLAnchorElement;\n\n return startEditingButton;\n}\n"],"mappings":";;;AAAA,SAAS,cAAc;AAEvB,OAAO,iCAAiC;AAiB7B;AAVJ,SAAS,6BAA4D;AACxE,QAAM,iBAAiB,SAAS;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,gBAAgB;AAChB,WAAO;AAAA,EACX;AAEA,QAAM,UAAU,SAAS,uBAAuB;AAChD,SAAO,oBAAC,+BAA4B,GAAI,OAAO;AAE/C,MAAI,QAAQ,SAAS,WAAW,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,WAAS,KAAK,YAAY,OAAO;AAEjC,QAAM,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACJ;AAEA,SAAO;AACX;","names":[]}
@@ -32,7 +32,8 @@ var generateToolbar_exports = {};
32
32
  __export(generateToolbar_exports, {
33
33
  appendFieldPathDropdown: () => appendFieldPathDropdown,
34
34
  appendFieldToolbar: () => appendFieldToolbar,
35
- appendFocusedToolbar: () => appendFocusedToolbar
35
+ appendFocusedToolbar: () => appendFocusedToolbar,
36
+ removeFieldToolbar: () => removeFieldToolbar
36
37
  });
37
38
  module.exports = __toCommonJS(generateToolbar_exports);
38
39
  var import_constants = require("../utils/constants.cjs");
@@ -40,9 +41,14 @@ var import_FieldToolbar = __toESM(require("../components/FieldToolbar.cjs"), 1);
40
41
  var import_preact = require("preact");
41
42
  var import_fieldLabelWrapper = __toESM(require("../components/fieldLabelWrapper.cjs"), 1);
42
43
  var import_getEntryPermissionsCached = require("../utils/getEntryPermissionsCached.cjs");
44
+ var import_postMessage = require("../utils/types/postMessage.types.cjs");
45
+ var import_visualBuilderPostMessage = __toESM(require("../utils/visualBuilderPostMessage.cjs"), 1);
43
46
  var import_jsx_runtime = require("preact/jsx-runtime");
44
- function appendFocusedToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false) {
45
- appendFieldPathDropdown(eventDetails, focusedToolbarElement);
47
+ function appendFocusedToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false, options) {
48
+ appendFieldPathDropdown(eventDetails, focusedToolbarElement, options);
49
+ if (options?.isHover) {
50
+ return;
51
+ }
46
52
  appendFieldToolbar(
47
53
  eventDetails,
48
54
  focusedToolbarElement,
@@ -50,10 +56,11 @@ function appendFocusedToolbar(eventDetails, focusedToolbarElement, hideOverlay,
50
56
  isVariant
51
57
  );
52
58
  }
53
- async function appendFieldToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false) {
59
+ async function appendFieldToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false, options) {
60
+ const { isHover } = options || {};
54
61
  if (focusedToolbarElement.querySelector(
55
62
  ".visual-builder__focused-toolbar__multiple-field-toolbar"
56
- ))
63
+ ) && !isHover)
57
64
  return;
58
65
  const entryPermissions = await (0, import_getEntryPermissionsCached.getEntryPermissionsCached)({
59
66
  entryUid: eventDetails.fieldMetadata.entry_uid,
@@ -75,12 +82,24 @@ async function appendFieldToolbar(eventDetails, focusedToolbarElement, hideOverl
75
82
  );
76
83
  focusedToolbarElement.append(wrapper);
77
84
  }
78
- function appendFieldPathDropdown(eventDetails, focusedToolbarElement) {
79
- if (document.querySelector(
85
+ function appendFieldPathDropdown(eventDetails, focusedToolbarElement, options) {
86
+ const { isHover } = options || {};
87
+ const fieldLabelWrapper = document.querySelector(
80
88
  ".visual-builder__focused-toolbar__field-label-wrapper"
81
- ))
82
- return;
89
+ );
83
90
  const { editableElement: targetElement, fieldMetadata } = eventDetails;
91
+ if (fieldLabelWrapper) {
92
+ if (isHover) {
93
+ const fieldCslp = fieldLabelWrapper.getAttribute("data-hovered-cslp");
94
+ if (fieldCslp === fieldMetadata.cslpValue) {
95
+ return;
96
+ } else {
97
+ removeFieldToolbar(focusedToolbarElement);
98
+ }
99
+ } else {
100
+ return;
101
+ }
102
+ }
84
103
  const targetElementDimension = targetElement.getBoundingClientRect();
85
104
  const distanceFromTop = targetElementDimension.top + window.scrollY - import_constants.TOOLBAR_EDGE_BUFFER;
86
105
  const adjustedDistanceFromTop = targetElementDimension.top + window.scrollY < import_constants.TOP_EDGE_BUFFER ? distanceFromTop + targetElementDimension.height + import_constants.TOP_EDGE_BUFFER : distanceFromTop;
@@ -136,10 +155,23 @@ function collectParentCSLPPaths(targetElement, count) {
136
155
  }
137
156
  return cslpPaths;
138
157
  }
158
+ function removeFieldToolbar(toolbar) {
159
+ toolbar.innerHTML = "";
160
+ const toolbarEvents = [
161
+ import_postMessage.VisualBuilderPostMessageEvents.DELETE_INSTANCE,
162
+ import_postMessage.VisualBuilderPostMessageEvents.UPDATE_DISCUSSION_ID
163
+ ];
164
+ toolbarEvents.forEach((event) => {
165
+ if (import_visualBuilderPostMessage.default?.requestMessageHandlers?.has(event)) {
166
+ import_visualBuilderPostMessage.default?.unregisterEvent?.(event);
167
+ }
168
+ });
169
+ }
139
170
  // Annotate the CommonJS export names for ESM import in node:
140
171
  0 && (module.exports = {
141
172
  appendFieldPathDropdown,
142
173
  appendFieldToolbar,
143
- appendFocusedToolbar
174
+ appendFocusedToolbar,
175
+ removeFieldToolbar
144
176
  });
145
177
  //# sourceMappingURL=generateToolbar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/generators/generateToolbar.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n DATA_CSLP_ATTR_SELECTOR,\n LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX,\n RIGHT_EDGE_BUFFER,\n TOOLBAR_EDGE_BUFFER,\n TOP_EDGE_BUFFER,\n} from \"../utils/constants\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\n\nimport FieldToolbarComponent from \"../components/FieldToolbar\";\nimport { render } from \"preact\";\nimport FieldLabelWrapperComponent from \"../components/fieldLabelWrapper\";\nimport { getEntryPermissionsCached } from \"../utils/getEntryPermissionsCached\";\n\nexport function appendFocusedToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false\n): void {\n appendFieldPathDropdown(eventDetails, focusedToolbarElement);\n appendFieldToolbar(\n eventDetails,\n focusedToolbarElement,\n hideOverlay,\n isVariant\n );\n}\n\nexport async function appendFieldToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false\n): Promise<void> {\n if (\n focusedToolbarElement.querySelector(\n \".visual-builder__focused-toolbar__multiple-field-toolbar\"\n )\n )\n return;\n const entryPermissions = await getEntryPermissionsCached({\n entryUid: eventDetails.fieldMetadata.entry_uid,\n contentTypeUid: eventDetails.fieldMetadata.content_type_uid,\n locale: eventDetails.fieldMetadata.locale,\n });\n const wrapper = document.createDocumentFragment();\n render(\n <FieldToolbarComponent\n eventDetails={eventDetails}\n hideOverlay={hideOverlay}\n isVariant={isVariant}\n entryPermissions={entryPermissions}\n />,\n wrapper\n );\n focusedToolbarElement.append(wrapper);\n}\n\nexport function appendFieldPathDropdown(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement\n): void {\n if (\n document.querySelector(\n \".visual-builder__focused-toolbar__field-label-wrapper\"\n )\n )\n return;\n const { editableElement: targetElement, fieldMetadata } = eventDetails;\n const targetElementDimension = targetElement.getBoundingClientRect();\n\n const distanceFromTop =\n targetElementDimension.top + window.scrollY - TOOLBAR_EDGE_BUFFER;\n // Position the toolbar at the top unless there's insufficient space or scrolling up is not possible (topmost element targetted).\n const adjustedDistanceFromTop =\n targetElementDimension.top + window.scrollY < TOP_EDGE_BUFFER\n ? distanceFromTop + targetElementDimension.height + TOP_EDGE_BUFFER\n : distanceFromTop;\n\n const distanceFromLeft =\n targetElementDimension.left - LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX;\n const adjustedDistanceFromLeft = Math.max(\n distanceFromLeft,\n TOOLBAR_EDGE_BUFFER\n );\n\n const targetElementRightEdgeOffset =\n window.scrollX + window.innerWidth - targetElementDimension.left;\n\n if (targetElementRightEdgeOffset < RIGHT_EDGE_BUFFER) {\n // Overflow / Cutoff on right edge\n focusedToolbarElement.style.justifyContent = \"flex-end\";\n focusedToolbarElement.style.left = `${\n targetElementDimension.right + LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX\n }px`;\n } else {\n focusedToolbarElement.style.justifyContent = \"flex-start\"; // default\n focusedToolbarElement.style.left = `${adjustedDistanceFromLeft}px`;\n }\n\n focusedToolbarElement.style.top = `${adjustedDistanceFromTop}px`;\n\n const parentPaths = collectParentCSLPPaths(targetElement, 2);\n\n const wrapper = document.createDocumentFragment();\n render(\n <FieldLabelWrapperComponent\n fieldMetadata={fieldMetadata}\n eventDetails={eventDetails}\n parentPaths={parentPaths}\n getParentEditableElement={(cslp: string) => {\n const parentElement = targetElement.closest(\n `[${DATA_CSLP_ATTR_SELECTOR}=\"${cslp}\"]`\n ) as HTMLElement | null;\n return parentElement;\n }}\n />,\n wrapper\n );\n\n focusedToolbarElement.appendChild(wrapper);\n}\n\nfunction collectParentCSLPPaths(\n targetElement: Element,\n count: number\n): Array<string> {\n const cslpPaths: Array<string> = [];\n let currentElement = targetElement.parentElement;\n\n while (count > 0 || currentElement === window.document.body) {\n if (!currentElement) {\n return cslpPaths;\n }\n\n if (currentElement.hasAttribute(DATA_CSLP_ATTR_SELECTOR)) {\n cslpPaths.push(\n currentElement.getAttribute(DATA_CSLP_ATTR_SELECTOR) as string\n );\n count--;\n }\n currentElement = currentElement.parentElement;\n }\n\n return cslpPaths;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,uBAMO;AAIP,0BAAkC;AAClC,oBAAuB;AACvB,+BAAuC;AACvC,uCAA0C;AAoClC;AAlCD,SAAS,qBACZ,cACA,uBACA,aACA,YAAqB,OACjB;AACJ,0BAAwB,cAAc,qBAAqB;AAC3D;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,eAAsB,mBAClB,cACA,uBACA,aACA,YAAqB,OACR;AACb,MACI,sBAAsB;AAAA,IAClB;AAAA,EACJ;AAEA;AACJ,QAAM,mBAAmB,UAAM,4DAA0B;AAAA,IACrD,UAAU,aAAa,cAAc;AAAA,IACrC,gBAAgB,aAAa,cAAc;AAAA,IAC3C,QAAQ,aAAa,cAAc;AAAA,EACvC,CAAC;AACD,QAAM,UAAU,SAAS,uBAAuB;AAChD;AAAA,IACI;AAAA,MAAC,oBAAAA;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AACA,wBAAsB,OAAO,OAAO;AACxC;AAEO,SAAS,wBACZ,cACA,uBACI;AACJ,MACI,SAAS;AAAA,IACL;AAAA,EACJ;AAEA;AACJ,QAAM,EAAE,iBAAiB,eAAe,cAAc,IAAI;AAC1D,QAAM,yBAAyB,cAAc,sBAAsB;AAEnE,QAAM,kBACF,uBAAuB,MAAM,OAAO,UAAU;AAElD,QAAM,0BACF,uBAAuB,MAAM,OAAO,UAAU,mCACxC,kBAAkB,uBAAuB,SAAS,mCAClD;AAEV,QAAM,mBACF,uBAAuB,OAAO;AAClC,QAAM,2BAA2B,KAAK;AAAA,IAClC;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,+BACF,OAAO,UAAU,OAAO,aAAa,uBAAuB;AAEhE,MAAI,+BAA+B,oCAAmB;AAElD,0BAAsB,MAAM,iBAAiB;AAC7C,0BAAsB,MAAM,OAAO,GAC/B,uBAAuB,QAAQ,iDACnC;AAAA,EACJ,OAAO;AACH,0BAAsB,MAAM,iBAAiB;AAC7C,0BAAsB,MAAM,OAAO,GAAG,wBAAwB;AAAA,EAClE;AAEA,wBAAsB,MAAM,MAAM,GAAG,uBAAuB;AAE5D,QAAM,cAAc,uBAAuB,eAAe,CAAC;AAE3D,QAAM,UAAU,SAAS,uBAAuB;AAChD;AAAA,IACI;AAAA,MAAC,yBAAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA,0BAA0B,CAAC,SAAiB;AACxC,gBAAM,gBAAgB,cAAc;AAAA,YAChC,IAAI,wCAAuB,KAAK,IAAI;AAAA,UACxC;AACA,iBAAO;AAAA,QACX;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,wBAAsB,YAAY,OAAO;AAC7C;AAEA,SAAS,uBACL,eACA,OACa;AACb,QAAM,YAA2B,CAAC;AAClC,MAAI,iBAAiB,cAAc;AAEnC,SAAO,QAAQ,KAAK,mBAAmB,OAAO,SAAS,MAAM;AACzD,QAAI,CAAC,gBAAgB;AACjB,aAAO;AAAA,IACX;AAEA,QAAI,eAAe,aAAa,wCAAuB,GAAG;AACtD,gBAAU;AAAA,QACN,eAAe,aAAa,wCAAuB;AAAA,MACvD;AACA;AAAA,IACJ;AACA,qBAAiB,eAAe;AAAA,EACpC;AAEA,SAAO;AACX;","names":["FieldToolbarComponent","FieldLabelWrapperComponent"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/generators/generateToolbar.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n DATA_CSLP_ATTR_SELECTOR,\n LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX,\n RIGHT_EDGE_BUFFER,\n TOOLBAR_EDGE_BUFFER,\n TOP_EDGE_BUFFER,\n} from \"../utils/constants\";\nimport FieldToolbarComponent from \"../components/FieldToolbar\";\nimport { render } from \"preact\";\nimport FieldLabelWrapperComponent from \"../components/fieldLabelWrapper\";\nimport { getEntryPermissionsCached } from \"../utils/getEntryPermissionsCached\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\n\nexport function appendFocusedToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false,\n options?: {\n isHover?: boolean;\n }\n): void {\n appendFieldPathDropdown(eventDetails, focusedToolbarElement, options);\n if(options?.isHover) {\n return;\n }\n appendFieldToolbar(\n eventDetails,\n focusedToolbarElement,\n hideOverlay,\n isVariant\n );\n}\n\nexport async function appendFieldToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false,\n options?: {\n isHover?: boolean;\n }\n): Promise<void> {\n const { isHover } = options || {};\n if (\n focusedToolbarElement.querySelector(\n \".visual-builder__focused-toolbar__multiple-field-toolbar\"\n ) && !isHover\n )\n return;\n const entryPermissions = await getEntryPermissionsCached({\n entryUid: eventDetails.fieldMetadata.entry_uid,\n contentTypeUid: eventDetails.fieldMetadata.content_type_uid,\n locale: eventDetails.fieldMetadata.locale,\n });\n const wrapper = document.createDocumentFragment();\n render(\n <FieldToolbarComponent\n eventDetails={eventDetails}\n hideOverlay={hideOverlay}\n isVariant={isVariant}\n entryPermissions={entryPermissions}\n />,\n wrapper\n );\n focusedToolbarElement.append(wrapper);\n}\n\nexport function appendFieldPathDropdown(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n options?: {\n isHover?: boolean;\n }\n): void {\n const { isHover } = options || {};\n const fieldLabelWrapper = document.querySelector(\n \".visual-builder__focused-toolbar__field-label-wrapper\"\n ) as HTMLDivElement | null;\n const { editableElement: targetElement, fieldMetadata } = eventDetails;\n\n if (fieldLabelWrapper) {\n if(isHover) {\n const fieldCslp = fieldLabelWrapper.getAttribute(\"data-hovered-cslp\");\n if(fieldCslp === fieldMetadata.cslpValue) {\n return;\n } else {\n removeFieldToolbar(focusedToolbarElement);\n }\n } else {\n return;\n }\n }\n \n const targetElementDimension = targetElement.getBoundingClientRect();\n\n const distanceFromTop =\n targetElementDimension.top + window.scrollY - TOOLBAR_EDGE_BUFFER;\n // Position the toolbar at the top unless there's insufficient space or scrolling up is not possible (topmost element targetted).\n const adjustedDistanceFromTop =\n targetElementDimension.top + window.scrollY < TOP_EDGE_BUFFER\n ? distanceFromTop + targetElementDimension.height + TOP_EDGE_BUFFER\n : distanceFromTop;\n\n const distanceFromLeft =\n targetElementDimension.left - LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX;\n const adjustedDistanceFromLeft = Math.max(\n distanceFromLeft,\n TOOLBAR_EDGE_BUFFER\n );\n\n const targetElementRightEdgeOffset =\n window.scrollX + window.innerWidth - targetElementDimension.left;\n\n if (targetElementRightEdgeOffset < RIGHT_EDGE_BUFFER) {\n // Overflow / Cutoff on right edge\n focusedToolbarElement.style.justifyContent = \"flex-end\";\n focusedToolbarElement.style.left = `${\n targetElementDimension.right + LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX\n }px`;\n } else {\n focusedToolbarElement.style.justifyContent = \"flex-start\"; // default\n focusedToolbarElement.style.left = `${adjustedDistanceFromLeft}px`;\n }\n\n focusedToolbarElement.style.top = `${adjustedDistanceFromTop}px`;\n\n const parentPaths = collectParentCSLPPaths(targetElement, 2);\n\n const wrapper = document.createDocumentFragment();\n render(\n <FieldLabelWrapperComponent\n fieldMetadata={fieldMetadata}\n eventDetails={eventDetails}\n parentPaths={parentPaths}\n getParentEditableElement={(cslp: string) => {\n const parentElement = targetElement.closest(\n `[${DATA_CSLP_ATTR_SELECTOR}=\"${cslp}\"]`\n ) as HTMLElement | null;\n return parentElement;\n }}\n />,\n wrapper\n );\n\n focusedToolbarElement.appendChild(wrapper);\n}\n\nfunction collectParentCSLPPaths(\n targetElement: Element,\n count: number\n): Array<string> {\n const cslpPaths: Array<string> = [];\n let currentElement = targetElement.parentElement;\n\n while (count > 0 || currentElement === window.document.body) {\n if (!currentElement) {\n return cslpPaths;\n }\n\n if (currentElement.hasAttribute(DATA_CSLP_ATTR_SELECTOR)) {\n cslpPaths.push(\n currentElement.getAttribute(DATA_CSLP_ATTR_SELECTOR) as string\n );\n count--;\n }\n currentElement = currentElement.parentElement;\n }\n\n return cslpPaths;\n}\n\nexport function removeFieldToolbar(toolbar: Element) {\n toolbar.innerHTML = \"\";\n const toolbarEvents = [\n VisualBuilderPostMessageEvents.DELETE_INSTANCE,\n VisualBuilderPostMessageEvents.UPDATE_DISCUSSION_ID,\n ];\n toolbarEvents.forEach((event) => {\n //@ts-expect-error - We are accessing private method here, but it is necessary to clean up the event listeners.\n if (visualBuilderPostMessage?.requestMessageHandlers?.has(event)) {\n //@ts-expect-error - We are accessing private method here, but it is necessary to clean up the event listeners.\n visualBuilderPostMessage?.unregisterEvent?.(event);\n }\n });\n}\n"],"mappings":"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","names":["FieldToolbarComponent","FieldLabelWrapperComponent","visualBuilderPostMessage"]}
@@ -1,8 +1,15 @@
1
1
  import { VisualBuilderCslpEventDetails } from '../types/visualBuilder.types.cjs';
2
2
  import '../../cslp/types/cslp.types.cjs';
3
3
 
4
- declare function appendFocusedToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean): void;
5
- declare function appendFieldToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean): Promise<void>;
6
- declare function appendFieldPathDropdown(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement): void;
4
+ declare function appendFocusedToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean, options?: {
5
+ isHover?: boolean;
6
+ }): void;
7
+ declare function appendFieldToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean, options?: {
8
+ isHover?: boolean;
9
+ }): Promise<void>;
10
+ declare function appendFieldPathDropdown(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, options?: {
11
+ isHover?: boolean;
12
+ }): void;
13
+ declare function removeFieldToolbar(toolbar: Element): void;
7
14
 
8
- export { appendFieldPathDropdown, appendFieldToolbar, appendFocusedToolbar };
15
+ export { appendFieldPathDropdown, appendFieldToolbar, appendFocusedToolbar, removeFieldToolbar };
@@ -1,8 +1,15 @@
1
1
  import { VisualBuilderCslpEventDetails } from '../types/visualBuilder.types.js';
2
2
  import '../../cslp/types/cslp.types.js';
3
3
 
4
- declare function appendFocusedToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean): void;
5
- declare function appendFieldToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean): Promise<void>;
6
- declare function appendFieldPathDropdown(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement): void;
4
+ declare function appendFocusedToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean, options?: {
5
+ isHover?: boolean;
6
+ }): void;
7
+ declare function appendFieldToolbar(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, hideOverlay: () => void, isVariant?: boolean, options?: {
8
+ isHover?: boolean;
9
+ }): Promise<void>;
10
+ declare function appendFieldPathDropdown(eventDetails: VisualBuilderCslpEventDetails, focusedToolbarElement: HTMLDivElement, options?: {
11
+ isHover?: boolean;
12
+ }): void;
13
+ declare function removeFieldToolbar(toolbar: Element): void;
7
14
 
8
- export { appendFieldPathDropdown, appendFieldToolbar, appendFocusedToolbar };
15
+ export { appendFieldPathDropdown, appendFieldToolbar, appendFocusedToolbar, removeFieldToolbar };
@@ -12,9 +12,14 @@ import FieldToolbarComponent from "../components/FieldToolbar.js";
12
12
  import { render } from "preact";
13
13
  import FieldLabelWrapperComponent from "../components/fieldLabelWrapper.js";
14
14
  import { getEntryPermissionsCached } from "../utils/getEntryPermissionsCached.js";
15
+ import { VisualBuilderPostMessageEvents } from "../utils/types/postMessage.types.js";
16
+ import visualBuilderPostMessage from "../utils/visualBuilderPostMessage.js";
15
17
  import { jsx } from "preact/jsx-runtime";
16
- function appendFocusedToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false) {
17
- appendFieldPathDropdown(eventDetails, focusedToolbarElement);
18
+ function appendFocusedToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false, options) {
19
+ appendFieldPathDropdown(eventDetails, focusedToolbarElement, options);
20
+ if (options?.isHover) {
21
+ return;
22
+ }
18
23
  appendFieldToolbar(
19
24
  eventDetails,
20
25
  focusedToolbarElement,
@@ -22,10 +27,11 @@ function appendFocusedToolbar(eventDetails, focusedToolbarElement, hideOverlay,
22
27
  isVariant
23
28
  );
24
29
  }
25
- async function appendFieldToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false) {
30
+ async function appendFieldToolbar(eventDetails, focusedToolbarElement, hideOverlay, isVariant = false, options) {
31
+ const { isHover } = options || {};
26
32
  if (focusedToolbarElement.querySelector(
27
33
  ".visual-builder__focused-toolbar__multiple-field-toolbar"
28
- ))
34
+ ) && !isHover)
29
35
  return;
30
36
  const entryPermissions = await getEntryPermissionsCached({
31
37
  entryUid: eventDetails.fieldMetadata.entry_uid,
@@ -47,12 +53,24 @@ async function appendFieldToolbar(eventDetails, focusedToolbarElement, hideOverl
47
53
  );
48
54
  focusedToolbarElement.append(wrapper);
49
55
  }
50
- function appendFieldPathDropdown(eventDetails, focusedToolbarElement) {
51
- if (document.querySelector(
56
+ function appendFieldPathDropdown(eventDetails, focusedToolbarElement, options) {
57
+ const { isHover } = options || {};
58
+ const fieldLabelWrapper = document.querySelector(
52
59
  ".visual-builder__focused-toolbar__field-label-wrapper"
53
- ))
54
- return;
60
+ );
55
61
  const { editableElement: targetElement, fieldMetadata } = eventDetails;
62
+ if (fieldLabelWrapper) {
63
+ if (isHover) {
64
+ const fieldCslp = fieldLabelWrapper.getAttribute("data-hovered-cslp");
65
+ if (fieldCslp === fieldMetadata.cslpValue) {
66
+ return;
67
+ } else {
68
+ removeFieldToolbar(focusedToolbarElement);
69
+ }
70
+ } else {
71
+ return;
72
+ }
73
+ }
56
74
  const targetElementDimension = targetElement.getBoundingClientRect();
57
75
  const distanceFromTop = targetElementDimension.top + window.scrollY - TOOLBAR_EDGE_BUFFER;
58
76
  const adjustedDistanceFromTop = targetElementDimension.top + window.scrollY < TOP_EDGE_BUFFER ? distanceFromTop + targetElementDimension.height + TOP_EDGE_BUFFER : distanceFromTop;
@@ -108,9 +126,22 @@ function collectParentCSLPPaths(targetElement, count) {
108
126
  }
109
127
  return cslpPaths;
110
128
  }
129
+ function removeFieldToolbar(toolbar) {
130
+ toolbar.innerHTML = "";
131
+ const toolbarEvents = [
132
+ VisualBuilderPostMessageEvents.DELETE_INSTANCE,
133
+ VisualBuilderPostMessageEvents.UPDATE_DISCUSSION_ID
134
+ ];
135
+ toolbarEvents.forEach((event) => {
136
+ if (visualBuilderPostMessage?.requestMessageHandlers?.has(event)) {
137
+ visualBuilderPostMessage?.unregisterEvent?.(event);
138
+ }
139
+ });
140
+ }
111
141
  export {
112
142
  appendFieldPathDropdown,
113
143
  appendFieldToolbar,
114
- appendFocusedToolbar
144
+ appendFocusedToolbar,
145
+ removeFieldToolbar
115
146
  };
116
147
  //# sourceMappingURL=generateToolbar.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/generators/generateToolbar.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n DATA_CSLP_ATTR_SELECTOR,\n LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX,\n RIGHT_EDGE_BUFFER,\n TOOLBAR_EDGE_BUFFER,\n TOP_EDGE_BUFFER,\n} from \"../utils/constants\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\n\nimport FieldToolbarComponent from \"../components/FieldToolbar\";\nimport { render } from \"preact\";\nimport FieldLabelWrapperComponent from \"../components/fieldLabelWrapper\";\nimport { getEntryPermissionsCached } from \"../utils/getEntryPermissionsCached\";\n\nexport function appendFocusedToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false\n): void {\n appendFieldPathDropdown(eventDetails, focusedToolbarElement);\n appendFieldToolbar(\n eventDetails,\n focusedToolbarElement,\n hideOverlay,\n isVariant\n );\n}\n\nexport async function appendFieldToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false\n): Promise<void> {\n if (\n focusedToolbarElement.querySelector(\n \".visual-builder__focused-toolbar__multiple-field-toolbar\"\n )\n )\n return;\n const entryPermissions = await getEntryPermissionsCached({\n entryUid: eventDetails.fieldMetadata.entry_uid,\n contentTypeUid: eventDetails.fieldMetadata.content_type_uid,\n locale: eventDetails.fieldMetadata.locale,\n });\n const wrapper = document.createDocumentFragment();\n render(\n <FieldToolbarComponent\n eventDetails={eventDetails}\n hideOverlay={hideOverlay}\n isVariant={isVariant}\n entryPermissions={entryPermissions}\n />,\n wrapper\n );\n focusedToolbarElement.append(wrapper);\n}\n\nexport function appendFieldPathDropdown(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement\n): void {\n if (\n document.querySelector(\n \".visual-builder__focused-toolbar__field-label-wrapper\"\n )\n )\n return;\n const { editableElement: targetElement, fieldMetadata } = eventDetails;\n const targetElementDimension = targetElement.getBoundingClientRect();\n\n const distanceFromTop =\n targetElementDimension.top + window.scrollY - TOOLBAR_EDGE_BUFFER;\n // Position the toolbar at the top unless there's insufficient space or scrolling up is not possible (topmost element targetted).\n const adjustedDistanceFromTop =\n targetElementDimension.top + window.scrollY < TOP_EDGE_BUFFER\n ? distanceFromTop + targetElementDimension.height + TOP_EDGE_BUFFER\n : distanceFromTop;\n\n const distanceFromLeft =\n targetElementDimension.left - LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX;\n const adjustedDistanceFromLeft = Math.max(\n distanceFromLeft,\n TOOLBAR_EDGE_BUFFER\n );\n\n const targetElementRightEdgeOffset =\n window.scrollX + window.innerWidth - targetElementDimension.left;\n\n if (targetElementRightEdgeOffset < RIGHT_EDGE_BUFFER) {\n // Overflow / Cutoff on right edge\n focusedToolbarElement.style.justifyContent = \"flex-end\";\n focusedToolbarElement.style.left = `${\n targetElementDimension.right + LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX\n }px`;\n } else {\n focusedToolbarElement.style.justifyContent = \"flex-start\"; // default\n focusedToolbarElement.style.left = `${adjustedDistanceFromLeft}px`;\n }\n\n focusedToolbarElement.style.top = `${adjustedDistanceFromTop}px`;\n\n const parentPaths = collectParentCSLPPaths(targetElement, 2);\n\n const wrapper = document.createDocumentFragment();\n render(\n <FieldLabelWrapperComponent\n fieldMetadata={fieldMetadata}\n eventDetails={eventDetails}\n parentPaths={parentPaths}\n getParentEditableElement={(cslp: string) => {\n const parentElement = targetElement.closest(\n `[${DATA_CSLP_ATTR_SELECTOR}=\"${cslp}\"]`\n ) as HTMLElement | null;\n return parentElement;\n }}\n />,\n wrapper\n );\n\n focusedToolbarElement.appendChild(wrapper);\n}\n\nfunction collectParentCSLPPaths(\n targetElement: Element,\n count: number\n): Array<string> {\n const cslpPaths: Array<string> = [];\n let currentElement = targetElement.parentElement;\n\n while (count > 0 || currentElement === window.document.body) {\n if (!currentElement) {\n return cslpPaths;\n }\n\n if (currentElement.hasAttribute(DATA_CSLP_ATTR_SELECTOR)) {\n cslpPaths.push(\n currentElement.getAttribute(DATA_CSLP_ATTR_SELECTOR) as string\n );\n count--;\n }\n currentElement = currentElement.parentElement;\n }\n\n return cslpPaths;\n}\n"],"mappings":";;;AAEA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAIP,OAAO,2BAA2B;AAClC,SAAS,cAAc;AACvB,OAAO,gCAAgC;AACvC,SAAS,iCAAiC;AAoClC;AAlCD,SAAS,qBACZ,cACA,uBACA,aACA,YAAqB,OACjB;AACJ,0BAAwB,cAAc,qBAAqB;AAC3D;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,eAAsB,mBAClB,cACA,uBACA,aACA,YAAqB,OACR;AACb,MACI,sBAAsB;AAAA,IAClB;AAAA,EACJ;AAEA;AACJ,QAAM,mBAAmB,MAAM,0BAA0B;AAAA,IACrD,UAAU,aAAa,cAAc;AAAA,IACrC,gBAAgB,aAAa,cAAc;AAAA,IAC3C,QAAQ,aAAa,cAAc;AAAA,EACvC,CAAC;AACD,QAAM,UAAU,SAAS,uBAAuB;AAChD;AAAA,IACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AACA,wBAAsB,OAAO,OAAO;AACxC;AAEO,SAAS,wBACZ,cACA,uBACI;AACJ,MACI,SAAS;AAAA,IACL;AAAA,EACJ;AAEA;AACJ,QAAM,EAAE,iBAAiB,eAAe,cAAc,IAAI;AAC1D,QAAM,yBAAyB,cAAc,sBAAsB;AAEnE,QAAM,kBACF,uBAAuB,MAAM,OAAO,UAAU;AAElD,QAAM,0BACF,uBAAuB,MAAM,OAAO,UAAU,kBACxC,kBAAkB,uBAAuB,SAAS,kBAClD;AAEV,QAAM,mBACF,uBAAuB,OAAO;AAClC,QAAM,2BAA2B,KAAK;AAAA,IAClC;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,+BACF,OAAO,UAAU,OAAO,aAAa,uBAAuB;AAEhE,MAAI,+BAA+B,mBAAmB;AAElD,0BAAsB,MAAM,iBAAiB;AAC7C,0BAAsB,MAAM,OAAO,GAC/B,uBAAuB,QAAQ,gCACnC;AAAA,EACJ,OAAO;AACH,0BAAsB,MAAM,iBAAiB;AAC7C,0BAAsB,MAAM,OAAO,GAAG,wBAAwB;AAAA,EAClE;AAEA,wBAAsB,MAAM,MAAM,GAAG,uBAAuB;AAE5D,QAAM,cAAc,uBAAuB,eAAe,CAAC;AAE3D,QAAM,UAAU,SAAS,uBAAuB;AAChD;AAAA,IACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA,0BAA0B,CAAC,SAAiB;AACxC,gBAAM,gBAAgB,cAAc;AAAA,YAChC,IAAI,uBAAuB,KAAK,IAAI;AAAA,UACxC;AACA,iBAAO;AAAA,QACX;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,wBAAsB,YAAY,OAAO;AAC7C;AAEA,SAAS,uBACL,eACA,OACa;AACb,QAAM,YAA2B,CAAC;AAClC,MAAI,iBAAiB,cAAc;AAEnC,SAAO,QAAQ,KAAK,mBAAmB,OAAO,SAAS,MAAM;AACzD,QAAI,CAAC,gBAAgB;AACjB,aAAO;AAAA,IACX;AAEA,QAAI,eAAe,aAAa,uBAAuB,GAAG;AACtD,gBAAU;AAAA,QACN,eAAe,aAAa,uBAAuB;AAAA,MACvD;AACA;AAAA,IACJ;AACA,qBAAiB,eAAe;AAAA,EACpC;AAEA,SAAO;AACX;","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/generators/generateToolbar.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n DATA_CSLP_ATTR_SELECTOR,\n LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX,\n RIGHT_EDGE_BUFFER,\n TOOLBAR_EDGE_BUFFER,\n TOP_EDGE_BUFFER,\n} from \"../utils/constants\";\nimport FieldToolbarComponent from \"../components/FieldToolbar\";\nimport { render } from \"preact\";\nimport FieldLabelWrapperComponent from \"../components/fieldLabelWrapper\";\nimport { getEntryPermissionsCached } from \"../utils/getEntryPermissionsCached\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\n\nexport function appendFocusedToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false,\n options?: {\n isHover?: boolean;\n }\n): void {\n appendFieldPathDropdown(eventDetails, focusedToolbarElement, options);\n if(options?.isHover) {\n return;\n }\n appendFieldToolbar(\n eventDetails,\n focusedToolbarElement,\n hideOverlay,\n isVariant\n );\n}\n\nexport async function appendFieldToolbar(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n hideOverlay: () => void,\n isVariant: boolean = false,\n options?: {\n isHover?: boolean;\n }\n): Promise<void> {\n const { isHover } = options || {};\n if (\n focusedToolbarElement.querySelector(\n \".visual-builder__focused-toolbar__multiple-field-toolbar\"\n ) && !isHover\n )\n return;\n const entryPermissions = await getEntryPermissionsCached({\n entryUid: eventDetails.fieldMetadata.entry_uid,\n contentTypeUid: eventDetails.fieldMetadata.content_type_uid,\n locale: eventDetails.fieldMetadata.locale,\n });\n const wrapper = document.createDocumentFragment();\n render(\n <FieldToolbarComponent\n eventDetails={eventDetails}\n hideOverlay={hideOverlay}\n isVariant={isVariant}\n entryPermissions={entryPermissions}\n />,\n wrapper\n );\n focusedToolbarElement.append(wrapper);\n}\n\nexport function appendFieldPathDropdown(\n eventDetails: VisualBuilderCslpEventDetails,\n focusedToolbarElement: HTMLDivElement,\n options?: {\n isHover?: boolean;\n }\n): void {\n const { isHover } = options || {};\n const fieldLabelWrapper = document.querySelector(\n \".visual-builder__focused-toolbar__field-label-wrapper\"\n ) as HTMLDivElement | null;\n const { editableElement: targetElement, fieldMetadata } = eventDetails;\n\n if (fieldLabelWrapper) {\n if(isHover) {\n const fieldCslp = fieldLabelWrapper.getAttribute(\"data-hovered-cslp\");\n if(fieldCslp === fieldMetadata.cslpValue) {\n return;\n } else {\n removeFieldToolbar(focusedToolbarElement);\n }\n } else {\n return;\n }\n }\n \n const targetElementDimension = targetElement.getBoundingClientRect();\n\n const distanceFromTop =\n targetElementDimension.top + window.scrollY - TOOLBAR_EDGE_BUFFER;\n // Position the toolbar at the top unless there's insufficient space or scrolling up is not possible (topmost element targetted).\n const adjustedDistanceFromTop =\n targetElementDimension.top + window.scrollY < TOP_EDGE_BUFFER\n ? distanceFromTop + targetElementDimension.height + TOP_EDGE_BUFFER\n : distanceFromTop;\n\n const distanceFromLeft =\n targetElementDimension.left - LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX;\n const adjustedDistanceFromLeft = Math.max(\n distanceFromLeft,\n TOOLBAR_EDGE_BUFFER\n );\n\n const targetElementRightEdgeOffset =\n window.scrollX + window.innerWidth - targetElementDimension.left;\n\n if (targetElementRightEdgeOffset < RIGHT_EDGE_BUFFER) {\n // Overflow / Cutoff on right edge\n focusedToolbarElement.style.justifyContent = \"flex-end\";\n focusedToolbarElement.style.left = `${\n targetElementDimension.right + LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX\n }px`;\n } else {\n focusedToolbarElement.style.justifyContent = \"flex-start\"; // default\n focusedToolbarElement.style.left = `${adjustedDistanceFromLeft}px`;\n }\n\n focusedToolbarElement.style.top = `${adjustedDistanceFromTop}px`;\n\n const parentPaths = collectParentCSLPPaths(targetElement, 2);\n\n const wrapper = document.createDocumentFragment();\n render(\n <FieldLabelWrapperComponent\n fieldMetadata={fieldMetadata}\n eventDetails={eventDetails}\n parentPaths={parentPaths}\n getParentEditableElement={(cslp: string) => {\n const parentElement = targetElement.closest(\n `[${DATA_CSLP_ATTR_SELECTOR}=\"${cslp}\"]`\n ) as HTMLElement | null;\n return parentElement;\n }}\n />,\n wrapper\n );\n\n focusedToolbarElement.appendChild(wrapper);\n}\n\nfunction collectParentCSLPPaths(\n targetElement: Element,\n count: number\n): Array<string> {\n const cslpPaths: Array<string> = [];\n let currentElement = targetElement.parentElement;\n\n while (count > 0 || currentElement === window.document.body) {\n if (!currentElement) {\n return cslpPaths;\n }\n\n if (currentElement.hasAttribute(DATA_CSLP_ATTR_SELECTOR)) {\n cslpPaths.push(\n currentElement.getAttribute(DATA_CSLP_ATTR_SELECTOR) as string\n );\n count--;\n }\n currentElement = currentElement.parentElement;\n }\n\n return cslpPaths;\n}\n\nexport function removeFieldToolbar(toolbar: Element) {\n toolbar.innerHTML = \"\";\n const toolbarEvents = [\n VisualBuilderPostMessageEvents.DELETE_INSTANCE,\n VisualBuilderPostMessageEvents.UPDATE_DISCUSSION_ID,\n ];\n toolbarEvents.forEach((event) => {\n //@ts-expect-error - We are accessing private method here, but it is necessary to clean up the event listeners.\n if (visualBuilderPostMessage?.requestMessageHandlers?.has(event)) {\n //@ts-expect-error - We are accessing private method here, but it is necessary to clean up the event listeners.\n visualBuilderPostMessage?.unregisterEvent?.(event);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -214,7 +214,9 @@ var _VisualBuilder = class _VisualBuilder {
214
214
  audienceMode: false,
215
215
  locale: "en-us",
216
216
  variant: null,
217
- focusElementObserver: null
217
+ focusElementObserver: null,
218
+ referenceParentMap: {},
219
+ isFocussed: false
218
220
  };
219
221
  if (this.visualBuilderContainer) {
220
222
  window.document.body.removeChild(this.visualBuilderContainer);
@@ -323,7 +325,7 @@ var _VisualBuilder = class _VisualBuilder {
323
325
  }
324
326
  }).catch(() => {
325
327
  if (!(0, import_inIframe.inIframe)()) {
326
- (0, import_generateStartEditingButton.generateStartEditingButton)(this.visualBuilderContainer);
328
+ (0, import_generateStartEditingButton.generateStartEditingButton)();
327
329
  }
328
330
  });
329
331
  }
@@ -346,7 +348,9 @@ _VisualBuilder.VisualBuilderGlobalState = (0, import_signals.signal)({
346
348
  audienceMode: false,
347
349
  locale: import_configManager.default.get().stackDetails.masterLocale || "en-us",
348
350
  variant: null,
349
- focusElementObserver: null
351
+ focusElementObserver: null,
352
+ referenceParentMap: {},
353
+ isFocussed: false
350
354
  });
351
355
  var VisualBuilder = _VisualBuilder;
352
356
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/visualBuilder/index.ts"],"sourcesContent":["import { Signal, signal } from \"@preact/signals\";\n\nimport { inIframe } from \"../common/inIframe\";\nimport Config from \"../configManager/configManager\";\nimport {\n useHistoryPostMessageEvent,\n useOnEntryUpdatePostMessageEvent,\n} from \"../livePreview/eventManager/postMessageEvent.hooks\";\nimport {\n ILivePreviewModeConfig,\n ILivePreviewWindowType,\n IVisualBuilderInitEvent,\n} from \"../types/types\";\nimport { generateStartEditingButton } from \"./generators/generateStartEditingButton\";\n\nimport { addFocusOverlay } from \"./generators/generateOverlay\";\nimport { getEntryIdentifiersInCurrentPage } from \"./utils/getEntryIdentifiersInCurrentPage\";\nimport visualBuilderPostMessage from \"./utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./utils/types/postMessage.types\";\n\nimport { setup } from \"goober\";\nimport { debounce, isEqual } from \"lodash-es\";\nimport { h } from \"preact\";\nimport { extractDetailsFromCslp } from \"../cslp\";\nimport initUI from \"./components\";\nimport { useDraftFieldsPostMessageEvent } from \"./eventManager/useDraftFieldsPostMessageEvent\";\nimport { useHideFocusOverlayPostMessageEvent } from \"./eventManager/useHideFocusOverlayPostMessageEvent\";\nimport { useScrollToField } from \"./eventManager/useScrollToField\";\nimport { useVariantFieldsPostMessageEvent } from \"./eventManager/useVariantsPostMessageEvent\";\nimport {\n generateEmptyBlocks,\n removeEmptyBlocks,\n} from \"./generators/generateEmptyBlock\";\nimport { addEventListeners, removeEventListeners } from \"./listeners\";\nimport { addKeyboardShortcuts } from \"./listeners/keyboardShortcuts\";\nimport { FieldSchemaMap } from \"./utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"./utils/isFieldDisabled\";\nimport {\n updateFocussedState,\n updateFocussedStateOnMutation,\n} from \"./utils/updateFocussedState\";\nimport { useHighlightCommentIcon } from \"./eventManager/useHighlightCommentIcon\";\nimport { updateHighlightedCommentIconPosition } from \"./generators/generateHighlightedComment\";\nimport {\n updateCollabIconPosition,\n updatePopupPositions,\n updateSuggestionListPosition,\n} from \"./generators/generateThread\";\nimport { useRecalculateVariantDataCSLPValues } from \"./eventManager/useRecalculateVariantDataCSLPValues\";\nimport { VB_EmptyBlockParentClass } from \"..\";\nimport { useCollab } from \"./eventManager/useCollab\";\nimport {\n handleMissingThreads,\n processThreadsBatch,\n filterUnrenderedThreads,\n clearThreadStatus,\n} from \"./generators/generateThread\";\nimport { IThreadDTO } from \"./types/collab.types\";\n\ninterface VisualBuilderGlobalStateImpl {\n previousSelectedEditableDOM: HTMLElement | Element | null;\n previousHoveredTargetDOM: Element | null;\n previousEmptyBlockParents: Element[] | [];\n focusFieldValue: string | null;\n focusFieldReceivedInput: boolean;\n audienceMode: boolean;\n locale: string;\n variant: string | null;\n focusElementObserver: MutationObserver | null;\n}\n\nlet threadsPayload: IThreadDTO[] = [];\n\nexport class VisualBuilder {\n private customCursor: HTMLDivElement | null = null;\n private overlayWrapper: HTMLDivElement | null = null;\n private visualBuilderContainer: HTMLDivElement | null = null;\n private focusedToolbar: HTMLDivElement | null = null;\n\n static VisualBuilderGlobalState: Signal<VisualBuilderGlobalStateImpl> =\n signal({\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: Config.get().stackDetails.masterLocale || \"en-us\",\n variant: null,\n focusElementObserver: null,\n });\n\n private handlePositionChange(editableElement: HTMLElement) {\n updateFocussedState({\n editableElement,\n visualBuilderContainer: this.visualBuilderContainer,\n overlayWrapper: this.overlayWrapper,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n }\n\n private scrollEventHandler = () => {\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n updateHighlightedCommentIconPosition(); // Update icons position\n };\n\n private resizeEventHandler = () => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n updateHighlightedCommentIconPosition();\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n if (previousSelectedEditableDOM) {\n this.handlePositionChange(\n previousSelectedEditableDOM as HTMLElement\n );\n }\n };\n\n private resizeObserver = new ResizeObserver(([entry]) => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n\n if (!this.overlayWrapper || !previousSelectedEditableDOM) {\n return;\n }\n\n // if previous selected editable element is not same as the current\n // target and the target is also not psuedo-editable then return\n if (\n !entry.target.isSameNode(previousSelectedEditableDOM) &&\n !entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n )\n ) {\n return;\n }\n\n const isPsuedoEditableElement = entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n );\n\n // the \"actual\" editable element when the current target is psuedo-editable\n // is the previous selected editable element instead of the closest data-cslp element\n // (cant use closest because the psuedo editable is absolute positioned)\n // (Note - why do we even need the closest? we do an early exit if entry.target\n // is not the previous selected editable element, needs more investigation)\n const editableElement = (\n isPsuedoEditableElement\n ? previousSelectedEditableDOM\n : entry.target.closest(\"[data-cslp]\")\n ) as HTMLElement | null;\n\n if (isPsuedoEditableElement) {\n // if the current target is psuedo-editable, then the resizing occurred by typing\n // into the psuedo editable, simply update the focus overlay\n addFocusOverlay(entry.target, this.overlayWrapper);\n\n // TODO check if we can now resize the actual editable element\n // when psuedo editable element is resized, avoid infinite loops\n } else if (editableElement) {\n this.handlePositionChange(editableElement);\n }\n\n // update the overlay if field is disabled\n const cslpData =\n editableElement && editableElement.getAttribute(\"data-cslp\");\n\n if (!editableElement || !cslpData) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n ).then((fieldSchema) => {\n if (!fieldSchema) {\n return;\n }\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement,\n fieldMetadata,\n });\n if (isDisabled) {\n addFocusOverlay(\n editableElement,\n this.overlayWrapper as HTMLDivElement,\n isDisabled\n );\n }\n });\n });\n\n private mutationObserver = new MutationObserver(\n debounce(\n async () => {\n updateFocussedStateOnMutation(\n this.overlayWrapper,\n this.focusedToolbar,\n this.visualBuilderContainer,\n this.resizeObserver\n );\n\n const emptyBlockParents = Array.from(\n document.querySelectorAll(`.${VB_EmptyBlockParentClass}`)\n );\n\n const previousEmptyBlockParents = VisualBuilder\n .VisualBuilderGlobalState.value\n .previousEmptyBlockParents as Element[];\n\n if (!isEqual(emptyBlockParents, previousEmptyBlockParents)) {\n const noMoreEmptyBlockParent =\n previousEmptyBlockParents.filter(\n (x) => !emptyBlockParents.includes(x)\n );\n const newEmptyBlockParent = emptyBlockParents.filter(\n (x) => !previousEmptyBlockParents.includes(x)\n );\n\n removeEmptyBlocks(noMoreEmptyBlockParent);\n await generateEmptyBlocks(newEmptyBlockParent);\n\n VisualBuilder.VisualBuilderGlobalState.value = {\n ...VisualBuilder.VisualBuilderGlobalState.value,\n previousEmptyBlockParents: emptyBlockParents,\n };\n }\n },\n 100,\n { trailing: true }\n )\n );\n\n private threadMutationObserver = new MutationObserver(\n debounce(() => {\n const container = document.querySelector(\n \".visual-builder__container\"\n );\n if (container && threadsPayload) {\n const unrenderedThreads =\n filterUnrenderedThreads(threadsPayload);\n\n if (unrenderedThreads.length > 0) {\n processThreadsBatch(threadsPayload).then(\n (missingThreadIds) => {\n missingThreadIds.forEach(clearThreadStatus);\n if (missingThreadIds.length > 0) {\n handleMissingThreads({\n payload: { isElementPresent: false },\n threadUids: missingThreadIds,\n });\n }\n }\n );\n }\n\n threadsPayload = [];\n }\n }, 1000)\n );\n\n constructor() {\n // Handles changes in element positions due to sidebar toggling or window resizing,\n // triggering a redraw of the visual builder\n window.addEventListener(\"resize\", this.resizeEventHandler);\n window.addEventListener(\"scroll\", this.scrollEventHandler);\n initUI({\n resizeObserver: this.resizeObserver,\n });\n\n // Initializing goober for css-in-js\n setup(h);\n\n this.visualBuilderContainer = document.querySelector(\n \".visual-builder__container\"\n );\n this.overlayWrapper = document.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n this.customCursor = document.querySelector(\".visual-builder__cursor\");\n this.focusedToolbar = document.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const config = Config.get();\n\n if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {\n return;\n }\n\n visualBuilderPostMessage\n ?.send<IVisualBuilderInitEvent>(\"init\", {\n isSSR: config.ssr,\n href: window.location.href,\n })\n .then((data) => {\n const {\n windowType = ILivePreviewWindowType.BUILDER,\n stackDetails,\n collab,\n } = data || {};\n Config.set(\"windowType\", windowType);\n Config.set(\n \"stackDetails.masterLocale\",\n stackDetails?.masterLocale || \"en-us\"\n );\n\n if (collab) {\n Config.set(\"collab.enable\", collab.enable);\n Config.set(\"collab.isFeedbackMode\", collab.isFeedbackMode);\n Config.set(\"collab.inviteMetadata\", collab.inviteMetadata);\n }\n\n if (collab?.payload) {\n threadsPayload = collab?.payload;\n }\n\n addEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n this.threadMutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n\n useHistoryPostMessageEvent();\n useCollab();\n\n if (windowType === ILivePreviewWindowType.BUILDER) {\n addKeyboardShortcuts({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n useScrollToField();\n useHighlightCommentIcon();\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.GET_ALL_ENTRIES_IN_CURRENT_PAGE,\n getEntryIdentifiersInCurrentPage\n );\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.SEND_VARIANT_AND_LOCALE\n );\n\n useHideFocusOverlayPostMessageEvent({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n\n // These events are used to sync the data when we made some changes in the entry without invoking live preview module.\n useOnEntryUpdatePostMessageEvent();\n useRecalculateVariantDataCSLPValues();\n useDraftFieldsPostMessageEvent();\n useVariantFieldsPostMessageEvent();\n }\n })\n .catch(() => {\n if (!inIframe()) {\n generateStartEditingButton(this.visualBuilderContainer);\n }\n });\n }\n\n // TODO: write test cases\n destroy = (): void => {\n // Remove event listeners\n window.removeEventListener(\"resize\", this.resizeEventHandler);\n window.removeEventListener(\"scroll\", this.scrollEventHandler);\n\n // Remove custom event listeners\n removeEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n // Disconnect observers\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.threadMutationObserver.disconnect();\n\n // Clear global state\n VisualBuilder.VisualBuilderGlobalState.value = {\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: \"en-us\",\n variant: null,\n focusElementObserver: null,\n };\n\n // Remove DOM elements\n if (this.visualBuilderContainer) {\n window.document.body.removeChild(this.visualBuilderContainer);\n }\n if (this.customCursor) {\n this.customCursor.remove();\n }\n if (this.overlayWrapper) {\n this.overlayWrapper.remove();\n }\n if (this.focusedToolbar) {\n this.focusedToolbar.remove();\n }\n\n // Nullify references\n this.customCursor = null;\n this.overlayWrapper = null;\n this.visualBuilderContainer = null;\n this.focusedToolbar = null;\n };\n}\n"],"mappings":"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","names":["import_generateThread","initUI","Config","visualBuilderPostMessage"]}
1
+ {"version":3,"sources":["../../../src/visualBuilder/index.ts"],"sourcesContent":["import { Signal, signal } from \"@preact/signals\";\n\nimport { inIframe } from \"../common/inIframe\";\nimport Config from \"../configManager/configManager\";\nimport {\n useHistoryPostMessageEvent,\n useOnEntryUpdatePostMessageEvent,\n} from \"../livePreview/eventManager/postMessageEvent.hooks\";\nimport {\n ILivePreviewModeConfig,\n ILivePreviewWindowType,\n IVisualBuilderInitEvent,\n} from \"../types/types\";\nimport { generateStartEditingButton } from \"./generators/generateStartEditingButton\";\n\nimport { addFocusOverlay } from \"./generators/generateOverlay\";\nimport { getEntryIdentifiersInCurrentPage } from \"./utils/getEntryIdentifiersInCurrentPage\";\nimport visualBuilderPostMessage from \"./utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./utils/types/postMessage.types\";\n\nimport { setup } from \"goober\";\nimport { debounce, isEqual } from \"lodash-es\";\nimport { h } from \"preact\";\nimport { extractDetailsFromCslp } from \"../cslp\";\nimport initUI from \"./components\";\nimport { useDraftFieldsPostMessageEvent } from \"./eventManager/useDraftFieldsPostMessageEvent\";\nimport { useHideFocusOverlayPostMessageEvent } from \"./eventManager/useHideFocusOverlayPostMessageEvent\";\nimport { useScrollToField } from \"./eventManager/useScrollToField\";\nimport { useVariantFieldsPostMessageEvent } from \"./eventManager/useVariantsPostMessageEvent\";\nimport {\n generateEmptyBlocks,\n removeEmptyBlocks,\n} from \"./generators/generateEmptyBlock\";\nimport { addEventListeners, removeEventListeners } from \"./listeners\";\nimport { addKeyboardShortcuts } from \"./listeners/keyboardShortcuts\";\nimport { FieldSchemaMap } from \"./utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"./utils/isFieldDisabled\";\nimport {\n updateFocussedState,\n updateFocussedStateOnMutation,\n} from \"./utils/updateFocussedState\";\nimport { useHighlightCommentIcon } from \"./eventManager/useHighlightCommentIcon\";\nimport { updateHighlightedCommentIconPosition } from \"./generators/generateHighlightedComment\";\nimport {\n updateCollabIconPosition,\n updatePopupPositions,\n updateSuggestionListPosition,\n} from \"./generators/generateThread\";\nimport { useRecalculateVariantDataCSLPValues } from \"./eventManager/useRecalculateVariantDataCSLPValues\";\nimport { VB_EmptyBlockParentClass } from \"..\";\nimport { useCollab } from \"./eventManager/useCollab\";\nimport {\n handleMissingThreads,\n processThreadsBatch,\n filterUnrenderedThreads,\n clearThreadStatus,\n} from \"./generators/generateThread\";\nimport { IThreadDTO } from \"./types/collab.types\";\n\ninterface VisualBuilderGlobalStateImpl {\n previousSelectedEditableDOM: HTMLElement | Element | null;\n previousHoveredTargetDOM: Element | null;\n previousEmptyBlockParents: Element[] | [];\n focusFieldValue: string | null;\n focusFieldReceivedInput: boolean;\n audienceMode: boolean;\n locale: string;\n variant: string | null;\n focusElementObserver: MutationObserver | null;\n referenceParentMap: Record<string, string>;\n isFocussed: boolean;\n}\n\nlet threadsPayload: IThreadDTO[] = [];\n\nexport class VisualBuilder {\n private customCursor: HTMLDivElement | null = null;\n private overlayWrapper: HTMLDivElement | null = null;\n private visualBuilderContainer: HTMLDivElement | null = null;\n private focusedToolbar: HTMLDivElement | null = null;\n\n static VisualBuilderGlobalState: Signal<VisualBuilderGlobalStateImpl> =\n signal({\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: Config.get().stackDetails.masterLocale || \"en-us\",\n variant: null,\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n });\n\n private handlePositionChange(editableElement: HTMLElement) {\n updateFocussedState({\n editableElement,\n visualBuilderContainer: this.visualBuilderContainer,\n overlayWrapper: this.overlayWrapper,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n }\n\n private scrollEventHandler = () => {\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n updateHighlightedCommentIconPosition(); // Update icons position\n };\n\n private resizeEventHandler = () => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n updateHighlightedCommentIconPosition();\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n if (previousSelectedEditableDOM) {\n this.handlePositionChange(\n previousSelectedEditableDOM as HTMLElement\n );\n }\n };\n\n private resizeObserver = new ResizeObserver(([entry]) => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n\n if (!this.overlayWrapper || !previousSelectedEditableDOM) {\n return;\n }\n\n // if previous selected editable element is not same as the current\n // target and the target is also not psuedo-editable then return\n if (\n !entry.target.isSameNode(previousSelectedEditableDOM) &&\n !entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n )\n ) {\n return;\n }\n\n const isPsuedoEditableElement = entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n );\n\n // the \"actual\" editable element when the current target is psuedo-editable\n // is the previous selected editable element instead of the closest data-cslp element\n // (cant use closest because the psuedo editable is absolute positioned)\n // (Note - why do we even need the closest? we do an early exit if entry.target\n // is not the previous selected editable element, needs more investigation)\n const editableElement = (\n isPsuedoEditableElement\n ? previousSelectedEditableDOM\n : entry.target.closest(\"[data-cslp]\")\n ) as HTMLElement | null;\n\n if (isPsuedoEditableElement) {\n // if the current target is psuedo-editable, then the resizing occurred by typing\n // into the psuedo editable, simply update the focus overlay\n addFocusOverlay(entry.target, this.overlayWrapper);\n\n // TODO check if we can now resize the actual editable element\n // when psuedo editable element is resized, avoid infinite loops\n } else if (editableElement) {\n this.handlePositionChange(editableElement);\n }\n\n // update the overlay if field is disabled\n const cslpData =\n editableElement && editableElement.getAttribute(\"data-cslp\");\n\n if (!editableElement || !cslpData) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n ).then((fieldSchema) => {\n if (!fieldSchema) {\n return;\n }\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement,\n fieldMetadata,\n });\n if (isDisabled) {\n addFocusOverlay(\n editableElement,\n this.overlayWrapper as HTMLDivElement,\n isDisabled\n );\n }\n });\n });\n\n private mutationObserver = new MutationObserver(\n debounce(\n async () => {\n updateFocussedStateOnMutation(\n this.overlayWrapper,\n this.focusedToolbar,\n this.visualBuilderContainer,\n this.resizeObserver\n );\n\n const emptyBlockParents = Array.from(\n document.querySelectorAll(`.${VB_EmptyBlockParentClass}`)\n );\n\n const previousEmptyBlockParents = VisualBuilder\n .VisualBuilderGlobalState.value\n .previousEmptyBlockParents as Element[];\n\n if (!isEqual(emptyBlockParents, previousEmptyBlockParents)) {\n const noMoreEmptyBlockParent =\n previousEmptyBlockParents.filter(\n (x) => !emptyBlockParents.includes(x)\n );\n const newEmptyBlockParent = emptyBlockParents.filter(\n (x) => !previousEmptyBlockParents.includes(x)\n );\n\n removeEmptyBlocks(noMoreEmptyBlockParent);\n await generateEmptyBlocks(newEmptyBlockParent);\n\n VisualBuilder.VisualBuilderGlobalState.value = {\n ...VisualBuilder.VisualBuilderGlobalState.value,\n previousEmptyBlockParents: emptyBlockParents,\n };\n }\n },\n 100,\n { trailing: true }\n )\n );\n\n private threadMutationObserver = new MutationObserver(\n debounce(() => {\n const container = document.querySelector(\n \".visual-builder__container\"\n );\n if (container && threadsPayload) {\n const unrenderedThreads =\n filterUnrenderedThreads(threadsPayload);\n\n if (unrenderedThreads.length > 0) {\n processThreadsBatch(threadsPayload).then(\n (missingThreadIds) => {\n missingThreadIds.forEach(clearThreadStatus);\n if (missingThreadIds.length > 0) {\n handleMissingThreads({\n payload: { isElementPresent: false },\n threadUids: missingThreadIds,\n });\n }\n }\n );\n }\n\n threadsPayload = [];\n }\n }, 1000)\n );\n\n constructor() {\n // Handles changes in element positions due to sidebar toggling or window resizing,\n // triggering a redraw of the visual builder\n window.addEventListener(\"resize\", this.resizeEventHandler);\n window.addEventListener(\"scroll\", this.scrollEventHandler);\n initUI({\n resizeObserver: this.resizeObserver,\n });\n\n // Initializing goober for css-in-js\n setup(h);\n\n this.visualBuilderContainer = document.querySelector(\n \".visual-builder__container\"\n );\n this.overlayWrapper = document.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n this.customCursor = document.querySelector(\".visual-builder__cursor\");\n this.focusedToolbar = document.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const config = Config.get();\n\n if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {\n return;\n }\n\n visualBuilderPostMessage\n ?.send<IVisualBuilderInitEvent>(\"init\", {\n isSSR: config.ssr,\n href: window.location.href,\n })\n .then((data) => {\n const {\n windowType = ILivePreviewWindowType.BUILDER,\n stackDetails,\n collab,\n } = data || {};\n Config.set(\"windowType\", windowType);\n Config.set(\n \"stackDetails.masterLocale\",\n stackDetails?.masterLocale || \"en-us\"\n );\n\n if (collab) {\n Config.set(\"collab.enable\", collab.enable);\n Config.set(\"collab.isFeedbackMode\", collab.isFeedbackMode);\n Config.set(\"collab.inviteMetadata\", collab.inviteMetadata);\n }\n\n if (collab?.payload) {\n threadsPayload = collab?.payload;\n }\n\n addEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n this.threadMutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n\n useHistoryPostMessageEvent();\n useCollab();\n\n if (windowType === ILivePreviewWindowType.BUILDER) {\n addKeyboardShortcuts({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n useScrollToField();\n useHighlightCommentIcon();\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.GET_ALL_ENTRIES_IN_CURRENT_PAGE,\n getEntryIdentifiersInCurrentPage\n );\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.SEND_VARIANT_AND_LOCALE\n );\n\n useHideFocusOverlayPostMessageEvent({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n\n // These events are used to sync the data when we made some changes in the entry without invoking live preview module.\n useOnEntryUpdatePostMessageEvent();\n useRecalculateVariantDataCSLPValues();\n useDraftFieldsPostMessageEvent();\n useVariantFieldsPostMessageEvent();\n }\n })\n .catch(() => {\n if (!inIframe()) {\n generateStartEditingButton();\n }\n });\n }\n\n // TODO: write test cases\n destroy = (): void => {\n // Remove event listeners\n window.removeEventListener(\"resize\", this.resizeEventHandler);\n window.removeEventListener(\"scroll\", this.scrollEventHandler);\n\n // Remove custom event listeners\n removeEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n // Disconnect observers\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.threadMutationObserver.disconnect();\n\n // Clear global state\n VisualBuilder.VisualBuilderGlobalState.value = {\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: \"en-us\",\n variant: null,\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n };\n\n // Remove DOM elements\n if (this.visualBuilderContainer) {\n window.document.body.removeChild(this.visualBuilderContainer);\n }\n if (this.customCursor) {\n this.customCursor.remove();\n }\n if (this.overlayWrapper) {\n this.overlayWrapper.remove();\n }\n if (this.focusedToolbar) {\n this.focusedToolbar.remove();\n }\n\n // Nullify references\n this.customCursor = null;\n this.overlayWrapper = null;\n this.visualBuilderContainer = null;\n this.focusedToolbar = null;\n };\n}\n"],"mappings":"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","names":["import_generateThread","initUI","Config","visualBuilderPostMessage"]}
@@ -10,6 +10,8 @@ interface VisualBuilderGlobalStateImpl {
10
10
  locale: string;
11
11
  variant: string | null;
12
12
  focusElementObserver: MutationObserver | null;
13
+ referenceParentMap: Record<string, string>;
14
+ isFocussed: boolean;
13
15
  }
14
16
  declare class VisualBuilder {
15
17
  private customCursor;
@@ -10,6 +10,8 @@ interface VisualBuilderGlobalStateImpl {
10
10
  locale: string;
11
11
  variant: string | null;
12
12
  focusElementObserver: MutationObserver | null;
13
+ referenceParentMap: Record<string, string>;
14
+ isFocussed: boolean;
13
15
  }
14
16
  declare class VisualBuilder {
15
17
  private customCursor;
@@ -203,7 +203,9 @@ var _VisualBuilder = class _VisualBuilder {
203
203
  audienceMode: false,
204
204
  locale: "en-us",
205
205
  variant: null,
206
- focusElementObserver: null
206
+ focusElementObserver: null,
207
+ referenceParentMap: {},
208
+ isFocussed: false
207
209
  };
208
210
  if (this.visualBuilderContainer) {
209
211
  window.document.body.removeChild(this.visualBuilderContainer);
@@ -312,7 +314,7 @@ var _VisualBuilder = class _VisualBuilder {
312
314
  }
313
315
  }).catch(() => {
314
316
  if (!inIframe()) {
315
- generateStartEditingButton(this.visualBuilderContainer);
317
+ generateStartEditingButton();
316
318
  }
317
319
  });
318
320
  }
@@ -335,7 +337,9 @@ _VisualBuilder.VisualBuilderGlobalState = signal({
335
337
  audienceMode: false,
336
338
  locale: Config.get().stackDetails.masterLocale || "en-us",
337
339
  variant: null,
338
- focusElementObserver: null
340
+ focusElementObserver: null,
341
+ referenceParentMap: {},
342
+ isFocussed: false
339
343
  });
340
344
  var VisualBuilder = _VisualBuilder;
341
345
  export {