@comet/site-react 7.21.0-canary-20250522145352

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 (116) hide show
  1. package/LICENSE +24 -0
  2. package/lib/blockLoader/blockLoader.d.ts +32 -0
  3. package/lib/blockLoader/blockLoader.d.ts.map +1 -0
  4. package/lib/blockLoader/blockLoader.js +57 -0
  5. package/lib/blocks/PropsWithData.d.ts +4 -0
  6. package/lib/blocks/PropsWithData.d.ts.map +1 -0
  7. package/lib/blocks/SvgImageBlock.d.ts +9 -0
  8. package/lib/blocks/SvgImageBlock.d.ts.map +1 -0
  9. package/lib/blocks/SvgImageBlock.js +23 -0
  10. package/lib/blocks/factories/BlocksBlock.d.ts +15 -0
  11. package/lib/blocks/factories/BlocksBlock.d.ts.map +1 -0
  12. package/lib/blocks/factories/BlocksBlock.js +30 -0
  13. package/lib/blocks/factories/ListBlock.d.ts +14 -0
  14. package/lib/blocks/factories/ListBlock.d.ts.map +1 -0
  15. package/lib/blocks/factories/ListBlock.js +13 -0
  16. package/lib/blocks/factories/OneOfBlock.d.ts +15 -0
  17. package/lib/blocks/factories/OneOfBlock.d.ts.map +1 -0
  18. package/lib/blocks/factories/OneOfBlock.js +26 -0
  19. package/lib/blocks/factories/OptionalBlock.d.ts +11 -0
  20. package/lib/blocks/factories/OptionalBlock.d.ts.map +1 -0
  21. package/lib/blocks/factories/OptionalBlock.js +10 -0
  22. package/lib/blocks/factories/types.d.ts +5 -0
  23. package/lib/blocks/factories/types.d.ts.map +1 -0
  24. package/lib/blocks/helpers/RichTextBlockHelper.d.ts +3 -0
  25. package/lib/blocks/helpers/RichTextBlockHelper.d.ts.map +1 -0
  26. package/lib/blocks/helpers/RichTextBlockHelper.js +7 -0
  27. package/lib/blocks/helpers/useIsElementInViewport.d.ts +2 -0
  28. package/lib/blocks/helpers/useIsElementInViewport.d.ts.map +1 -0
  29. package/lib/blocks/helpers/useIsElementInViewport.js +21 -0
  30. package/lib/blocks.generated.d.ts +176 -0
  31. package/lib/blocks.generated.d.ts.map +1 -0
  32. package/lib/cookies/CookieApiContext.d.ts +14 -0
  33. package/lib/cookies/CookieApiContext.d.ts.map +1 -0
  34. package/lib/cookies/CookieApiContext.js +19 -0
  35. package/lib/cookies/CookieSafe.d.ts +9 -0
  36. package/lib/cookies/CookieSafe.d.ts.map +1 -0
  37. package/lib/cookies/CookieSafe.js +19 -0
  38. package/lib/cookies/useCookieBotCookieApi.d.ts +3 -0
  39. package/lib/cookies/useCookieBotCookieApi.d.ts.map +1 -0
  40. package/lib/cookies/useCookieBotCookieApi.js +34 -0
  41. package/lib/cookies/useLocalStorageCookieApi.d.ts +11 -0
  42. package/lib/cookies/useLocalStorageCookieApi.d.ts.map +1 -0
  43. package/lib/cookies/useLocalStorageCookieApi.js +41 -0
  44. package/lib/cookies/useOneTrustCookieApi.d.ts +3 -0
  45. package/lib/cookies/useOneTrustCookieApi.d.ts.map +1 -0
  46. package/lib/cookies/useOneTrustCookieApi.js +49 -0
  47. package/lib/errorHandler/ErrorHandlerBoundary.d.ts +3 -0
  48. package/lib/errorHandler/ErrorHandlerBoundary.d.ts.map +1 -0
  49. package/lib/errorHandler/ErrorHandlerBoundary.js +10 -0
  50. package/lib/errorHandler/ErrorHandlerBoundaryInternal.d.ts +17 -0
  51. package/lib/errorHandler/ErrorHandlerBoundaryInternal.d.ts.map +1 -0
  52. package/lib/errorHandler/ErrorHandlerBoundaryInternal.js +27 -0
  53. package/lib/errorHandler/ErrorHandlerProvider.d.ts +9 -0
  54. package/lib/errorHandler/ErrorHandlerProvider.d.ts.map +1 -0
  55. package/lib/errorHandler/ErrorHandlerProvider.js +22 -0
  56. package/lib/graphQLFetch/fetchInMemoryCache.d.ts +4 -0
  57. package/lib/graphQLFetch/fetchInMemoryCache.d.ts.map +1 -0
  58. package/lib/graphQLFetch/fetchInMemoryCache.js +38 -0
  59. package/lib/graphQLFetch/graphQLFetch.d.ts +12 -0
  60. package/lib/graphQLFetch/graphQLFetch.d.ts.map +1 -0
  61. package/lib/graphQLFetch/graphQLFetch.js +111 -0
  62. package/lib/iframebridge/IFrameBridge.d.ts +40 -0
  63. package/lib/iframebridge/IFrameBridge.d.ts.map +1 -0
  64. package/lib/iframebridge/IFrameBridge.js +239 -0
  65. package/lib/iframebridge/IFrameBridge.module.scss.js +8 -0
  66. package/lib/iframebridge/IFrameMessage.d.ts +118 -0
  67. package/lib/iframebridge/IFrameMessage.d.ts.map +1 -0
  68. package/lib/iframebridge/IFrameMessage.js +21 -0
  69. package/lib/iframebridge/Preview.d.ts +9 -0
  70. package/lib/iframebridge/Preview.d.ts.map +1 -0
  71. package/lib/iframebridge/Preview.js +57 -0
  72. package/lib/iframebridge/Preview.module.scss.js +8 -0
  73. package/lib/iframebridge/PreviewOverlay.d.ts +2 -0
  74. package/lib/iframebridge/PreviewOverlay.d.ts.map +1 -0
  75. package/lib/iframebridge/PreviewOverlay.js +27 -0
  76. package/lib/iframebridge/PreviewOverlay.module.scss.js +8 -0
  77. package/lib/iframebridge/PreviewOverlayElement.d.ts +7 -0
  78. package/lib/iframebridge/PreviewOverlayElement.d.ts.map +1 -0
  79. package/lib/iframebridge/PreviewOverlayElement.js +36 -0
  80. package/lib/iframebridge/PreviewOverlayElement.module.scss.js +20 -0
  81. package/lib/iframebridge/useBlockPreviewFetch.d.ts +16 -0
  82. package/lib/iframebridge/useBlockPreviewFetch.d.ts.map +1 -0
  83. package/lib/iframebridge/useBlockPreviewFetch.js +29 -0
  84. package/lib/iframebridge/useIFrameBridge.d.ts +3 -0
  85. package/lib/iframebridge/useIFrameBridge.d.ts.map +1 -0
  86. package/lib/iframebridge/useIFrameBridge.js +8 -0
  87. package/lib/iframebridge/utils.d.ts +10 -0
  88. package/lib/iframebridge/utils.d.ts.map +1 -0
  89. package/lib/iframebridge/utils.js +45 -0
  90. package/lib/iframebridge/withPreview.d.ts +18 -0
  91. package/lib/iframebridge/withPreview.d.ts.map +1 -0
  92. package/lib/iframebridge/withPreview.js +34 -0
  93. package/lib/image/Image.d.ts +8 -0
  94. package/lib/image/Image.d.ts.map +1 -0
  95. package/lib/image/Image.js +10 -0
  96. package/lib/image/image.utils.d.ts +18 -0
  97. package/lib/image/image.utils.d.ts.map +1 -0
  98. package/lib/image/image.utils.js +53 -0
  99. package/lib/index.d.ts +32 -0
  100. package/lib/index.d.ts.map +1 -0
  101. package/lib/index.js +69 -0
  102. package/lib/preview/BlockPreviewProvider.d.ts +3 -0
  103. package/lib/preview/BlockPreviewProvider.d.ts.map +1 -0
  104. package/lib/preview/BlockPreviewProvider.js +18 -0
  105. package/lib/preview/PreviewContext.d.ts +9 -0
  106. package/lib/preview/PreviewContext.d.ts.map +1 -0
  107. package/lib/preview/PreviewContext.js +11 -0
  108. package/lib/preview/usePreview.d.ts +11 -0
  109. package/lib/preview/usePreview.d.ts.map +1 -0
  110. package/lib/preview/usePreview.js +41 -0
  111. package/lib/previewskeleton/PreviewSkeleton.d.ts +14 -0
  112. package/lib/previewskeleton/PreviewSkeleton.d.ts.map +1 -0
  113. package/lib/previewskeleton/PreviewSkeleton.js +64 -0
  114. package/lib/previewskeleton/PreviewSkeleton.module.scss.js +17 -0
  115. package/lib/style.css +1 -0
  116. package/package.json +84 -0
