@strapi/content-manager 0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64 → 0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8

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.
@@ -40,25 +40,65 @@
40
40
  };
41
41
  /* -----------------------------------------------------------------------------------------------
42
42
  * Functionality pieces
43
- * ---------------------------------------------------------------------------------------------*/ const setupStegaDecoding = async ()=>{
43
+ * ---------------------------------------------------------------------------------------------*/ const setupStegaDOMObserver = async ()=>{
44
44
  if (DISABLE_STEGA_DECODING) {
45
45
  return;
46
46
  }
47
- const { vercelStegaDecode: stegaDecode } = await import(// @ts-expect-error it's not a local dependency
47
+ const { vercelStegaDecode: stegaDecode, vercelStegaClean: stegaClean } = await import(// @ts-expect-error it's not a local dependency
48
48
  // eslint-disable-next-line import/no-unresolved
49
49
  'https://cdn.jsdelivr.net/npm/@vercel/stega@0.1.2/+esm');
50
- const allElements = document.querySelectorAll('*');
51
- Array.from(allElements).forEach((element)=>{
52
- const directTextContent = Array.from(element.childNodes).filter((node)=>node.nodeType === Node.TEXT_NODE).map((node)=>node.textContent || '').join('');
50
+ const processElementForStega = (element)=>{
51
+ const directTextNodes = Array.from(element.childNodes).filter((node)=>node.nodeType === Node.TEXT_NODE);
52
+ const directTextContent = directTextNodes.map((node)=>node.textContent || '').join('');
53
53
  if (directTextContent) {
54
54
  try {
55
55
  const result = stegaDecode(directTextContent);
56
56
  if (result) {
57
57
  element.setAttribute(SOURCE_ATTRIBUTE, result.key);
58
+ // Remove encoded part from DOM text content (to avoid breaking links for example)
59
+ directTextNodes.forEach((node)=>{
60
+ if (node.textContent) {
61
+ const cleanedText = stegaClean(node.textContent);
62
+ if (cleanedText !== node.textContent) {
63
+ node.textContent = cleanedText;
64
+ }
65
+ }
66
+ });
58
67
  }
59
68
  } catch (error) {}
60
69
  }
70
+ };
71
+ // Process all existing elements
72
+ const allElements = document.querySelectorAll('*');
73
+ Array.from(allElements).forEach(processElementForStega);
74
+ // Create observer for new elements and text changes
75
+ const observer = new MutationObserver((mutations)=>{
76
+ mutations.forEach((mutation)=>{
77
+ // Handle added nodes
78
+ if (mutation.type === 'childList') {
79
+ mutation.addedNodes.forEach((node)=>{
80
+ if (node.nodeType === Node.ELEMENT_NODE) {
81
+ const element = node;
82
+ // Process the added element
83
+ processElementForStega(element);
84
+ // Process all child elements
85
+ const childElements = element.querySelectorAll('*');
86
+ Array.from(childElements).forEach(processElementForStega);
87
+ }
88
+ });
89
+ }
90
+ // Handle text content changes
91
+ if (mutation.type === 'characterData' && mutation.target.parentElement) {
92
+ processElementForStega(mutation.target.parentElement);
93
+ }
94
+ });
95
+ });
96
+ observer.observe(document, {
97
+ childList: true,
98
+ subtree: true,
99
+ characterData: true
61
100
  });
101
+ return observer;
62
102
  };
63
103
  const createOverlaySystem = ()=>{
64
104
  // Clean up before creating a new overlay so we can safely call previewScript multiple times
@@ -79,9 +119,8 @@
79
119
  return overlay;
80
120
  };
81
121
  const createHighlightManager = (overlay)=>{
82
- const elements = window.document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);
122
+ const elementToHighlight = new Map();
83
123
  const eventListeners = [];
84
- const highlights = [];
85
124
  const focusedHighlights = [];
86
125
  let focusedField = null;
87
126
  const drawHighlight = (target, highlight)=>{
@@ -92,136 +131,225 @@
92
131
  highlight.style.transform = `translate(${rect.left - HIGHLIGHT_PADDING}px, ${rect.top - HIGHLIGHT_PADDING}px)`;
93
132
  };
94
133
  const updateAllHighlights = ()=>{
95
- highlights.forEach((highlight, index)=>{
96
- const element = elements[index];
97
- if (element && highlight) {
98
- drawHighlight(element, highlight);
134
+ elementToHighlight.forEach((highlight, element)=>{
135
+ drawHighlight(element, highlight);
136
+ });
137
+ };
138
+ const createHighlightForElement = (element)=>{
139
+ if (elementToHighlight.has(element)) {
140
+ return; // Already has a highlight
141
+ }
142
+ const highlight = document.createElement('div');
143
+ highlight.style.cssText = `
144
+ position: absolute;
145
+ outline: 2px solid transparent;
146
+ pointer-events: none;
147
+ border-radius: 2px;
148
+ background-color: transparent;
149
+ will-change: transform;
150
+ transition: outline-color 0.1s ease-in-out;
151
+ `;
152
+ // Move hover detection to the underlying element
153
+ const mouseEnterHandler = ()=>{
154
+ if (!focusedHighlights.includes(highlight)) {
155
+ highlight.style.outlineColor = HIGHLIGHT_HOVER_COLOR;
99
156
  }
157
+ };
158
+ const mouseLeaveHandler = ()=>{
159
+ if (!focusedHighlights.includes(highlight)) {
160
+ highlight.style.outlineColor = 'transparent';
161
+ }
162
+ };
163
+ const doubleClickHandler = ()=>{
164
+ const sourceAttribute = element.getAttribute(SOURCE_ATTRIBUTE);
165
+ if (sourceAttribute) {
166
+ const rect = element.getBoundingClientRect();
167
+ sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT, {
168
+ path: sourceAttribute,
169
+ position: {
170
+ top: rect.top,
171
+ left: rect.left,
172
+ right: rect.right,
173
+ bottom: rect.bottom,
174
+ width: rect.width,
175
+ height: rect.height
176
+ }
177
+ });
178
+ }
179
+ };
180
+ const mouseDownHandler = (event)=>{
181
+ // Prevent default multi click to select behavior
182
+ if (event.detail >= 2) {
183
+ event.preventDefault();
184
+ }
185
+ };
186
+ element.addEventListener('mouseenter', mouseEnterHandler);
187
+ element.addEventListener('mouseleave', mouseLeaveHandler);
188
+ element.addEventListener('dblclick', doubleClickHandler);
189
+ element.addEventListener('mousedown', mouseDownHandler);
190
+ // Store event listeners for cleanup
191
+ eventListeners.push({
192
+ element,
193
+ type: 'mouseenter',
194
+ handler: mouseEnterHandler
195
+ }, {
196
+ element,
197
+ type: 'mouseleave',
198
+ handler: mouseLeaveHandler
199
+ }, {
200
+ element,
201
+ type: 'dblclick',
202
+ handler: doubleClickHandler
203
+ }, {
204
+ element,
205
+ type: 'mousedown',
206
+ handler: mouseDownHandler
207
+ });
208
+ elementToHighlight.set(element, highlight);
209
+ overlay.appendChild(highlight);
210
+ drawHighlight(element, highlight);
211
+ };
212
+ const removeHighlightForElement = (element)=>{
213
+ const highlight = elementToHighlight.get(element);
214
+ if (!highlight) return;
215
+ highlight.remove();
216
+ elementToHighlight.delete(element);
217
+ // Remove event listeners for this element
218
+ const listenersToRemove = eventListeners.filter((listener)=>listener.element === element);
219
+ listenersToRemove.forEach(({ element, type, handler })=>{
220
+ element.removeEventListener(type, handler);
100
221
  });
222
+ // Mutate eventListeners to remove listeners for this element
223
+ eventListeners.splice(0, eventListeners.length, ...eventListeners.filter((listener)=>listener.element !== element));
101
224
  };
102
- elements.forEach((element)=>{
225
+ // Process all existing elements with source attributes
226
+ const initialElements = window.document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);
227
+ Array.from(initialElements).forEach((element)=>{
103
228
  if (element instanceof HTMLElement) {
104
- const highlight = document.createElement('div');
105
- highlight.style.cssText = `
106
- position: absolute;
107
- outline: 2px solid transparent;
108
- pointer-events: none;
109
- border-radius: 2px;
110
- background-color: transparent;
111
- will-change: transform;
112
- transition: outline-color 0.1s ease-in-out;
113
- `;
114
- // Move hover detection to the underlying element
115
- const mouseEnterHandler = ()=>{
116
- if (!focusedHighlights.includes(highlight)) {
117
- highlight.style.outlineColor = HIGHLIGHT_HOVER_COLOR;
118
- }
119
- };
120
- const mouseLeaveHandler = ()=>{
121
- if (!focusedHighlights.includes(highlight)) {
122
- highlight.style.outlineColor = 'transparent';
123
- }
124
- };
125
- const doubleClickHandler = ()=>{
126
- const sourceAttribute = element.getAttribute(SOURCE_ATTRIBUTE);
127
- if (sourceAttribute) {
128
- const rect = element.getBoundingClientRect();
129
- sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT, {
130
- path: sourceAttribute,
131
- position: {
132
- top: rect.top,
133
- left: rect.left,
134
- right: rect.right,
135
- bottom: rect.bottom,
136
- width: rect.width,
137
- height: rect.height
138
- }
139
- });
140
- }
141
- };
142
- const mouseDownHandler = (event)=>{
143
- // Prevent default multi click to select behavior
144
- if (event.detail >= 2) {
145
- event.preventDefault();
146
- }
147
- };
148
- element.addEventListener('mouseenter', mouseEnterHandler);
149
- element.addEventListener('mouseleave', mouseLeaveHandler);
150
- element.addEventListener('dblclick', doubleClickHandler);
151
- element.addEventListener('mousedown', mouseDownHandler);
152
- // Store event listeners for cleanup
153
- eventListeners.push({
154
- element,
155
- type: 'mouseenter',
156
- handler: mouseEnterHandler
157
- }, {
158
- element,
159
- type: 'mouseleave',
160
- handler: mouseLeaveHandler
161
- }, {
162
- element,
163
- type: 'dblclick',
164
- handler: doubleClickHandler
165
- }, {
166
- element,
167
- type: 'mousedown',
168
- handler: mouseDownHandler
169
- });
170
- highlights.push(highlight);
171
- overlay.appendChild(highlight);
172
- drawHighlight(element, highlight);
229
+ createHighlightForElement(element);
173
230
  }
174
231
  });
175
232
  return {
176
- elements,
233
+ get elements () {
234
+ return Array.from(elementToHighlight.keys());
235
+ },
236
+ get highlights () {
237
+ return Array.from(elementToHighlight.values());
238
+ },
177
239
  updateAllHighlights,
178
240
  eventListeners,
179
- highlights,
180
241
  focusedHighlights,
242
+ createHighlightForElement,
243
+ removeHighlightForElement,
181
244
  setFocusedField: (field)=>{
182
245
  focusedField = field;
183
246
  },
184
247
  getFocusedField: ()=>focusedField
185
248
  };
186
249
  };
187
- const setupObservers = (highlightManager)=>{
250
+ const setupObservers = (highlightManager, stegaObserver)=>{
188
251
  const resizeObserver = new ResizeObserver(()=>{
189
252
  highlightManager.updateAllHighlights();
190
253
  });
191
- highlightManager.elements.forEach((element)=>{
254
+ const observeElementForResize = (element)=>{
192
255
  resizeObserver.observe(element);
193
- });
256
+ };
257
+ // Observe existing elements
258
+ highlightManager.elements.forEach(observeElementForResize);
194
259
  resizeObserver.observe(document.documentElement);
260
+ // Create highlight observer to watch for new elements with source attributes
261
+ const highlightObserver = new MutationObserver((mutations)=>{
262
+ mutations.forEach((mutation)=>{
263
+ if (mutation.type === 'attributes' && mutation.attributeName === SOURCE_ATTRIBUTE) {
264
+ const target = mutation.target;
265
+ if (target.hasAttribute(SOURCE_ATTRIBUTE)) {
266
+ highlightManager.createHighlightForElement(target);
267
+ observeElementForResize(target);
268
+ } else {
269
+ highlightManager.removeHighlightForElement(target);
270
+ }
271
+ }
272
+ if (mutation.type === 'childList') {
273
+ mutation.addedNodes.forEach((node)=>{
274
+ if (node.nodeType === Node.ELEMENT_NODE) {
275
+ const element = node;
276
+ // Check if the added element has source attribute
277
+ if (element.hasAttribute(SOURCE_ATTRIBUTE) && element instanceof HTMLElement) {
278
+ highlightManager.createHighlightForElement(element);
279
+ observeElementForResize(element);
280
+ }
281
+ // Check all child elements for source attributes
282
+ const elementsWithSource = element.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);
283
+ Array.from(elementsWithSource).forEach((childElement)=>{
284
+ if (childElement instanceof HTMLElement) {
285
+ highlightManager.createHighlightForElement(childElement);
286
+ observeElementForResize(childElement);
287
+ }
288
+ });
289
+ }
290
+ });
291
+ mutation.removedNodes.forEach((node)=>{
292
+ if (node.nodeType === Node.ELEMENT_NODE) {
293
+ const element = node;
294
+ highlightManager.removeHighlightForElement(element);
295
+ }
296
+ });
297
+ }
298
+ });
299
+ });
300
+ highlightObserver.observe(document, {
301
+ childList: true,
302
+ subtree: true,
303
+ attributes: true,
304
+ attributeFilter: [
305
+ SOURCE_ATTRIBUTE
306
+ ]
307
+ });
195
308
  const updateOnScroll = ()=>{
196
309
  highlightManager.updateAllHighlights();
197
310
  };
198
311
  const scrollableElements = new Set();
199
312
  scrollableElements.add(window);
200
- // Find all scrollable ancestors for all tracked elements
201
- highlightManager.elements.forEach((element)=>{
202
- let parent = element.parentElement;
203
- while(parent){
204
- const computedStyle = window.getComputedStyle(parent);
205
- const overflow = computedStyle.overflow + computedStyle.overflowX + computedStyle.overflowY;
206
- if (overflow.includes('scroll') || overflow.includes('auto')) {
207
- scrollableElements.add(parent);
313
+ const findScrollableAncestors = ()=>{
314
+ // Clear existing scrollable elements (except window)
315
+ scrollableElements.forEach((element)=>{
316
+ if (element !== window) {
317
+ element.removeEventListener('scroll', updateOnScroll);
208
318
  }
209
- parent = parent.parentElement;
210
- }
211
- });
212
- // Add scroll listeners to all scrollable elements
213
- scrollableElements.forEach((element)=>{
214
- if (element === window) {
215
- window.addEventListener('scroll', updateOnScroll);
216
- window.addEventListener('resize', updateOnScroll);
217
- } else {
218
- element.addEventListener('scroll', updateOnScroll);
219
- }
220
- });
319
+ });
320
+ scrollableElements.clear();
321
+ scrollableElements.add(window);
322
+ // Find all scrollable ancestors for all tracked elements
323
+ highlightManager.elements.forEach((element)=>{
324
+ let parent = element.parentElement;
325
+ while(parent){
326
+ const computedStyle = window.getComputedStyle(parent);
327
+ const overflow = computedStyle.overflow + computedStyle.overflowX + computedStyle.overflowY;
328
+ if (overflow.includes('scroll') || overflow.includes('auto')) {
329
+ scrollableElements.add(parent);
330
+ }
331
+ parent = parent.parentElement;
332
+ }
333
+ });
334
+ // Add scroll listeners to all scrollable elements
335
+ scrollableElements.forEach((element)=>{
336
+ if (element === window) {
337
+ window.addEventListener('scroll', updateOnScroll);
338
+ window.addEventListener('resize', updateOnScroll);
339
+ } else {
340
+ element.addEventListener('scroll', updateOnScroll);
341
+ }
342
+ });
343
+ };
344
+ // Initial setup of scrollable elements
345
+ findScrollableAncestors();
221
346
  return {
222
347
  resizeObserver,
348
+ highlightObserver,
349
+ stegaObserver,
223
350
  updateOnScroll,
224
- scrollableElements
351
+ scrollableElements,
352
+ findScrollableAncestors
225
353
  };
226
354
  };
227
355
  const setupEventHandlers = (highlightManager)=>{
@@ -237,6 +365,8 @@
237
365
  element.textContent = value || '';
238
366
  }
239
367
  });
368
+ // Update highlight dimensions since the new text content may affect them
369
+ highlightManager.updateAllHighlights();
240
370
  return;
241
371
  }
242
372
  // The user focused a new input, update the highlights in the preview
@@ -288,6 +418,8 @@
288
418
  const createCleanupSystem = (overlay, observers, eventHandlers)=>{
289
419
  window.__strapi_previewCleanup = ()=>{
290
420
  observers.resizeObserver.disconnect();
421
+ observers.highlightObserver.disconnect();
422
+ observers.stegaObserver?.disconnect();
291
423
  // Remove all scroll listeners
292
424
  observers.scrollableElements.forEach((element)=>{
293
425
  if (element === window) {
@@ -306,10 +438,10 @@
306
438
  };
307
439
  /* -----------------------------------------------------------------------------------------------
308
440
  * Orchestration
309
- * ---------------------------------------------------------------------------------------------*/ setupStegaDecoding().then(()=>{
441
+ * ---------------------------------------------------------------------------------------------*/ setupStegaDOMObserver().then((stegaObserver)=>{
310
442
  const overlay = createOverlaySystem();
311
443
  const highlightManager = createHighlightManager(overlay);
312
- const observers = setupObservers(highlightManager);
444
+ const observers = setupObservers(highlightManager, stegaObserver);
313
445
  const eventHandlers = setupEventHandlers(highlightManager);
314
446
  createCleanupSystem(overlay, observers, eventHandlers);
315
447
  });
@@ -1 +1 @@
1
- {"version":3,"file":"previewScript.js","sources":["../../../../admin/src/preview/utils/previewScript.ts"],"sourcesContent":["// NOTE: This override is for the properties on _user's site_, it's not about Strapi Admin.\ndeclare global {\n interface Window {\n __strapi_previewCleanup?: () => void;\n STRAPI_HIGHLIGHT_HOVER_COLOR?: string;\n STRAPI_HIGHLIGHT_ACTIVE_COLOR?: string;\n STRAPI_DISABLE_STEGA_DECODING?: boolean;\n }\n}\n\n/**\n * previewScript will be injected into the preview iframe after being stringified.\n * Therefore it CANNOT use any imports, or refer to any variables outside of its own scope.\n * It's why many functions are defined within previewScript, it's the only way to avoid going full spaghetti.\n * To get a better overview of everything previewScript does, go to the orchestration part at its end.\n */\nconst previewScript = (shouldRun = true) => {\n /* -----------------------------------------------------------------------------------------------\n * Params\n * ---------------------------------------------------------------------------------------------*/\n const HIGHLIGHT_PADDING = 2; // in pixels\n const HIGHLIGHT_HOVER_COLOR = window.STRAPI_HIGHLIGHT_HOVER_COLOR ?? '#4945ff'; // dark primary500\n const HIGHLIGHT_ACTIVE_COLOR = window.STRAPI_HIGHLIGHT_ACTIVE_COLOR ?? '#7b79ff'; // dark primary600\n\n const DISABLE_STEGA_DECODING = window.STRAPI_DISABLE_STEGA_DECODING ?? false;\n const SOURCE_ATTRIBUTE = 'data-strapi-source';\n const OVERLAY_ID = 'strapi-preview-overlay';\n const INTERNAL_EVENTS = {\n STRAPI_FIELD_FOCUS: 'strapiFieldFocus',\n STRAPI_FIELD_BLUR: 'strapiFieldBlur',\n STRAPI_FIELD_CHANGE: 'strapiFieldChange',\n STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',\n } as const;\n\n /**\n * Calling the function in no-run mode lets us retrieve the constants from other files and keep\n * a single source of truth for them. It's the only way to do this because this script can't\n * refer to any variables outside of its own scope, because it's stringified before it's run.\n */\n if (!shouldRun) {\n return { INTERNAL_EVENTS };\n }\n\n /* -----------------------------------------------------------------------------------------------\n * Utils\n * ---------------------------------------------------------------------------------------------*/\n\n const sendMessage = (\n type: (typeof INTERNAL_EVENTS)[keyof typeof INTERNAL_EVENTS],\n payload: unknown\n ) => {\n window.parent.postMessage({ type, payload }, '*');\n };\n\n /* -----------------------------------------------------------------------------------------------\n * Functionality pieces\n * ---------------------------------------------------------------------------------------------*/\n\n const setupStegaDecoding = async () => {\n if (DISABLE_STEGA_DECODING) {\n return;\n }\n\n const { vercelStegaDecode: stegaDecode } = await import(\n // @ts-expect-error it's not a local dependency\n // eslint-disable-next-line import/no-unresolved\n 'https://cdn.jsdelivr.net/npm/@vercel/stega@0.1.2/+esm'\n );\n\n const allElements = document.querySelectorAll('*');\n\n Array.from(allElements).forEach((element) => {\n const directTextContent = Array.from(element.childNodes)\n .filter((node) => node.nodeType === Node.TEXT_NODE)\n .map((node) => node.textContent || '')\n .join('');\n\n if (directTextContent) {\n try {\n const result = stegaDecode(directTextContent);\n if (result) {\n element.setAttribute(SOURCE_ATTRIBUTE, result.key);\n }\n } catch (error) {}\n }\n });\n };\n\n const createOverlaySystem = () => {\n // Clean up before creating a new overlay so we can safely call previewScript multiple times\n window.__strapi_previewCleanup?.();\n document.getElementById(OVERLAY_ID)?.remove();\n\n const overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 9999;\n `;\n\n window.document.body.appendChild(overlay);\n return overlay;\n };\n\n type EventListenersList = Array<{\n element: HTMLElement | Window;\n type: keyof HTMLElementEventMap | 'message';\n handler: EventListener;\n }>;\n\n const createHighlightManager = (overlay: HTMLElement) => {\n const elements = window.document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);\n const eventListeners: EventListenersList = [];\n const highlights: HTMLElement[] = [];\n const focusedHighlights: HTMLElement[] = [];\n let focusedField: string | null = null;\n\n const drawHighlight = (target: Element, highlight: HTMLElement) => {\n if (!highlight) return;\n\n const rect = target.getBoundingClientRect();\n highlight.style.width = `${rect.width + HIGHLIGHT_PADDING * 2}px`;\n highlight.style.height = `${rect.height + HIGHLIGHT_PADDING * 2}px`;\n highlight.style.transform = `translate(${rect.left - HIGHLIGHT_PADDING}px, ${rect.top - HIGHLIGHT_PADDING}px)`;\n };\n\n const updateAllHighlights = () => {\n highlights.forEach((highlight, index) => {\n const element = elements[index];\n if (element && highlight) {\n drawHighlight(element, highlight);\n }\n });\n };\n\n elements.forEach((element) => {\n if (element instanceof HTMLElement) {\n const highlight = document.createElement('div');\n highlight.style.cssText = `\n position: absolute;\n outline: 2px solid transparent;\n pointer-events: none;\n border-radius: 2px;\n background-color: transparent;\n will-change: transform;\n transition: outline-color 0.1s ease-in-out;\n `;\n\n // Move hover detection to the underlying element\n const mouseEnterHandler = () => {\n if (!focusedHighlights.includes(highlight)) {\n highlight.style.outlineColor = HIGHLIGHT_HOVER_COLOR;\n }\n };\n const mouseLeaveHandler = () => {\n if (!focusedHighlights.includes(highlight)) {\n highlight.style.outlineColor = 'transparent';\n }\n };\n const doubleClickHandler = () => {\n const sourceAttribute = element.getAttribute(SOURCE_ATTRIBUTE);\n if (sourceAttribute) {\n const rect = element.getBoundingClientRect();\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT, {\n path: sourceAttribute,\n position: {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n },\n });\n }\n };\n const mouseDownHandler = (event: MouseEvent) => {\n // Prevent default multi click to select behavior\n if (event.detail >= 2) {\n event.preventDefault();\n }\n };\n\n element.addEventListener('mouseenter', mouseEnterHandler);\n element.addEventListener('mouseleave', mouseLeaveHandler);\n element.addEventListener('dblclick', doubleClickHandler);\n element.addEventListener('mousedown', mouseDownHandler);\n\n // Store event listeners for cleanup\n eventListeners.push(\n { element, type: 'mouseenter', handler: mouseEnterHandler },\n { element, type: 'mouseleave', handler: mouseLeaveHandler },\n { element, type: 'dblclick', handler: doubleClickHandler },\n { element, type: 'mousedown', handler: mouseDownHandler as EventListener }\n );\n\n highlights.push(highlight);\n overlay.appendChild(highlight);\n\n drawHighlight(element, highlight);\n }\n });\n\n return {\n elements,\n updateAllHighlights,\n eventListeners,\n highlights,\n focusedHighlights,\n setFocusedField: (field: string | null) => {\n focusedField = field;\n },\n getFocusedField: () => focusedField,\n };\n };\n\n type HighlightManager = ReturnType<typeof createHighlightManager>;\n\n const setupObservers = (highlightManager: HighlightManager) => {\n const resizeObserver = new ResizeObserver(() => {\n highlightManager.updateAllHighlights();\n });\n\n highlightManager.elements.forEach((element: Element) => {\n resizeObserver.observe(element);\n });\n\n resizeObserver.observe(document.documentElement);\n\n const updateOnScroll = () => {\n highlightManager.updateAllHighlights();\n };\n\n const scrollableElements = new Set<Element | Window>();\n scrollableElements.add(window);\n\n // Find all scrollable ancestors for all tracked elements\n highlightManager.elements.forEach((element) => {\n let parent = element.parentElement;\n while (parent) {\n const computedStyle = window.getComputedStyle(parent);\n const overflow = computedStyle.overflow + computedStyle.overflowX + computedStyle.overflowY;\n\n if (overflow.includes('scroll') || overflow.includes('auto')) {\n scrollableElements.add(parent);\n }\n\n parent = parent.parentElement;\n }\n });\n\n // Add scroll listeners to all scrollable elements\n scrollableElements.forEach((element) => {\n if (element === window) {\n window.addEventListener('scroll', updateOnScroll);\n window.addEventListener('resize', updateOnScroll);\n } else {\n element.addEventListener('scroll', updateOnScroll);\n }\n });\n\n return {\n resizeObserver,\n updateOnScroll,\n scrollableElements,\n };\n };\n\n const setupEventHandlers = (highlightManager: HighlightManager) => {\n const handleMessage = (event: MessageEvent) => {\n if (!event.data?.type) return;\n\n // The user typed in an input, reflect the change in the preview\n if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_CHANGE) {\n const { field, value } = event.data.payload;\n if (!field) return;\n\n const matchingElements = document.querySelectorAll(`[${SOURCE_ATTRIBUTE}=\"${field}\"]`);\n matchingElements.forEach((element) => {\n if (element instanceof HTMLElement) {\n element.textContent = value || '';\n }\n });\n return;\n }\n\n // The user focused a new input, update the highlights in the preview\n if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS) {\n const { field } = event.data.payload;\n if (!field) return;\n\n // Clear existing focused highlights\n highlightManager.focusedHighlights.forEach((highlight: HTMLElement) => {\n highlight.style.outlineColor = 'transparent';\n });\n highlightManager.focusedHighlights.length = 0;\n\n // Set new focused field and highlight matching elements\n highlightManager.setFocusedField(field);\n const matchingElements = document.querySelectorAll(`[${SOURCE_ATTRIBUTE}=\"${field}\"]`);\n matchingElements.forEach((element) => {\n const highlight =\n highlightManager.highlights[Array.from(highlightManager.elements).indexOf(element)];\n if (highlight) {\n highlight.style.outlineColor = HIGHLIGHT_ACTIVE_COLOR;\n highlight.style.outlineWidth = '3px';\n highlightManager.focusedHighlights.push(highlight);\n }\n });\n return;\n }\n\n // The user is no longer focusing an input, remove the highlights\n if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_BLUR) {\n const { field } = event.data.payload;\n if (field !== highlightManager.getFocusedField()) return;\n\n highlightManager.focusedHighlights.forEach((highlight: HTMLElement) => {\n highlight.style.outlineColor = 'transparent';\n highlight.style.outlineWidth = '2px';\n });\n highlightManager.focusedHighlights.length = 0;\n highlightManager.setFocusedField(null);\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n // Add the message handler to the cleanup list\n const messageEventListener = {\n element: window,\n type: 'message' as keyof HTMLElementEventMap,\n handler: handleMessage as EventListener,\n };\n\n return [...highlightManager.eventListeners, messageEventListener];\n };\n\n const createCleanupSystem = (\n overlay: HTMLElement,\n observers: ReturnType<typeof setupObservers>,\n eventHandlers: EventListenersList\n ) => {\n window.__strapi_previewCleanup = () => {\n observers.resizeObserver.disconnect();\n\n // Remove all scroll listeners\n observers.scrollableElements.forEach((element) => {\n if (element === window) {\n window.removeEventListener('scroll', observers.updateOnScroll);\n window.removeEventListener('resize', observers.updateOnScroll);\n } else {\n (element as Element).removeEventListener('scroll', observers.updateOnScroll);\n }\n });\n\n // Remove highlight event listeners\n eventHandlers.forEach(({ element, type, handler }) => {\n element.removeEventListener(type, handler);\n });\n\n overlay.remove();\n };\n };\n\n /* -----------------------------------------------------------------------------------------------\n * Orchestration\n * ---------------------------------------------------------------------------------------------*/\n\n setupStegaDecoding().then(() => {\n const overlay = createOverlaySystem();\n const highlightManager = createHighlightManager(overlay);\n const observers = setupObservers(highlightManager);\n const eventHandlers = setupEventHandlers(highlightManager);\n createCleanupSystem(overlay, observers, eventHandlers);\n });\n};\n\nexport { previewScript };\n"],"names":["previewScript","shouldRun","HIGHLIGHT_PADDING","HIGHLIGHT_HOVER_COLOR","window","STRAPI_HIGHLIGHT_HOVER_COLOR","HIGHLIGHT_ACTIVE_COLOR","STRAPI_HIGHLIGHT_ACTIVE_COLOR","DISABLE_STEGA_DECODING","STRAPI_DISABLE_STEGA_DECODING","SOURCE_ATTRIBUTE","OVERLAY_ID","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","STRAPI_FIELD_BLUR","STRAPI_FIELD_CHANGE","STRAPI_FIELD_FOCUS_INTENT","sendMessage","type","payload","parent","postMessage","setupStegaDecoding","vercelStegaDecode","stegaDecode","allElements","document","querySelectorAll","Array","from","forEach","element","directTextContent","childNodes","filter","node","nodeType","Node","TEXT_NODE","map","textContent","join","result","setAttribute","key","error","createOverlaySystem","__strapi_previewCleanup","getElementById","remove","overlay","createElement","id","style","cssText","body","appendChild","createHighlightManager","elements","eventListeners","highlights","focusedHighlights","focusedField","drawHighlight","target","highlight","rect","getBoundingClientRect","width","height","transform","left","top","updateAllHighlights","index","HTMLElement","mouseEnterHandler","includes","outlineColor","mouseLeaveHandler","doubleClickHandler","sourceAttribute","getAttribute","path","position","right","bottom","mouseDownHandler","event","detail","preventDefault","addEventListener","push","handler","setFocusedField","field","getFocusedField","setupObservers","highlightManager","resizeObserver","ResizeObserver","observe","documentElement","updateOnScroll","scrollableElements","Set","add","parentElement","computedStyle","getComputedStyle","overflow","overflowX","overflowY","setupEventHandlers","handleMessage","data","value","matchingElements","length","indexOf","outlineWidth","messageEventListener","createCleanupSystem","observers","eventHandlers","disconnect","removeEventListener","then"],"mappings":"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"}
1
+ {"version":3,"file":"previewScript.js","sources":["../../../../admin/src/preview/utils/previewScript.ts"],"sourcesContent":["// NOTE: This override is for the properties on _user's site_, it's not about Strapi Admin.\ndeclare global {\n interface Window {\n __strapi_previewCleanup?: () => void;\n STRAPI_HIGHLIGHT_HOVER_COLOR?: string;\n STRAPI_HIGHLIGHT_ACTIVE_COLOR?: string;\n STRAPI_DISABLE_STEGA_DECODING?: boolean;\n }\n}\n\n/**\n * previewScript will be injected into the preview iframe after being stringified.\n * Therefore it CANNOT use any imports, or refer to any variables outside of its own scope.\n * It's why many functions are defined within previewScript, it's the only way to avoid going full spaghetti.\n * To get a better overview of everything previewScript does, go to the orchestration part at its end.\n */\nconst previewScript = (shouldRun = true) => {\n /* -----------------------------------------------------------------------------------------------\n * Params\n * ---------------------------------------------------------------------------------------------*/\n const HIGHLIGHT_PADDING = 2; // in pixels\n const HIGHLIGHT_HOVER_COLOR = window.STRAPI_HIGHLIGHT_HOVER_COLOR ?? '#4945ff'; // dark primary500\n const HIGHLIGHT_ACTIVE_COLOR = window.STRAPI_HIGHLIGHT_ACTIVE_COLOR ?? '#7b79ff'; // dark primary600\n\n const DISABLE_STEGA_DECODING = window.STRAPI_DISABLE_STEGA_DECODING ?? false;\n const SOURCE_ATTRIBUTE = 'data-strapi-source';\n const OVERLAY_ID = 'strapi-preview-overlay';\n const INTERNAL_EVENTS = {\n STRAPI_FIELD_FOCUS: 'strapiFieldFocus',\n STRAPI_FIELD_BLUR: 'strapiFieldBlur',\n STRAPI_FIELD_CHANGE: 'strapiFieldChange',\n STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',\n } as const;\n\n /**\n * Calling the function in no-run mode lets us retrieve the constants from other files and keep\n * a single source of truth for them. It's the only way to do this because this script can't\n * refer to any variables outside of its own scope, because it's stringified before it's run.\n */\n if (!shouldRun) {\n return { INTERNAL_EVENTS };\n }\n\n /* -----------------------------------------------------------------------------------------------\n * Utils\n * ---------------------------------------------------------------------------------------------*/\n\n const sendMessage = (\n type: (typeof INTERNAL_EVENTS)[keyof typeof INTERNAL_EVENTS],\n payload: unknown\n ) => {\n window.parent.postMessage({ type, payload }, '*');\n };\n\n /* -----------------------------------------------------------------------------------------------\n * Functionality pieces\n * ---------------------------------------------------------------------------------------------*/\n\n const setupStegaDOMObserver = async () => {\n if (DISABLE_STEGA_DECODING) {\n return;\n }\n\n const { vercelStegaDecode: stegaDecode, vercelStegaClean: stegaClean } = await import(\n // @ts-expect-error it's not a local dependency\n // eslint-disable-next-line import/no-unresolved\n 'https://cdn.jsdelivr.net/npm/@vercel/stega@0.1.2/+esm'\n );\n\n const processElementForStega = (element: Element) => {\n const directTextNodes = Array.from(element.childNodes).filter(\n (node) => node.nodeType === Node.TEXT_NODE\n );\n\n const directTextContent = directTextNodes.map((node) => node.textContent || '').join('');\n\n if (directTextContent) {\n try {\n const result = stegaDecode(directTextContent);\n if (result) {\n element.setAttribute(SOURCE_ATTRIBUTE, result.key);\n\n // Remove encoded part from DOM text content (to avoid breaking links for example)\n directTextNodes.forEach((node) => {\n if (node.textContent) {\n const cleanedText = stegaClean(node.textContent);\n if (cleanedText !== node.textContent) {\n node.textContent = cleanedText;\n }\n }\n });\n }\n } catch (error) {}\n }\n };\n\n // Process all existing elements\n const allElements = document.querySelectorAll('*');\n Array.from(allElements).forEach(processElementForStega);\n\n // Create observer for new elements and text changes\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n // Handle added nodes\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n // Process the added element\n processElementForStega(element);\n // Process all child elements\n const childElements = element.querySelectorAll('*');\n Array.from(childElements).forEach(processElementForStega);\n }\n });\n }\n\n // Handle text content changes\n if (mutation.type === 'characterData' && mutation.target.parentElement) {\n processElementForStega(mutation.target.parentElement);\n }\n });\n });\n\n observer.observe(document, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n return observer;\n };\n\n const createOverlaySystem = () => {\n // Clean up before creating a new overlay so we can safely call previewScript multiple times\n window.__strapi_previewCleanup?.();\n document.getElementById(OVERLAY_ID)?.remove();\n\n const overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 9999;\n `;\n\n window.document.body.appendChild(overlay);\n return overlay;\n };\n\n type EventListenersList = Array<{\n element: HTMLElement | Window;\n type: keyof HTMLElementEventMap | 'message';\n handler: EventListener;\n }>;\n\n const createHighlightManager = (overlay: HTMLElement) => {\n const elementToHighlight = new Map<Element, HTMLElement>();\n const eventListeners: EventListenersList = [];\n const focusedHighlights: HTMLElement[] = [];\n let focusedField: string | null = null;\n\n const drawHighlight = (target: Element, highlight: HTMLElement) => {\n if (!highlight) return;\n\n const rect = target.getBoundingClientRect();\n highlight.style.width = `${rect.width + HIGHLIGHT_PADDING * 2}px`;\n highlight.style.height = `${rect.height + HIGHLIGHT_PADDING * 2}px`;\n highlight.style.transform = `translate(${rect.left - HIGHLIGHT_PADDING}px, ${rect.top - HIGHLIGHT_PADDING}px)`;\n };\n\n const updateAllHighlights = () => {\n elementToHighlight.forEach((highlight, element) => {\n drawHighlight(element, highlight);\n });\n };\n\n const createHighlightForElement = (element: HTMLElement) => {\n if (elementToHighlight.has(element)) {\n return; // Already has a highlight\n }\n\n const highlight = document.createElement('div');\n highlight.style.cssText = `\n position: absolute;\n outline: 2px solid transparent;\n pointer-events: none;\n border-radius: 2px;\n background-color: transparent;\n will-change: transform;\n transition: outline-color 0.1s ease-in-out;\n `;\n\n // Move hover detection to the underlying element\n const mouseEnterHandler = () => {\n if (!focusedHighlights.includes(highlight)) {\n highlight.style.outlineColor = HIGHLIGHT_HOVER_COLOR;\n }\n };\n const mouseLeaveHandler = () => {\n if (!focusedHighlights.includes(highlight)) {\n highlight.style.outlineColor = 'transparent';\n }\n };\n const doubleClickHandler = () => {\n const sourceAttribute = element.getAttribute(SOURCE_ATTRIBUTE);\n if (sourceAttribute) {\n const rect = element.getBoundingClientRect();\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT, {\n path: sourceAttribute,\n position: {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n },\n });\n }\n };\n const mouseDownHandler = (event: MouseEvent) => {\n // Prevent default multi click to select behavior\n if (event.detail >= 2) {\n event.preventDefault();\n }\n };\n\n element.addEventListener('mouseenter', mouseEnterHandler);\n element.addEventListener('mouseleave', mouseLeaveHandler);\n element.addEventListener('dblclick', doubleClickHandler);\n element.addEventListener('mousedown', mouseDownHandler);\n\n // Store event listeners for cleanup\n eventListeners.push(\n { element, type: 'mouseenter', handler: mouseEnterHandler },\n { element, type: 'mouseleave', handler: mouseLeaveHandler },\n { element, type: 'dblclick', handler: doubleClickHandler },\n { element, type: 'mousedown', handler: mouseDownHandler as EventListener }\n );\n\n elementToHighlight.set(element, highlight);\n overlay.appendChild(highlight);\n drawHighlight(element, highlight);\n };\n\n const removeHighlightForElement = (element: Element) => {\n const highlight = elementToHighlight.get(element);\n\n if (!highlight) return;\n\n highlight.remove();\n elementToHighlight.delete(element);\n\n // Remove event listeners for this element\n const listenersToRemove = eventListeners.filter((listener) => listener.element === element);\n listenersToRemove.forEach(({ element, type, handler }) => {\n element.removeEventListener(type, handler);\n });\n\n // Mutate eventListeners to remove listeners for this element\n eventListeners.splice(\n 0,\n eventListeners.length,\n ...eventListeners.filter((listener) => listener.element !== element)\n );\n };\n\n // Process all existing elements with source attributes\n const initialElements = window.document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);\n Array.from(initialElements).forEach((element) => {\n if (element instanceof HTMLElement) {\n createHighlightForElement(element);\n }\n });\n\n return {\n get elements() {\n return Array.from(elementToHighlight.keys());\n },\n get highlights() {\n return Array.from(elementToHighlight.values());\n },\n updateAllHighlights,\n eventListeners,\n focusedHighlights,\n createHighlightForElement,\n removeHighlightForElement,\n setFocusedField: (field: string | null) => {\n focusedField = field;\n },\n getFocusedField: () => focusedField,\n };\n };\n\n type HighlightManager = ReturnType<typeof createHighlightManager>;\n\n const setupObservers = (\n highlightManager: HighlightManager,\n stegaObserver: MutationObserver | undefined\n ) => {\n const resizeObserver = new ResizeObserver(() => {\n highlightManager.updateAllHighlights();\n });\n\n const observeElementForResize = (element: Element) => {\n resizeObserver.observe(element);\n };\n\n // Observe existing elements\n highlightManager.elements.forEach(observeElementForResize);\n resizeObserver.observe(document.documentElement);\n\n // Create highlight observer to watch for new elements with source attributes\n const highlightObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes' && mutation.attributeName === SOURCE_ATTRIBUTE) {\n const target = mutation.target as HTMLElement;\n if (target.hasAttribute(SOURCE_ATTRIBUTE)) {\n highlightManager.createHighlightForElement(target);\n observeElementForResize(target);\n } else {\n highlightManager.removeHighlightForElement(target);\n }\n }\n\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n // Check if the added element has source attribute\n if (element.hasAttribute(SOURCE_ATTRIBUTE) && element instanceof HTMLElement) {\n highlightManager.createHighlightForElement(element);\n observeElementForResize(element);\n }\n // Check all child elements for source attributes\n const elementsWithSource = element.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);\n Array.from(elementsWithSource).forEach((childElement) => {\n if (childElement instanceof HTMLElement) {\n highlightManager.createHighlightForElement(childElement);\n observeElementForResize(childElement);\n }\n });\n }\n });\n\n mutation.removedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n highlightManager.removeHighlightForElement(element);\n }\n });\n }\n });\n });\n\n highlightObserver.observe(document, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [SOURCE_ATTRIBUTE],\n });\n\n const updateOnScroll = () => {\n highlightManager.updateAllHighlights();\n };\n\n const scrollableElements = new Set<Element | Window>();\n scrollableElements.add(window);\n\n const findScrollableAncestors = () => {\n // Clear existing scrollable elements (except window)\n scrollableElements.forEach((element) => {\n if (element !== window) {\n (element as Element).removeEventListener('scroll', updateOnScroll);\n }\n });\n scrollableElements.clear();\n scrollableElements.add(window);\n\n // Find all scrollable ancestors for all tracked elements\n highlightManager.elements.forEach((element) => {\n let parent = element.parentElement;\n while (parent) {\n const computedStyle = window.getComputedStyle(parent);\n const overflow =\n computedStyle.overflow + computedStyle.overflowX + computedStyle.overflowY;\n\n if (overflow.includes('scroll') || overflow.includes('auto')) {\n scrollableElements.add(parent);\n }\n\n parent = parent.parentElement;\n }\n });\n\n // Add scroll listeners to all scrollable elements\n scrollableElements.forEach((element) => {\n if (element === window) {\n window.addEventListener('scroll', updateOnScroll);\n window.addEventListener('resize', updateOnScroll);\n } else {\n element.addEventListener('scroll', updateOnScroll);\n }\n });\n };\n\n // Initial setup of scrollable elements\n findScrollableAncestors();\n\n return {\n resizeObserver,\n highlightObserver,\n stegaObserver,\n updateOnScroll,\n scrollableElements,\n findScrollableAncestors,\n };\n };\n\n const setupEventHandlers = (highlightManager: HighlightManager) => {\n const handleMessage = (event: MessageEvent) => {\n if (!event.data?.type) return;\n\n // The user typed in an input, reflect the change in the preview\n if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_CHANGE) {\n const { field, value } = event.data.payload;\n if (!field) return;\n\n const matchingElements = document.querySelectorAll(`[${SOURCE_ATTRIBUTE}=\"${field}\"]`);\n matchingElements.forEach((element) => {\n if (element instanceof HTMLElement) {\n element.textContent = value || '';\n }\n });\n\n // Update highlight dimensions since the new text content may affect them\n highlightManager.updateAllHighlights();\n return;\n }\n\n // The user focused a new input, update the highlights in the preview\n if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS) {\n const { field } = event.data.payload;\n if (!field) return;\n\n // Clear existing focused highlights\n highlightManager.focusedHighlights.forEach((highlight: HTMLElement) => {\n highlight.style.outlineColor = 'transparent';\n });\n highlightManager.focusedHighlights.length = 0;\n\n // Set new focused field and highlight matching elements\n highlightManager.setFocusedField(field);\n const matchingElements = document.querySelectorAll(`[${SOURCE_ATTRIBUTE}=\"${field}\"]`);\n matchingElements.forEach((element) => {\n const highlight =\n highlightManager.highlights[Array.from(highlightManager.elements).indexOf(element)];\n if (highlight) {\n highlight.style.outlineColor = HIGHLIGHT_ACTIVE_COLOR;\n highlight.style.outlineWidth = '3px';\n highlightManager.focusedHighlights.push(highlight);\n }\n });\n return;\n }\n\n // The user is no longer focusing an input, remove the highlights\n if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_BLUR) {\n const { field } = event.data.payload;\n if (field !== highlightManager.getFocusedField()) return;\n\n highlightManager.focusedHighlights.forEach((highlight: HTMLElement) => {\n highlight.style.outlineColor = 'transparent';\n highlight.style.outlineWidth = '2px';\n });\n highlightManager.focusedHighlights.length = 0;\n highlightManager.setFocusedField(null);\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n // Add the message handler to the cleanup list\n const messageEventListener = {\n element: window,\n type: 'message' as keyof HTMLElementEventMap,\n handler: handleMessage as EventListener,\n };\n\n return [...highlightManager.eventListeners, messageEventListener];\n };\n\n const createCleanupSystem = (\n overlay: HTMLElement,\n observers: ReturnType<typeof setupObservers>,\n eventHandlers: EventListenersList\n ) => {\n window.__strapi_previewCleanup = () => {\n observers.resizeObserver.disconnect();\n observers.highlightObserver.disconnect();\n observers.stegaObserver?.disconnect();\n\n // Remove all scroll listeners\n observers.scrollableElements.forEach((element) => {\n if (element === window) {\n window.removeEventListener('scroll', observers.updateOnScroll);\n window.removeEventListener('resize', observers.updateOnScroll);\n } else {\n (element as Element).removeEventListener('scroll', observers.updateOnScroll);\n }\n });\n\n // Remove highlight event listeners\n eventHandlers.forEach(({ element, type, handler }) => {\n element.removeEventListener(type, handler);\n });\n\n overlay.remove();\n };\n };\n\n /* -----------------------------------------------------------------------------------------------\n * Orchestration\n * ---------------------------------------------------------------------------------------------*/\n\n setupStegaDOMObserver().then((stegaObserver) => {\n const overlay = createOverlaySystem();\n const highlightManager = createHighlightManager(overlay);\n const observers = setupObservers(highlightManager, stegaObserver);\n const eventHandlers = setupEventHandlers(highlightManager);\n createCleanupSystem(overlay, observers, eventHandlers);\n });\n};\n\nexport { previewScript };\n"],"names":["previewScript","shouldRun","HIGHLIGHT_PADDING","HIGHLIGHT_HOVER_COLOR","window","STRAPI_HIGHLIGHT_HOVER_COLOR","HIGHLIGHT_ACTIVE_COLOR","STRAPI_HIGHLIGHT_ACTIVE_COLOR","DISABLE_STEGA_DECODING","STRAPI_DISABLE_STEGA_DECODING","SOURCE_ATTRIBUTE","OVERLAY_ID","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","STRAPI_FIELD_BLUR","STRAPI_FIELD_CHANGE","STRAPI_FIELD_FOCUS_INTENT","sendMessage","type","payload","parent","postMessage","setupStegaDOMObserver","vercelStegaDecode","stegaDecode","vercelStegaClean","stegaClean","processElementForStega","element","directTextNodes","Array","from","childNodes","filter","node","nodeType","Node","TEXT_NODE","directTextContent","map","textContent","join","result","setAttribute","key","forEach","cleanedText","error","allElements","document","querySelectorAll","observer","MutationObserver","mutations","mutation","addedNodes","ELEMENT_NODE","childElements","target","parentElement","observe","childList","subtree","characterData","createOverlaySystem","__strapi_previewCleanup","getElementById","remove","overlay","createElement","id","style","cssText","body","appendChild","createHighlightManager","elementToHighlight","Map","eventListeners","focusedHighlights","focusedField","drawHighlight","highlight","rect","getBoundingClientRect","width","height","transform","left","top","updateAllHighlights","createHighlightForElement","has","mouseEnterHandler","includes","outlineColor","mouseLeaveHandler","doubleClickHandler","sourceAttribute","getAttribute","path","position","right","bottom","mouseDownHandler","event","detail","preventDefault","addEventListener","push","handler","set","removeHighlightForElement","get","delete","listenersToRemove","listener","removeEventListener","splice","length","initialElements","HTMLElement","elements","keys","highlights","values","setFocusedField","field","getFocusedField","setupObservers","highlightManager","stegaObserver","resizeObserver","ResizeObserver","observeElementForResize","documentElement","highlightObserver","attributeName","hasAttribute","elementsWithSource","childElement","removedNodes","attributes","attributeFilter","updateOnScroll","scrollableElements","Set","add","findScrollableAncestors","clear","computedStyle","getComputedStyle","overflow","overflowX","overflowY","setupEventHandlers","handleMessage","data","value","matchingElements","indexOf","outlineWidth","messageEventListener","createCleanupSystem","observers","eventHandlers","disconnect","then"],"mappings":";;AAAA;AAUA;;;;;AAKC,IACKA,MAAAA,aAAAA,GAAgB,CAACC,SAAAA,GAAY,IAAI,GAAA;AACrC;;qGAGA,MAAMC,iBAAoB,GAAA,CAAA,CAAA;AAC1B,IAAA,MAAMC,qBAAwBC,GAAAA,MAAAA,CAAOC,4BAA4B,IAAI;AACrE,IAAA,MAAMC,sBAAyBF,GAAAA,MAAAA,CAAOG,6BAA6B,IAAI;IAEvE,MAAMC,sBAAAA,GAAyBJ,MAAOK,CAAAA,6BAA6B,IAAI,KAAA;AACvE,IAAA,MAAMC,gBAAmB,GAAA,oBAAA;AACzB,IAAA,MAAMC,UAAa,GAAA,wBAAA;AACnB,IAAA,MAAMC,eAAkB,GAAA;QACtBC,kBAAoB,EAAA,kBAAA;QACpBC,iBAAmB,EAAA,iBAAA;QACnBC,mBAAqB,EAAA,mBAAA;QACrBC,yBAA2B,EAAA;AAC7B,KAAA;AAEA;;;;MAKA,IAAI,CAACf,SAAW,EAAA;QACd,OAAO;AAAEW,YAAAA;AAAgB,SAAA;AAC3B;AAEA;;qGAIA,MAAMK,WAAc,GAAA,CAClBC,IACAC,EAAAA,OAAAA,GAAAA;QAEAf,MAAOgB,CAAAA,MAAM,CAACC,WAAW,CAAC;AAAEH,YAAAA,IAAAA;AAAMC,YAAAA;SAAW,EAAA,GAAA,CAAA;AAC/C,KAAA;AAEA;;AAEgG,qGAEhG,MAAMG,qBAAwB,GAAA,UAAA;AAC5B,QAAA,IAAId,sBAAwB,EAAA;AAC1B,YAAA;AACF;QAEA,MAAM,EAAEe,iBAAmBC,EAAAA,WAAW,EAAEC,gBAAAA,EAAkBC,UAAU,EAAE,GAAG,MAAM;;AAG7E,QAAA,uDAAA,CAAA;AAGF,QAAA,MAAMC,yBAAyB,CAACC,OAAAA,GAAAA;AAC9B,YAAA,MAAMC,eAAkBC,GAAAA,KAAAA,CAAMC,IAAI,CAACH,QAAQI,UAAU,CAAA,CAAEC,MAAM,CAC3D,CAACC,IAASA,GAAAA,IAAAA,CAAKC,QAAQ,KAAKC,KAAKC,SAAS,CAAA;YAG5C,MAAMC,iBAAAA,GAAoBT,eAAgBU,CAAAA,GAAG,CAAC,CAACL,IAASA,GAAAA,IAAAA,CAAKM,WAAW,IAAI,EAAIC,CAAAA,CAAAA,IAAI,CAAC,EAAA,CAAA;AAErF,YAAA,IAAIH,iBAAmB,EAAA;gBACrB,IAAI;AACF,oBAAA,MAAMI,SAASlB,WAAYc,CAAAA,iBAAAA,CAAAA;AAC3B,oBAAA,IAAII,MAAQ,EAAA;AACVd,wBAAAA,OAAAA,CAAQe,YAAY,CAACjC,gBAAkBgC,EAAAA,MAAAA,CAAOE,GAAG,CAAA;;wBAGjDf,eAAgBgB,CAAAA,OAAO,CAAC,CAACX,IAAAA,GAAAA;4BACvB,IAAIA,IAAAA,CAAKM,WAAW,EAAE;gCACpB,MAAMM,WAAAA,GAAcpB,UAAWQ,CAAAA,IAAAA,CAAKM,WAAW,CAAA;gCAC/C,IAAIM,WAAAA,KAAgBZ,IAAKM,CAAAA,WAAW,EAAE;AACpCN,oCAAAA,IAAAA,CAAKM,WAAW,GAAGM,WAAAA;AACrB;AACF;AACF,yBAAA,CAAA;AACF;iBACA,CAAA,OAAOC,OAAO;AAClB;AACF,SAAA;;QAGA,MAAMC,WAAAA,GAAcC,QAASC,CAAAA,gBAAgB,CAAC,GAAA,CAAA;AAC9CpB,QAAAA,KAAAA,CAAMC,IAAI,CAACiB,WAAaH,CAAAA,CAAAA,OAAO,CAAClB,sBAAAA,CAAAA;;QAGhC,MAAMwB,QAAAA,GAAW,IAAIC,gBAAAA,CAAiB,CAACC,SAAAA,GAAAA;YACrCA,SAAUR,CAAAA,OAAO,CAAC,CAACS,QAAAA,GAAAA;;gBAEjB,IAAIA,QAAAA,CAASpC,IAAI,KAAK,WAAa,EAAA;AACjCoC,oBAAAA,QAAAA,CAASC,UAAU,CAACV,OAAO,CAAC,CAACX,IAAAA,GAAAA;AAC3B,wBAAA,IAAIA,IAAKC,CAAAA,QAAQ,KAAKC,IAAAA,CAAKoB,YAAY,EAAE;AACvC,4BAAA,MAAM5B,OAAUM,GAAAA,IAAAA;;4BAEhBP,sBAAuBC,CAAAA,OAAAA,CAAAA;;4BAEvB,MAAM6B,aAAAA,GAAgB7B,OAAQsB,CAAAA,gBAAgB,CAAC,GAAA,CAAA;AAC/CpB,4BAAAA,KAAAA,CAAMC,IAAI,CAAC0B,aAAeZ,CAAAA,CAAAA,OAAO,CAAClB,sBAAAA,CAAAA;AACpC;AACF,qBAAA,CAAA;AACF;;gBAGA,IAAI2B,QAAAA,CAASpC,IAAI,KAAK,eAAA,IAAmBoC,SAASI,MAAM,CAACC,aAAa,EAAE;oBACtEhC,sBAAuB2B,CAAAA,QAAAA,CAASI,MAAM,CAACC,aAAa,CAAA;AACtD;AACF,aAAA,CAAA;AACF,SAAA,CAAA;QAEAR,QAASS,CAAAA,OAAO,CAACX,QAAU,EAAA;YACzBY,SAAW,EAAA,IAAA;YACXC,OAAS,EAAA,IAAA;YACTC,aAAe,EAAA;AACjB,SAAA,CAAA;QAEA,OAAOZ,QAAAA;AACT,KAAA;AAEA,IAAA,MAAMa,mBAAsB,GAAA,IAAA;;AAE1B5D,QAAAA,MAAAA,CAAO6D,uBAAuB,IAAA;QAC9BhB,QAASiB,CAAAA,cAAc,CAACvD,UAAawD,CAAAA,EAAAA,MAAAA,EAAAA;QAErC,MAAMC,OAAAA,GAAUnB,QAASoB,CAAAA,aAAa,CAAC,KAAA,CAAA;AACvCD,QAAAA,OAAAA,CAAQE,EAAE,GAAG3D,UAAAA;AACbyD,QAAAA,OAAAA,CAAQG,KAAK,CAACC,OAAO,GAAG;;;;;;;;IAQxB,CAAC;AAEDpE,QAAAA,MAAAA,CAAO6C,QAAQ,CAACwB,IAAI,CAACC,WAAW,CAACN,OAAAA,CAAAA;QACjC,OAAOA,OAAAA;AACT,KAAA;AAQA,IAAA,MAAMO,yBAAyB,CAACP,OAAAA,GAAAA;AAC9B,QAAA,MAAMQ,qBAAqB,IAAIC,GAAAA,EAAAA;AAC/B,QAAA,MAAMC,iBAAqC,EAAE;AAC7C,QAAA,MAAMC,oBAAmC,EAAE;AAC3C,QAAA,IAAIC,YAA8B,GAAA,IAAA;QAElC,MAAMC,aAAAA,GAAgB,CAACvB,MAAiBwB,EAAAA,SAAAA,GAAAA;AACtC,YAAA,IAAI,CAACA,SAAW,EAAA;YAEhB,MAAMC,IAAAA,GAAOzB,OAAO0B,qBAAqB,EAAA;AACzCF,YAAAA,SAAAA,CAAUX,KAAK,CAACc,KAAK,GAAG,CAAC,EAAEF,IAAKE,CAAAA,KAAK,GAAGnF,iBAAAA,GAAoB,CAAE,CAAA,EAAE,CAAC;AACjEgF,YAAAA,SAAAA,CAAUX,KAAK,CAACe,MAAM,GAAG,CAAC,EAAEH,IAAKG,CAAAA,MAAM,GAAGpF,iBAAAA,GAAoB,CAAE,CAAA,EAAE,CAAC;AACnEgF,YAAAA,SAAAA,CAAUX,KAAK,CAACgB,SAAS,GAAG,CAAC,UAAU,EAAEJ,IAAKK,CAAAA,IAAI,GAAGtF,iBAAAA,CAAkB,IAAI,EAAEiF,IAAAA,CAAKM,GAAG,GAAGvF,iBAAAA,CAAkB,GAAG,CAAC;AAChH,SAAA;AAEA,QAAA,MAAMwF,mBAAsB,GAAA,IAAA;YAC1Bd,kBAAmB/B,CAAAA,OAAO,CAAC,CAACqC,SAAWtD,EAAAA,OAAAA,GAAAA;AACrCqD,gBAAAA,aAAAA,CAAcrD,OAASsD,EAAAA,SAAAA,CAAAA;AACzB,aAAA,CAAA;AACF,SAAA;AAEA,QAAA,MAAMS,4BAA4B,CAAC/D,OAAAA,GAAAA;YACjC,IAAIgD,kBAAAA,CAAmBgB,GAAG,CAAChE,OAAU,CAAA,EAAA;AACnC,gBAAA,OAAA;AACF;YAEA,MAAMsD,SAAAA,GAAYjC,QAASoB,CAAAA,aAAa,CAAC,KAAA,CAAA;AACzCa,YAAAA,SAAAA,CAAUX,KAAK,CAACC,OAAO,GAAG;;;;;;;;MAQ1B,CAAC;;AAGD,YAAA,MAAMqB,iBAAoB,GAAA,IAAA;AACxB,gBAAA,IAAI,CAACd,iBAAAA,CAAkBe,QAAQ,CAACZ,SAAY,CAAA,EAAA;oBAC1CA,SAAUX,CAAAA,KAAK,CAACwB,YAAY,GAAG5F,qBAAAA;AACjC;AACF,aAAA;AACA,YAAA,MAAM6F,iBAAoB,GAAA,IAAA;AACxB,gBAAA,IAAI,CAACjB,iBAAAA,CAAkBe,QAAQ,CAACZ,SAAY,CAAA,EAAA;oBAC1CA,SAAUX,CAAAA,KAAK,CAACwB,YAAY,GAAG,aAAA;AACjC;AACF,aAAA;AACA,YAAA,MAAME,kBAAqB,GAAA,IAAA;gBACzB,MAAMC,eAAAA,GAAkBtE,OAAQuE,CAAAA,YAAY,CAACzF,gBAAAA,CAAAA;AAC7C,gBAAA,IAAIwF,eAAiB,EAAA;oBACnB,MAAMf,IAAAA,GAAOvD,QAAQwD,qBAAqB,EAAA;oBAC1CnE,WAAYL,CAAAA,eAAAA,CAAgBI,yBAAyB,EAAE;wBACrDoF,IAAMF,EAAAA,eAAAA;wBACNG,QAAU,EAAA;AACRZ,4BAAAA,GAAAA,EAAKN,KAAKM,GAAG;AACbD,4BAAAA,IAAAA,EAAML,KAAKK,IAAI;AACfc,4BAAAA,KAAAA,EAAOnB,KAAKmB,KAAK;AACjBC,4BAAAA,MAAAA,EAAQpB,KAAKoB,MAAM;AACnBlB,4BAAAA,KAAAA,EAAOF,KAAKE,KAAK;AACjBC,4BAAAA,MAAAA,EAAQH,KAAKG;AACf;AACF,qBAAA,CAAA;AACF;AACF,aAAA;AACA,YAAA,MAAMkB,mBAAmB,CAACC,KAAAA,GAAAA;;gBAExB,IAAIA,KAAAA,CAAMC,MAAM,IAAI,CAAG,EAAA;AACrBD,oBAAAA,KAAAA,CAAME,cAAc,EAAA;AACtB;AACF,aAAA;YAEA/E,OAAQgF,CAAAA,gBAAgB,CAAC,YAAcf,EAAAA,iBAAAA,CAAAA;YACvCjE,OAAQgF,CAAAA,gBAAgB,CAAC,YAAcZ,EAAAA,iBAAAA,CAAAA;YACvCpE,OAAQgF,CAAAA,gBAAgB,CAAC,UAAYX,EAAAA,kBAAAA,CAAAA;YACrCrE,OAAQgF,CAAAA,gBAAgB,CAAC,WAAaJ,EAAAA,gBAAAA,CAAAA;;AAGtC1B,YAAAA,cAAAA,CAAe+B,IAAI,CACjB;AAAEjF,gBAAAA,OAAAA;gBAASV,IAAM,EAAA,YAAA;gBAAc4F,OAASjB,EAAAA;aACxC,EAAA;AAAEjE,gBAAAA,OAAAA;gBAASV,IAAM,EAAA,YAAA;gBAAc4F,OAASd,EAAAA;aACxC,EAAA;AAAEpE,gBAAAA,OAAAA;gBAASV,IAAM,EAAA,UAAA;gBAAY4F,OAASb,EAAAA;aACtC,EAAA;AAAErE,gBAAAA,OAAAA;gBAASV,IAAM,EAAA,WAAA;gBAAa4F,OAASN,EAAAA;AAAkC,aAAA,CAAA;YAG3E5B,kBAAmBmC,CAAAA,GAAG,CAACnF,OAASsD,EAAAA,SAAAA,CAAAA;AAChCd,YAAAA,OAAAA,CAAQM,WAAW,CAACQ,SAAAA,CAAAA;AACpBD,YAAAA,aAAAA,CAAcrD,OAASsD,EAAAA,SAAAA,CAAAA;AACzB,SAAA;AAEA,QAAA,MAAM8B,4BAA4B,CAACpF,OAAAA,GAAAA;YACjC,MAAMsD,SAAAA,GAAYN,kBAAmBqC,CAAAA,GAAG,CAACrF,OAAAA,CAAAA;AAEzC,YAAA,IAAI,CAACsD,SAAW,EAAA;AAEhBA,YAAAA,SAAAA,CAAUf,MAAM,EAAA;AAChBS,YAAAA,kBAAAA,CAAmBsC,MAAM,CAACtF,OAAAA,CAAAA;;YAG1B,MAAMuF,iBAAAA,GAAoBrC,eAAe7C,MAAM,CAAC,CAACmF,QAAaA,GAAAA,QAAAA,CAASxF,OAAO,KAAKA,OAAAA,CAAAA;YACnFuF,iBAAkBtE,CAAAA,OAAO,CAAC,CAAC,EAAEjB,OAAO,EAAEV,IAAI,EAAE4F,OAAO,EAAE,GAAA;gBACnDlF,OAAQyF,CAAAA,mBAAmB,CAACnG,IAAM4F,EAAAA,OAAAA,CAAAA;AACpC,aAAA,CAAA;;AAGAhC,YAAAA,cAAAA,CAAewC,MAAM,CACnB,CACAxC,EAAAA,cAAAA,CAAeyC,MAAM,EAAA,GAClBzC,cAAe7C,CAAAA,MAAM,CAAC,CAACmF,QAAaA,GAAAA,QAAAA,CAASxF,OAAO,KAAKA,OAAAA,CAAAA,CAAAA;AAEhE,SAAA;;QAGA,MAAM4F,eAAAA,GAAkBpH,MAAO6C,CAAAA,QAAQ,CAACC,gBAAgB,CAAC,CAAC,CAAC,EAAExC,gBAAiB,CAAA,CAAC,CAAC,CAAA;AAChFoB,QAAAA,KAAAA,CAAMC,IAAI,CAACyF,eAAiB3E,CAAAA,CAAAA,OAAO,CAAC,CAACjB,OAAAA,GAAAA;AACnC,YAAA,IAAIA,mBAAmB6F,WAAa,EAAA;gBAClC9B,yBAA0B/D,CAAAA,OAAAA,CAAAA;AAC5B;AACF,SAAA,CAAA;QAEA,OAAO;AACL,YAAA,IAAI8F,QAAW,CAAA,GAAA;AACb,gBAAA,OAAO5F,KAAMC,CAAAA,IAAI,CAAC6C,kBAAAA,CAAmB+C,IAAI,EAAA,CAAA;AAC3C,aAAA;AACA,YAAA,IAAIC,UAAa,CAAA,GAAA;AACf,gBAAA,OAAO9F,KAAMC,CAAAA,IAAI,CAAC6C,kBAAAA,CAAmBiD,MAAM,EAAA,CAAA;AAC7C,aAAA;AACAnC,YAAAA,mBAAAA;AACAZ,YAAAA,cAAAA;AACAC,YAAAA,iBAAAA;AACAY,YAAAA,yBAAAA;AACAqB,YAAAA,yBAAAA;AACAc,YAAAA,eAAAA,EAAiB,CAACC,KAAAA,GAAAA;gBAChB/C,YAAe+C,GAAAA,KAAAA;AACjB,aAAA;AACAC,YAAAA,eAAAA,EAAiB,IAAMhD;AACzB,SAAA;AACF,KAAA;IAIA,MAAMiD,cAAAA,GAAiB,CACrBC,gBACAC,EAAAA,aAAAA,GAAAA;QAEA,MAAMC,cAAAA,GAAiB,IAAIC,cAAe,CAAA,IAAA;AACxCH,YAAAA,gBAAAA,CAAiBxC,mBAAmB,EAAA;AACtC,SAAA,CAAA;AAEA,QAAA,MAAM4C,0BAA0B,CAAC1G,OAAAA,GAAAA;AAC/BwG,YAAAA,cAAAA,CAAexE,OAAO,CAAChC,OAAAA,CAAAA;AACzB,SAAA;;QAGAsG,gBAAiBR,CAAAA,QAAQ,CAAC7E,OAAO,CAACyF,uBAAAA,CAAAA;QAClCF,cAAexE,CAAAA,OAAO,CAACX,QAAAA,CAASsF,eAAe,CAAA;;QAG/C,MAAMC,iBAAAA,GAAoB,IAAIpF,gBAAAA,CAAiB,CAACC,SAAAA,GAAAA;YAC9CA,SAAUR,CAAAA,OAAO,CAAC,CAACS,QAAAA,GAAAA;AACjB,gBAAA,IAAIA,SAASpC,IAAI,KAAK,gBAAgBoC,QAASmF,CAAAA,aAAa,KAAK/H,gBAAkB,EAAA;oBACjF,MAAMgD,MAAAA,GAASJ,SAASI,MAAM;oBAC9B,IAAIA,MAAAA,CAAOgF,YAAY,CAAChI,gBAAmB,CAAA,EAAA;AACzCwH,wBAAAA,gBAAAA,CAAiBvC,yBAAyB,CAACjC,MAAAA,CAAAA;wBAC3C4E,uBAAwB5E,CAAAA,MAAAA,CAAAA;qBACnB,MAAA;AACLwE,wBAAAA,gBAAAA,CAAiBlB,yBAAyB,CAACtD,MAAAA,CAAAA;AAC7C;AACF;gBAEA,IAAIJ,QAAAA,CAASpC,IAAI,KAAK,WAAa,EAAA;AACjCoC,oBAAAA,QAAAA,CAASC,UAAU,CAACV,OAAO,CAAC,CAACX,IAAAA,GAAAA;AAC3B,wBAAA,IAAIA,IAAKC,CAAAA,QAAQ,KAAKC,IAAAA,CAAKoB,YAAY,EAAE;AACvC,4BAAA,MAAM5B,OAAUM,GAAAA,IAAAA;;AAEhB,4BAAA,IAAIN,OAAQ8G,CAAAA,YAAY,CAAChI,gBAAAA,CAAAA,IAAqBkB,mBAAmB6F,WAAa,EAAA;AAC5ES,gCAAAA,gBAAAA,CAAiBvC,yBAAyB,CAAC/D,OAAAA,CAAAA;gCAC3C0G,uBAAwB1G,CAAAA,OAAAA,CAAAA;AAC1B;;4BAEA,MAAM+G,kBAAAA,GAAqB/G,QAAQsB,gBAAgB,CAAC,CAAC,CAAC,EAAExC,gBAAiB,CAAA,CAAC,CAAC,CAAA;AAC3EoB,4BAAAA,KAAAA,CAAMC,IAAI,CAAC4G,kBAAoB9F,CAAAA,CAAAA,OAAO,CAAC,CAAC+F,YAAAA,GAAAA;AACtC,gCAAA,IAAIA,wBAAwBnB,WAAa,EAAA;AACvCS,oCAAAA,gBAAAA,CAAiBvC,yBAAyB,CAACiD,YAAAA,CAAAA;oCAC3CN,uBAAwBM,CAAAA,YAAAA,CAAAA;AAC1B;AACF,6BAAA,CAAA;AACF;AACF,qBAAA,CAAA;AAEAtF,oBAAAA,QAAAA,CAASuF,YAAY,CAAChG,OAAO,CAAC,CAACX,IAAAA,GAAAA;AAC7B,wBAAA,IAAIA,IAAKC,CAAAA,QAAQ,KAAKC,IAAAA,CAAKoB,YAAY,EAAE;AACvC,4BAAA,MAAM5B,OAAUM,GAAAA,IAAAA;AAChBgG,4BAAAA,gBAAAA,CAAiBlB,yBAAyB,CAACpF,OAAAA,CAAAA;AAC7C;AACF,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;AACF,SAAA,CAAA;QAEA4G,iBAAkB5E,CAAAA,OAAO,CAACX,QAAU,EAAA;YAClCY,SAAW,EAAA,IAAA;YACXC,OAAS,EAAA,IAAA;YACTgF,UAAY,EAAA,IAAA;YACZC,eAAiB,EAAA;AAACrI,gBAAAA;AAAiB;AACrC,SAAA,CAAA;AAEA,QAAA,MAAMsI,cAAiB,GAAA,IAAA;AACrBd,YAAAA,gBAAAA,CAAiBxC,mBAAmB,EAAA;AACtC,SAAA;AAEA,QAAA,MAAMuD,qBAAqB,IAAIC,GAAAA,EAAAA;AAC/BD,QAAAA,kBAAAA,CAAmBE,GAAG,CAAC/I,MAAAA,CAAAA;AAEvB,QAAA,MAAMgJ,uBAA0B,GAAA,IAAA;;YAE9BH,kBAAmBpG,CAAAA,OAAO,CAAC,CAACjB,OAAAA,GAAAA;AAC1B,gBAAA,IAAIA,YAAYxB,MAAQ,EAAA;oBACrBwB,OAAoByF,CAAAA,mBAAmB,CAAC,QAAU2B,EAAAA,cAAAA,CAAAA;AACrD;AACF,aAAA,CAAA;AACAC,YAAAA,kBAAAA,CAAmBI,KAAK,EAAA;AACxBJ,YAAAA,kBAAAA,CAAmBE,GAAG,CAAC/I,MAAAA,CAAAA;;AAGvB8H,YAAAA,gBAAAA,CAAiBR,QAAQ,CAAC7E,OAAO,CAAC,CAACjB,OAAAA,GAAAA;gBACjC,IAAIR,MAAAA,GAASQ,QAAQ+B,aAAa;AAClC,gBAAA,MAAOvC,MAAQ,CAAA;oBACb,MAAMkI,aAAAA,GAAgBlJ,MAAOmJ,CAAAA,gBAAgB,CAACnI,MAAAA,CAAAA;oBAC9C,MAAMoI,QAAAA,GACJF,cAAcE,QAAQ,GAAGF,cAAcG,SAAS,GAAGH,cAAcI,SAAS;AAE5E,oBAAA,IAAIF,SAAS1D,QAAQ,CAAC,aAAa0D,QAAS1D,CAAAA,QAAQ,CAAC,MAAS,CAAA,EAAA;AAC5DmD,wBAAAA,kBAAAA,CAAmBE,GAAG,CAAC/H,MAAAA,CAAAA;AACzB;AAEAA,oBAAAA,MAAAA,GAASA,OAAOuC,aAAa;AAC/B;AACF,aAAA,CAAA;;YAGAsF,kBAAmBpG,CAAAA,OAAO,CAAC,CAACjB,OAAAA,GAAAA;AAC1B,gBAAA,IAAIA,YAAYxB,MAAQ,EAAA;oBACtBA,MAAOwG,CAAAA,gBAAgB,CAAC,QAAUoC,EAAAA,cAAAA,CAAAA;oBAClC5I,MAAOwG,CAAAA,gBAAgB,CAAC,QAAUoC,EAAAA,cAAAA,CAAAA;iBAC7B,MAAA;oBACLpH,OAAQgF,CAAAA,gBAAgB,CAAC,QAAUoC,EAAAA,cAAAA,CAAAA;AACrC;AACF,aAAA,CAAA;AACF,SAAA;;AAGAI,QAAAA,uBAAAA,EAAAA;QAEA,OAAO;AACLhB,YAAAA,cAAAA;AACAI,YAAAA,iBAAAA;AACAL,YAAAA,aAAAA;AACAa,YAAAA,cAAAA;AACAC,YAAAA,kBAAAA;AACAG,YAAAA;AACF,SAAA;AACF,KAAA;AAEA,IAAA,MAAMO,qBAAqB,CAACzB,gBAAAA,GAAAA;AAC1B,QAAA,MAAM0B,gBAAgB,CAACnD,KAAAA,GAAAA;AACrB,YAAA,IAAI,CAACA,KAAAA,CAAMoD,IAAI,EAAE3I,IAAM,EAAA;;AAGvB,YAAA,IAAIuF,MAAMoD,IAAI,CAAC3I,IAAI,KAAKN,eAAAA,CAAgBG,mBAAmB,EAAE;gBAC3D,MAAM,EAAEgH,KAAK,EAAE+B,KAAK,EAAE,GAAGrD,KAAAA,CAAMoD,IAAI,CAAC1I,OAAO;AAC3C,gBAAA,IAAI,CAAC4G,KAAO,EAAA;AAEZ,gBAAA,MAAMgC,gBAAmB9G,GAAAA,QAAAA,CAASC,gBAAgB,CAAC,CAAC,CAAC,EAAExC,gBAAAA,CAAiB,EAAE,EAAEqH,KAAM,CAAA,EAAE,CAAC,CAAA;gBACrFgC,gBAAiBlH,CAAAA,OAAO,CAAC,CAACjB,OAAAA,GAAAA;AACxB,oBAAA,IAAIA,mBAAmB6F,WAAa,EAAA;wBAClC7F,OAAQY,CAAAA,WAAW,GAAGsH,KAAS,IAAA,EAAA;AACjC;AACF,iBAAA,CAAA;;AAGA5B,gBAAAA,gBAAAA,CAAiBxC,mBAAmB,EAAA;AACpC,gBAAA;AACF;;AAGA,YAAA,IAAIe,MAAMoD,IAAI,CAAC3I,IAAI,KAAKN,eAAAA,CAAgBC,kBAAkB,EAAE;AAC1D,gBAAA,MAAM,EAAEkH,KAAK,EAAE,GAAGtB,KAAMoD,CAAAA,IAAI,CAAC1I,OAAO;AACpC,gBAAA,IAAI,CAAC4G,KAAO,EAAA;;AAGZG,gBAAAA,gBAAAA,CAAiBnD,iBAAiB,CAAClC,OAAO,CAAC,CAACqC,SAAAA,GAAAA;oBAC1CA,SAAUX,CAAAA,KAAK,CAACwB,YAAY,GAAG,aAAA;AACjC,iBAAA,CAAA;gBACAmC,gBAAiBnD,CAAAA,iBAAiB,CAACwC,MAAM,GAAG,CAAA;;AAG5CW,gBAAAA,gBAAAA,CAAiBJ,eAAe,CAACC,KAAAA,CAAAA;AACjC,gBAAA,MAAMgC,gBAAmB9G,GAAAA,QAAAA,CAASC,gBAAgB,CAAC,CAAC,CAAC,EAAExC,gBAAAA,CAAiB,EAAE,EAAEqH,KAAM,CAAA,EAAE,CAAC,CAAA;gBACrFgC,gBAAiBlH,CAAAA,OAAO,CAAC,CAACjB,OAAAA,GAAAA;AACxB,oBAAA,MAAMsD,SACJgD,GAAAA,gBAAAA,CAAiBN,UAAU,CAAC9F,KAAMC,CAAAA,IAAI,CAACmG,gBAAAA,CAAiBR,QAAQ,CAAA,CAAEsC,OAAO,CAACpI,OAAS,CAAA,CAAA;AACrF,oBAAA,IAAIsD,SAAW,EAAA;wBACbA,SAAUX,CAAAA,KAAK,CAACwB,YAAY,GAAGzF,sBAAAA;wBAC/B4E,SAAUX,CAAAA,KAAK,CAAC0F,YAAY,GAAG,KAAA;wBAC/B/B,gBAAiBnD,CAAAA,iBAAiB,CAAC8B,IAAI,CAAC3B,SAAAA,CAAAA;AAC1C;AACF,iBAAA,CAAA;AACA,gBAAA;AACF;;AAGA,YAAA,IAAIuB,MAAMoD,IAAI,CAAC3I,IAAI,KAAKN,eAAAA,CAAgBE,iBAAiB,EAAE;AACzD,gBAAA,MAAM,EAAEiH,KAAK,EAAE,GAAGtB,KAAMoD,CAAAA,IAAI,CAAC1I,OAAO;gBACpC,IAAI4G,KAAAA,KAAUG,gBAAiBF,CAAAA,eAAe,EAAI,EAAA;AAElDE,gBAAAA,gBAAAA,CAAiBnD,iBAAiB,CAAClC,OAAO,CAAC,CAACqC,SAAAA,GAAAA;oBAC1CA,SAAUX,CAAAA,KAAK,CAACwB,YAAY,GAAG,aAAA;oBAC/Bb,SAAUX,CAAAA,KAAK,CAAC0F,YAAY,GAAG,KAAA;AACjC,iBAAA,CAAA;gBACA/B,gBAAiBnD,CAAAA,iBAAiB,CAACwC,MAAM,GAAG,CAAA;AAC5CW,gBAAAA,gBAAAA,CAAiBJ,eAAe,CAAC,IAAA,CAAA;AACnC;AACF,SAAA;QAEA1H,MAAOwG,CAAAA,gBAAgB,CAAC,SAAWgD,EAAAA,aAAAA,CAAAA;;AAGnC,QAAA,MAAMM,oBAAuB,GAAA;YAC3BtI,OAASxB,EAAAA,MAAAA;YACTc,IAAM,EAAA,SAAA;YACN4F,OAAS8C,EAAAA;AACX,SAAA;QAEA,OAAO;AAAI1B,YAAAA,GAAAA,gBAAAA,CAAiBpD,cAAc;AAAEoF,YAAAA;AAAqB,SAAA;AACnE,KAAA;IAEA,MAAMC,mBAAAA,GAAsB,CAC1B/F,OAAAA,EACAgG,SACAC,EAAAA,aAAAA,GAAAA;AAEAjK,QAAAA,MAAAA,CAAO6D,uBAAuB,GAAG,IAAA;YAC/BmG,SAAUhC,CAAAA,cAAc,CAACkC,UAAU,EAAA;YACnCF,SAAU5B,CAAAA,iBAAiB,CAAC8B,UAAU,EAAA;AACtCF,YAAAA,SAAAA,CAAUjC,aAAa,EAAEmC,UAAAA,EAAAA;;AAGzBF,YAAAA,SAAAA,CAAUnB,kBAAkB,CAACpG,OAAO,CAAC,CAACjB,OAAAA,GAAAA;AACpC,gBAAA,IAAIA,YAAYxB,MAAQ,EAAA;AACtBA,oBAAAA,MAAAA,CAAOiH,mBAAmB,CAAC,QAAU+C,EAAAA,SAAAA,CAAUpB,cAAc,CAAA;AAC7D5I,oBAAAA,MAAAA,CAAOiH,mBAAmB,CAAC,QAAU+C,EAAAA,SAAAA,CAAUpB,cAAc,CAAA;iBACxD,MAAA;AACJpH,oBAAAA,OAAAA,CAAoByF,mBAAmB,CAAC,QAAU+C,EAAAA,SAAAA,CAAUpB,cAAc,CAAA;AAC7E;AACF,aAAA,CAAA;;YAGAqB,aAAcxH,CAAAA,OAAO,CAAC,CAAC,EAAEjB,OAAO,EAAEV,IAAI,EAAE4F,OAAO,EAAE,GAAA;gBAC/ClF,OAAQyF,CAAAA,mBAAmB,CAACnG,IAAM4F,EAAAA,OAAAA,CAAAA;AACpC,aAAA,CAAA;AAEA1C,YAAAA,OAAAA,CAAQD,MAAM,EAAA;AAChB,SAAA;AACF,KAAA;AAEA;;qGAIA7C,qBAAAA,EAAAA,CAAwBiJ,IAAI,CAAC,CAACpC,aAAAA,GAAAA;AAC5B,QAAA,MAAM/D,OAAUJ,GAAAA,mBAAAA,EAAAA;AAChB,QAAA,MAAMkE,mBAAmBvD,sBAAuBP,CAAAA,OAAAA,CAAAA;QAChD,MAAMgG,SAAAA,GAAYnC,eAAeC,gBAAkBC,EAAAA,aAAAA,CAAAA;AACnD,QAAA,MAAMkC,gBAAgBV,kBAAmBzB,CAAAA,gBAAAA,CAAAA;AACzCiC,QAAAA,mBAAAA,CAAoB/F,SAASgG,SAAWC,EAAAA,aAAAA,CAAAA;AAC1C,KAAA,CAAA;AACF;;;;"}