@strapi/content-manager 0.0.0-experimental.ae2010c73ea60e398b726874a9b7b2bf3faada51 → 0.0.0-experimental.ae51b136d065d25740e6d2aa634b3dfec5824476

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/dist/admin/components/LeftMenu.js +13 -15
  2. package/dist/admin/components/LeftMenu.js.map +1 -1
  3. package/dist/admin/components/LeftMenu.mjs +14 -16
  4. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  5. package/dist/admin/components/Widgets.js +267 -9
  6. package/dist/admin/components/Widgets.js.map +1 -1
  7. package/dist/admin/components/Widgets.mjs +250 -12
  8. package/dist/admin/components/Widgets.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionContent.js +24 -3
  10. package/dist/admin/history/components/VersionContent.js.map +1 -1
  11. package/dist/admin/history/components/VersionContent.mjs +25 -4
  12. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocumentActions.js +5 -5
  14. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  15. package/dist/admin/hooks/useDocumentActions.mjs +6 -6
  16. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  17. package/dist/admin/index.js +47 -8
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +47 -9
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/layout.js +1 -27
  22. package/dist/admin/layout.js.map +1 -1
  23. package/dist/admin/layout.mjs +2 -9
  24. package/dist/admin/layout.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/EditViewPage.js +27 -17
  26. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  27. package/dist/admin/pages/EditView/EditViewPage.mjs +29 -19
  28. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/components/Blocker.js +18 -0
  30. package/dist/admin/pages/EditView/components/Blocker.js.map +1 -0
  31. package/dist/admin/pages/EditView/components/Blocker.mjs +16 -0
  32. package/dist/admin/pages/EditView/components/Blocker.mjs.map +1 -0
  33. package/dist/admin/pages/EditView/components/DocumentActions.js +74 -63
  34. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/DocumentActions.mjs +76 -65
  36. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +12 -1
  38. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +13 -2
  40. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +13 -2
  42. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +14 -3
  44. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +18 -5
  46. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +20 -7
  48. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +1 -0
  50. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +1 -0
  52. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +156 -105
  54. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +159 -108
  56. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
  58. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
  60. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormLayout.js +27 -3
  62. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormLayout.mjs +27 -3
  64. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/InputRenderer.js +20 -7
  66. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/InputRenderer.mjs +20 -7
  68. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/utils/data.js +128 -0
  70. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  71. package/dist/admin/pages/EditView/utils/data.mjs +128 -1
  72. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  73. package/dist/admin/pages/ListView/ListViewPage.js +221 -203
  74. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  75. package/dist/admin/pages/ListView/ListViewPage.mjs +222 -204
  76. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  77. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +12 -2
  78. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  79. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +12 -2
  80. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  81. package/dist/admin/pages/ListView/components/Filters.js +3 -1
  82. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  83. package/dist/admin/pages/ListView/components/Filters.mjs +3 -1
  84. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  85. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  86. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  87. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  88. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  89. package/dist/admin/preview/components/InputPopover.js +165 -0
  90. package/dist/admin/preview/components/InputPopover.js.map +1 -0
  91. package/dist/admin/preview/components/InputPopover.mjs +143 -0
  92. package/dist/admin/preview/components/InputPopover.mjs.map +1 -0
  93. package/dist/admin/preview/components/PreviewHeader.js +0 -1
  94. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  95. package/dist/admin/preview/components/PreviewHeader.mjs +0 -1
  96. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  97. package/dist/admin/preview/components/PreviewSidePanel.js +31 -4
  98. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  99. package/dist/admin/preview/components/PreviewSidePanel.mjs +32 -5
  100. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  101. package/dist/admin/preview/hooks/usePreviewInputManager.js +77 -0
  102. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -0
  103. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +56 -0
  104. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -0
  105. package/dist/admin/preview/pages/Preview.js +172 -68
  106. package/dist/admin/preview/pages/Preview.js.map +1 -1
  107. package/dist/admin/preview/pages/Preview.mjs +174 -70
  108. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  109. package/dist/admin/preview/utils/constants.js +22 -0
  110. package/dist/admin/preview/utils/constants.js.map +1 -0
  111. package/dist/admin/preview/utils/constants.mjs +19 -0
  112. package/dist/admin/preview/utils/constants.mjs.map +1 -0
  113. package/dist/admin/preview/utils/fieldUtils.js +98 -0
  114. package/dist/admin/preview/utils/fieldUtils.js.map +1 -0
  115. package/dist/admin/preview/utils/fieldUtils.mjs +94 -0
  116. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -0
  117. package/dist/admin/preview/utils/getSendMessage.js +22 -0
  118. package/dist/admin/preview/utils/getSendMessage.js.map +1 -0
  119. package/dist/admin/preview/utils/getSendMessage.mjs +20 -0
  120. package/dist/admin/preview/utils/getSendMessage.mjs.map +1 -0
  121. package/dist/admin/preview/utils/previewScript.js +452 -0
  122. package/dist/admin/preview/utils/previewScript.js.map +1 -0
  123. package/dist/admin/preview/utils/previewScript.mjs +450 -0
  124. package/dist/admin/preview/utils/previewScript.mjs.map +1 -0
  125. package/dist/admin/services/api.js +4 -1
  126. package/dist/admin/services/api.js.map +1 -1
  127. package/dist/admin/services/api.mjs +4 -1
  128. package/dist/admin/services/api.mjs.map +1 -1
  129. package/dist/admin/services/documents.js +42 -16
  130. package/dist/admin/services/documents.js.map +1 -1
  131. package/dist/admin/services/documents.mjs +42 -16
  132. package/dist/admin/services/documents.mjs.map +1 -1
  133. package/dist/admin/src/components/Widgets.d.ts +2 -1
  134. package/dist/admin/src/exports.d.ts +1 -0
  135. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  136. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  137. package/dist/admin/src/pages/EditView/components/Blocker.d.ts +5 -0
  138. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  139. package/dist/admin/src/pages/EditView/utils/data.d.ts +19 -1
  140. package/dist/admin/src/preview/components/InputPopover.d.ts +6 -0
  141. package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +5 -0
  142. package/dist/admin/src/preview/pages/Preview.d.ts +12 -0
  143. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  144. package/dist/admin/src/preview/utils/constants.d.ts +20 -0
  145. package/dist/admin/src/preview/utils/fieldUtils.d.ts +16 -0
  146. package/dist/admin/src/preview/utils/getSendMessage.d.ts +11 -0
  147. package/dist/admin/src/preview/utils/previewScript.d.ts +23 -0
  148. package/dist/admin/src/services/api.d.ts +1 -1
  149. package/dist/admin/src/services/components.d.ts +2 -2
  150. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  151. package/dist/admin/src/services/documents.d.ts +23 -17
  152. package/dist/admin/src/services/homepage.d.ts +1 -1
  153. package/dist/admin/src/services/init.d.ts +1 -1
  154. package/dist/admin/src/services/relations.d.ts +2 -2
  155. package/dist/admin/src/services/uid.d.ts +3 -3
  156. package/dist/admin/src/utils/api.d.ts +1 -1
  157. package/dist/admin/src/utils/validation.d.ts +1 -0
  158. package/dist/admin/translations/en.json.js +6 -0
  159. package/dist/admin/translations/en.json.js.map +1 -1
  160. package/dist/admin/translations/en.json.mjs +6 -0
  161. package/dist/admin/translations/en.json.mjs.map +1 -1
  162. package/dist/admin/translations/es.json.js +5 -2
  163. package/dist/admin/translations/es.json.js.map +1 -1
  164. package/dist/admin/translations/es.json.mjs +5 -2
  165. package/dist/admin/translations/es.json.mjs.map +1 -1
  166. package/dist/admin/translations/fr.json.js +10 -2
  167. package/dist/admin/translations/fr.json.js.map +1 -1
  168. package/dist/admin/translations/fr.json.mjs +10 -2
  169. package/dist/admin/translations/fr.json.mjs.map +1 -1
  170. package/dist/admin/utils/api.js +1 -1
  171. package/dist/admin/utils/api.js.map +1 -1
  172. package/dist/admin/utils/api.mjs +1 -1
  173. package/dist/admin/utils/api.mjs.map +1 -1
  174. package/dist/admin/utils/validation.js +18 -6
  175. package/dist/admin/utils/validation.js.map +1 -1
  176. package/dist/admin/utils/validation.mjs +18 -6
  177. package/dist/admin/utils/validation.mjs.map +1 -1
  178. package/dist/server/controllers/relations.js +2 -2
  179. package/dist/server/controllers/relations.js.map +1 -1
  180. package/dist/server/controllers/relations.mjs +2 -2
  181. package/dist/server/controllers/relations.mjs.map +1 -1
  182. package/dist/server/history/services/lifecycles.js +20 -19
  183. package/dist/server/history/services/lifecycles.js.map +1 -1
  184. package/dist/server/history/services/lifecycles.mjs +20 -19
  185. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  186. package/dist/server/homepage/controllers/homepage.js +5 -0
  187. package/dist/server/homepage/controllers/homepage.js.map +1 -1
  188. package/dist/server/homepage/controllers/homepage.mjs +5 -0
  189. package/dist/server/homepage/controllers/homepage.mjs.map +1 -1
  190. package/dist/server/homepage/routes/homepage.js +11 -0
  191. package/dist/server/homepage/routes/homepage.js.map +1 -1
  192. package/dist/server/homepage/routes/homepage.mjs +11 -0
  193. package/dist/server/homepage/routes/homepage.mjs.map +1 -1
  194. package/dist/server/homepage/services/homepage.js +86 -46
  195. package/dist/server/homepage/services/homepage.js.map +1 -1
  196. package/dist/server/homepage/services/homepage.mjs +86 -46
  197. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  198. package/dist/server/preview/services/preview-config.js +5 -1
  199. package/dist/server/preview/services/preview-config.js.map +1 -1
  200. package/dist/server/preview/services/preview-config.mjs +5 -1
  201. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  202. package/dist/server/preview/services/preview.js +4 -0
  203. package/dist/server/preview/services/preview.js.map +1 -1
  204. package/dist/server/preview/services/preview.mjs +4 -0
  205. package/dist/server/preview/services/preview.mjs.map +1 -1
  206. package/dist/server/services/document-manager.js +3 -0
  207. package/dist/server/services/document-manager.js.map +1 -1
  208. package/dist/server/services/document-manager.mjs +3 -0
  209. package/dist/server/services/document-manager.mjs.map +1 -1
  210. package/dist/server/services/document-metadata.js +1 -1
  211. package/dist/server/services/document-metadata.js.map +1 -1
  212. package/dist/server/services/document-metadata.mjs +1 -1
  213. package/dist/server/services/document-metadata.mjs.map +1 -1
  214. package/dist/server/services/utils/populate.js +11 -0
  215. package/dist/server/services/utils/populate.js.map +1 -1
  216. package/dist/server/services/utils/populate.mjs +11 -0
  217. package/dist/server/services/utils/populate.mjs.map +1 -1
  218. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  219. package/dist/server/src/homepage/controllers/homepage.d.ts +2 -1
  220. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  221. package/dist/server/src/homepage/index.d.ts +7 -0
  222. package/dist/server/src/homepage/index.d.ts.map +1 -1
  223. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -1
  224. package/dist/server/src/homepage/services/homepage.d.ts +4 -1
  225. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  226. package/dist/server/src/homepage/services/index.d.ts +7 -0
  227. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  228. package/dist/server/src/index.d.ts +7 -0
  229. package/dist/server/src/index.d.ts.map +1 -1
  230. package/dist/server/src/preview/services/index.d.ts +1 -0
  231. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  232. package/dist/server/src/preview/services/preview-config.d.ts +1 -0
  233. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  234. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  235. package/dist/server/src/preview/utils.d.ts +1 -0
  236. package/dist/server/src/preview/utils.d.ts.map +1 -1
  237. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  238. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  239. package/dist/server/src/services/index.d.ts +7 -0
  240. package/dist/server/src/services/index.d.ts.map +1 -1
  241. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  242. package/dist/shared/contracts/collection-types.d.ts +0 -1
  243. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  244. package/dist/shared/contracts/homepage.d.ts +13 -0
  245. package/dist/shared/contracts/homepage.d.ts.map +1 -1
  246. package/package.json +7 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldUtils.js","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part, index, array) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: any\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new Error('Invalid field path');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new Error('Relations not handled');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new Error('Invalid field path');\n }\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name][currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(remainingParts, componentAttributes, currentData[currentPart.name]);\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new Error('Invalid field path');\n }\n\n const componentData = currentData[currentPart.name][currentPart.index];\n const componentAttributes = components[componentData.__component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const url = new URL(strapiSource);\n const path = url.searchParams.get('path');\n const type = url.searchParams.get('type');\n const documentId = url.searchParams.get('documentId');\n const locale = url.searchParams.get('locale');\n const model = url.searchParams.get('model');\n const kind = url.searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind as Struct.ContentTypeKind | undefined,\n };\n}\n"],"names":["parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","name","index","reduce","acc","array","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","Error","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","url","URL","searchParams","get","documentId","locale","model","kind"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ // Helper function to parse path with array indices and return clean attribute names