@@ -0,0 +1,239 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import isEqual from "lodash.isequal";
4
+ import { createContext, useState, useRef, useCallback, useEffect, useMemo } from "react";
5
+ import { useDebounceCallback } from "usehooks-ts";
6
+ import styles from "./IFrameBridge.module.scss.js";
7
+ import { AdminMessageType, IFrameMessageType } from "./IFrameMessage.js";
8
+ import { PreviewOverlay } from "./PreviewOverlay.js";
9
+ import { getRecursiveChildrenOfPreviewElement, getCombinedPositioningOfElements, PREVIEW_ELEMENT_SCROLLED_INTO_VIEW_EVENT } from "./utils.js";
10
+ const IFrameBridgeContext = createContext({
11
+ hasBridge: false,
12
+ showOutlines: false,
13
+ showOnlyVisible: false,
14
+ sendSelectComponent: () => {
15
+ },
16
+ sendHoverComponent: () => {
17
+ },
18
+ sendMessage: () => {
19
+ },
20
+ contentScope: void 0,
21
+ graphQLApiUrl: void 0,
22
+ previewElementsData: [],
23
+ removePreviewElement: () => {
24
+ },
25
+ addPreviewElement: () => {
26
+ }
27
+ });
28
+ const IFrameBridgeProvider = ({ children }) => {
29
+ var _a;
30
+ const [block, setBlock] = useState(void 0);
31
+ const [showOnlyVisible, setShowOnlyVisible] = useState(false);
32
+ const [selectedAdminRoute, setSelectedAdminRoute] = useState(void 0);
33
+ const [hoveredAdminRoute, setHoveredAdminRoute] = useState(null);
34
+ const [showOutlines, setShowOutlines] = useState(false);
35
+ const [contentScope, setContentScope] = useState(void 0);
36
+ const [graphQLApiUrl, setGraphQLApiUrl] = useState("");
37
+ const [previewElements, setPreviewElements] = useState([]);
38
+ const [previewElementsData, setPreviewElementsData] = useState([]);
39
+ const childrenWrapperRef = useRef(null);
40
+ const childrenWrapperWidth = (_a = childrenWrapperRef.current) == null ? void 0 : _a.offsetWidth;
41
+ const recalculatePreviewElementsData = useCallback(() => {
42
+ if (!childrenWrapperWidth) {
43
+ return;
44
+ }
45
+ const newPreviewElementsData = previewElements.map((previewElement) => {
46
+ const childNodes = getRecursiveChildrenOfPreviewElement(previewElement.element);
47
+ const positioning = getCombinedPositioningOfElements(childNodes);
48
+ const isRenderedOutsideOfViewportWidth = positioning.left > childrenWrapperWidth;
49
+ if (isRenderedOutsideOfViewportWidth) {
50
+ return {
51
+ adminRoute: previewElement.adminRoute,
52
+ label: previewElement.label,
53
+ position: {
54
+ top: positioning.top,
55
+ left: positioning.left,
56
+ width: 0,
57
+ height: positioning.height
58
+ }
59
+ };
60
+ }
61
+ const spaceBetweenRightEdgeOfElementAndRightEdgeOfViewport = positioning.left + positioning.width - childrenWrapperWidth;
62
+ const tooWideForPreviewViewportByPixels = spaceBetweenRightEdgeOfElementAndRightEdgeOfViewport > 0 ? spaceBetweenRightEdgeOfElementAndRightEdgeOfViewport : 0;
63
+ return {
64
+ adminRoute: previewElement.adminRoute,
65
+ label: previewElement.label,
66
+ position: {
67
+ top: positioning.top,
68
+ left: positioning.left,
69
+ width: positioning.width - tooWideForPreviewViewportByPixels,
70
+ height: positioning.height
71
+ }
72
+ };
73
+ }).filter((elementData) => elementData.position.width !== 0).sort((previousElementData, nextElementData) => {
74
+ const previousSize = previousElementData.position.width * previousElementData.position.height;
75
+ const nextSize = nextElementData.position.width * nextElementData.position.height;
76
+ return nextSize - previousSize;
77
+ }).map((elementData, index) => {
78
+ return {
79
+ ...elementData,
80
+ position: {
81
+ ...elementData.position,
82
+ zIndex: index + 1
83
+ }
84
+ };
85
+ });
86
+ setPreviewElementsData((previousElementsData) => {
87
+ const dataDidNotChange = isEqual(previousElementsData, newPreviewElementsData);
88
+ if (dataDidNotChange) {
89
+ return previousElementsData;
90
+ }
91
+ return newPreviewElementsData;
92
+ });
93
+ }, [previewElements, childrenWrapperWidth]);
94
+ useEffect(() => {
95
+ if (childrenWrapperRef.current) {
96
+ const mutationObserver = new MutationObserver(() => {
97
+ recalculatePreviewElementsData();
98
+ });
99
+ const resizeObserver = new ResizeObserver(() => {
100
+ recalculatePreviewElementsData();
101
+ });
102
+ mutationObserver.observe(childrenWrapperRef.current, { childList: true, subtree: true, attributes: true });
103
+ resizeObserver.observe(childrenWrapperRef.current);
104
+ return () => {
105
+ mutationObserver.disconnect();
106
+ resizeObserver.disconnect();
107
+ };
108
+ }
109
+ }, [recalculatePreviewElementsData]);
110
+ useEffect(() => {
111
+ previewElements.forEach((previewElement) => {
112
+ previewElement.element.addEventListener(PREVIEW_ELEMENT_SCROLLED_INTO_VIEW_EVENT, recalculatePreviewElementsData);
113
+ });
114
+ return () => {
115
+ previewElements.forEach((previewElement) => {
116
+ previewElement.element.removeEventListener(PREVIEW_ELEMENT_SCROLLED_INTO_VIEW_EVENT, recalculatePreviewElementsData);
117
+ });
118
+ };
119
+ }, [previewElements, recalculatePreviewElementsData]);
120
+ const sendMessage = useCallback((message) => {
121
+ window.parent.postMessage(JSON.stringify(message), "*");
122
+ }, []);
123
+ const debounceDeactivateOutlines = useDebounceCallback(() => {
124
+ setShowOutlines(false);
125
+ }, 2500);
126
+ const onReceiveMessage = useCallback(
127
+ (message) => {
128
+ switch (message.cometType) {
129
+ case AdminMessageType.Block:
130
+ setBlock(message.data.block);
131
+ break;
132
+ case AdminMessageType.ShowOnlyVisible:
133
+ setShowOnlyVisible(message.data.showOnlyVisible);
134
+ break;
135
+ case AdminMessageType.SelectComponent:
136
+ setSelectedAdminRoute(
137
+ message.data.adminRoute.lastIndexOf("#") > 0 ? message.data.adminRoute.substr(0, message.data.adminRoute.lastIndexOf("#")) : message.data.adminRoute
138
+ );
139
+ break;
140
+ case AdminMessageType.HoverComponent:
141
+ setHoveredAdminRoute(message.data.adminRoute);
142
+ setShowOutlines(true);
143
+ debounceDeactivateOutlines();
144
+ break;
145
+ case AdminMessageType.ContentScope:
146
+ setContentScope(message.data.contentScope);
147
+ break;
148
+ case AdminMessageType.GraphQLApiUrl:
149
+ setGraphQLApiUrl(message.data.graphQLApiUrl);
150
+ break;
151
+ }
152
+ },
153
+ [debounceDeactivateOutlines]
154
+ );
155
+ useEffect(() => {
156
+ if (typeof window === "undefined") {
157
+ return;
158
+ }
159
+ const handleMessage = (e) => {
160
+ try {
161
+ const message = JSON.parse(e.data);
162
+ if (message.hasOwnProperty("cometType")) {
163
+ onReceiveMessage(message);
164
+ }
165
+ } catch (e2) {
166
+ }
167
+ };
168
+ window.addEventListener("message", handleMessage, false);
169
+ sendMessage({ cometType: IFrameMessageType.Ready });
170
+ return () => {
171
+ window.removeEventListener("message", handleMessage, false);
172
+ };
173
+ }, [onReceiveMessage, sendMessage]);
174
+ const addPreviewElement = useCallback(
175
+ (element) => {
176
+ setPreviewElements((prev) => [...prev, element]);
177
+ },
178
+ [setPreviewElements]
179
+ );
180
+ const removePreviewElement = useCallback(
181
+ (element) => {
182
+ setPreviewElements((prev) => prev.filter((el) => el.adminRoute !== element.adminRoute));
183
+ },
184
+ [setPreviewElements]
185
+ );
186
+ const iFrameBridgeValues = useMemo(
187
+ () => ({
188
+ showOutlines,
189
+ hasBridge: true,
190
+ block,
191
+ showOnlyVisible,
192
+ selectedAdminRoute,
193
+ hoveredAdminRoute,
194
+ sendSelectComponent: (adminRoute) => {
195
+ setSelectedAdminRoute(adminRoute);
196
+ sendMessage({ cometType: IFrameMessageType.SelectComponent, data: { adminRoute } });
197
+ },
198
+ sendHoverComponent: (route) => {
199
+ sendMessage({ cometType: IFrameMessageType.HoverComponent, data: { route } });
200
+ },
201
+ sendMessage,
202
+ contentScope,
203
+ graphQLApiUrl,
204
+ previewElementsData,
205
+ addPreviewElement,
206
+ removePreviewElement
207
+ }),
208
+ [
209
+ showOutlines,
210
+ block,
211
+ showOnlyVisible,
212
+ selectedAdminRoute,
213
+ hoveredAdminRoute,
214
+ sendMessage,
215
+ contentScope,
216
+ graphQLApiUrl,
217
+ previewElementsData,
218
+ addPreviewElement,
219
+ removePreviewElement
220
+ ]
221
+ );
222
+ return /* @__PURE__ */ jsx(IFrameBridgeContext.Provider, { value: iFrameBridgeValues, children: /* @__PURE__ */ jsxs(
223
+ "div",
224
+ {
225
+ onMouseMove: () => {
226
+ setShowOutlines(true);
227
+ debounceDeactivateOutlines();
228
+ },
229
+ children: [
230
+ /* @__PURE__ */ jsx(PreviewOverlay, {}),
231
+ /* @__PURE__ */ jsx("div", { ref: childrenWrapperRef, className: styles.childrenWrapper, children })
232
+ ]
233
+ }
234
+ ) });
235
+ };
236
+ export {
237
+ IFrameBridgeContext,
238
+ IFrameBridgeProvider
239
+ };
@@ -0,0 +1,8 @@
1
+ const childrenWrapper = "_childrenWrapper_qguhx_1";
2
+ const styles = {
3
+ childrenWrapper
4
+ };
5
+ export {
6
+ childrenWrapper,
7
+ styles as default
8
+ };
@@ -0,0 +1,118 @@
1
+ import { ExternalLinkBlockData } from '../blocks.generated';
2
+ export declare enum IFrameMessageType {
3
+ Ready = "Ready",
4
+ SelectComponent = "SelectComponent",
5
+ HoverComponent = "HoverComponent",
6
+ /**
7
+ * @deprecated Use SitePreviewIFrameMessageType.OpenLink instead
8
+ */
9
+ OpenLink = "OpenLink",
10
+ /**
11
+ * @deprecated Use SitePreviewIFrameMessageType.SitePreviewLocation instead
12
+ */
13
+ SitePreviewLocation = "SitePreviewLocation"
14
+ }
15
+ /**
16
+ * The `IReadyIFrameMessage` message is sent from the site to the admin when the iFrame is ready to receive messages.
17
+ */
18
+ export interface IReadyIFrameMessage {
19
+ cometType: IFrameMessageType.Ready;
20
+ }
21
+ /**
22
+ * The `IFrameSelectComponentMessage` is sent from the site to the admin when a component is selected in the iFrame.
23
+ *
24
+ * The admin interface will then try to navigate to the corresponding block's admin interface.
25
+ */
26
+ export interface IFrameSelectComponentMessage {
27
+ cometType: IFrameMessageType.SelectComponent;
28
+ data: {
29
+ adminRoute: string;
30
+ };
31
+ }
32
+ /**
33
+ * @deprecated Use SitePreviewIFrameOpenLinkMessage instead
34
+ */
35
+ export interface IFrameOpenLinkMessage {
36
+ cometType: IFrameMessageType.OpenLink;
37
+ data: {
38
+ link: ExternalLinkBlockData;
39
+ };
40
+ }
41
+ /**
42
+ * @deprecated Use SitePreviewIFrameLocationMessage instead
43
+ */
44
+ export interface IFrameLocationMessage {
45
+ cometType: IFrameMessageType.SitePreviewLocation;
46
+ data: Pick<Location, "search" | "pathname">;
47
+ }
48
+ /**
49
+ * The `IFrameHoverComponentMessage` is sent from the site to the admin, when a component is hovered in the iFrame and should be highlighted in the admin interface.
50
+ */
51
+ export interface IFrameHoverComponentMessage {
52
+ cometType: IFrameMessageType.HoverComponent;
53
+ data: {
54
+ route: string | null;
55
+ };
56
+ }
57
+ export type IFrameMessage = IReadyIFrameMessage | IFrameSelectComponentMessage | IFrameOpenLinkMessage | IFrameLocationMessage | IFrameHoverComponentMessage;
58
+ export declare enum AdminMessageType {
59
+ Block = "Block",
60
+ ShowOnlyVisible = "ShowOnlyVisible",
61
+ SelectComponent = "SelectComponent",
62
+ HoverComponent = "HoverComponent",
63
+ ContentScope = "ContentScope",
64
+ GraphQLApiUrl = "GraphQLApiUrl"
65
+ }
66
+ /**
67
+ * The `IAdminBlockMessage` is sent from the admin to the site, whih block should be displayed in the iFrame.
68
+ */
69
+ export interface IAdminBlockMessage {
70
+ cometType: AdminMessageType.Block;
71
+ data: {
72
+ block: unknown;
73
+ };
74
+ }
75
+ /**
76
+ * The `IAdminShowOnlyVisibleMessage` is sent from the admin to the site, when the "Show only visible" checkbox is toggled.
77
+ */
78
+ export interface IAdminShowOnlyVisibleMessage {
79
+ cometType: AdminMessageType.ShowOnlyVisible;
80
+ data: {
81
+ showOnlyVisible: boolean;
82
+ };
83
+ }
84
+ /**
85
+ * The `IAdminSelectComponentMessage` is sent from the admin to the site, when a component is selected in the admin interface.
86
+ */
87
+ export interface IAdminSelectComponentMessage {
88
+ cometType: AdminMessageType.SelectComponent;
89
+ data: {
90
+ adminRoute: string;
91
+ };
92
+ }
93
+ /**
94
+ * The `IAdminHoverComponentMessage` is sent from the admin to the site, when a component is hovered in the admin interface.
95
+ */
96
+ export interface IAdminHoverComponentMessage {
97
+ cometType: AdminMessageType.HoverComponent;
98
+ data: {
99
+ adminRoute: string | null;
100
+ };
101
+ }
102
+ /**
103
+ * The `IAdminContentScopeMessage` is sent from the admin to the site, when the content scope is changed in the admin interface.
104
+ */
105
+ export interface IAdminContentScopeMessage {
106
+ cometType: AdminMessageType.ContentScope;
107
+ data: {
108
+ contentScope: unknown;
109
+ };
110
+ }
111
+ export interface IAdminGraphQLApiUrlMessage {
112
+ cometType: AdminMessageType.GraphQLApiUrl;
113
+ data: {
114
+ graphQLApiUrl: string;
115
+ };
116
+ }
117
+ export type AdminMessage = IAdminBlockMessage | IAdminSelectComponentMessage | IAdminHoverComponentMessage | IAdminContentScopeMessage | IAdminShowOnlyVisibleMessage | IAdminGraphQLApiUrlMessage;
118
+ //# sourceMappingURL=IFrameMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IFrameMessage.d.ts","sourceRoot":"","sources":["../../src/iframebridge/IFrameMessage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,oBAAY,iBAAiB;IACzB,KAAK,UAAU;IACf,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC;;OAEG;IACH,QAAQ,aAAa;IACrB;;OAEG;IACH,mBAAmB,wBAAwB;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IACzC,SAAS,EAAE,iBAAiB,CAAC,eAAe,CAAC;IAC7C,IAAI,EAAE;QACF,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC;IACtC,IAAI,EAAE;QACF,IAAI,EAAE,qBAAqB,CAAC;KAC/B,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,iBAAiB,CAAC,mBAAmB,CAAC;IACjD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC;IAC5C,IAAI,EAAE;QACF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAC;CACL;AAED,MAAM,MAAM,aAAa,GACnB,mBAAmB,GACnB,4BAA4B,GAC5B,qBAAqB,GACrB,qBAAqB,GACrB,2BAA2B,CAAC;AAGlC,oBAAY,gBAAgB;IACxB,KAAK,UAAU;IACf,eAAe,oBAAoB;IACnC,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,gBAAgB,CAAC,KAAK,CAAC;IAClC,IAAI,EAAE;QACF,KAAK,EAAE,OAAO,CAAC;KAClB,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IACzC,SAAS,EAAE,gBAAgB,CAAC,eAAe,CAAC;IAC5C,IAAI,EAAE;QACF,eAAe,EAAE,OAAO,CAAC;KAC5B,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IACzC,SAAS,EAAE,gBAAgB,CAAC,eAAe,CAAC;IAC5C,IAAI,EAAE;QACF,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,SAAS,EAAE,gBAAgB,CAAC,cAAc,CAAC;IAC3C,IAAI,EAAE;QACF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC;IACzC,IAAI,EAAE;QACF,YAAY,EAAE,OAAO,CAAC;KACzB,CAAC;CACL;AAED,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,gBAAgB,CAAC,aAAa,CAAC;IAC1C,IAAI,EAAE;QACF,aAAa,EAAE,MAAM,CAAC;KACzB,CAAC;CACL;AAED,MAAM,MAAM,YAAY,GAClB,kBAAkB,GAClB,4BAA4B,GAC5B,2BAA2B,GAC3B,yBAAyB,GACzB,4BAA4B,GAC5B,0BAA0B,CAAC"}
@@ -0,0 +1,21 @@
1
+ var IFrameMessageType = /* @__PURE__ */ ((IFrameMessageType2) => {
2
+ IFrameMessageType2["Ready"] = "Ready";
3
+ IFrameMessageType2["SelectComponent"] = "SelectComponent";
4
+ IFrameMessageType2["HoverComponent"] = "HoverComponent";
5
+ IFrameMessageType2["OpenLink"] = "OpenLink";
6
+ IFrameMessageType2["SitePreviewLocation"] = "SitePreviewLocation";
7
+ return IFrameMessageType2;
8
+ })(IFrameMessageType || {});
9
+ var AdminMessageType = /* @__PURE__ */ ((AdminMessageType2) => {
10
+ AdminMessageType2["Block"] = "Block";
11
+ AdminMessageType2["ShowOnlyVisible"] = "ShowOnlyVisible";
12
+ AdminMessageType2["SelectComponent"] = "SelectComponent";
13
+ AdminMessageType2["HoverComponent"] = "HoverComponent";
14
+ AdminMessageType2["ContentScope"] = "ContentScope";
15
+ AdminMessageType2["GraphQLApiUrl"] = "GraphQLApiUrl";
16
+ return AdminMessageType2;
17
+ })(AdminMessageType || {});
18
+ export {
19
+ AdminMessageType,
20
+ IFrameMessageType
21
+ };
@@ -0,0 +1,9 @@
1
+ import { PropsWithChildren } from 'react';
2
+ interface Props extends PropsWithChildren {
3
+ adminRoute: string;
4
+ label: string;
5
+ enabledAutoScrolling?: boolean;
6
+ }
7
+ export declare const Preview: ({ adminRoute, children, label, enabledAutoScrolling }: Props) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Preview.d.ts","sourceRoot":"","sources":["../../src/iframebridge/Preview.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAqB,MAAM,OAAO,CAAC;AAOlE,UAAU,KAAM,SAAQ,iBAAiB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,eAAO,MAAM,OAAO,0DAAkE,KAAK,4CAyD1F,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import { jsx, Fragment } from "react/jsx-runtime";
3
+ import { useRef, useEffect } from "react";
4
+ import scrollIntoView from "scroll-into-view-if-needed";
5
+ import styles from "./Preview.module.scss.js";
6
+ import { useIFrameBridge } from "./useIFrameBridge.js";
7
+ import { PREVIEW_ELEMENT_SCROLLED_INTO_VIEW_EVENT, BLOCK_PREVIEW_CONTAINER_DATA_ATTRIBUTE } from "./utils.js";
8
+ const Preview = ({ adminRoute, children, label, enabledAutoScrolling = true }) => {
9
+ const { addPreviewElement, removePreviewElement, ...iFrameBridge } = useIFrameBridge();
10
+ const isSelected = adminRoute === iFrameBridge.selectedAdminRoute;
11
+ const isHovered = adminRoute === iFrameBridge.hoveredAdminRoute;
12
+ const previewElementContainerRef = useRef(null);
13
+ useEffect(() => {
14
+ const previewElement = previewElementContainerRef.current ? {
15
+ label,
16
+ adminRoute,
17
+ element: previewElementContainerRef.current
18
+ } : null;
19
+ if (previewElement) {
20
+ addPreviewElement(previewElement);
21
+ return () => {
22
+ removePreviewElement(previewElement);
23
+ };
24
+ }
25
+ }, [label, adminRoute, addPreviewElement, removePreviewElement]);
26
+ useEffect(() => {
27
+ const timeout = setTimeout(() => {
28
+ var _a;
29
+ if (enabledAutoScrolling) {
30
+ if (isHovered || isSelected) {
31
+ if ((_a = previewElementContainerRef.current) == null ? void 0 : _a.firstElementChild) {
32
+ scrollIntoView(previewElementContainerRef.current.firstElementChild, {
33
+ scrollMode: "if-needed",
34
+ block: "center",
35
+ inline: "nearest",
36
+ behavior: "smooth"
37
+ });
38
+ setTimeout(() => {
39
+ var _a2;
40
+ (_a2 = previewElementContainerRef.current) == null ? void 0 : _a2.dispatchEvent(new Event(PREVIEW_ELEMENT_SCROLLED_INTO_VIEW_EVENT));
41
+ }, 600);
42
+ }
43
+ }
44
+ }
45
+ }, 500);
46
+ return () => {
47
+ clearTimeout(timeout);
48
+ };
49
+ }, [enabledAutoScrolling, isHovered, isSelected]);
50
+ if (iFrameBridge.hasBridge) {
51
+ return /* @__PURE__ */ jsx("div", { ref: previewElementContainerRef, className: styles.previewElementContainer, ...{ [BLOCK_PREVIEW_CONTAINER_DATA_ATTRIBUTE]: "" }, children });
52
+ }
53
+ return /* @__PURE__ */ jsx(Fragment, { children });
54
+ };
55
+ export {
56
+ Preview
57
+ };
@@ -0,0 +1,8 @@
1
+ const previewElementContainer = "_previewElementContainer_nwhl6_1";
2
+ const styles = {
3
+ previewElementContainer
4
+ };
5
+ export {
6
+ styles as default,
7
+ previewElementContainer
8
+ };
@@ -0,0 +1,2 @@
1
+ export declare const PreviewOverlay: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=PreviewOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewOverlay.d.ts","sourceRoot":"","sources":["../../src/iframebridge/PreviewOverlay.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,+CA2B1B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import styles from "./PreviewOverlay.module.scss.js";
3
+ import { PreviewOverlayElement } from "./PreviewOverlayElement.js";
4
+ import { useIFrameBridge } from "./useIFrameBridge.js";
5
+ let lastSelectedElementPath = "";
6
+ const PreviewOverlay = () => {
7
+ const iFrameBridge = useIFrameBridge();
8
+ let bottomMostElementPosition = 0;
9
+ iFrameBridge.previewElementsData.forEach((element) => {
10
+ if (element.position.zIndex > 1)
11
+ return;
12
+ const elementBottom = element.position.top + element.position.height;
13
+ if (elementBottom > bottomMostElementPosition) {
14
+ bottomMostElementPosition = elementBottom;
15
+ }
16
+ });
17
+ return /* @__PURE__ */ jsx("div", { className: styles.root, style: { "--height": `${bottomMostElementPosition}px` }, children: iFrameBridge.previewElementsData.map((element, index) => {
18
+ const isSelected = element.adminRoute === iFrameBridge.selectedAdminRoute;
19
+ if (isSelected && lastSelectedElementPath !== element.adminRoute) {
20
+ lastSelectedElementPath = element.adminRoute;
21
+ }
22
+ return /* @__PURE__ */ jsx(PreviewOverlayElement, { element }, index);
23
+ }) });
24
+ };
25
+ export {
26
+ PreviewOverlay
27
+ };
@@ -0,0 +1,8 @@
1
+ const root = "_root_v4248_1";
2
+ const styles = {
3
+ root
4
+ };
5
+ export {
6
+ styles as default,
7
+ root
8
+ };
@@ -0,0 +1,7 @@
1
+ import { OverlayElementData } from './IFrameBridge';
2
+ type Props = {
3
+ element: OverlayElementData;
4
+ };
5
+ export declare const PreviewOverlayElement: ({ element }: Props) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=PreviewOverlayElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewOverlayElement.d.ts","sourceRoot":"","sources":["../../src/iframebridge/PreviewOverlayElement.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,KAAK,KAAK,GAAG;IACT,OAAO,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,gBAAiB,KAAK,4CA8BvD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import clsx from "clsx";
3
+ import styles from "./PreviewOverlayElement.module.scss.js";
4
+ import { useIFrameBridge } from "./useIFrameBridge.js";
5
+ const PreviewOverlayElement = ({ element }) => {
6
+ const iFrameBridge = useIFrameBridge();
7
+ const isSelected = element.adminRoute === iFrameBridge.selectedAdminRoute;
8
+ const isHovered = element.adminRoute === iFrameBridge.hoveredAdminRoute;
9
+ return /* @__PURE__ */ jsx(
10
+ "div",
11
+ {
12
+ className: clsx(
13
+ styles.root,
14
+ iFrameBridge.showOutlines && !isHovered && styles.showBlockOutlines,
15
+ isSelected && styles.blockIsSelected,
16
+ isHovered && styles.isHoveredInBlockList
17
+ ),
18
+ title: element.label,
19
+ onClick: () => {
20
+ iFrameBridge.sendSelectComponent(element.adminRoute);
21
+ },
22
+ onMouseEnter: () => {
23
+ iFrameBridge.sendHoverComponent(element.adminRoute);
24
+ },
25
+ onMouseLeave: () => {
26
+ iFrameBridge.sendHoverComponent(null);
27
+ },
28
+ style: element.position,
29
+ children: /* @__PURE__ */ jsx("div", { className: styles.label, children: element.label })
30
+ },
31
+ element.adminRoute
32
+ );
33
+ };
34
+ export {
35
+ PreviewOverlayElement
36
+ };
@@ -0,0 +1,20 @@
1
+ const root = "_root_1ya0k_1";
2
+ const isHoveredInBlockList = "_isHoveredInBlockList_1ya0k_24";
3
+ const showBlockOutlines = "_showBlockOutlines_1ya0k_32";
4
+ const blockIsSelected = "_blockIsSelected_1ya0k_37";
5
+ const label = "_label_1ya0k_40";
6
+ const styles = {
7
+ root,
8
+ isHoveredInBlockList,
9
+ showBlockOutlines,
10
+ blockIsSelected,
11
+ label
12
+ };
13
+ export {
14
+ blockIsSelected,
15
+ styles as default,
16
+ isHoveredInBlockList,
17
+ label,
18
+ root,
19
+ showBlockOutlines
20
+ };
@@ -0,0 +1,16 @@
1
+ import { GraphQLFetch } from '../graphQLFetch/graphQLFetch';
2
+ type Fetch = typeof fetch;
3
+ /**
4
+ * @deprecated Use useBlockPreviewFetch() without argument instead
5
+ * @param apiUrl the API URL
6
+ */
7
+ export declare function useBlockPreviewFetch(apiUrl: string): {
8
+ fetch: Fetch;
9
+ graphQLFetch: GraphQLFetch;
10
+ };
11
+ export declare function useBlockPreviewFetch(apiUrl?: string | undefined): {
12
+ fetch: Fetch;
13
+ graphQLFetch?: GraphQLFetch;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=useBlockPreviewFetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBlockPreviewFetch.d.ts","sourceRoot":"","sources":["../../src/iframebridge/useBlockPreviewFetch.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAA4E,MAAM,8BAA8B,CAAC;AAK3I,KAAK,KAAK,GAAG,OAAO,KAAK,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAE,CAAC;AACnG,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { useState, useEffect } from "react";
2
+ import { createFetchInMemoryCache } from "../graphQLFetch/fetchInMemoryCache.js";
3
+ import { createGraphQLFetch, createFetchWithDefaults, convertPreviewDataToHeaders } from "../graphQLFetch/graphQLFetch.js";
4
+ import { useIFrameBridge } from "./useIFrameBridge.js";
5
+ const cachingFetch = createFetchInMemoryCache(fetch);
6
+ function useBlockPreviewFetch(apiUrl) {
7
+ const { showOnlyVisible, graphQLApiUrl } = useIFrameBridge();
8
+ const [graphQLFetch, setGraphQLFetch] = useState(
9
+ () => apiUrl ? createBlockPreviewFetch(apiUrl, !showOnlyVisible) : void 0
10
+ );
11
+ useEffect(() => {
12
+ if (graphQLApiUrl) {
13
+ setGraphQLFetch(() => createBlockPreviewFetch(graphQLApiUrl, !showOnlyVisible));
14
+ }
15
+ }, [showOnlyVisible, graphQLApiUrl]);
16
+ return {
17
+ graphQLFetch,
18
+ fetch: cachingFetch
19
+ };
20
+ }
21
+ function createBlockPreviewFetch(graphqlApiUrl, includeInvisible) {
22
+ return createGraphQLFetch(
23
+ createFetchWithDefaults(cachingFetch, { headers: convertPreviewDataToHeaders({ includeInvisible }), credentials: "include" }),
24
+ graphqlApiUrl
25
+ );
26
+ }
27
+ export {
28
+ useBlockPreviewFetch
29
+ };
@@ -0,0 +1,3 @@
1
+ import { IFrameBridgeContext } from './IFrameBridge';
2
+ export declare function useIFrameBridge(): IFrameBridgeContext;
3
+ //# sourceMappingURL=useIFrameBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIFrameBridge.d.ts","sourceRoot":"","sources":["../../src/iframebridge/useIFrameBridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,wBAAgB,eAAe,IAAI,mBAAmB,CAErD"}
@@ -0,0 +1,8 @@
1
+ import { useContext } from "react";
2
+ import { IFrameBridgeContext } from "./IFrameBridge.js";
3
+ function useIFrameBridge() {
4
+ return useContext(IFrameBridgeContext);
5
+ }
6
+ export {
7
+ useIFrameBridge
8
+ };