@strapi/content-manager 0.0.0-next.9ee35b96a156316b69719c0e5fec26bce796b251 → 0.0.0-next.a1da9b829e36a866a425439d22ab6f484b547d9f
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.
- package/dist/admin/components/LeftMenu.js +13 -15
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/LeftMenu.mjs +14 -16
- package/dist/admin/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/components/Widgets.js +15 -7
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/components/Widgets.mjs +15 -7
- package/dist/admin/components/Widgets.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +12 -19
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +13 -20
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Blocker.js +18 -0
- package/dist/admin/pages/EditView/components/Blocker.js.map +1 -0
- package/dist/admin/pages/EditView/components/Blocker.mjs +16 -0
- package/dist/admin/pages/EditView/components/Blocker.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/DocumentActions.js +16 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +17 -2
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +15 -5
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +15 -5
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +26 -7
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +26 -7
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +8 -8
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +8 -8
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +73 -0
- package/dist/admin/preview/components/InputPopover.js.map +1 -0
- package/dist/admin/preview/components/InputPopover.mjs +70 -0
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.js +67 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs +46 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -0
- package/dist/admin/preview/pages/Preview.js +119 -118
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +120 -119
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/constants.js +2 -1
- package/dist/admin/preview/utils/constants.js.map +1 -1
- package/dist/admin/preview/utils/constants.mjs +2 -2
- package/dist/admin/preview/utils/constants.mjs.map +1 -1
- package/dist/admin/preview/utils/getSendMessage.js +22 -0
- package/dist/admin/preview/utils/getSendMessage.js.map +1 -0
- package/dist/admin/preview/utils/getSendMessage.mjs +20 -0
- package/dist/admin/preview/utils/getSendMessage.mjs.map +1 -0
- package/dist/admin/preview/utils/previewScript.js +426 -4
- package/dist/admin/preview/utils/previewScript.js.map +1 -1
- package/dist/admin/preview/utils/previewScript.mjs +426 -4
- package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
- package/dist/admin/services/documents.js +0 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +0 -1
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/src/pages/EditView/components/Blocker.d.ts +5 -0
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
- package/dist/admin/src/preview/components/InputPopover.d.ts +6 -0
- package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +4 -0
- package/dist/admin/src/preview/pages/Preview.d.ts +8 -0
- package/dist/admin/src/preview/utils/constants.d.ts +4 -1
- package/dist/admin/src/preview/utils/getSendMessage.d.ts +11 -0
- package/dist/admin/src/preview/utils/previewScript.d.ts +8 -1
- package/dist/admin/translations/en.json.js +1 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -0
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +1 -0
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +1 -0
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +1 -0
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +2 -2
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +2 -2
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -7,7 +7,7 @@ const scriptResponse = previewScript.previewScript(false);
|
|
|
7
7
|
* These events can be changed safely. They're used by the content manager admin on one side, and by
|
|
8
8
|
* the preview script on the other. We own both ends, and they're not documented to users, so we can
|
|
9
9
|
* do what we want with them.
|
|
10
|
-
*/ scriptResponse.INTERNAL_EVENTS;
|
|
10
|
+
*/ const INTERNAL_EVENTS = scriptResponse.INTERNAL_EVENTS;
|
|
11
11
|
/**
|
|
12
12
|
* These events are documented to users, and will be hardcoded in their frontends.
|
|
13
13
|
* Changing any of these would be a breaking change.
|
|
@@ -17,5 +17,6 @@ const scriptResponse = previewScript.previewScript(false);
|
|
|
17
17
|
STRAPI_SCRIPT: 'strapiScript'
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
+
exports.INTERNAL_EVENTS = INTERNAL_EVENTS;
|
|
20
21
|
exports.PUBLIC_EVENTS = PUBLIC_EVENTS;
|
|
21
22
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT"],"mappings":";;;;AAEA,MAAMA,iBAAiBC,2BAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT"],"mappings":";;;;AAEA,MAAMA,iBAAiBC,2BAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,IACM,MAAMC,eAAkBF,GAAAA,cAAAA,CAAgBE;AAE/C;;;UAIaC,aAAgB,GAAA;IAC3BC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA;AACjB;;;;;"}
|
|
@@ -5,7 +5,7 @@ const scriptResponse = previewScript(false);
|
|
|
5
5
|
* These events can be changed safely. They're used by the content manager admin on one side, and by
|
|
6
6
|
* the preview script on the other. We own both ends, and they're not documented to users, so we can
|
|
7
7
|
* do what we want with them.
|
|
8
|
-
*/ scriptResponse.INTERNAL_EVENTS;
|
|
8
|
+
*/ const INTERNAL_EVENTS = scriptResponse.INTERNAL_EVENTS;
|
|
9
9
|
/**
|
|
10
10
|
* These events are documented to users, and will be hardcoded in their frontends.
|
|
11
11
|
* Changing any of these would be a breaking change.
|
|
@@ -15,5 +15,5 @@ const scriptResponse = previewScript(false);
|
|
|
15
15
|
STRAPI_SCRIPT: 'strapiScript'
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
export { PUBLIC_EVENTS };
|
|
18
|
+
export { INTERNAL_EVENTS, PUBLIC_EVENTS };
|
|
19
19
|
//# sourceMappingURL=constants.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT"],"mappings":";;AAEA,MAAMA,iBAAiBC,aAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT"],"mappings":";;AAEA,MAAMA,iBAAiBC,aAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,IACM,MAAMC,eAAkBF,GAAAA,cAAAA,CAAgBE;AAE/C;;;UAIaC,aAAgB,GAAA;IAC3BC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA;AACjB;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A function factory so we can generate a new sendMessage everytime we need one.
|
|
5
|
+
* We can't store and reuse a single sendMessage because it needs to have a stable identity
|
|
6
|
+
* as it used in a useEffect function. And we can't rely on useCallback because we need the
|
|
7
|
+
* up-to-date iframe ref, and this would make it stale (refs don't trigger callback reevaluations).
|
|
8
|
+
*/ function getSendMessage(iframe) {
|
|
9
|
+
return (type, payload)=>{
|
|
10
|
+
if (!iframe?.current) return;
|
|
11
|
+
const { origin } = new URL(iframe.current.src);
|
|
12
|
+
iframe.current.contentWindow?.postMessage({
|
|
13
|
+
type,
|
|
14
|
+
...payload !== undefined && {
|
|
15
|
+
payload
|
|
16
|
+
}
|
|
17
|
+
}, origin);
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
exports.getSendMessage = getSendMessage;
|
|
22
|
+
//# sourceMappingURL=getSendMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSendMessage.js","sources":["../../../../admin/src/preview/utils/getSendMessage.ts"],"sourcesContent":["import type { INTERNAL_EVENTS, PUBLIC_EVENTS } from './constants';\n\ntype MessageType =\n | (typeof INTERNAL_EVENTS)[keyof typeof INTERNAL_EVENTS]\n | (typeof PUBLIC_EVENTS)[keyof typeof PUBLIC_EVENTS];\n\n/**\n * A function factory so we can generate a new sendMessage everytime we need one.\n * We can't store and reuse a single sendMessage because it needs to have a stable identity\n * as it used in a useEffect function. And we can't rely on useCallback because we need the\n * up-to-date iframe ref, and this would make it stale (refs don't trigger callback reevaluations).\n */\nexport function getSendMessage(iframe: React.RefObject<HTMLIFrameElement> | undefined) {\n return (type: MessageType, payload?: unknown) => {\n if (!iframe?.current) return;\n\n const { origin } = new URL(iframe.current.src);\n\n iframe.current.contentWindow?.postMessage(\n {\n type,\n ...(payload !== undefined && { payload }),\n },\n origin\n );\n };\n}\n"],"names":["getSendMessage","iframe","type","payload","current","origin","URL","src","contentWindow","postMessage","undefined"],"mappings":";;AAMA;;;;;IAMO,SAASA,cAAAA,CAAeC,MAAsD,EAAA;AACnF,IAAA,OAAO,CAACC,IAAmBC,EAAAA,OAAAA,GAAAA;QACzB,IAAI,CAACF,QAAQG,OAAS,EAAA;QAEtB,MAAM,EAAEC,MAAM,EAAE,GAAG,IAAIC,GAAIL,CAAAA,MAAAA,CAAOG,OAAO,CAACG,GAAG,CAAA;AAE7CN,QAAAA,MAAAA,CAAOG,OAAO,CAACI,aAAa,EAAEC,WAC5B,CAAA;AACEP,YAAAA,IAAAA;AACA,YAAA,GAAIC,YAAYO,SAAa,IAAA;AAAEP,gBAAAA;;SAEjCE,EAAAA,MAAAA,CAAAA;AAEJ,KAAA;AACF;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A function factory so we can generate a new sendMessage everytime we need one.
|
|
3
|
+
* We can't store and reuse a single sendMessage because it needs to have a stable identity
|
|
4
|
+
* as it used in a useEffect function. And we can't rely on useCallback because we need the
|
|
5
|
+
* up-to-date iframe ref, and this would make it stale (refs don't trigger callback reevaluations).
|
|
6
|
+
*/ function getSendMessage(iframe) {
|
|
7
|
+
return (type, payload)=>{
|
|
8
|
+
if (!iframe?.current) return;
|
|
9
|
+
const { origin } = new URL(iframe.current.src);
|
|
10
|
+
iframe.current.contentWindow?.postMessage({
|
|
11
|
+
type,
|
|
12
|
+
...payload !== undefined && {
|
|
13
|
+
payload
|
|
14
|
+
}
|
|
15
|
+
}, origin);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { getSendMessage };
|
|
20
|
+
//# sourceMappingURL=getSendMessage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSendMessage.mjs","sources":["../../../../admin/src/preview/utils/getSendMessage.ts"],"sourcesContent":["import type { INTERNAL_EVENTS, PUBLIC_EVENTS } from './constants';\n\ntype MessageType =\n | (typeof INTERNAL_EVENTS)[keyof typeof INTERNAL_EVENTS]\n | (typeof PUBLIC_EVENTS)[keyof typeof PUBLIC_EVENTS];\n\n/**\n * A function factory so we can generate a new sendMessage everytime we need one.\n * We can't store and reuse a single sendMessage because it needs to have a stable identity\n * as it used in a useEffect function. And we can't rely on useCallback because we need the\n * up-to-date iframe ref, and this would make it stale (refs don't trigger callback reevaluations).\n */\nexport function getSendMessage(iframe: React.RefObject<HTMLIFrameElement> | undefined) {\n return (type: MessageType, payload?: unknown) => {\n if (!iframe?.current) return;\n\n const { origin } = new URL(iframe.current.src);\n\n iframe.current.contentWindow?.postMessage(\n {\n type,\n ...(payload !== undefined && { payload }),\n },\n origin\n );\n };\n}\n"],"names":["getSendMessage","iframe","type","payload","current","origin","URL","src","contentWindow","postMessage","undefined"],"mappings":"AAMA;;;;;IAMO,SAASA,cAAAA,CAAeC,MAAsD,EAAA;AACnF,IAAA,OAAO,CAACC,IAAmBC,EAAAA,OAAAA,GAAAA;QACzB,IAAI,CAACF,QAAQG,OAAS,EAAA;QAEtB,MAAM,EAAEC,MAAM,EAAE,GAAG,IAAIC,GAAIL,CAAAA,MAAAA,CAAOG,OAAO,CAACG,GAAG,CAAA;AAE7CN,QAAAA,MAAAA,CAAOG,OAAO,CAACI,aAAa,EAAEC,WAC5B,CAAA;AACEP,YAAAA,IAAAA;AACA,YAAA,GAAIC,YAAYO,SAAa,IAAA;AAAEP,gBAAAA;;SAEjCE,EAAAA,MAAAA,CAAAA;AAEJ,KAAA;AACF;;;;"}
|
|
@@ -7,8 +7,19 @@
|
|
|
7
7
|
* It's why many functions are defined within previewScript, it's the only way to avoid going full spaghetti.
|
|
8
8
|
* To get a better overview of everything previewScript does, go to the orchestration part at its end.
|
|
9
9
|
*/ const previewScript = (shouldRun = true)=>{
|
|
10
|
+
/* -----------------------------------------------------------------------------------------------
|
|
11
|
+
* Params
|
|
12
|
+
* ---------------------------------------------------------------------------------------------*/ const HIGHLIGHT_PADDING = 2; // in pixels
|
|
13
|
+
const HIGHLIGHT_HOVER_COLOR = window.STRAPI_HIGHLIGHT_HOVER_COLOR ?? '#4945ff'; // dark primary500
|
|
14
|
+
const HIGHLIGHT_ACTIVE_COLOR = window.STRAPI_HIGHLIGHT_ACTIVE_COLOR ?? '#7b79ff'; // dark primary600
|
|
15
|
+
const DISABLE_STEGA_DECODING = window.STRAPI_DISABLE_STEGA_DECODING ?? false;
|
|
16
|
+
const SOURCE_ATTRIBUTE = 'data-strapi-source';
|
|
17
|
+
const OVERLAY_ID = 'strapi-preview-overlay';
|
|
10
18
|
const INTERNAL_EVENTS = {
|
|
11
|
-
|
|
19
|
+
STRAPI_FIELD_FOCUS: 'strapiFieldFocus',
|
|
20
|
+
STRAPI_FIELD_BLUR: 'strapiFieldBlur',
|
|
21
|
+
STRAPI_FIELD_CHANGE: 'strapiFieldChange',
|
|
22
|
+
STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent'
|
|
12
23
|
};
|
|
13
24
|
/**
|
|
14
25
|
* Calling the function in no-run mode lets us retrieve the constants from other files and keep
|
|
@@ -19,9 +30,420 @@
|
|
|
19
30
|
INTERNAL_EVENTS
|
|
20
31
|
};
|
|
21
32
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
33
|
+
/* -----------------------------------------------------------------------------------------------
|
|
34
|
+
* Utils
|
|
35
|
+
* ---------------------------------------------------------------------------------------------*/ const sendMessage = (type, payload)=>{
|
|
36
|
+
window.parent.postMessage({
|
|
37
|
+
type,
|
|
38
|
+
payload
|
|
39
|
+
}, '*');
|
|
40
|
+
};
|
|
41
|
+
/* -----------------------------------------------------------------------------------------------
|
|
42
|
+
* Functionality pieces
|
|
43
|
+
* ---------------------------------------------------------------------------------------------*/ const setupStegaDOMObserver = async ()=>{
|
|
44
|
+
if (DISABLE_STEGA_DECODING) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const { vercelStegaDecode: stegaDecode, vercelStegaClean: stegaClean } = await import(// @ts-expect-error it's not a local dependency
|
|
48
|
+
// eslint-disable-next-line import/no-unresolved
|
|
49
|
+
'https://cdn.jsdelivr.net/npm/@vercel/stega@0.1.2/+esm');
|
|
50
|
+
const applyStegaToElement = (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
|
+
if (directTextContent) {
|
|
54
|
+
try {
|
|
55
|
+
const result = stegaDecode(directTextContent);
|
|
56
|
+
if (result) {
|
|
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
|
+
});
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
// Process all existing elements
|
|
72
|
+
const allElements = document.querySelectorAll('*');
|
|
73
|
+
Array.from(allElements).forEach(applyStegaToElement);
|
|
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
|
+
applyStegaToElement(element);
|
|
84
|
+
// Process all child elements
|
|
85
|
+
const childElements = element.querySelectorAll('*');
|
|
86
|
+
Array.from(childElements).forEach(applyStegaToElement);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Handle text content changes
|
|
91
|
+
if (mutation.type === 'characterData' && mutation.target.parentElement) {
|
|
92
|
+
applyStegaToElement(mutation.target.parentElement);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
observer.observe(document, {
|
|
97
|
+
childList: true,
|
|
98
|
+
subtree: true,
|
|
99
|
+
characterData: true
|
|
100
|
+
});
|
|
101
|
+
return observer;
|
|
102
|
+
};
|
|
103
|
+
const createOverlaySystem = ()=>{
|
|
104
|
+
// Clean up before creating a new overlay so we can safely call previewScript multiple times
|
|
105
|
+
window.__strapi_previewCleanup?.();
|
|
106
|
+
document.getElementById(OVERLAY_ID)?.remove();
|
|
107
|
+
const overlay = document.createElement('div');
|
|
108
|
+
overlay.id = OVERLAY_ID;
|
|
109
|
+
overlay.style.cssText = `
|
|
110
|
+
position: fixed;
|
|
111
|
+
top: 0;
|
|
112
|
+
left: 0;
|
|
113
|
+
width: 100%;
|
|
114
|
+
height: 100%;
|
|
115
|
+
pointer-events: none;
|
|
116
|
+
z-index: 9999;
|
|
117
|
+
`;
|
|
118
|
+
window.document.body.appendChild(overlay);
|
|
119
|
+
return overlay;
|
|
120
|
+
};
|
|
121
|
+
const createHighlightManager = (overlay)=>{
|
|
122
|
+
const elementsToHighlight = new Map();
|
|
123
|
+
const eventListeners = [];
|
|
124
|
+
const focusedHighlights = [];
|
|
125
|
+
let focusedField = null;
|
|
126
|
+
const drawHighlight = (target, highlight)=>{
|
|
127
|
+
if (!highlight) return;
|
|
128
|
+
const rect = target.getBoundingClientRect();
|
|
129
|
+
highlight.style.width = `${rect.width + HIGHLIGHT_PADDING * 2}px`;
|
|
130
|
+
highlight.style.height = `${rect.height + HIGHLIGHT_PADDING * 2}px`;
|
|
131
|
+
highlight.style.transform = `translate(${rect.left - HIGHLIGHT_PADDING}px, ${rect.top - HIGHLIGHT_PADDING}px)`;
|
|
132
|
+
};
|
|
133
|
+
const updateAllHighlights = ()=>{
|
|
134
|
+
elementsToHighlight.forEach((highlight, element)=>{
|
|
135
|
+
drawHighlight(element, highlight);
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
const createHighlightForElement = (element)=>{
|
|
139
|
+
if (elementsToHighlight.has(element)) {
|
|
140
|
+
// Already has a highlight
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const highlight = document.createElement('div');
|
|
144
|
+
highlight.style.cssText = `
|
|
145
|
+
position: absolute;
|
|
146
|
+
outline: 2px solid transparent;
|
|
147
|
+
pointer-events: none;
|
|
148
|
+
border-radius: 2px;
|
|
149
|
+
background-color: transparent;
|
|
150
|
+
will-change: transform;
|
|
151
|
+
transition: outline-color 0.1s ease-in-out;
|
|
152
|
+
`;
|
|
153
|
+
// Move hover detection to the underlying element
|
|
154
|
+
const mouseEnterHandler = ()=>{
|
|
155
|
+
if (!focusedHighlights.includes(highlight)) {
|
|
156
|
+
highlight.style.outlineColor = HIGHLIGHT_HOVER_COLOR;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
const mouseLeaveHandler = ()=>{
|
|
160
|
+
if (!focusedHighlights.includes(highlight)) {
|
|
161
|
+
highlight.style.outlineColor = 'transparent';
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const doubleClickHandler = ()=>{
|
|
165
|
+
const sourceAttribute = element.getAttribute(SOURCE_ATTRIBUTE);
|
|
166
|
+
if (sourceAttribute) {
|
|
167
|
+
const rect = element.getBoundingClientRect();
|
|
168
|
+
sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT, {
|
|
169
|
+
path: sourceAttribute,
|
|
170
|
+
position: {
|
|
171
|
+
top: rect.top,
|
|
172
|
+
left: rect.left,
|
|
173
|
+
right: rect.right,
|
|
174
|
+
bottom: rect.bottom,
|
|
175
|
+
width: rect.width,
|
|
176
|
+
height: rect.height
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const mouseDownHandler = (event)=>{
|
|
182
|
+
// Prevent default multi click to select behavior
|
|
183
|
+
if (event.detail >= 2) {
|
|
184
|
+
event.preventDefault();
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
element.addEventListener('mouseenter', mouseEnterHandler);
|
|
188
|
+
element.addEventListener('mouseleave', mouseLeaveHandler);
|
|
189
|
+
element.addEventListener('dblclick', doubleClickHandler);
|
|
190
|
+
element.addEventListener('mousedown', mouseDownHandler);
|
|
191
|
+
// Store event listeners for cleanup
|
|
192
|
+
eventListeners.push({
|
|
193
|
+
element,
|
|
194
|
+
type: 'mouseenter',
|
|
195
|
+
handler: mouseEnterHandler
|
|
196
|
+
}, {
|
|
197
|
+
element,
|
|
198
|
+
type: 'mouseleave',
|
|
199
|
+
handler: mouseLeaveHandler
|
|
200
|
+
}, {
|
|
201
|
+
element,
|
|
202
|
+
type: 'dblclick',
|
|
203
|
+
handler: doubleClickHandler
|
|
204
|
+
}, {
|
|
205
|
+
element,
|
|
206
|
+
type: 'mousedown',
|
|
207
|
+
handler: mouseDownHandler
|
|
208
|
+
});
|
|
209
|
+
elementsToHighlight.set(element, highlight);
|
|
210
|
+
overlay.appendChild(highlight);
|
|
211
|
+
drawHighlight(element, highlight);
|
|
212
|
+
};
|
|
213
|
+
const removeHighlightForElement = (element)=>{
|
|
214
|
+
const highlight = elementsToHighlight.get(element);
|
|
215
|
+
if (!highlight) return;
|
|
216
|
+
highlight.remove();
|
|
217
|
+
elementsToHighlight.delete(element);
|
|
218
|
+
// Remove event listeners for this element
|
|
219
|
+
const listenersToRemove = eventListeners.filter((listener)=>listener.element === element);
|
|
220
|
+
listenersToRemove.forEach(({ element, type, handler })=>{
|
|
221
|
+
element.removeEventListener(type, handler);
|
|
222
|
+
});
|
|
223
|
+
// Mutate eventListeners to remove listeners for this element
|
|
224
|
+
eventListeners.splice(0, eventListeners.length, ...eventListeners.filter((listener)=>listener.element !== element));
|
|
225
|
+
};
|
|
226
|
+
// Process all existing elements with source attributes
|
|
227
|
+
const initialElements = window.document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);
|
|
228
|
+
Array.from(initialElements).forEach((element)=>{
|
|
229
|
+
if (element instanceof HTMLElement) {
|
|
230
|
+
createHighlightForElement(element);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
return {
|
|
234
|
+
get elements () {
|
|
235
|
+
return Array.from(elementsToHighlight.keys());
|
|
236
|
+
},
|
|
237
|
+
get highlights () {
|
|
238
|
+
return Array.from(elementsToHighlight.values());
|
|
239
|
+
},
|
|
240
|
+
updateAllHighlights,
|
|
241
|
+
eventListeners,
|
|
242
|
+
focusedHighlights,
|
|
243
|
+
createHighlightForElement,
|
|
244
|
+
removeHighlightForElement,
|
|
245
|
+
setFocusedField: (field)=>{
|
|
246
|
+
focusedField = field;
|
|
247
|
+
},
|
|
248
|
+
getFocusedField: ()=>focusedField
|
|
249
|
+
};
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* We need to track scroll in all the element parents in order to keep the highlight position
|
|
253
|
+
* in sync with the element position. Listening to window scroll is not enough because the
|
|
254
|
+
* element can be inside one or more scrollable containers.
|
|
255
|
+
*/ const setupScrollManagement = (highlightManager)=>{
|
|
256
|
+
const updateOnScroll = ()=>{
|
|
257
|
+
highlightManager.updateAllHighlights();
|
|
258
|
+
};
|
|
259
|
+
const scrollableElements = new Set();
|
|
260
|
+
scrollableElements.add(window);
|
|
261
|
+
// Find all scrollable ancestors for all tracked elements and set up scroll listeners
|
|
262
|
+
highlightManager.elements.forEach((element)=>{
|
|
263
|
+
let parent = element.parentElement;
|
|
264
|
+
while(parent){
|
|
265
|
+
const computedStyle = window.getComputedStyle(parent);
|
|
266
|
+
const overflow = computedStyle.overflow + computedStyle.overflowX + computedStyle.overflowY;
|
|
267
|
+
if (overflow.includes('scroll') || overflow.includes('auto')) {
|
|
268
|
+
scrollableElements.add(parent);
|
|
269
|
+
}
|
|
270
|
+
parent = parent.parentElement;
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
// Add scroll listeners to all scrollable elements
|
|
274
|
+
scrollableElements.forEach((element)=>{
|
|
275
|
+
if (element === window) {
|
|
276
|
+
window.addEventListener('scroll', updateOnScroll);
|
|
277
|
+
window.addEventListener('resize', updateOnScroll);
|
|
278
|
+
} else {
|
|
279
|
+
element.addEventListener('scroll', updateOnScroll);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
const cleanup = ()=>{
|
|
283
|
+
scrollableElements.forEach((element)=>{
|
|
284
|
+
if (element === window) {
|
|
285
|
+
window.removeEventListener('scroll', updateOnScroll);
|
|
286
|
+
window.removeEventListener('resize', updateOnScroll);
|
|
287
|
+
} else {
|
|
288
|
+
element.removeEventListener('scroll', updateOnScroll);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
return {
|
|
293
|
+
cleanup
|
|
294
|
+
};
|
|
295
|
+
};
|
|
296
|
+
const setupObservers = (highlightManager, stegaObserver)=>{
|
|
297
|
+
const resizeObserver = new ResizeObserver(()=>{
|
|
298
|
+
highlightManager.updateAllHighlights();
|
|
299
|
+
});
|
|
300
|
+
const observeElementForResize = (element)=>{
|
|
301
|
+
resizeObserver.observe(element);
|
|
302
|
+
};
|
|
303
|
+
// Observe existing elements
|
|
304
|
+
highlightManager.elements.forEach(observeElementForResize);
|
|
305
|
+
resizeObserver.observe(document.documentElement);
|
|
306
|
+
// Create highlight observer to watch for new elements with source attributes
|
|
307
|
+
const highlightObserver = new MutationObserver((mutations)=>{
|
|
308
|
+
mutations.forEach((mutation)=>{
|
|
309
|
+
if (mutation.type === 'attributes' && mutation.attributeName === SOURCE_ATTRIBUTE) {
|
|
310
|
+
const target = mutation.target;
|
|
311
|
+
if (target.hasAttribute(SOURCE_ATTRIBUTE)) {
|
|
312
|
+
highlightManager.createHighlightForElement(target);
|
|
313
|
+
observeElementForResize(target);
|
|
314
|
+
} else {
|
|
315
|
+
highlightManager.removeHighlightForElement(target);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (mutation.type === 'childList') {
|
|
319
|
+
mutation.addedNodes.forEach((node)=>{
|
|
320
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
321
|
+
const element = node;
|
|
322
|
+
// Check if the added element has source attribute
|
|
323
|
+
if (element.hasAttribute(SOURCE_ATTRIBUTE) && element instanceof HTMLElement) {
|
|
324
|
+
highlightManager.createHighlightForElement(element);
|
|
325
|
+
observeElementForResize(element);
|
|
326
|
+
}
|
|
327
|
+
// Check all child elements for source attributes
|
|
328
|
+
const elementsWithSource = element.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);
|
|
329
|
+
Array.from(elementsWithSource).forEach((childElement)=>{
|
|
330
|
+
if (childElement instanceof HTMLElement) {
|
|
331
|
+
highlightManager.createHighlightForElement(childElement);
|
|
332
|
+
observeElementForResize(childElement);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
mutation.removedNodes.forEach((node)=>{
|
|
338
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
339
|
+
const element = node;
|
|
340
|
+
highlightManager.removeHighlightForElement(element);
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
highlightObserver.observe(document, {
|
|
347
|
+
childList: true,
|
|
348
|
+
subtree: true,
|
|
349
|
+
attributes: true,
|
|
350
|
+
attributeFilter: [
|
|
351
|
+
SOURCE_ATTRIBUTE
|
|
352
|
+
]
|
|
353
|
+
});
|
|
354
|
+
return {
|
|
355
|
+
resizeObserver,
|
|
356
|
+
highlightObserver,
|
|
357
|
+
stegaObserver
|
|
358
|
+
};
|
|
359
|
+
};
|
|
360
|
+
const setupEventHandlers = (highlightManager)=>{
|
|
361
|
+
const handleMessage = (event)=>{
|
|
362
|
+
if (!event.data?.type) return;
|
|
363
|
+
// The user typed in an input, reflect the change in the preview
|
|
364
|
+
if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_CHANGE) {
|
|
365
|
+
const { field, value } = event.data.payload;
|
|
366
|
+
if (!field) return;
|
|
367
|
+
const matchingElements = document.querySelectorAll(`[${SOURCE_ATTRIBUTE}="${field}"]`);
|
|
368
|
+
matchingElements.forEach((element)=>{
|
|
369
|
+
if (element instanceof HTMLElement) {
|
|
370
|
+
element.textContent = value || '';
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
// Update highlight dimensions since the new text content may affect them
|
|
374
|
+
highlightManager.updateAllHighlights();
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
// The user focused a new input, update the highlights in the preview
|
|
378
|
+
if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS) {
|
|
379
|
+
const { field } = event.data.payload;
|
|
380
|
+
if (!field) return;
|
|
381
|
+
// Clear existing focused highlights
|
|
382
|
+
highlightManager.focusedHighlights.forEach((highlight)=>{
|
|
383
|
+
highlight.style.outlineColor = 'transparent';
|
|
384
|
+
});
|
|
385
|
+
highlightManager.focusedHighlights.length = 0;
|
|
386
|
+
// Set new focused field and highlight matching elements
|
|
387
|
+
highlightManager.setFocusedField(field);
|
|
388
|
+
const matchingElements = document.querySelectorAll(`[${SOURCE_ATTRIBUTE}="${field}"]`);
|
|
389
|
+
matchingElements.forEach((element)=>{
|
|
390
|
+
const highlight = highlightManager.highlights[Array.from(highlightManager.elements).indexOf(element)];
|
|
391
|
+
if (highlight) {
|
|
392
|
+
highlight.style.outlineColor = HIGHLIGHT_ACTIVE_COLOR;
|
|
393
|
+
highlight.style.outlineWidth = '3px';
|
|
394
|
+
highlightManager.focusedHighlights.push(highlight);
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
// The user is no longer focusing an input, remove the highlights
|
|
400
|
+
if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_BLUR) {
|
|
401
|
+
const { field } = event.data.payload;
|
|
402
|
+
if (field !== highlightManager.getFocusedField()) return;
|
|
403
|
+
highlightManager.focusedHighlights.forEach((highlight)=>{
|
|
404
|
+
highlight.style.outlineColor = 'transparent';
|
|
405
|
+
highlight.style.outlineWidth = '2px';
|
|
406
|
+
});
|
|
407
|
+
highlightManager.focusedHighlights.length = 0;
|
|
408
|
+
highlightManager.setFocusedField(null);
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
window.addEventListener('message', handleMessage);
|
|
412
|
+
// Add the message handler to the cleanup list
|
|
413
|
+
const messageEventListener = {
|
|
414
|
+
element: window,
|
|
415
|
+
type: 'message',
|
|
416
|
+
handler: handleMessage
|
|
417
|
+
};
|
|
418
|
+
return [
|
|
419
|
+
...highlightManager.eventListeners,
|
|
420
|
+
messageEventListener
|
|
421
|
+
];
|
|
422
|
+
};
|
|
423
|
+
const createCleanupSystem = (overlay, observers, scrollManager, eventHandlers)=>{
|
|
424
|
+
window.__strapi_previewCleanup = ()=>{
|
|
425
|
+
observers.resizeObserver.disconnect();
|
|
426
|
+
observers.highlightObserver.disconnect();
|
|
427
|
+
observers.stegaObserver?.disconnect();
|
|
428
|
+
// Clean up scroll listeners
|
|
429
|
+
scrollManager.cleanup();
|
|
430
|
+
// Remove highlight event listeners
|
|
431
|
+
eventHandlers.forEach(({ element, type, handler })=>{
|
|
432
|
+
element.removeEventListener(type, handler);
|
|
433
|
+
});
|
|
434
|
+
overlay.remove();
|
|
435
|
+
};
|
|
436
|
+
};
|
|
437
|
+
/* -----------------------------------------------------------------------------------------------
|
|
438
|
+
* Orchestration
|
|
439
|
+
* ---------------------------------------------------------------------------------------------*/ setupStegaDOMObserver().then((stegaObserver)=>{
|
|
440
|
+
const overlay = createOverlaySystem();
|
|
441
|
+
const highlightManager = createHighlightManager(overlay);
|
|
442
|
+
const observers = setupObservers(highlightManager, stegaObserver);
|
|
443
|
+
const scrollManager = setupScrollManagement(highlightManager);
|
|
444
|
+
const eventHandlers = setupEventHandlers(highlightManager);
|
|
445
|
+
createCleanupSystem(overlay, observers, scrollManager, eventHandlers);
|
|
446
|
+
});
|
|
25
447
|
};
|
|
26
448
|
|
|
27
449
|
exports.previewScript = previewScript;
|
|
@@ -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}\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 const INTERNAL_EVENTS = {\n DUMMY_EVENT: 'dummyEvent',\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 // Live Preview logic will go here.\n // eslint-disable-next-line no-console\n console.log('Preview script running');\n};\n\nexport { previewScript };\n"],"names":["previewScript","shouldRun","INTERNAL_EVENTS","DUMMY_EVENT","console","log"],"mappings":";;AAAA;AAKA;;;;;AAKC,IACKA,MAAAA,aAAAA,GAAgB,CAACC,SAAAA,GAAY,IAAI,GAAA;AACrC,IAAA,MAAMC,eAAkB,GAAA;QACtBC,WAAa,EAAA;AACf,KAAA;AAEA;;;;MAKA,IAAI,CAACF,SAAW,EAAA;QACd,OAAO;AAAEC,YAAAA;AAAgB,SAAA;AAC3B;;;AAIAE,IAAAA,OAAAA,CAAQC,GAAG,CAAC,wBAAA,CAAA;AACd;;;;"}
|
|
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 applyStegaToElement = (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(applyStegaToElement);\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 applyStegaToElement(element);\n // Process all child elements\n const childElements = element.querySelectorAll('*');\n Array.from(childElements).forEach(applyStegaToElement);\n }\n });\n }\n\n // Handle text content changes\n if (mutation.type === 'characterData' && mutation.target.parentElement) {\n applyStegaToElement(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 elementsToHighlight = 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 elementsToHighlight.forEach((highlight, element) => {\n drawHighlight(element, highlight);\n });\n };\n\n const createHighlightForElement = (element: HTMLElement) => {\n if (elementsToHighlight.has(element)) {\n // Already has a highlight\n return;\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 elementsToHighlight.set(element, highlight);\n overlay.appendChild(highlight);\n drawHighlight(element, highlight);\n };\n\n const removeHighlightForElement = (element: Element) => {\n const highlight = elementsToHighlight.get(element);\n\n if (!highlight) return;\n\n highlight.remove();\n elementsToHighlight.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(elementsToHighlight.keys());\n },\n get highlights() {\n return Array.from(elementsToHighlight.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 /**\n * We need to track scroll in all the element parents in order to keep the highlight position\n * in sync with the element position. Listening to window scroll is not enough because the\n * element can be inside one or more scrollable containers.\n */\n const setupScrollManagement = (highlightManager: HighlightManager) => {\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 and set up scroll listeners\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 const cleanup = () => {\n scrollableElements.forEach((element) => {\n if (element === window) {\n window.removeEventListener('scroll', updateOnScroll);\n window.removeEventListener('resize', updateOnScroll);\n } else {\n (element as Element).removeEventListener('scroll', updateOnScroll);\n }\n });\n };\n\n return { cleanup };\n };\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 return {\n resizeObserver,\n highlightObserver,\n stegaObserver,\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 scrollManager: ReturnType<typeof setupScrollManagement>,\n eventHandlers: EventListenersList\n ) => {\n window.__strapi_previewCleanup = () => {\n observers.resizeObserver.disconnect();\n observers.highlightObserver.disconnect();\n observers.stegaObserver?.disconnect();\n\n // Clean up scroll listeners\n scrollManager.cleanup();\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 scrollManager = setupScrollManagement(highlightManager);\n const eventHandlers = setupEventHandlers(highlightManager);\n createCleanupSystem(overlay, observers, scrollManager, 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","applyStegaToElement","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","elementsToHighlight","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","setupScrollManagement","highlightManager","updateOnScroll","scrollableElements","Set","add","computedStyle","getComputedStyle","overflow","overflowX","overflowY","cleanup","setupObservers","stegaObserver","resizeObserver","ResizeObserver","observeElementForResize","documentElement","highlightObserver","attributeName","hasAttribute","elementsWithSource","childElement","removedNodes","attributes","attributeFilter","setupEventHandlers","handleMessage","data","value","matchingElements","indexOf","outlineWidth","messageEventListener","createCleanupSystem","observers","scrollManager","eventHandlers","disconnect","then"],"mappings":"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"}
|