2
+ const parsePathWithIndices = (path)=>{
3
+ // Split by dots, then parse array indices from each part. For example:
4
+ // input "components.4.field.relations.2.name"
5
+ // output [{name: "components", index: 4}, {name: "field"}, {name: "relations", index: 2}, {name: "name"}]
6
+ return path.split('.').map((part)=>{
7
+ const numericIndex = parseInt(part, 10);
8
+ if (!isNaN(numericIndex) && part === numericIndex.toString()) {
9
+ // This part is a pure numeric index, return it as an index for the previous part
10
+ return {
11
+ name: '',
12
+ index: numericIndex
13
+ };
14
+ }
15
+ return {
16
+ name: part
17
+ };
18
+ }).reduce((acc, part, index, array)=>{
19
+ if (part.name === '' && part.index !== undefined) {
20
+ // This is an index, attach it to the previous part
21
+ if (acc.length > 0) {
22
+ acc[acc.length - 1].index = part.index;
23
+ }
24
+ } else {
25
+ acc.push(part);
26
+ }
27
+ return acc;
28
+ }, []);
29
+ };
30
+ function getAttributeSchemaFromPath({ path, schema, components, document }) {
31
+ /**
32
+ * Create the function that will be recursively called.
33
+ * We don't do recursion on getAttributeSchemaFromPath itself because:
34
+ * - it takes a path string, not the parsed array that's better for recursion
35
+ * - even when several levels deep, we still need access to the root schema and components
36
+ */ const visitor = (currentPathParts, currentAttributes, currentData)=>{
37
+ const [currentPart, ...remainingParts] = currentPathParts;
38
+ // Get the data and schema for the current path
39
+ const currentAttribute = currentAttributes[currentPart.name];
40
+ if (!currentAttribute) {
41
+ throw new Error('Invalid field path');
42
+ }
43
+ if (currentAttribute.type === 'relation') {
44
+ throw new Error('Relations not handled');
45
+ }
46
+ if (currentAttribute.type === 'component') {
47
+ const componentAttributes = components[currentAttribute.component].attributes;
48
+ if (currentAttribute.repeatable) {
49
+ // We must have the index, otherwise we don't know what data to use
50
+ if (currentPart.index === undefined) {
51
+ throw new Error('Invalid field path');
52
+ }
53
+ return visitor(remainingParts, componentAttributes, currentData[currentPart.name][currentPart.index]);
54
+ }
55
+ // Non repeatable component
56
+ return visitor(remainingParts, componentAttributes, currentData[currentPart.name]);
57
+ }
58
+ if (currentAttribute.type === 'dynamiczone') {
59
+ // We must have the index, otherwise we don't know what component we're dealing with
60
+ if (currentPart.index === undefined) {
61
+ throw new Error('Invalid field path');
62
+ }
63
+ const componentData = currentData[currentPart.name][currentPart.index];
64
+ const componentAttributes = components[componentData.__component].attributes;
65
+ return visitor(remainingParts, componentAttributes, componentData);
66
+ }
67
+ // Plain regular field. It ends the recursion
68
+ return currentAttributes[currentPart.name];
69
+ };
70
+ return visitor(parsePathWithIndices(path), schema.attributes, document);
71
+ }
72
+ function parseFieldMetaData(strapiSource) {
73
+ const url = new URL(strapiSource);
74
+ const path = url.searchParams.get('path');
75
+ const type = url.searchParams.get('type');
76
+ const documentId = url.searchParams.get('documentId');
77
+ const locale = url.searchParams.get('locale');
78
+ const model = url.searchParams.get('model');
79
+ const kind = url.searchParams.get('kind');
80
+ if (!path || !type || !documentId || !model) {
81
+ return null;
82
+ }
83
+ return {
84
+ path,
85
+ type: type,
86
+ documentId,
87
+ locale: locale ?? null,
88
+ model: model,
89
+ kind: kind
90
+ };
91
+ }
92
+
93
+ export { getAttributeSchemaFromPath, parseFieldMetaData, parsePathWithIndices };
94
+ //# sourceMappingURL=fieldUtils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldUtils.mjs","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part, index, array) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: any\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new Error('Invalid field path');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new Error('Relations not handled');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new Error('Invalid field path');\n }\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name][currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(remainingParts, componentAttributes, currentData[currentPart.name]);\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new Error('Invalid field path');\n }\n\n const componentData = currentData[currentPart.name][currentPart.index];\n const componentAttributes = components[componentData.__component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const url = new URL(strapiSource);\n const path = url.searchParams.get('path');\n const type = url.searchParams.get('type');\n const documentId = url.searchParams.get('documentId');\n const locale = url.searchParams.get('locale');\n const model = url.searchParams.get('model');\n const kind = url.searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind as Struct.ContentTypeKind | undefined,\n };\n}\n"],"names":["parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","name","index","reduce","acc","array","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","Error","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","url","URL","searchParams","get","documentId","locale","model","kind"],"mappings":"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"}
@@ -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;;;;"}
@@ -0,0 +1,452 @@
1
+ 'use strict';
2
+
3
+ // NOTE: This override is for the properties on _user's site_, it's not about Strapi Admin.
4
+ /**
5
+ * previewScript will be injected into the preview iframe after being stringified.
6
+ * Therefore it CANNOT use any imports, or refer to any variables outside of its own scope.
7
+ * It's why many functions are defined within previewScript, it's the only way to avoid going full spaghetti.
8
+ * To get a better overview of everything previewScript does, go to the orchestration part at its end.
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';
18
+ const INTERNAL_EVENTS = {
19
+ STRAPI_FIELD_FOCUS: 'strapiFieldFocus',
20
+ STRAPI_FIELD_BLUR: 'strapiFieldBlur',
21
+ STRAPI_FIELD_CHANGE: 'strapiFieldChange',
22
+ STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent'
23
+ };
24
+ /**
25
+ * Calling the function in no-run mode lets us retrieve the constants from other files and keep
26
+ * a single source of truth for them. It's the only way to do this because this script can't
27
+ * refer to any variables outside of its own scope, because it's stringified before it's run.
28
+ */ if (!shouldRun) {
29
+ return {
30
+ INTERNAL_EVENTS
31
+ };
32
+ }
33
+ /* -----------------------------------------------------------------------------------------------
34
+ * Utils
35
+ * ---------------------------------------------------------------------------------------------*/ const sendMessage = (type, payload)=>{
36
+ window.parent.postMessage({
37
+ type,
38
+ payload
39
+ }, '*');
40
+ };
41
+ const getElementsByPath = (path)=>{
42
+ return document.querySelectorAll(`[${SOURCE_ATTRIBUTE}*="path=${path}"]`);
43
+ };
44
+ /* -----------------------------------------------------------------------------------------------
45
+ * Functionality pieces
46
+ * ---------------------------------------------------------------------------------------------*/ const setupStegaDOMObserver = async ()=>{
47
+ if (DISABLE_STEGA_DECODING) {
48
+ return;
49
+ }
50
+ const { vercelStegaDecode: stegaDecode, vercelStegaClean: stegaClean } = await import(// @ts-expect-error it's not a local dependency
51
+ // eslint-disable-next-line import/no-unresolved
52
+ 'https://cdn.jsdelivr.net/npm/@vercel/stega@0.1.2/+esm');
53
+ const processElementForStega = (element)=>{
54
+ const directTextNodes = Array.from(element.childNodes).filter((node)=>node.nodeType === Node.TEXT_NODE);
55
+ const directTextContent = directTextNodes.map((node)=>node.textContent || '').join('');
56
+ if (directTextContent) {
57
+ try {
58
+ const result = stegaDecode(directTextContent);
59
+ if (result && 'strapiSource' in result) {
60
+ element.setAttribute(SOURCE_ATTRIBUTE, result.strapiSource);
61
+ // Remove encoded part from DOM text content (to avoid breaking links for example)
62
+ directTextNodes.forEach((node)=>{
63
+ if (node.textContent) {
64
+ const cleanedText = stegaClean(node.textContent);
65
+ if (cleanedText !== node.textContent) {
66
+ node.textContent = cleanedText;
67
+ }
68
+ }
69
+ });
70
+ }
71
+ } catch (error) {}
72
+ }
73
+ };
74
+ // Process all existing elements
75
+ const allElements = document.querySelectorAll('*');
76
+ Array.from(allElements).forEach(processElementForStega);
77
+ // Create observer for new elements and text changes
78
+ const observer = new MutationObserver((mutations)=>{
79
+ mutations.forEach((mutation)=>{
80
+ // Handle added nodes
81
+ if (mutation.type === 'childList') {
82
+ mutation.addedNodes.forEach((node)=>{
83
+ if (node.nodeType === Node.ELEMENT_NODE) {
84
+ const element = node;
85
+ // Process the added element
86
+ processElementForStega(element);
87
+ // Process all child elements
88
+ const childElements = element.querySelectorAll('*');
89
+ Array.from(childElements).forEach(processElementForStega);
90
+ }
91
+ });
92
+ }
93
+ // Handle text content changes
94
+ if (mutation.type === 'characterData' && mutation.target.parentElement) {
95
+ processElementForStega(mutation.target.parentElement);
96
+ }
97
+ });
98
+ });
99
+ observer.observe(document, {
100
+ childList: true,
101
+ subtree: true,
102
+ characterData: true
103
+ });
104
+ return observer;
105
+ };
106
+ const createOverlaySystem = ()=>{
107
+ // Clean up before creating a new overlay so we can safely call previewScript multiple times
108
+ window.__strapi_previewCleanup?.();
109
+ document.getElementById(OVERLAY_ID)?.remove();
110
+ const overlay = document.createElement('div');
111
+ overlay.id = OVERLAY_ID;
112
+ overlay.style.cssText = `
113
+ position: fixed;
114
+ top: 0;
115
+ left: 0;
116
+ width: 100%;
117
+ height: 100%;
118
+ pointer-events: none;
119
+ z-index: 9999;
120
+ `;
121
+ window.document.body.appendChild(overlay);
122
+ return overlay;
123
+ };
124
+ const createHighlightManager = (overlay)=>{
125
+ const elementToHighlight = new Map();
126
+ const eventListeners = [];
127
+ const focusedHighlights = [];
128
+ let focusedField = null;
129
+ const drawHighlight = (target, highlight)=>{
130
+ if (!highlight) return;
131
+ const rect = target.getBoundingClientRect();
132
+ highlight.style.width = `${rect.width + HIGHLIGHT_PADDING * 2}px`;
133
+ highlight.style.height = `${rect.height + HIGHLIGHT_PADDING * 2}px`;
134
+ highlight.style.transform = `translate(${rect.left - HIGHLIGHT_PADDING}px, ${rect.top - HIGHLIGHT_PADDING}px)`;
135
+ };
136
+ const updateAllHighlights = ()=>{
137
+ elementToHighlight.forEach((highlight, element)=>{
138
+ drawHighlight(element, highlight);
139
+ });
140
+ };
141
+ const createHighlightForElement = (element)=>{
142
+ if (elementToHighlight.has(element)) {
143
+ return; // Already has a highlight
144
+ }
145
+ const highlight = document.createElement('div');
146
+ highlight.style.cssText = `
147
+ position: absolute;
148
+ outline: 2px solid transparent;
149
+ pointer-events: none;
150
+ border-radius: 2px;
151
+ background-color: transparent;
152
+ will-change: transform;
153
+ transition: outline-color 0.1s ease-in-out;
154
+ `;
155
+ // Move hover detection to the underlying element
156
+ const mouseEnterHandler = ()=>{
157
+ if (!focusedHighlights.includes(highlight)) {
158
+ highlight.style.outlineColor = HIGHLIGHT_HOVER_COLOR;
159
+ }
160
+ };
161
+ const mouseLeaveHandler = ()=>{
162
+ if (!focusedHighlights.includes(highlight)) {
163
+ highlight.style.outlineColor = 'transparent';
164
+ }
165
+ };
166
+ const doubleClickHandler = ()=>{
167
+ const sourceAttribute = element.getAttribute(SOURCE_ATTRIBUTE);
168
+ if (sourceAttribute) {
169
+ const rect = element.getBoundingClientRect();
170
+ sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT, {
171
+ path: sourceAttribute,
172
+ position: {
173
+ top: rect.top,
174
+ left: rect.left,
175
+ right: rect.right,
176
+ bottom: rect.bottom,
177
+ width: rect.width,
178
+ height: rect.height
179
+ }
180
+ });
181
+ }
182
+ };
183
+ const mouseDownHandler = (event)=>{
184
+ // Prevent default multi click to select behavior
185
+ if (event.detail >= 2) {
186
+ event.preventDefault();
187
+ }
188
+ };
189
+ element.addEventListener('mouseenter', mouseEnterHandler);
190
+ element.addEventListener('mouseleave', mouseLeaveHandler);
191
+ element.addEventListener('dblclick', doubleClickHandler);
192
+ element.addEventListener('mousedown', mouseDownHandler);
193
+ // Store event listeners for cleanup
194
+ eventListeners.push({
195
+ element,
196
+ type: 'mouseenter',
197
+ handler: mouseEnterHandler
198
+ }, {
199
+ element,
200
+ type: 'mouseleave',
201
+ handler: mouseLeaveHandler
202
+ }, {
203
+ element,
204
+ type: 'dblclick',
205
+ handler: doubleClickHandler
206
+ }, {
207
+ element,
208
+ type: 'mousedown',
209
+ handler: mouseDownHandler
210
+ });
211
+ elementToHighlight.set(element, highlight);
212
+ overlay.appendChild(highlight);
213
+ drawHighlight(element, highlight);
214
+ };
215
+ const removeHighlightForElement = (element)=>{
216
+ const highlight = elementToHighlight.get(element);
217
+ if (!highlight) return;
218
+ highlight.remove();
219
+ elementToHighlight.delete(element);
220
+ // Remove event listeners for this element
221
+ const listenersToRemove = eventListeners.filter((listener)=>listener.element === element);
222
+ listenersToRemove.forEach(({ element, type, handler })=>{
223
+ element.removeEventListener(type, handler);
224
+ });
225
+ // Mutate eventListeners to remove listeners for this element
226
+ eventListeners.splice(0, eventListeners.length, ...eventListeners.filter((listener)=>listener.element !== element));
227
+ };
228
+ // Process all existing elements with source attributes
229
+ const initialElements = window.document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);
230
+ Array.from(initialElements).forEach((element)=>{
231
+ if (element instanceof HTMLElement) {
232
+ createHighlightForElement(element);
233
+ }
234
+ });
235
+ return {
236
+ get elements () {
237
+ return Array.from(elementToHighlight.keys());
238
+ },
239
+ get highlights () {
240
+ return Array.from(elementToHighlight.values());
241
+ },
242
+ updateAllHighlights,
243
+ eventListeners,
244
+ focusedHighlights,
245
+ createHighlightForElement,
246
+ removeHighlightForElement,
247
+ setFocusedField: (field)=>{
248
+ focusedField = field;
249
+ },
250
+ getFocusedField: ()=>focusedField
251
+ };
252
+ };
253
+ const setupObservers = (highlightManager, stegaObserver)=>{
254
+ const resizeObserver = new ResizeObserver(()=>{
255
+ highlightManager.updateAllHighlights();
256
+ });
257
+ const observeElementForResize = (element)=>{
258
+ resizeObserver.observe(element);
259
+ };
260
+ // Observe existing elements
261
+ highlightManager.elements.forEach(observeElementForResize);
262
+ resizeObserver.observe(document.documentElement);
263
+ // Create highlight observer to watch for new elements with source attributes
264
+ const highlightObserver = new MutationObserver((mutations)=>{
265
+ mutations.forEach((mutation)=>{
266
+ if (mutation.type === 'attributes' && mutation.attributeName === SOURCE_ATTRIBUTE) {
267
+ const target = mutation.target;
268
+ if (target.hasAttribute(SOURCE_ATTRIBUTE)) {
269
+ highlightManager.createHighlightForElement(target);
270
+ observeElementForResize(target);
271
+ } else {
272
+ highlightManager.removeHighlightForElement(target);
273
+ }
274
+ }
275
+ if (mutation.type === 'childList') {
276
+ mutation.addedNodes.forEach((node)=>{
277
+ if (node.nodeType === Node.ELEMENT_NODE) {
278
+ const element = node;
279
+ // Check if the added element has source attribute
280
+ if (element.hasAttribute(SOURCE_ATTRIBUTE) && element instanceof HTMLElement) {
281
+ highlightManager.createHighlightForElement(element);
282
+ observeElementForResize(element);
283
+ }
284
+ // Check all child elements for source attributes
285
+ const elementsWithSource = element.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);
286
+ Array.from(elementsWithSource).forEach((childElement)=>{
287
+ if (childElement instanceof HTMLElement) {
288
+ highlightManager.createHighlightForElement(childElement);
289
+ observeElementForResize(childElement);
290
+ }
291
+ });
292
+ }
293
+ });
294
+ mutation.removedNodes.forEach((node)=>{
295
+ if (node.nodeType === Node.ELEMENT_NODE) {
296
+ const element = node;
297
+ highlightManager.removeHighlightForElement(element);
298
+ }
299
+ });
300
+ }
301
+ });
302
+ });
303
+ highlightObserver.observe(document, {
304
+ childList: true,
305
+ subtree: true,
306
+ attributes: true,
307
+ attributeFilter: [
308
+ SOURCE_ATTRIBUTE
309
+ ]
310
+ });
311
+ const updateOnScroll = ()=>{
312
+ highlightManager.updateAllHighlights();
313
+ };
314
+ const scrollableElements = new Set();
315
+ scrollableElements.add(window);
316
+ const findScrollableAncestors = ()=>{
317
+ // Clear existing scrollable elements (except window)
318
+ scrollableElements.forEach((element)=>{
319
+ if (element !== window) {
320
+ element.removeEventListener('scroll', updateOnScroll);
321
+ }
322
+ });
323
+ scrollableElements.clear();
324
+ scrollableElements.add(window);
325
+ // Find all scrollable ancestors for all tracked elements
326
+ highlightManager.elements.forEach((element)=>{
327
+ let parent = element.parentElement;
328
+ while(parent){
329
+ const computedStyle = window.getComputedStyle(parent);
330
+ const overflow = computedStyle.overflow + computedStyle.overflowX + computedStyle.overflowY;
331
+ if (overflow.includes('scroll') || overflow.includes('auto')) {
332
+ scrollableElements.add(parent);
333
+ }
334
+ parent = parent.parentElement;
335
+ }
336
+ });
337
+ // Add scroll listeners to all scrollable elements
338
+ scrollableElements.forEach((element)=>{
339
+ if (element === window) {
340
+ window.addEventListener('scroll', updateOnScroll);
341
+ window.addEventListener('resize', updateOnScroll);
342
+ } else {
343
+ element.addEventListener('scroll', updateOnScroll);
344
+ }
345
+ });
346
+ };
347
+ // Initial setup of scrollable elements
348
+ findScrollableAncestors();
349
+ return {
350
+ resizeObserver,
351
+ highlightObserver,
352
+ stegaObserver,
353
+ updateOnScroll,
354
+ scrollableElements,
355
+ findScrollableAncestors
356
+ };
357
+ };
358
+ const setupEventHandlers = (highlightManager)=>{
359
+ const handleMessage = (event)=>{
360
+ if (!event.data?.type) return;
361
+ // The user typed in an input, reflect the change in the preview
362
+ if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_CHANGE) {
363
+ const { field, value } = event.data.payload;
364
+ if (!field) return;
365
+ getElementsByPath(field).forEach((element)=>{
366
+ if (element instanceof HTMLElement) {
367
+ element.textContent = value || '';
368
+ }
369
+ });
370
+ // Update highlight dimensions since the new text content may affect them
371
+ highlightManager.updateAllHighlights();
372
+ return;
373
+ }
374
+ // The user focused a new input, update the highlights in the preview
375
+ if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS) {
376
+ const { field } = event.data.payload;
377
+ if (!field) return;
378
+ // Clear existing focused highlights
379
+ highlightManager.focusedHighlights.forEach((highlight)=>{
380
+ highlight.style.outlineColor = 'transparent';
381
+ });
382
+ highlightManager.focusedHighlights.length = 0;
383
+ // Set new focused field and highlight matching elements
384
+ highlightManager.setFocusedField(field);
385
+ getElementsByPath(field).forEach((element)=>{
386
+ const highlight = highlightManager.highlights[Array.from(highlightManager.elements).indexOf(element)];
387
+ if (highlight) {
388
+ highlight.style.outlineColor = HIGHLIGHT_ACTIVE_COLOR;
389
+ highlight.style.outlineWidth = '3px';
390
+ highlightManager.focusedHighlights.push(highlight);
391
+ }
392
+ });
393
+ return;
394
+ }
395
+ // The user is no longer focusing an input, remove the highlights
396
+ if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_BLUR) {
397
+ const { field } = event.data.payload;
398
+ if (field !== highlightManager.getFocusedField()) return;
399
+ highlightManager.focusedHighlights.forEach((highlight)=>{
400
+ highlight.style.outlineColor = 'transparent';
401
+ highlight.style.outlineWidth = '2px';
402
+ });
403
+ highlightManager.focusedHighlights.length = 0;
404
+ highlightManager.setFocusedField(null);
405
+ }
406
+ };
407
+ window.addEventListener('message', handleMessage);
408
+ // Add the message handler to the cleanup list
409
+ const messageEventListener = {
410
+ element: window,
411
+ type: 'message',
412
+ handler: handleMessage
413
+ };
414
+ return [
415
+ ...highlightManager.eventListeners,
416
+ messageEventListener
417
+ ];
418
+ };
419
+ const createCleanupSystem = (overlay, observers, eventHandlers)=>{
420
+ window.__strapi_previewCleanup = ()=>{
421
+ observers.resizeObserver.disconnect();
422
+ observers.highlightObserver.disconnect();
423
+ observers.stegaObserver?.disconnect();
424
+ // Remove all scroll listeners
425
+ observers.scrollableElements.forEach((element)=>{
426
+ if (element === window) {
427
+ window.removeEventListener('scroll', observers.updateOnScroll);
428
+ window.removeEventListener('resize', observers.updateOnScroll);
429
+ } else {
430
+ element.removeEventListener('scroll', observers.updateOnScroll);
431
+ }
432
+ });
433
+ // Remove highlight event listeners
434
+ eventHandlers.forEach(({ element, type, handler })=>{
435
+ element.removeEventListener(type, handler);
436
+ });
437
+ overlay.remove();
438
+ };
439
+ };
440
+ /* -----------------------------------------------------------------------------------------------
441
+ * Orchestration
442
+ * ---------------------------------------------------------------------------------------------*/ setupStegaDOMObserver().then((stegaObserver)=>{
443
+ const overlay = createOverlaySystem();
444
+ const highlightManager = createHighlightManager(overlay);
445
+ const observers = setupObservers(highlightManager, stegaObserver);
446
+ const eventHandlers = setupEventHandlers(highlightManager);
447
+ createCleanupSystem(overlay, observers, eventHandlers);
448
+ });
449
+ };
450
+
451
+ exports.previewScript = previewScript;
452
+ //# sourceMappingURL=previewScript.js.map