@strapi/content-manager 0.0.0-experimental.826f263c58b6886b849d3f03b81f7a530bc51c91 → 0.0.0-experimental.82afe56cecefd0078d534e25909834ecf5fdd404

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 (231) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
  3. package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
  4. package/dist/_chunks/{ComponentConfigurationPage-DJcn1DrO.js → ComponentConfigurationPage-DMxUlNOo.js} +5 -6
  5. package/dist/_chunks/{ComponentConfigurationPage-DJcn1DrO.js.map → ComponentConfigurationPage-DMxUlNOo.js.map} +1 -1
  6. package/dist/_chunks/{ComponentConfigurationPage-CR5XdR33.mjs → ComponentConfigurationPage-baEkO-OV.mjs} +4 -4
  7. package/dist/_chunks/{ComponentConfigurationPage-CR5XdR33.mjs.map → ComponentConfigurationPage-baEkO-OV.mjs.map} +1 -1
  8. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
  9. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
  10. package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
  11. package/dist/_chunks/{EditConfigurationPage-tDtWj7R2.js → EditConfigurationPage-CXxV7mKn.js} +5 -6
  12. package/dist/_chunks/{EditConfigurationPage-tDtWj7R2.js.map → EditConfigurationPage-CXxV7mKn.js.map} +1 -1
  13. package/dist/_chunks/{EditConfigurationPage-DmCIb4kD.mjs → EditConfigurationPage-YR8-4VCS.mjs} +4 -4
  14. package/dist/_chunks/{EditConfigurationPage-DmCIb4kD.mjs.map → EditConfigurationPage-YR8-4VCS.mjs.map} +1 -1
  15. package/dist/_chunks/{EditViewPage-CoQEnFlC.js → EditViewPage-BfR6jAR6.js} +71 -84
  16. package/dist/_chunks/EditViewPage-BfR6jAR6.js.map +1 -0
  17. package/dist/_chunks/EditViewPage-DFF7c27p.mjs +191 -0
  18. package/dist/_chunks/EditViewPage-DFF7c27p.mjs.map +1 -0
  19. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
  20. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
  21. package/dist/_chunks/{Form-Bpig5rch.js → Form-CjcMRP5A.js} +55 -38
  22. package/dist/_chunks/Form-CjcMRP5A.js.map +1 -0
  23. package/dist/_chunks/{Form-Dxmihyw8.mjs → Form-MSOSfGGN.mjs} +55 -37
  24. package/dist/_chunks/Form-MSOSfGGN.mjs.map +1 -0
  25. package/dist/_chunks/{History-BfX6XmZK.js → History-BgZ7gVuF.js} +208 -138
  26. package/dist/_chunks/History-BgZ7gVuF.js.map +1 -0
  27. package/dist/_chunks/{History-BZP8n7KT.mjs → History-WOQNVho-.mjs} +201 -130
  28. package/dist/_chunks/History-WOQNVho-.mjs.map +1 -0
  29. package/dist/_chunks/{Field-Cz_J9551.mjs → Input-BkKwZ6Qt.mjs} +1757 -1383
  30. package/dist/_chunks/Input-BkKwZ6Qt.mjs.map +1 -0
  31. package/dist/_chunks/{Field-ZdrmmQ4Y.js → Input-BwOibhc3.js} +1748 -1374
  32. package/dist/_chunks/Input-BwOibhc3.js.map +1 -0
  33. package/dist/_chunks/{ListConfigurationPage-DxKuVkKz.mjs → ListConfigurationPage-BeXfr6uW.mjs} +63 -52
  34. package/dist/_chunks/ListConfigurationPage-BeXfr6uW.mjs.map +1 -0
  35. package/dist/_chunks/{ListConfigurationPage-B3CXj8PY.js → ListConfigurationPage-DnJ3nbwL.js} +62 -51
  36. package/dist/_chunks/ListConfigurationPage-DnJ3nbwL.js.map +1 -0
  37. package/dist/_chunks/{ListViewPage-Bk9VO__I.js → ListViewPage-CJFDudKl.js} +155 -129
  38. package/dist/_chunks/ListViewPage-CJFDudKl.js.map +1 -0
  39. package/dist/_chunks/{ListViewPage-D5D3tVPq.mjs → ListViewPage-VK2v44Q1.mjs} +156 -129
  40. package/dist/_chunks/ListViewPage-VK2v44Q1.mjs.map +1 -0
  41. package/dist/_chunks/{NoContentTypePage-DnMeuQCj.mjs → NoContentTypePage-T8ttty6K.mjs} +2 -2
  42. package/dist/_chunks/{NoContentTypePage-DnMeuQCj.mjs.map → NoContentTypePage-T8ttty6K.mjs.map} +1 -1
  43. package/dist/_chunks/{NoContentTypePage-DsB2F7Z1.js → NoContentTypePage-en2PwWgI.js} +2 -2
  44. package/dist/_chunks/{NoContentTypePage-DsB2F7Z1.js.map → NoContentTypePage-en2PwWgI.js.map} +1 -1
  45. package/dist/_chunks/{NoPermissionsPage-BQDM64_b.js → NoPermissionsPage-CcjILry3.js} +2 -2
  46. package/dist/_chunks/{NoPermissionsPage-BQDM64_b.js.map → NoPermissionsPage-CcjILry3.js.map} +1 -1
  47. package/dist/_chunks/{NoPermissionsPage-OyoME_Tf.mjs → NoPermissionsPage-CokBHhhy.mjs} +2 -2
  48. package/dist/_chunks/{NoPermissionsPage-OyoME_Tf.mjs.map → NoPermissionsPage-CokBHhhy.mjs.map} +1 -1
  49. package/dist/_chunks/Preview-BF81YhRj.mjs +287 -0
  50. package/dist/_chunks/Preview-BF81YhRj.mjs.map +1 -0
  51. package/dist/_chunks/Preview-DgzAuzWQ.js +305 -0
  52. package/dist/_chunks/Preview-DgzAuzWQ.js.map +1 -0
  53. package/dist/_chunks/{Relations-B6B3A3mb.js → Relations-1O-JcM4t.js} +76 -43
  54. package/dist/_chunks/Relations-1O-JcM4t.js.map +1 -0
  55. package/dist/_chunks/{Relations-BOYZmuWy.mjs → Relations-BncdhGCd.mjs} +76 -42
  56. package/dist/_chunks/Relations-BncdhGCd.mjs.map +1 -0
  57. package/dist/_chunks/{en-Dzv55oQw.mjs → en-BZaUty0m.mjs} +41 -18
  58. package/dist/_chunks/{en-Dzv55oQw.mjs.map → en-BZaUty0m.mjs.map} +1 -1
  59. package/dist/_chunks/{en-BN1bvFK7.js → en-CzCnBk4S.js} +41 -18
  60. package/dist/_chunks/{en-BN1bvFK7.js.map → en-CzCnBk4S.js.map} +1 -1
  61. package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
  62. package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
  63. package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
  64. package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
  65. package/dist/_chunks/{fr-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
  66. package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
  67. package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
  68. package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
  69. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  70. package/dist/_chunks/{index-VHviNMeW.mjs → index-DiluOUp6.mjs} +1469 -966
  71. package/dist/_chunks/index-DiluOUp6.mjs.map +1 -0
  72. package/dist/_chunks/{index-DzN3kBgx.js → index-EXJvmn4t.js} +1439 -936
  73. package/dist/_chunks/index-EXJvmn4t.js.map +1 -0
  74. package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
  75. package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
  76. package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
  77. package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
  78. package/dist/_chunks/{layout-b91XRlD2.js → layout-4TbKVax8.js} +41 -24
  79. package/dist/_chunks/layout-4TbKVax8.js.map +1 -0
  80. package/dist/_chunks/{layout-CPn1PM6x.mjs → layout-mSwsYzxv.mjs} +42 -24
  81. package/dist/_chunks/layout-mSwsYzxv.mjs.map +1 -0
  82. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  83. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  84. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  85. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  86. package/dist/_chunks/{relations-BsqxS6tR.mjs → relations--YOvQBqv.mjs} +6 -7
  87. package/dist/_chunks/relations--YOvQBqv.mjs.map +1 -0
  88. package/dist/_chunks/{relations-CA7IYmcP.js → relations-Ai6Izh7h.js} +6 -7
  89. package/dist/_chunks/relations-Ai6Izh7h.js.map +1 -0
  90. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  91. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  92. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  93. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  94. package/dist/_chunks/usePrev-CZGy2Vjf.mjs +29 -0
  95. package/dist/_chunks/usePrev-CZGy2Vjf.mjs.map +1 -0
  96. package/dist/_chunks/{usePrev-B9w_-eYc.js → usePrev-D5J_2fEu.js} +14 -1
  97. package/dist/_chunks/usePrev-D5J_2fEu.js.map +1 -0
  98. package/dist/admin/index.js +3 -1
  99. package/dist/admin/index.js.map +1 -1
  100. package/dist/admin/index.mjs +10 -8
  101. package/dist/admin/src/content-manager.d.ts +3 -2
  102. package/dist/admin/src/exports.d.ts +2 -1
  103. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +1 -1
  104. package/dist/admin/src/history/index.d.ts +3 -0
  105. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  106. package/dist/admin/src/hooks/useDocument.d.ts +49 -1
  107. package/dist/admin/src/index.d.ts +1 -0
  108. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  109. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +9 -4
  110. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
  111. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  112. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  113. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +5 -0
  114. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
  115. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
  116. package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +20 -0
  117. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  118. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  119. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +6 -58
  120. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
  121. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  122. package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
  123. package/dist/admin/src/pages/ListView/components/BulkActions/Actions.d.ts +3 -30
  124. package/dist/admin/src/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +2 -2
  125. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  126. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  127. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  128. package/dist/admin/src/preview/index.d.ts +4 -0
  129. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  130. package/dist/admin/src/preview/routes.d.ts +3 -0
  131. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  132. package/dist/admin/src/router.d.ts +1 -1
  133. package/dist/admin/src/services/api.d.ts +1 -1
  134. package/dist/admin/src/services/components.d.ts +2 -2
  135. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  136. package/dist/admin/src/services/documents.d.ts +19 -20
  137. package/dist/admin/src/services/init.d.ts +1 -1
  138. package/dist/admin/src/services/relations.d.ts +2 -2
  139. package/dist/admin/src/services/uid.d.ts +3 -3
  140. package/dist/admin/src/utils/validation.d.ts +4 -1
  141. package/dist/server/index.js +765 -434
  142. package/dist/server/index.js.map +1 -1
  143. package/dist/server/index.mjs +766 -434
  144. package/dist/server/index.mjs.map +1 -1
  145. package/dist/server/src/bootstrap.d.ts.map +1 -1
  146. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  147. package/dist/server/src/controllers/index.d.ts.map +1 -1
  148. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  149. package/dist/server/src/controllers/uid.d.ts.map +1 -1
  150. package/dist/server/src/controllers/utils/metadata.d.ts +16 -1
  151. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  152. package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
  153. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  154. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  155. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  156. package/dist/server/src/history/services/history.d.ts +3 -3
  157. package/dist/server/src/history/services/history.d.ts.map +1 -1
  158. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  159. package/dist/server/src/history/services/utils.d.ts +8 -12
  160. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  161. package/dist/server/src/index.d.ts +7 -6
  162. package/dist/server/src/index.d.ts.map +1 -1
  163. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  164. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  165. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  166. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  167. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  168. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  169. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  170. package/dist/server/src/preview/index.d.ts +4 -0
  171. package/dist/server/src/preview/index.d.ts.map +1 -0
  172. package/dist/server/src/preview/routes/index.d.ts +8 -0
  173. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  174. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  175. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  176. package/dist/server/src/preview/services/index.d.ts +16 -0
  177. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  178. package/dist/server/src/preview/services/preview-config.d.ts +32 -0
  179. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  180. package/dist/server/src/preview/services/preview.d.ts +12 -0
  181. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  182. package/dist/server/src/preview/utils.d.ts +19 -0
  183. package/dist/server/src/preview/utils.d.ts.map +1 -0
  184. package/dist/server/src/register.d.ts.map +1 -1
  185. package/dist/server/src/routes/index.d.ts.map +1 -1
  186. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  187. package/dist/server/src/services/document-metadata.d.ts +12 -10
  188. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  189. package/dist/server/src/services/index.d.ts +7 -6
  190. package/dist/server/src/services/index.d.ts.map +1 -1
  191. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  192. package/dist/server/src/services/utils/populate.d.ts +2 -2
  193. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  194. package/dist/server/src/utils/index.d.ts +2 -0
  195. package/dist/server/src/utils/index.d.ts.map +1 -1
  196. package/dist/shared/contracts/collection-types.d.ts +3 -1
  197. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  198. package/dist/shared/contracts/index.d.ts +1 -0
  199. package/dist/shared/contracts/index.d.ts.map +1 -1
  200. package/dist/shared/contracts/preview.d.ts +27 -0
  201. package/dist/shared/contracts/preview.d.ts.map +1 -0
  202. package/dist/shared/index.js +4 -0
  203. package/dist/shared/index.js.map +1 -1
  204. package/dist/shared/index.mjs +4 -0
  205. package/dist/shared/index.mjs.map +1 -1
  206. package/package.json +17 -16
  207. package/dist/_chunks/EditViewPage-CoQEnFlC.js.map +0 -1
  208. package/dist/_chunks/EditViewPage-DvaV7U9b.mjs +0 -203
  209. package/dist/_chunks/EditViewPage-DvaV7U9b.mjs.map +0 -1
  210. package/dist/_chunks/Field-Cz_J9551.mjs.map +0 -1
  211. package/dist/_chunks/Field-ZdrmmQ4Y.js.map +0 -1
  212. package/dist/_chunks/Form-Bpig5rch.js.map +0 -1
  213. package/dist/_chunks/Form-Dxmihyw8.mjs.map +0 -1
  214. package/dist/_chunks/History-BZP8n7KT.mjs.map +0 -1
  215. package/dist/_chunks/History-BfX6XmZK.js.map +0 -1
  216. package/dist/_chunks/ListConfigurationPage-B3CXj8PY.js.map +0 -1
  217. package/dist/_chunks/ListConfigurationPage-DxKuVkKz.mjs.map +0 -1
  218. package/dist/_chunks/ListViewPage-Bk9VO__I.js.map +0 -1
  219. package/dist/_chunks/ListViewPage-D5D3tVPq.mjs.map +0 -1
  220. package/dist/_chunks/Relations-B6B3A3mb.js.map +0 -1
  221. package/dist/_chunks/Relations-BOYZmuWy.mjs.map +0 -1
  222. package/dist/_chunks/index-DzN3kBgx.js.map +0 -1
  223. package/dist/_chunks/index-VHviNMeW.mjs.map +0 -1
  224. package/dist/_chunks/layout-CPn1PM6x.mjs.map +0 -1
  225. package/dist/_chunks/layout-b91XRlD2.js.map +0 -1
  226. package/dist/_chunks/relations-BsqxS6tR.mjs.map +0 -1
  227. package/dist/_chunks/relations-CA7IYmcP.js.map +0 -1
  228. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  229. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  230. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  231. package/strapi-server.js +0 -3
@@ -3,23 +3,73 @@ const jsxRuntime = require("react/jsx-runtime");
3
3
  const React = require("react");
4
4
  const strapiAdmin = require("@strapi/admin/strapi-admin");
5
5
  const designSystem = require("@strapi/design-system");
6
- const pipe$1 = require("lodash/fp/pipe");
7
- const reactIntl = require("react-intl");
8
- const index = require("./index-DzN3kBgx.js");
9
- const fractionalIndexing = require("fractional-indexing");
10
- const Relations = require("./Relations-B6B3A3mb.js");
11
6
  const Icons = require("@strapi/icons");
7
+ const reactIntl = require("react-intl");
8
+ const index = require("./index-EXJvmn4t.js");
12
9
  const styledComponents = require("styled-components");
13
- const ComponentIcon = require("./ComponentIcon-BXdiCGQp.js");
14
- const reactDndHtml5Backend = require("react-dnd-html5-backend");
15
- const useDragAndDrop = require("./useDragAndDrop-J0TUUbR6.js");
16
- const objects = require("./objects-gigeqt7s.js");
17
10
  const slate = require("slate");
18
11
  const slateHistory = require("slate-history");
19
12
  const slateReact = require("slate-react");
20
- const usePrev = require("./usePrev-B9w_-eYc.js");
13
+ const Prism = require("prismjs");
14
+ require("prismjs/themes/prism-solarizedlight.css");
15
+ require("prismjs/components/prism-asmatmel");
16
+ require("prismjs/components/prism-bash");
17
+ require("prismjs/components/prism-basic");
18
+ require("prismjs/components/prism-c");
19
+ require("prismjs/components/prism-clojure");
20
+ require("prismjs/components/prism-cobol");
21
+ require("prismjs/components/prism-cpp");
22
+ require("prismjs/components/prism-csharp");
23
+ require("prismjs/components/prism-dart");
24
+ require("prismjs/components/prism-docker");
25
+ require("prismjs/components/prism-elixir");
26
+ require("prismjs/components/prism-erlang");
27
+ require("prismjs/components/prism-fortran");
28
+ require("prismjs/components/prism-fsharp");
29
+ require("prismjs/components/prism-go");
30
+ require("prismjs/components/prism-graphql");
31
+ require("prismjs/components/prism-groovy");
32
+ require("prismjs/components/prism-haskell");
33
+ require("prismjs/components/prism-haxe");
34
+ require("prismjs/components/prism-ini");
35
+ require("prismjs/components/prism-java");
36
+ require("prismjs/components/prism-javascript");
37
+ require("prismjs/components/prism-jsx");
38
+ require("prismjs/components/prism-json");
39
+ require("prismjs/components/prism-julia");
40
+ require("prismjs/components/prism-kotlin");
41
+ require("prismjs/components/prism-latex");
42
+ require("prismjs/components/prism-lua");
43
+ require("prismjs/components/prism-markdown");
44
+ require("prismjs/components/prism-matlab");
45
+ require("prismjs/components/prism-makefile");
46
+ require("prismjs/components/prism-objectivec");
47
+ require("prismjs/components/prism-perl");
48
+ require("prismjs/components/prism-php");
49
+ require("prismjs/components/prism-powershell");
50
+ require("prismjs/components/prism-python");
51
+ require("prismjs/components/prism-r");
52
+ require("prismjs/components/prism-ruby");
53
+ require("prismjs/components/prism-rust");
54
+ require("prismjs/components/prism-sas");
55
+ require("prismjs/components/prism-scala");
56
+ require("prismjs/components/prism-scheme");
57
+ require("prismjs/components/prism-sql");
58
+ require("prismjs/components/prism-stata");
59
+ require("prismjs/components/prism-swift");
60
+ require("prismjs/components/prism-typescript");
61
+ require("prismjs/components/prism-tsx");
62
+ require("prismjs/components/prism-vbnet");
63
+ require("prismjs/components/prism-yaml");
64
+ const usePrev = require("./usePrev-D5J_2fEu.js");
65
+ const useDragAndDrop = require("./useDragAndDrop-BMtgCYzL.js");
21
66
  const Toolbar = require("@radix-ui/react-toolbar");
67
+ const reactDndHtml5Backend = require("react-dnd-html5-backend");
22
68
  const reactRouterDom = require("react-router-dom");
69
+ const objects = require("./objects-BcXOv6_9.js");
70
+ const Relations = require("./Relations-1O-JcM4t.js");
71
+ const pipe$1 = require("lodash/fp/pipe");
72
+ const ComponentIcon = require("./ComponentIcon-CRbtQEUV.js");
23
73
  const CodeMirror = require("codemirror5");
24
74
  const sanitizeHtml = require("sanitize-html");
25
75
  const highlight_js = require("highlight.js");
@@ -37,8 +87,7 @@ require("highlight.js/styles/solarized-dark.css");
37
87
  require("codemirror5/addon/display/placeholder");
38
88
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
39
89
  function _interopNamespace(e) {
40
- if (e && e.__esModule)
41
- return e;
90
+ if (e && e.__esModule) return e;
42
91
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
43
92
  if (e) {
44
93
  for (const k in e) {
@@ -55,8 +104,9 @@ function _interopNamespace(e) {
55
104
  return Object.freeze(n);
56
105
  }
57
106
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
58
- const pipe__default = /* @__PURE__ */ _interopDefault(pipe$1);
107
+ const Prism__namespace = /* @__PURE__ */ _interopNamespace(Prism);
59
108
  const Toolbar__namespace = /* @__PURE__ */ _interopNamespace(Toolbar);
109
+ const pipe__default = /* @__PURE__ */ _interopDefault(pipe$1);
60
110
  const CodeMirror__default = /* @__PURE__ */ _interopDefault(CodeMirror);
61
111
  const sanitizeHtml__default = /* @__PURE__ */ _interopDefault(sanitizeHtml);
62
112
  const Markdown__default = /* @__PURE__ */ _interopDefault(Markdown);
@@ -69,93 +119,6 @@ const ins__default = /* @__PURE__ */ _interopDefault(ins);
69
119
  const mark__default = /* @__PURE__ */ _interopDefault(mark);
70
120
  const sub__default = /* @__PURE__ */ _interopDefault(sub);
71
121
  const sup__default = /* @__PURE__ */ _interopDefault(sup);
72
- const BLOCK_LIST_ATTRIBUTE_KEYS = ["__component", "__temp_key__"];
73
- const traverseData = (predicate, transform) => (schema, components = {}) => (data = {}) => {
74
- const traverse = (datum, attributes) => {
75
- return Object.entries(datum).reduce((acc, [key, value]) => {
76
- const attribute = attributes[key];
77
- if (BLOCK_LIST_ATTRIBUTE_KEYS.includes(key) || value === null || value === void 0) {
78
- acc[key] = value;
79
- return acc;
80
- }
81
- if (attribute.type === "component") {
82
- if (attribute.repeatable) {
83
- const componentValue = predicate(attribute, value) ? transform(value, attribute) : value;
84
- acc[key] = componentValue.map(
85
- (componentData) => traverse(componentData, components[attribute.component]?.attributes ?? {})
86
- );
87
- } else {
88
- const componentValue = predicate(attribute, value) ? transform(value, attribute) : value;
89
- acc[key] = traverse(componentValue, components[attribute.component]?.attributes ?? {});
90
- }
91
- } else if (attribute.type === "dynamiczone") {
92
- const dynamicZoneValue = predicate(attribute, value) ? transform(value, attribute) : value;
93
- acc[key] = dynamicZoneValue.map(
94
- (componentData) => traverse(componentData, components[componentData.__component]?.attributes ?? {})
95
- );
96
- } else if (predicate(attribute, value)) {
97
- acc[key] = transform(value, attribute);
98
- } else {
99
- acc[key] = value;
100
- }
101
- return acc;
102
- }, {});
103
- };
104
- return traverse(data, schema.attributes);
105
- };
106
- const removeProhibitedFields = (prohibitedFields) => traverseData(
107
- (attribute) => prohibitedFields.includes(attribute.type),
108
- () => ""
109
- );
110
- const prepareRelations = traverseData(
111
- (attribute) => attribute.type === "relation",
112
- () => ({
113
- connect: [],
114
- disconnect: []
115
- })
116
- );
117
- const prepareTempKeys = traverseData(
118
- (attribute) => attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone",
119
- (data) => {
120
- if (Array.isArray(data) && data.length > 0) {
121
- const keys = fractionalIndexing.generateNKeysBetween(void 0, void 0, data.length);
122
- return data.map((datum, index2) => ({
123
- ...datum,
124
- __temp_key__: keys[index2]
125
- }));
126
- }
127
- return data;
128
- }
129
- );
130
- const removeFieldsThatDontExistOnSchema = (schema) => (data) => {
131
- const schemaKeys = Object.keys(schema.attributes);
132
- const dataKeys = Object.keys(data);
133
- const keysToRemove = dataKeys.filter((key) => !schemaKeys.includes(key));
134
- const revisedData = [...keysToRemove, ...index.DOCUMENT_META_FIELDS].reduce((acc, key) => {
135
- delete acc[key];
136
- return acc;
137
- }, structuredClone(data));
138
- return revisedData;
139
- };
140
- const removeNullValues = (data) => {
141
- return Object.entries(data).reduce((acc, [key, value]) => {
142
- if (value === null) {
143
- return acc;
144
- }
145
- acc[key] = value;
146
- return acc;
147
- }, {});
148
- };
149
- const transformDocument = (schema, components = {}) => (document2) => {
150
- const transformations = pipe__default.default(
151
- removeFieldsThatDontExistOnSchema(schema),
152
- removeProhibitedFields(["password"])(schema, components),
153
- removeNullValues,
154
- prepareRelations(schema, components),
155
- prepareTempKeys(schema, components)
156
- );
157
- return transformations(document2);
158
- };
159
122
  const componentStore = /* @__PURE__ */ new Map();
160
123
  const useLazyComponents = (componentUids = []) => {
161
124
  const [lazyComponentStore, setLazyComponentStore] = React.useState(Object.fromEntries(componentStore));
@@ -194,6 +157,224 @@ const useLazyComponents = (componentUids = []) => {
194
157
  }, []);
195
158
  return { isLazyLoading: loading, lazyComponentStore, cleanup };
196
159
  };
160
+ const codeLanguages = [
161
+ {
162
+ value: "asm",
163
+ label: "Assembly",
164
+ decorate: "asmatmel"
165
+ },
166
+ {
167
+ value: "bash",
168
+ label: "Bash"
169
+ },
170
+ {
171
+ value: "c",
172
+ label: "C"
173
+ },
174
+ {
175
+ value: "clojure",
176
+ label: "Clojure"
177
+ },
178
+ {
179
+ value: "cobol",
180
+ label: "COBOL"
181
+ },
182
+ {
183
+ value: "cpp",
184
+ label: "C++"
185
+ },
186
+ {
187
+ value: "csharp",
188
+ label: "C#"
189
+ },
190
+ {
191
+ value: "css",
192
+ label: "CSS"
193
+ },
194
+ {
195
+ value: "dart",
196
+ label: "Dart"
197
+ },
198
+ {
199
+ value: "dockerfile",
200
+ label: "Dockerfile",
201
+ decorate: "docker"
202
+ },
203
+ {
204
+ value: "elixir",
205
+ label: "Elixir"
206
+ },
207
+ {
208
+ value: "erlang",
209
+ label: "Erlang"
210
+ },
211
+ {
212
+ value: "fortran",
213
+ label: "Fortran"
214
+ },
215
+ {
216
+ value: "fsharp",
217
+ label: "F#"
218
+ },
219
+ {
220
+ value: "go",
221
+ label: "Go"
222
+ },
223
+ {
224
+ value: "graphql",
225
+ label: "GraphQL"
226
+ },
227
+ {
228
+ value: "groovy",
229
+ label: "Groovy"
230
+ },
231
+ {
232
+ value: "haskell",
233
+ label: "Haskell"
234
+ },
235
+ {
236
+ value: "haxe",
237
+ label: "Haxe"
238
+ },
239
+ {
240
+ value: "html",
241
+ label: "HTML"
242
+ },
243
+ {
244
+ value: "ini",
245
+ label: "INI"
246
+ },
247
+ {
248
+ value: "java",
249
+ label: "Java"
250
+ },
251
+ {
252
+ value: "javascript",
253
+ label: "JavaScript"
254
+ },
255
+ {
256
+ value: "jsx",
257
+ label: "JavaScript (React)"
258
+ },
259
+ {
260
+ value: "json",
261
+ label: "JSON"
262
+ },
263
+ {
264
+ value: "julia",
265
+ label: "Julia"
266
+ },
267
+ {
268
+ value: "kotlin",
269
+ label: "Kotlin"
270
+ },
271
+ {
272
+ value: "latex",
273
+ label: "LaTeX"
274
+ },
275
+ {
276
+ value: "lua",
277
+ label: "Lua"
278
+ },
279
+ {
280
+ value: "markdown",
281
+ label: "Markdown"
282
+ },
283
+ {
284
+ value: "matlab",
285
+ label: "MATLAB"
286
+ },
287
+ {
288
+ value: "makefile",
289
+ label: "Makefile"
290
+ },
291
+ {
292
+ value: "objectivec",
293
+ label: "Objective-C"
294
+ },
295
+ {
296
+ value: "perl",
297
+ label: "Perl"
298
+ },
299
+ {
300
+ value: "php",
301
+ label: "PHP"
302
+ },
303
+ {
304
+ value: "plaintext",
305
+ label: "Plain text"
306
+ },
307
+ {
308
+ value: "powershell",
309
+ label: "PowerShell"
310
+ },
311
+ {
312
+ value: "python",
313
+ label: "Python"
314
+ },
315
+ {
316
+ value: "r",
317
+ label: "R"
318
+ },
319
+ {
320
+ value: "ruby",
321
+ label: "Ruby"
322
+ },
323
+ {
324
+ value: "rust",
325
+ label: "Rust"
326
+ },
327
+ {
328
+ value: "sas",
329
+ label: "SAS"
330
+ },
331
+ {
332
+ value: "scala",
333
+ label: "Scala"
334
+ },
335
+ {
336
+ value: "scheme",
337
+ label: "Scheme"
338
+ },
339
+ {
340
+ value: "shell",
341
+ label: "Shell"
342
+ },
343
+ {
344
+ value: "sql",
345
+ label: "SQL"
346
+ },
347
+ {
348
+ value: "stata",
349
+ label: "Stata"
350
+ },
351
+ {
352
+ value: "swift",
353
+ label: "Swift"
354
+ },
355
+ {
356
+ value: "typescript",
357
+ label: "TypeScript",
358
+ decorate: "ts"
359
+ },
360
+ {
361
+ value: "tsx",
362
+ label: "TypeScript (React)"
363
+ },
364
+ {
365
+ value: "vbnet",
366
+ label: "VB.NET"
367
+ },
368
+ {
369
+ value: "xml",
370
+ label: "XML"
371
+ },
372
+ {
373
+ value: "yaml",
374
+ label: "YAML",
375
+ decorate: "yml"
376
+ }
377
+ ];
197
378
  const baseHandleConvert = (editor, attributesToSet) => {
198
379
  const [_, lastNodePath] = slate.Editor.last(editor, []);
199
380
  slate.Transforms.unwrapNodes(editor, {
@@ -257,6 +438,29 @@ const pressEnterTwiceToExit = (editor) => {
257
438
  });
258
439
  }
259
440
  };
441
+ const decorateCode = ([node, path]) => {
442
+ const ranges = [];
443
+ if (!slate.Element.isElement(node) || node.type !== "code") return ranges;
444
+ const text = slate.Node.string(node);
445
+ const language = codeLanguages.find((lang) => lang.value === node.language);
446
+ const decorateKey = language?.decorate ?? language?.value;
447
+ const selectedLanguage = Prism__namespace.languages[decorateKey || "plaintext"];
448
+ const tokens = Prism__namespace.tokenize(text, selectedLanguage);
449
+ let start = 0;
450
+ for (const token of tokens) {
451
+ const length = token.length;
452
+ const end = start + length;
453
+ if (typeof token !== "string") {
454
+ ranges.push({
455
+ anchor: { path, offset: start },
456
+ focus: { path, offset: end },
457
+ className: `token ${token.type}`
458
+ });
459
+ }
460
+ start = end;
461
+ }
462
+ return ranges;
463
+ };
260
464
  const CodeBlock = styledComponents.styled.pre`
261
465
  border-radius: ${({ theme }) => theme.borderRadius};
262
466
  background-color: ${({ theme }) => theme.colors.neutral100};
@@ -264,6 +468,7 @@ const CodeBlock = styledComponents.styled.pre`
264
468
  overflow: auto;
265
469
  padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};
266
470
  flex-shrink: 1;
471
+
267
472
  & > code {
268
473
  font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,
269
474
  monospace;
@@ -272,10 +477,62 @@ const CodeBlock = styledComponents.styled.pre`
272
477
  max-width: 100%;
273
478
  }
274
479
  `;
480
+ const CodeEditor = (props) => {
481
+ const { editor } = useBlocksEditorContext("ImageDialog");
482
+ const editorIsFocused = slateReact.useFocused();
483
+ const imageIsSelected = slateReact.useSelected();
484
+ const { formatMessage } = reactIntl.useIntl();
485
+ const [isSelectOpen, setIsSelectOpen] = React__namespace.useState(false);
486
+ const shouldDisplayLanguageSelect = editorIsFocused && imageIsSelected || isSelectOpen;
487
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { position: "relative", width: "100%", children: [
488
+ /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, { ...props.attributes, children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: props.children }) }),
489
+ shouldDisplayLanguageSelect && /* @__PURE__ */ jsxRuntime.jsx(
490
+ designSystem.Box,
491
+ {
492
+ position: "absolute",
493
+ background: "neutral0",
494
+ borderColor: "neutral150",
495
+ borderStyle: "solid",
496
+ borderWidth: "0.5px",
497
+ shadow: "tableShadow",
498
+ top: "100%",
499
+ marginTop: 1,
500
+ right: 0,
501
+ padding: 1,
502
+ hasRadius: true,
503
+ children: /* @__PURE__ */ jsxRuntime.jsx(
504
+ designSystem.SingleSelect,
505
+ {
506
+ onChange: (open) => {
507
+ slate.Transforms.setNodes(
508
+ editor,
509
+ { language: open.toString() },
510
+ { match: (node) => !slate.Editor.isEditor(node) && node.type === "code" }
511
+ );
512
+ },
513
+ value: props.element.type === "code" && props.element.language || "plaintext",
514
+ onOpenChange: (open) => {
515
+ setIsSelectOpen(open);
516
+ if (!open) {
517
+ slateReact.ReactEditor.focus(editor);
518
+ }
519
+ },
520
+ onCloseAutoFocus: (e) => e.preventDefault(),
521
+ "aria-label": formatMessage({
522
+ id: "components.Blocks.blocks.code.languageLabel",
523
+ defaultMessage: "Select a language"
524
+ }),
525
+ children: codeLanguages.map(({ value, label }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value, children: label }, value))
526
+ }
527
+ )
528
+ }
529
+ )
530
+ ] });
531
+ };
275
532
  const codeBlocks = {
276
533
  code: {
277
- renderElement: (props) => /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, { ...props.attributes, children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: props.children }) }),
278
- icon: Icons.Code,
534
+ renderElement: (props) => /* @__PURE__ */ jsxRuntime.jsx(CodeEditor, { ...props }),
535
+ icon: Icons.CodeBlock,
279
536
  label: {
280
537
  id: "components.Blocks.blocks.code",
281
538
  defaultMessage: "Code block"
@@ -283,13 +540,12 @@ const codeBlocks = {
283
540
  matchNode: (node) => node.type === "code",
284
541
  isInBlocksSelector: true,
285
542
  handleConvert(editor) {
286
- baseHandleConvert(editor, { type: "code" });
543
+ baseHandleConvert(editor, { type: "code", language: "plaintext" });
287
544
  },
288
545
  handleEnterKey(editor) {
289
546
  pressEnterTwiceToExit(editor);
290
547
  },
291
- snippets: ["```"],
292
- dragHandleTopMargin: "10px"
548
+ snippets: ["```"]
293
549
  }
294
550
  };
295
551
  const H1 = styledComponents.styled(designSystem.Typography).attrs({ tag: "h1" })`
@@ -464,8 +720,7 @@ const ImageDialog = () => {
464
720
  const [isOpen, setIsOpen] = React__namespace.useState(true);
465
721
  const { editor } = useBlocksEditorContext("ImageDialog");
466
722
  const components = strapiAdmin.useStrapiApp("ImageDialog", (state) => state.components);
467
- if (!components || !isOpen)
468
- return null;
723
+ if (!components || !isOpen) return null;
469
724
  const MediaLibraryDialog = components["media-library"];
470
725
  const insertImages = (images) => {
471
726
  slate.Transforms.unwrapNodes(editor, {
@@ -474,14 +729,12 @@ const ImageDialog = () => {
474
729
  });
475
730
  const nodeEntryBeingReplaced = slate.Editor.above(editor, {
476
731
  match(node) {
477
- if (slate.Editor.isEditor(node))
478
- return false;
732
+ if (slate.Editor.isEditor(node)) return false;
479
733
  const isInlineNode = ["text", "link"].includes(node.type);
480
734
  return !isInlineNode;
481
735
  }
482
736
  });
483
- if (!nodeEntryBeingReplaced)
484
- return;
737
+ if (!nodeEntryBeingReplaced) return;
485
738
  const [, pathToInsert] = nodeEntryBeingReplaced;
486
739
  slate.Transforms.removeNodes(editor);
487
740
  const nodesToInsert = images.map((image) => {
@@ -623,18 +876,12 @@ const LinkContent = React__namespace.forwardRef(
623
876
  const [popoverOpen, setPopoverOpen] = React__namespace.useState(
624
877
  editor.lastInsertedLinkPath ? slate.Path.equals(path, editor.lastInsertedLinkPath) : false
625
878
  );
626
- const linkRef = React__namespace.useRef(null);
627
879
  const elementText = link.children.map((child) => child.text).join("");
628
880
  const [linkText, setLinkText] = React__namespace.useState(elementText);
629
881
  const [linkUrl, setLinkUrl] = React__namespace.useState(link.url);
630
882
  const linkInputRef = React__namespace.useRef(null);
631
- const [showRemoveButton, setShowRemoveButton] = React__namespace.useState(false);
883
+ const isLastInsertedLink = editor.lastInsertedLinkPath ? !slate.Path.equals(path, editor.lastInsertedLinkPath) : true;
632
884
  const [isSaveDisabled, setIsSaveDisabled] = React__namespace.useState(false);
633
- const handleOpenEditPopover = (e) => {
634
- e.preventDefault();
635
- setPopoverOpen(true);
636
- setShowRemoveButton(true);
637
- };
638
885
  const onLinkChange = (e) => {
639
886
  setIsSaveDisabled(false);
640
887
  setLinkUrl(e.target.value);
@@ -655,33 +902,32 @@ const LinkContent = React__namespace.forwardRef(
655
902
  editLink(editor, { url: linkUrl, text: linkText });
656
903
  setPopoverOpen(false);
657
904
  editor.lastInsertedLinkPath = null;
905
+ slateReact.ReactEditor.focus(editor);
658
906
  };
659
- const handleDismiss = () => {
660
- setPopoverOpen(false);
907
+ const handleClose = () => {
661
908
  if (link.url === "") {
662
909
  removeLink(editor);
663
910
  }
911
+ setPopoverOpen(false);
664
912
  slateReact.ReactEditor.focus(editor);
665
913
  };
666
- const inputNotDirty = !linkText || !linkUrl || link.url && link.url === linkUrl && elementText && elementText === linkText;
667
- const composedRefs = designSystem.useComposedRefs(linkRef, forwardedRef);
668
914
  React__namespace.useEffect(() => {
669
- if (popoverOpen)
670
- linkInputRef.current?.focus();
915
+ if (popoverOpen) linkInputRef.current?.focus();
671
916
  }, [popoverOpen]);
672
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
673
- /* @__PURE__ */ jsxRuntime.jsx(
917
+ const inputNotDirty = !linkText || !linkUrl || link.url && link.url === linkUrl && elementText && elementText === linkText;
918
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { open: popoverOpen, children: [
919
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
674
920
  StyledBaseLink,
675
921
  {
676
922
  ...attributes,
677
- ref: composedRefs,
923
+ ref: forwardedRef,
678
924
  href: link.url,
679
- onClick: handleOpenEditPopover,
925
+ onClick: () => setPopoverOpen(true),
680
926
  color: "primary600",
681
927
  children
682
928
  }
683
- ),
684
- popoverOpen && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover, { source: linkRef, onDismiss: handleDismiss, padding: 4, contentEditable: false, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "form", onSubmit: handleSave, direction: "column", gap: 4, children: [
929
+ ) }),
930
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Content, { onPointerDownOutside: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 4, children: [
685
931
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { width: "368px", children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "stretch", children: [
686
932
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
687
933
  id: "components.Blocks.popover.text",
@@ -727,7 +973,7 @@ const LinkContent = React__namespace.forwardRef(
727
973
  {
728
974
  variant: "danger-light",
729
975
  onClick: () => removeLink(editor),
730
- $visible: showRemoveButton,
976
+ $visible: isLastInsertedLink,
731
977
  children: formatMessage({
732
978
  id: "components.Blocks.popover.remove",
733
979
  defaultMessage: "Remove"
@@ -735,12 +981,12 @@ const LinkContent = React__namespace.forwardRef(
735
981
  }
736
982
  ),
737
983
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
738
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", onClick: handleDismiss, children: formatMessage({
739
- id: "components.Blocks.popover.cancel",
984
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", onClick: handleClose, children: formatMessage({
985
+ id: "global.cancel",
740
986
  defaultMessage: "Cancel"
741
987
  }) }),
742
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { type: "submit", disabled: Boolean(inputNotDirty) || isSaveDisabled, children: formatMessage({
743
- id: "components.Blocks.popover.save",
988
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { disabled: Boolean(inputNotDirty) || isSaveDisabled, onClick: handleSave, children: formatMessage({
989
+ id: "global.save",
744
990
  defaultMessage: "Save"
745
991
  }) })
746
992
  ] })
@@ -821,8 +1067,7 @@ const isText$1 = (node) => {
821
1067
  return slate.Node.isNode(node) && !slate.Editor.isEditor(node) && node.type === "text";
822
1068
  };
823
1069
  const handleBackspaceKeyOnList = (editor, event) => {
824
- if (!editor.selection)
825
- return;
1070
+ if (!editor.selection) return;
826
1071
  const [currentListItem, currentListItemPath] = slate.Editor.parent(editor, editor.selection.anchor);
827
1072
  const [currentList, currentListPath] = slate.Editor.parent(editor, currentListItemPath);
828
1073
  const isListEmpty = currentList.children.length === 1 && isText$1(currentListItem.children[0]) && currentListItem.children[0].text === "";
@@ -931,8 +1176,7 @@ const handleEnterKeyOnList = (editor) => {
931
1176
  };
932
1177
  const handleConvertToList = (editor, format) => {
933
1178
  const convertedPath = baseHandleConvert(editor, { type: "list-item" });
934
- if (!convertedPath)
935
- return;
1179
+ if (!convertedPath) return;
936
1180
  slate.Transforms.wrapNodes(editor, { type: "list", format, children: [] }, { at: convertedPath });
937
1181
  };
938
1182
  const handleTabOnList = (editor) => {
@@ -944,8 +1188,7 @@ const handleTabOnList = (editor) => {
944
1188
  }
945
1189
  const [currentListItem, currentListItemPath] = currentListItemEntry;
946
1190
  const [currentList] = slate.Editor.parent(editor, currentListItemPath);
947
- if (currentListItem === currentList.children[0])
948
- return;
1191
+ if (currentListItem === currentList.children[0]) return;
949
1192
  const currentListItemIndex = currentList.children.findIndex((item) => item === currentListItem);
950
1193
  const previousNode = currentList.children[currentListItemIndex - 1];
951
1194
  if (previousNode.type === "list") {
@@ -1081,13 +1324,13 @@ const quoteBlocks = {
1081
1324
  handleEnterKey(editor) {
1082
1325
  pressEnterTwiceToExit(editor);
1083
1326
  },
1084
- snippets: [">"],
1085
- dragHandleTopMargin: "6px"
1327
+ snippets: [">"]
1086
1328
  }
1087
1329
  };
1088
1330
  const ToolbarWrapper = styledComponents.styled(designSystem.Flex)`
1089
1331
  &[aria-disabled='true'] {
1090
1332
  cursor: not-allowed;
1333
+ background: ${({ theme }) => theme.colors.neutral150};
1091
1334
  }
1092
1335
  `;
1093
1336
  const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
@@ -1098,7 +1341,7 @@ const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
1098
1341
  const FlexButton = styledComponents.styled(designSystem.Flex)`
1099
1342
  // Inherit the not-allowed cursor from ToolbarWrapper when disabled
1100
1343
  &[aria-disabled] {
1101
- cursor: inherit;
1344
+ cursor: not-allowed;
1102
1345
  }
1103
1346
 
1104
1347
  &[aria-disabled='false'] {
@@ -1180,7 +1423,7 @@ const ToolbarButton = ({
1180
1423
  width: 7,
1181
1424
  height: 7,
1182
1425
  hasRadius: true,
1183
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { width: "1.2rem", height: "1.2rem", fill: disabled ? "neutral300" : enabledColor })
1426
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { fill: disabled ? "neutral300" : enabledColor })
1184
1427
  }
1185
1428
  )
1186
1429
  }
@@ -1312,8 +1555,7 @@ const isListNode = (node) => {
1312
1555
  const ListButton = ({ block, format }) => {
1313
1556
  const { editor, disabled, blocks } = useBlocksEditorContext("ListButton");
1314
1557
  const isListActive = () => {
1315
- if (!editor.selection)
1316
- return false;
1558
+ if (!editor.selection) return false;
1317
1559
  const currentListEntry = slate.Editor.above(editor, {
1318
1560
  match: (node) => !slate.Editor.isEditor(node) && node.type === "list",
1319
1561
  at: editor.selection.anchor
@@ -1325,6 +1567,26 @@ const ListButton = ({ block, format }) => {
1325
1567
  }
1326
1568
  return false;
1327
1569
  };
1570
+ const isListDisabled = () => {
1571
+ if (disabled) {
1572
+ return true;
1573
+ }
1574
+ if (!editor.selection) {
1575
+ return false;
1576
+ }
1577
+ const anchorNodeEntry = slate.Editor.above(editor, {
1578
+ at: editor.selection.anchor,
1579
+ match: (node) => !slate.Editor.isEditor(node) && node.type !== "text"
1580
+ });
1581
+ const focusNodeEntry = slate.Editor.above(editor, {
1582
+ at: editor.selection.focus,
1583
+ match: (node) => !slate.Editor.isEditor(node) && node.type !== "text"
1584
+ });
1585
+ if (!anchorNodeEntry || !focusNodeEntry) {
1586
+ return false;
1587
+ }
1588
+ return anchorNodeEntry[0] !== focusNodeEntry[0];
1589
+ };
1328
1590
  const toggleList = (format2) => {
1329
1591
  let currentListEntry;
1330
1592
  if (editor.selection) {
@@ -1358,7 +1620,7 @@ const ListButton = ({ block, format }) => {
1358
1620
  name: format,
1359
1621
  label: block.label,
1360
1622
  isActive: isListActive(),
1361
- disabled,
1623
+ disabled: isListDisabled(),
1362
1624
  handleClick: () => toggleList(format)
1363
1625
  }
1364
1626
  );
@@ -1367,8 +1629,7 @@ const LinkButton = ({ disabled }) => {
1367
1629
  const { editor } = useBlocksEditorContext("LinkButton");
1368
1630
  const isLinkActive = () => {
1369
1631
  const { selection } = editor;
1370
- if (!selection)
1371
- return false;
1632
+ if (!selection) return false;
1372
1633
  const [match] = Array.from(
1373
1634
  slate.Editor.nodes(editor, {
1374
1635
  at: slate.Editor.unhangRange(editor, selection),
@@ -1432,7 +1693,7 @@ const BlocksToolbar = () => {
1432
1693
  return false;
1433
1694
  };
1434
1695
  const isButtonDisabled = checkButtonDisabled();
1435
- return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, children: [
1696
+ return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, width: "100%", children: [
1436
1697
  /* @__PURE__ */ jsxRuntime.jsx(BlocksDropdown, {}),
1437
1698
  /* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
1438
1699
  /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.ToggleGroup, { type: "multiple", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, children: [
@@ -1502,33 +1763,36 @@ const DragItem = styledComponents.styled(designSystem.Flex)`
1502
1763
  }
1503
1764
  `;
1504
1765
  const DragIconButton = styledComponents.styled(designSystem.IconButton)`
1766
+ user-select: none;
1505
1767
  display: flex;
1506
1768
  align-items: center;
1507
1769
  justify-content: center;
1770
+ border: none;
1508
1771
  border-radius: ${({ theme }) => theme.borderRadius};
1509
- width: ${({ theme }) => theme.spaces[4]};
1510
- height: ${({ theme }) => theme.spaces[6]};
1772
+ padding-left: ${({ theme }) => theme.spaces[0]};
1773
+ padding-right: ${({ theme }) => theme.spaces[0]};
1774
+ padding-top: ${({ theme }) => theme.spaces[1]};
1775
+ padding-bottom: ${({ theme }) => theme.spaces[1]};
1511
1776
  visibility: hidden;
1512
1777
  cursor: grab;
1513
1778
  opacity: inherit;
1514
1779
  margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};
1515
1780
 
1516
1781
  &:hover {
1517
- background: ${({ theme }) => theme.colors.neutral200};
1782
+ background: ${({ theme }) => theme.colors.neutral100};
1518
1783
  }
1519
1784
  &:active {
1520
1785
  cursor: grabbing;
1786
+ background: ${({ theme }) => theme.colors.neutral150};
1521
1787
  }
1522
1788
  &[aria-disabled='true'] {
1523
- cursor: not-allowed;
1524
- background: transparent;
1789
+ visibility: hidden;
1525
1790
  }
1526
1791
  svg {
1527
- height: auto;
1528
- width: ${({ theme }) => theme.spaces[3]};
1792
+ min-width: ${({ theme }) => theme.spaces[3]};
1529
1793
 
1530
1794
  path {
1531
- fill: ${({ theme }) => theme.colors.neutral700};
1795
+ fill: ${({ theme }) => theme.colors.neutral500};
1532
1796
  }
1533
1797
  }
1534
1798
  `;
@@ -1573,8 +1837,7 @@ const DragAndDropElement = ({
1573
1837
  displayedValue: children
1574
1838
  },
1575
1839
  onDropItem(currentIndex, newIndex) {
1576
- if (newIndex)
1577
- handleMoveBlock(newIndex, currentIndex);
1840
+ if (newIndex) handleMoveBlock(newIndex, currentIndex);
1578
1841
  }
1579
1842
  });
1580
1843
  const composedBoxRefs = designSystem.useComposedRefs(blockRef, dropRef);
@@ -1630,6 +1893,7 @@ const DragAndDropElement = ({
1630
1893
  DragIconButton,
1631
1894
  {
1632
1895
  tag: "div",
1896
+ contentEditable: false,
1633
1897
  role: "button",
1634
1898
  tabIndex: 0,
1635
1899
  withTooltip: false,
@@ -1642,7 +1906,7 @@ const DragAndDropElement = ({
1642
1906
  disabled,
1643
1907
  draggable: true,
1644
1908
  $dragHandleTopMargin: dragHandleTopMargin,
1645
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, { color: "neutral600" })
1909
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, { color: "primary500" })
1646
1910
  }
1647
1911
  ),
1648
1912
  children
@@ -1679,7 +1943,7 @@ const baseRenderLeaf = (props, modifiers2) => {
1679
1943
  }
1680
1944
  return currentChildren;
1681
1945
  }, props.children);
1682
- return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, children: wrappedChildren });
1946
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, className: props.leaf.className, children: wrappedChildren });
1683
1947
  };
1684
1948
  const baseRenderElement = ({
1685
1949
  props,
@@ -1717,8 +1981,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
1717
1981
  [modifiers2]
1718
1982
  );
1719
1983
  const handleMoveBlocks = (editor2, event) => {
1720
- if (!editor2.selection)
1721
- return;
1984
+ if (!editor2.selection) return;
1722
1985
  const start = slate.Range.start(editor2.selection);
1723
1986
  const currentIndex = [start.path[0]];
1724
1987
  let newIndexPosition = 0;
@@ -1855,8 +2118,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
1855
2118
  }
1856
2119
  };
1857
2120
  const handleScrollSelectionIntoView = () => {
1858
- if (!editor.selection)
1859
- return;
2121
+ if (!editor.selection) return;
1860
2122
  const domRange = slateReact.ReactEditor.toDOMRange(editor, editor.selection);
1861
2123
  const domRect = domRange.getBoundingClientRect();
1862
2124
  const blocksInput = blocksRef.current;
@@ -1883,7 +2145,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
1883
2145
  background: "neutral0",
1884
2146
  color: "neutral800",
1885
2147
  lineHeight: 6,
1886
- paddingRight: 4,
2148
+ paddingRight: 7,
1887
2149
  paddingTop: 6,
1888
2150
  paddingBottom: 3,
1889
2151
  children: [
@@ -1894,6 +2156,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
1894
2156
  readOnly: disabled,
1895
2157
  placeholder,
1896
2158
  isExpandedMode,
2159
+ decorate: decorateCode,
1897
2160
  renderElement,
1898
2161
  renderLeaf,
1899
2162
  onKeyDown: handleKeyDown,
@@ -1966,7 +2229,7 @@ const EditorLayout$1 = ({
1966
2229
  /* @__PURE__ */ jsxRuntime.jsx(
1967
2230
  CollapseIconButton,
1968
2231
  {
1969
- "aria-label": formatMessage({
2232
+ label: formatMessage({
1970
2233
  id: index.getTranslation("components.Blocks.collapse"),
1971
2234
  defaultMessage: "Collapse"
1972
2235
  }),
@@ -2050,8 +2313,7 @@ const InlineCode = styledComponents.styled.code`
2050
2313
  `;
2051
2314
  const baseCheckIsActive = (editor, name2) => {
2052
2315
  const marks = slate.Editor.marks(editor);
2053
- if (!marks)
2054
- return false;
2316
+ if (!marks) return false;
2055
2317
  return Boolean(marks[name2]);
2056
2318
  };
2057
2319
  const baseHandleToggle = (editor, name2) => {
@@ -2217,6 +2479,7 @@ const ExpandIconButton = styledComponents.styled(designSystem.IconButton)`
2217
2479
  position: absolute;
2218
2480
  bottom: 1.2rem;
2219
2481
  right: 1.2rem;
2482
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
2220
2483
  `;
2221
2484
  function useResetKey(value) {
2222
2485
  const slateUpdatesCount = React__namespace.useRef(0);
@@ -2305,7 +2568,7 @@ const BlocksEditor = React__namespace.forwardRef(
2305
2568
  !isExpandedMode && /* @__PURE__ */ jsxRuntime.jsx(
2306
2569
  ExpandIconButton,
2307
2570
  {
2308
- "aria-label": formatMessage({
2571
+ label: formatMessage({
2309
2572
  id: index.getTranslation("components.Blocks.expand"),
2310
2573
  defaultMessage: "Expand"
2311
2574
  }),
@@ -2348,172 +2611,507 @@ const BlocksInput = React__namespace.forwardRef(
2348
2611
  }
2349
2612
  );
2350
2613
  const MemoizedBlocksInput = React__namespace.memo(BlocksInput);
2351
- const createDefaultForm = (contentType, components = {}) => {
2352
- const traverseSchema = (attributes) => {
2353
- return Object.entries(attributes).reduce((acc, [key, attribute]) => {
2354
- if ("default" in attribute) {
2355
- acc[key] = attribute.default;
2356
- } else if (attribute.type === "component" && attribute.required) {
2357
- const defaultComponentForm = traverseSchema(components[attribute.component].attributes);
2358
- if (attribute.repeatable) {
2359
- acc[key] = attribute.min ? [...Array(attribute.min).fill(defaultComponentForm)] : [];
2360
- } else {
2361
- acc[key] = defaultComponentForm;
2362
- }
2363
- } else if (attribute.type === "dynamiczone" && attribute.required) {
2364
- acc[key] = [];
2365
- }
2366
- return acc;
2367
- }, {});
2368
- };
2369
- return traverseSchema(contentType.attributes);
2370
- };
2371
2614
  const Initializer = ({ disabled, name: name2, onClick }) => {
2372
2615
  const { formatMessage } = reactIntl.useIntl();
2373
2616
  const field = strapiAdmin.useField(name2);
2374
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2375
- /* @__PURE__ */ jsxRuntime.jsx(
2376
- designSystem.Box,
2377
- {
2378
- tag: "button",
2379
- background: "neutral100",
2380
- borderColor: field.error ? "danger600" : "neutral200",
2381
- hasRadius: true,
2382
- disabled,
2383
- onClick,
2384
- paddingTop: 9,
2385
- paddingBottom: 9,
2386
- type: "button",
2387
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, children: [
2388
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(CircleIcon, {}) }),
2389
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "primary600", variant: "pi", fontWeight: "bold", children: formatMessage({
2390
- id: index.getTranslation("components.empty-repeatable"),
2391
- defaultMessage: "No entry yet. Click on the button below to add one."
2392
- }) }) })
2393
- ] })
2394
- }
2395
- ),
2396
- field.error && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "pi", children: field.error })
2397
- ] });
2617
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(
2618
+ designSystem.Box,
2619
+ {
2620
+ tag: "button",
2621
+ background: disabled ? "neutral150" : "neutral100",
2622
+ borderColor: field.error ? "danger600" : "neutral200",
2623
+ hasRadius: true,
2624
+ disabled,
2625
+ onClick,
2626
+ paddingTop: 9,
2627
+ paddingBottom: 9,
2628
+ type: "button",
2629
+ style: { cursor: disabled ? "not-allowed" : "pointer" },
2630
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, children: [
2631
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", color: disabled ? "neutral500" : "primary600", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.PlusCircle, { width: "3.2rem", height: "3.2rem" }) }),
2632
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
2633
+ designSystem.Typography,
2634
+ {
2635
+ textColor: disabled ? "neutral600" : "primary600",
2636
+ variant: "pi",
2637
+ fontWeight: "bold",
2638
+ children: formatMessage({
2639
+ id: index.getTranslation("components.empty-repeatable"),
2640
+ defaultMessage: "No entry yet. Click to add one."
2641
+ })
2642
+ }
2643
+ ) })
2644
+ ] })
2645
+ }
2646
+ ) });
2398
2647
  };
2399
- const CircleIcon = styledComponents.styled(Icons.PlusCircle)`
2400
- width: 2.4rem;
2401
- height: 2.4rem;
2402
- > circle {
2403
- fill: ${({ theme }) => theme.colors.primary200};
2404
- }
2648
+ const AddComponentButton = ({
2649
+ hasError,
2650
+ isDisabled,
2651
+ isOpen,
2652
+ children,
2653
+ onClick
2654
+ }) => {
2655
+ return /* @__PURE__ */ jsxRuntime.jsx(
2656
+ StyledButton,
2657
+ {
2658
+ type: "button",
2659
+ onClick,
2660
+ disabled: isDisabled,
2661
+ background: "neutral0",
2662
+ style: { cursor: isDisabled ? "not-allowed" : "pointer" },
2663
+ variant: "tertiary",
2664
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
2665
+ /* @__PURE__ */ jsxRuntime.jsx(StyledAddIcon, { "aria-hidden": true, $isOpen: isOpen, $hasError: hasError && !isOpen }),
2666
+ /* @__PURE__ */ jsxRuntime.jsx(
2667
+ designSystem.Typography,
2668
+ {
2669
+ variant: "pi",
2670
+ fontWeight: "bold",
2671
+ textColor: hasError && !isOpen ? "danger600" : "neutral600",
2672
+ children
2673
+ }
2674
+ )
2675
+ ] })
2676
+ }
2677
+ );
2678
+ };
2679
+ const StyledAddIcon = styledComponents.styled(Icons.PlusCircle)`
2680
+ height: ${({ theme }) => theme.spaces[6]};
2681
+ width: ${({ theme }) => theme.spaces[6]};
2682
+ transform: ${({ $isOpen }) => $isOpen ? "rotate(45deg)" : "rotate(0deg)"};
2683
+
2684
+ > circle {
2685
+ fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
2686
+ }
2405
2687
  > path {
2406
- fill: ${({ theme }) => theme.colors.primary600};
2688
+ fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral500};
2407
2689
  }
2408
2690
  `;
2409
- const NonRepeatableComponent = ({
2410
- attribute,
2411
- name: name2,
2412
- children,
2413
- layout
2691
+ const StyledButton = styledComponents.styled(designSystem.Button)`
2692
+ padding-left: ${({ theme }) => theme.spaces[3]};
2693
+ border-radius: 26px;
2694
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
2695
+ height: 5rem;
2696
+ `;
2697
+ const ComponentCategory = ({
2698
+ category,
2699
+ components = [],
2700
+ variant = "primary",
2701
+ onAddComponent
2414
2702
  }) => {
2415
- const { value } = strapiAdmin.useField(name2);
2416
- const level = Relations.useComponent("NonRepeatableComponent", (state) => state.level);
2417
- const isNested = level > 0;
2418
- return /* @__PURE__ */ jsxRuntime.jsx(Relations.ComponentProvider, { id: value?.id, uid: attribute.component, level: level + 1, type: "component", children: /* @__PURE__ */ jsxRuntime.jsx(
2703
+ const { formatMessage } = reactIntl.useIntl();
2704
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
2705
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
2706
+ /* @__PURE__ */ jsxRuntime.jsx(ResponsiveAccordionContent, { children: /* @__PURE__ */ jsxRuntime.jsx(Grid, { paddingTop: 4, paddingBottom: 4, paddingLeft: 3, paddingRight: 3, children: components.map(({ uid, displayName, icon }) => /* @__PURE__ */ jsxRuntime.jsx(
2707
+ ComponentBox,
2708
+ {
2709
+ tag: "button",
2710
+ type: "button",
2711
+ background: "neutral100",
2712
+ justifyContent: "center",
2713
+ onClick: onAddComponent(uid),
2714
+ hasRadius: true,
2715
+ height: "8.4rem",
2716
+ shrink: 0,
2717
+ borderColor: "neutral200",
2718
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
2719
+ /* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
2720
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
2721
+ ] })
2722
+ },
2723
+ uid
2724
+ )) }) })
2725
+ ] });
2726
+ };
2727
+ const ResponsiveAccordionContent = styledComponents.styled(designSystem.Accordion.Content)`
2728
+ container-type: inline-size;
2729
+ `;
2730
+ const Grid = styledComponents.styled(designSystem.Box)`
2731
+ display: grid;
2732
+ grid-template-columns: repeat(auto-fill, 100%);
2733
+ grid-gap: ${({ theme }) => theme.spaces[1]};
2734
+
2735
+ @container (min-width: ${() => RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
2736
+ grid-template-columns: repeat(auto-fill, 14rem);
2737
+ }
2738
+ `;
2739
+ const ComponentBox = styledComponents.styled(designSystem.Flex)`
2740
+ color: ${({ theme }) => theme.colors.neutral600};
2741
+ cursor: pointer;
2742
+
2743
+ @media (prefers-reduced-motion: no-preference) {
2744
+ transition: color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
2745
+ }
2746
+
2747
+ &:focus,
2748
+ &:hover {
2749
+ border: 1px solid ${({ theme }) => theme.colors.primary200};
2750
+ background: ${({ theme }) => theme.colors.primary100};
2751
+ color: ${({ theme }) => theme.colors.primary600};
2752
+ }
2753
+ `;
2754
+ const ComponentPicker = ({
2755
+ dynamicComponentsByCategory = {},
2756
+ isOpen,
2757
+ onClickAddComponent
2758
+ }) => {
2759
+ const { formatMessage } = reactIntl.useIntl();
2760
+ const handleAddComponentToDz = (componentUid) => () => {
2761
+ onClickAddComponent(componentUid);
2762
+ };
2763
+ if (!isOpen) {
2764
+ return null;
2765
+ }
2766
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2419
2767
  designSystem.Box,
2420
2768
  {
2421
- background: "neutral100",
2422
- paddingLeft: 6,
2423
- paddingRight: 6,
2424
2769
  paddingTop: 6,
2425
2770
  paddingBottom: 6,
2426
- hasRadius: isNested,
2427
- borderColor: isNested ? "neutral200" : void 0,
2428
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index2) => {
2429
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: row.map(({ size, ...field }) => {
2430
- const completeFieldName = `${name2}.${field.name}`;
2431
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: size, s: 12, xs: 12, children: children({ ...field, name: completeFieldName }) }, completeFieldName);
2432
- }) }, index2);
2433
- }) })
2771
+ paddingLeft: 5,
2772
+ paddingRight: 5,
2773
+ background: "neutral0",
2774
+ shadow: "tableShadow",
2775
+ borderColor: "neutral150",
2776
+ hasRadius: true,
2777
+ children: [
2778
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", textColor: "neutral600", children: formatMessage({
2779
+ id: index.getTranslation("components.DynamicZone.ComponentPicker-label"),
2780
+ defaultMessage: "Pick one component"
2781
+ }) }) }),
2782
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 2, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { defaultValue: Object.keys(dynamicComponentsByCategory)[0], children: Object.entries(dynamicComponentsByCategory).map(([category, components], index2) => /* @__PURE__ */ jsxRuntime.jsx(
2783
+ ComponentCategory,
2784
+ {
2785
+ category,
2786
+ components,
2787
+ onAddComponent: handleAddComponentToDz,
2788
+ variant: index2 % 2 === 1 ? "primary" : "secondary"
2789
+ },
2790
+ category
2791
+ )) }) })
2792
+ ]
2434
2793
  }
2435
- ) });
2794
+ );
2436
2795
  };
2437
- const RepeatableComponent = ({
2438
- attribute,
2796
+ const DynamicComponent = ({
2797
+ componentUid,
2439
2798
  disabled,
2799
+ index: index$1,
2440
2800
  name: name2,
2441
- mainField,
2442
- children,
2443
- layout
2801
+ onRemoveComponentClick,
2802
+ onMoveComponent,
2803
+ onGrabItem,
2804
+ onDropItem,
2805
+ onCancel,
2806
+ dynamicComponentsByCategory = {},
2807
+ onAddComponent,
2808
+ children
2444
2809
  }) => {
2445
- const { toggleNotification } = strapiAdmin.useNotification();
2446
2810
  const { formatMessage } = reactIntl.useIntl();
2447
- const { search: searchString } = reactRouterDom.useLocation();
2448
- const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
2449
- const { components } = index.useDoc();
2450
- const { value = [], error } = strapiAdmin.useField(name2);
2451
- const addFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.addFieldRow);
2452
- const moveFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.moveFieldRow);
2453
- const removeFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.removeFieldRow);
2454
- const { max = Infinity } = attribute;
2455
- const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
2456
- const [liveText, setLiveText] = React__namespace.useState("");
2457
- const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
2458
- if (search.has("field")) {
2459
- const fieldParam = search.get("field");
2460
- if (!fieldParam) {
2461
- return void 0;
2462
- }
2463
- const [, path] = fieldParam.split(`${name2}.`);
2464
- if (objects.getIn(value, path, void 0) !== void 0) {
2465
- const [subpath] = path.split(".");
2466
- return objects.getIn(value, subpath, void 0)?.__temp_key__;
2467
- }
2468
- }
2469
- return void 0;
2470
- }, [search, name2, value]);
2471
- const prevValue = usePrev.usePrev(value);
2811
+ const formValues = strapiAdmin.useForm("DynamicComponent", (state) => state.values);
2812
+ const {
2813
+ edit: { components }
2814
+ } = index.useDocLayout();
2815
+ const title = React__namespace.useMemo(() => {
2816
+ const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
2817
+ const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
2818
+ const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
2819
+ const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
2820
+ return mainValue;
2821
+ }, [componentUid, components, formValues, name2, index$1]);
2822
+ const { icon, displayName } = React__namespace.useMemo(() => {
2823
+ const [category] = componentUid.split(".");
2824
+ const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
2825
+ (component) => component.uid === componentUid
2826
+ ) ?? { icon: null, displayName: null };
2827
+ return { icon: icon2, displayName: displayName2 };
2828
+ }, [componentUid, dynamicComponentsByCategory]);
2829
+ const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
2830
+ type: `${useDragAndDrop.ItemTypes.DYNAMIC_ZONE}_${name2}`,
2831
+ index: index$1,
2832
+ item: {
2833
+ index: index$1,
2834
+ displayedValue: `${displayName} ${title}`,
2835
+ icon
2836
+ },
2837
+ onMoveItem: onMoveComponent,
2838
+ onDropItem,
2839
+ onGrabItem,
2840
+ onCancel
2841
+ });
2472
2842
  React__namespace.useEffect(() => {
2473
- if (prevValue && prevValue.length < value.length) {
2474
- setCollapseToOpen(value[value.length - 1].__temp_key__);
2475
- }
2476
- }, [value, prevValue]);
2843
+ dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
2844
+ }, [dragPreviewRef, index$1]);
2845
+ const accordionValue = React__namespace.useId();
2846
+ const { value = [], rawError } = strapiAdmin.useField(`${name2}.${index$1}`);
2847
+ const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
2477
2848
  React__namespace.useEffect(() => {
2478
- if (typeof componentTmpKeyWithFocussedField === "string") {
2479
- setCollapseToOpen(componentTmpKeyWithFocussedField);
2849
+ if (rawError && value) {
2850
+ setCollapseToOpen(accordionValue);
2480
2851
  }
2481
- }, [componentTmpKeyWithFocussedField]);
2482
- const toggleCollapses = () => {
2483
- setCollapseToOpen("");
2484
- };
2485
- const handleClick = () => {
2486
- if (value.length < max) {
2487
- const schema = components[attribute.component];
2488
- const form = createDefaultForm(schema, components);
2489
- const data = transformDocument(schema, components)(form);
2490
- addFieldRow(name2, data);
2491
- } else if (value.length >= max) {
2492
- toggleNotification({
2493
- type: "info",
2494
- message: formatMessage({
2495
- id: index.getTranslation("components.notification.info.maximum-requirement")
2496
- })
2497
- });
2498
- }
2499
- };
2500
- const handleMoveComponentField = (newIndex, currentIndex) => {
2501
- setLiveText(
2502
- formatMessage(
2503
- {
2504
- id: index.getTranslation("dnd.reorder"),
2505
- defaultMessage: "{item}, moved. New position in list: {position}."
2506
- },
2507
- {
2508
- item: `${name2}.${currentIndex}`,
2509
- position: getItemPos(newIndex)
2510
- }
2511
- )
2512
- );
2513
- moveFieldRow(name2, currentIndex, newIndex);
2514
- };
2515
- const handleValueChange = (key) => {
2516
- setCollapseToOpen(key);
2852
+ }, [rawError, value, accordionValue]);
2853
+ const composedBoxRefs = designSystem.useComposedRefs(boxRef, dropRef);
2854
+ const accordionActions = disabled ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2855
+ /* @__PURE__ */ jsxRuntime.jsx(
2856
+ designSystem.IconButton,
2857
+ {
2858
+ variant: "ghost",
2859
+ label: formatMessage(
2860
+ {
2861
+ id: index.getTranslation("components.DynamicZone.delete-label"),
2862
+ defaultMessage: "Delete {name}"
2863
+ },
2864
+ { name: title }
2865
+ ),
2866
+ onClick: onRemoveComponentClick,
2867
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
2868
+ }
2869
+ ),
2870
+ /* @__PURE__ */ jsxRuntime.jsx(
2871
+ designSystem.IconButton,
2872
+ {
2873
+ variant: "ghost",
2874
+ onClick: (e) => e.stopPropagation(),
2875
+ "data-handler-id": handlerId,
2876
+ ref: dragRef,
2877
+ label: formatMessage({
2878
+ id: index.getTranslation("components.DragHandle-label"),
2879
+ defaultMessage: "Drag"
2880
+ }),
2881
+ onKeyDown: handleKeyDown,
2882
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
2883
+ }
2884
+ ),
2885
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
2886
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 0, paddingRight: 0, children: /* @__PURE__ */ jsxRuntime.jsx(
2887
+ designSystem.IconButton,
2888
+ {
2889
+ variant: "ghost",
2890
+ label: formatMessage({
2891
+ id: index.getTranslation("components.DynamicZone.more-actions"),
2892
+ defaultMessage: "More actions"
2893
+ }),
2894
+ tag: "span",
2895
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false })
2896
+ }
2897
+ ) }),
2898
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
2899
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
2900
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
2901
+ id: index.getTranslation("components.DynamicZone.add-item-above"),
2902
+ defaultMessage: "Add component above"
2903
+ }) }),
2904
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2905
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
2906
+ components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
2907
+ ] }, category)) })
2908
+ ] }),
2909
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
2910
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
2911
+ id: index.getTranslation("components.DynamicZone.add-item-below"),
2912
+ defaultMessage: "Add component below"
2913
+ }) }),
2914
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2915
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
2916
+ components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
2917
+ ] }, category)) })
2918
+ ] })
2919
+ ] })
2920
+ ] })
2921
+ ] });
2922
+ const accordionTitle = title ? `${displayName} ${title}` : displayName;
2923
+ return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
2924
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
2925
+ /* @__PURE__ */ jsxRuntime.jsx(StyledBox, { ref: composedBoxRefs, hasRadius: true, children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview$1, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { value: collapseToOpen, onValueChange: setCollapseToOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: accordionValue, children: [
2926
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
2927
+ /* @__PURE__ */ jsxRuntime.jsx(
2928
+ designSystem.Accordion.Trigger,
2929
+ {
2930
+ icon: icon && ComponentIcon.COMPONENT_ICONS[icon] ? ComponentIcon.COMPONENT_ICONS[icon] : ComponentIcon.COMPONENT_ICONS.dashboard,
2931
+ children: accordionTitle
2932
+ }
2933
+ ),
2934
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
2935
+ ] }),
2936
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(AccordionContentRadius, { background: "neutral0", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 6, paddingRight: 6, paddingTop: 6, paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: components[componentUid]?.layout?.map((row, rowInd) => /* @__PURE__ */ jsxRuntime.jsx(
2937
+ designSystem.Grid.Item,
2938
+ {
2939
+ col: 12,
2940
+ s: 12,
2941
+ xs: 12,
2942
+ direction: "column",
2943
+ alignItems: "stretch",
2944
+ children: /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
2945
+ const fieldName = `${name2}.${index$1}.${field.name}`;
2946
+ const fieldWithTranslatedLabel = {
2947
+ ...field,
2948
+ label: formatMessage({
2949
+ id: `content-manager.components.${componentUid}.${field.name}`,
2950
+ defaultMessage: field.label
2951
+ })
2952
+ };
2953
+ return /* @__PURE__ */ jsxRuntime.jsx(
2954
+ ResponsiveGridItem,
2955
+ {
2956
+ col: size,
2957
+ s: 12,
2958
+ xs: 12,
2959
+ direction: "column",
2960
+ alignItems: "stretch",
2961
+ children: children ? children({ ...fieldWithTranslatedLabel, name: fieldName }) : /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel, name: fieldName })
2962
+ },
2963
+ fieldName
2964
+ );
2965
+ }) })
2966
+ },
2967
+ rowInd
2968
+ )) }) }) }) })
2969
+ ] }) }) })
2970
+ ] });
2971
+ };
2972
+ const StyledBox = styledComponents.styled(designSystem.Box)`
2973
+ > div:first-child {
2974
+ box-shadow: ${({ theme }) => theme.shadows.tableShadow};
2975
+ }
2976
+ `;
2977
+ const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
2978
+ border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
2979
+ `;
2980
+ const Rectangle = styledComponents.styled(designSystem.Box)`
2981
+ width: ${({ theme }) => theme.spaces[2]};
2982
+ height: ${({ theme }) => theme.spaces[4]};
2983
+ `;
2984
+ const Preview$1 = styledComponents.styled.span`
2985
+ display: block;
2986
+ background-color: ${({ theme }) => theme.colors.primary100};
2987
+ outline: 1px dashed ${({ theme }) => theme.colors.primary500};
2988
+ outline-offset: -1px;
2989
+ padding: ${({ theme }) => theme.spaces[6]};
2990
+ `;
2991
+ const ComponentContainer = styledComponents.styled(designSystem.Box)`
2992
+ list-style: none;
2993
+ padding: 0;
2994
+ margin: 0;
2995
+ `;
2996
+ const DynamicZoneLabel = ({
2997
+ hint,
2998
+ label,
2999
+ labelAction,
3000
+ name: name2,
3001
+ numberOfComponents = 0,
3002
+ required
3003
+ }) => {
3004
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
3005
+ designSystem.Box,
3006
+ {
3007
+ paddingTop: 3,
3008
+ paddingBottom: 3,
3009
+ paddingRight: 4,
3010
+ paddingLeft: 4,
3011
+ borderRadius: "26px",
3012
+ background: "neutral0",
3013
+ shadow: "filterShadow",
3014
+ color: "neutral500",
3015
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
3016
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
3017
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
3018
+ label || name2,
3019
+ " "
3020
+ ] }),
3021
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
3022
+ "(",
3023
+ numberOfComponents,
3024
+ ")"
3025
+ ] }),
3026
+ required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
3027
+ labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
3028
+ ] }),
3029
+ hint && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 1, maxWidth: "35.6rem", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", ellipsis: true, children: hint }) })
3030
+ ] })
3031
+ }
3032
+ ) });
3033
+ };
3034
+ const [DynamicZoneProvider, useDynamicZone] = strapiAdmin.createContext(
3035
+ "DynamicZone",
3036
+ {
3037
+ isInDynamicZone: false
3038
+ }
3039
+ );
3040
+ const DynamicZone = ({
3041
+ attribute,
3042
+ disabled: disabledProp,
3043
+ hint,
3044
+ label,
3045
+ labelAction,
3046
+ name: name2,
3047
+ required = false,
3048
+ children
3049
+ }) => {
3050
+ const { max = Infinity, min = -Infinity } = attribute ?? {};
3051
+ const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
3052
+ const [liveText, setLiveText] = React__namespace.useState("");
3053
+ const { components, isLoading } = index.useDoc();
3054
+ const disabled = disabledProp || isLoading;
3055
+ const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
3056
+ "DynamicZone",
3057
+ ({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
3058
+ addFieldRow: addFieldRow2,
3059
+ removeFieldRow: removeFieldRow2,
3060
+ moveFieldRow: moveFieldRow2
3061
+ })
3062
+ );
3063
+ const { value = [], error } = strapiAdmin.useField(name2);
3064
+ const dynamicComponentsByCategory = React__namespace.useMemo(() => {
3065
+ return attribute.components.reduce((acc, componentUid) => {
3066
+ const { category, info } = components[componentUid] ?? { info: {} };
3067
+ const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
3068
+ if (!acc[category]) {
3069
+ acc[category] = [];
3070
+ }
3071
+ acc[category] = [...acc[category], component];
3072
+ return acc;
3073
+ }, {});
3074
+ }, [attribute.components, components]);
3075
+ const { formatMessage } = reactIntl.useIntl();
3076
+ const { toggleNotification } = strapiAdmin.useNotification();
3077
+ const dynamicDisplayedComponentsLength = value.length;
3078
+ const handleAddComponent = (uid, position) => {
3079
+ setAddComponentIsOpen(false);
3080
+ const schema = components[uid];
3081
+ const form = index.createDefaultForm(schema, components);
3082
+ const transformations = pipe__default.default(index.transformDocument(schema, components), (data2) => ({
3083
+ ...data2,
3084
+ __component: uid
3085
+ }));
3086
+ const data = transformations(form);
3087
+ addFieldRow(name2, data, position);
3088
+ };
3089
+ const handleClickOpenPicker = () => {
3090
+ if (dynamicDisplayedComponentsLength < max) {
3091
+ setAddComponentIsOpen((prev) => !prev);
3092
+ } else {
3093
+ toggleNotification({
3094
+ type: "info",
3095
+ message: formatMessage({
3096
+ id: index.getTranslation("components.notification.info.maximum-requirement")
3097
+ })
3098
+ });
3099
+ }
3100
+ };
3101
+ const handleMoveComponent = (newIndex, currentIndex) => {
3102
+ setLiveText(
3103
+ formatMessage(
3104
+ {
3105
+ id: index.getTranslation("dnd.reorder"),
3106
+ defaultMessage: "{item}, moved. New position in list: {position}."
3107
+ },
3108
+ {
3109
+ item: `${name2}.${currentIndex}`,
3110
+ position: getItemPos(newIndex)
3111
+ }
3112
+ )
3113
+ );
3114
+ moveFieldRow(name2, currentIndex, newIndex);
2517
3115
  };
2518
3116
  const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
2519
3117
  const handleCancel = (index$1) => {
@@ -2557,419 +3155,109 @@ const RepeatableComponent = ({
2557
3155
  )
2558
3156
  );
2559
3157
  };
2560
- const ariaDescriptionId = React__namespace.useId();
2561
- const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
2562
- if (value.length === 0) {
2563
- return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
2564
- }
2565
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
2566
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
2567
- id: index.getTranslation("dnd.instructions"),
2568
- defaultMessage: `Press spacebar to grab and re-order`
2569
- }) }),
2570
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
2571
- /* @__PURE__ */ jsxRuntime.jsxs(
2572
- AccordionRoot,
2573
- {
2574
- $error: error,
2575
- value: collapseToOpen,
2576
- onValueChange: handleValueChange,
2577
- "aria-describedby": ariaDescriptionId,
2578
- children: [
2579
- value.map(({ __temp_key__: key, id }, index2) => {
2580
- const nameWithIndex = `${name2}.${index2}`;
2581
- return /* @__PURE__ */ jsxRuntime.jsx(
2582
- Relations.ComponentProvider,
2583
- {
2584
- id,
2585
- uid: attribute.component,
2586
- level: level + 1,
2587
- type: "repeatable",
2588
- children: /* @__PURE__ */ jsxRuntime.jsx(
2589
- Component,
2590
- {
2591
- disabled,
2592
- name: nameWithIndex,
2593
- attribute,
2594
- index: index2,
2595
- mainField,
2596
- onMoveItem: handleMoveComponentField,
2597
- onDeleteComponent: () => {
2598
- removeFieldRow(name2, index2);
2599
- toggleCollapses();
2600
- },
2601
- toggleCollapses,
2602
- onCancel: handleCancel,
2603
- onDropItem: handleDropItem,
2604
- onGrabItem: handleGrabItem,
2605
- __temp_key__: key,
2606
- children: layout.map((row, index22) => {
2607
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: row.map(({ size, ...field }) => {
2608
- const completeFieldName = `${nameWithIndex}.${field.name}`;
2609
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: size, s: 12, xs: 12, children: children({ ...field, name: completeFieldName }) }, completeFieldName);
2610
- }) }, index22);
2611
- })
2612
- }
2613
- )
2614
- },
2615
- key
2616
- );
2617
- }),
2618
- /* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
2619
- id: index.getTranslation("containers.EditView.add.new-entry"),
2620
- defaultMessage: "Add an entry"
2621
- }) })
2622
- ]
2623
- }
2624
- )
2625
- ] });
2626
- };
2627
- const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
2628
- border: 1px solid
2629
- ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
2630
- `;
2631
- const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
2632
- width: 100%;
2633
- display: flex;
2634
- justify-content: center;
2635
- border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
2636
- padding-inline: ${(props) => props.theme.spaces[6]};
2637
- padding-block: ${(props) => props.theme.spaces[3]};
2638
-
2639
- &:not([disabled]) {
2640
- cursor: pointer;
2641
-
2642
- &:hover {
2643
- background-color: ${(props) => props.theme.colors.primary100};
2644
- }
2645
- }
2646
-
2647
- span {
2648
- font-weight: 600;
2649
- font-size: 1.4rem;
2650
- line-height: 2.4rem;
2651
- }
2652
-
2653
- @media (prefers-reduced-motion: no-preference) {
2654
- transition: background-color 120ms ${(props) => props.theme.easings.easeOutQuad};
2655
- }
2656
- `;
2657
- const Component = ({
2658
- disabled,
2659
- index: index$1,
2660
- name: name2,
2661
- mainField = {
2662
- name: "id",
2663
- type: "integer"
2664
- },
2665
- children,
2666
- onDeleteComponent,
2667
- toggleCollapses,
2668
- __temp_key__,
2669
- ...dragProps
2670
- }) => {
2671
- const { formatMessage } = reactIntl.useIntl();
2672
- const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
2673
- return objects.getIn(state.values, [...name2.split("."), mainField.name]);
2674
- });
2675
- const accordionRef = React__namespace.useRef(null);
2676
- const componentKey = name2.split(".").slice(0, -1).join(".");
2677
- const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
2678
- type: `${useDragAndDrop.ItemTypes.COMPONENT}_${componentKey}`,
2679
- index: index$1,
2680
- item: {
2681
- index: index$1,
2682
- displayedValue: displayValue
2683
- },
2684
- onStart() {
2685
- toggleCollapses();
2686
- },
2687
- ...dragProps
2688
- });
2689
- React__namespace.useEffect(() => {
2690
- dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
2691
- }, [dragPreviewRef, index$1]);
2692
- const composedAccordionRefs = designSystem.useComposedRefs(accordionRef, dragRef);
2693
- const composedBoxRefs = designSystem.useComposedRefs(
2694
- boxRef,
2695
- dropRef
2696
- );
2697
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview$1, {}) : /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { ref: composedBoxRefs, value: __temp_key__, children: [
2698
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
2699
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: displayValue }),
2700
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Actions, { children: [
2701
- /* @__PURE__ */ jsxRuntime.jsx(
2702
- designSystem.IconButton,
2703
- {
2704
- borderWidth: 0,
2705
- onClick: onDeleteComponent,
2706
- label: formatMessage({
2707
- id: index.getTranslation("containers.Edit.delete"),
2708
- defaultMessage: "Delete"
2709
- }),
2710
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
2711
- }
2712
- ),
2713
- /* @__PURE__ */ jsxRuntime.jsx(
2714
- designSystem.IconButton,
2715
- {
2716
- ref: composedAccordionRefs,
2717
- borderWidth: 0,
2718
- onClick: (e) => e.stopPropagation(),
2719
- "data-handler-id": handlerId,
2720
- label: formatMessage({
2721
- id: index.getTranslation("components.DragHandle-label"),
2722
- defaultMessage: "Drag"
2723
- }),
2724
- onKeyDown: handleKeyDown,
2725
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
2726
- }
2727
- )
2728
- ] })
2729
- ] }),
2730
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
2731
- designSystem.Flex,
2732
- {
2733
- direction: "column",
2734
- alignItems: "stretch",
2735
- background: "neutral100",
2736
- padding: 6,
2737
- gap: 6,
2738
- children
2739
- }
2740
- ) })
2741
- ] }) });
2742
- };
2743
- const Preview$1 = () => {
2744
- return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
2745
- };
2746
- const StyledSpan = styledComponents.styled(designSystem.Box)`
2747
- display: block;
2748
- outline: 1px dashed ${({ theme }) => theme.colors.primary500};
2749
- outline-offset: -1px;
2750
- `;
2751
- const ComponentInput = ({
2752
- label,
2753
- required,
2754
- name: name2,
2755
- attribute,
2756
- disabled,
2757
- labelAction,
2758
- ...props
2759
- }) => {
2760
- const { formatMessage } = reactIntl.useIntl();
2761
- const field = strapiAdmin.useField(name2);
2762
- const showResetComponent = !attribute.repeatable && field.value && !disabled;
2763
- const { components } = index.useDoc();
2764
- const handleInitialisationClick = () => {
2765
- const schema = components[attribute.component];
2766
- const form = createDefaultForm(schema, components);
2767
- const data = transformDocument(schema, components)(form);
2768
- field.onChange(name2, data);
3158
+ const handleRemoveComponent = (name22, currentIndex) => () => {
3159
+ removeFieldRow(name22, currentIndex);
2769
3160
  };
2770
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
2771
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
2772
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
2773
- label,
2774
- attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2775
- (",
2776
- Array.isArray(field.value) ? field.value.length : 0,
2777
- ")"
2778
- ] })
2779
- ] }),
2780
- showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
2781
- designSystem.IconButton,
3161
+ const hasError = error !== void 0;
3162
+ const renderButtonLabel = () => {
3163
+ if (addComponentIsOpen) {
3164
+ return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
3165
+ }
3166
+ if (hasError && dynamicDisplayedComponentsLength > max) {
3167
+ return formatMessage(
2782
3168
  {
2783
- label: formatMessage({
2784
- id: index.getTranslation("components.reset-entry"),
2785
- defaultMessage: "Reset Entry"
2786
- }),
2787
- borderWidth: 0,
2788
- onClick: () => {
2789
- field.onChange(name2, null);
2790
- },
2791
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
3169
+ id: index.getTranslation(`components.DynamicZone.extra-components`),
3170
+ defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
3171
+ },
3172
+ {
3173
+ number: dynamicDisplayedComponentsLength - max
2792
3174
  }
2793
- )
2794
- ] }),
2795
- !attribute.repeatable && !field.value && /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleInitialisationClick }),
2796
- !attribute.repeatable && field.value ? /* @__PURE__ */ jsxRuntime.jsx(NonRepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }) : null,
2797
- attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }),
2798
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
2799
- ] });
2800
- };
2801
- const MemoizedComponentInput = React__namespace.memo(ComponentInput);
2802
- const AddComponentButton = ({
2803
- hasError,
2804
- isDisabled,
2805
- isOpen,
2806
- children,
2807
- onClick
2808
- }) => {
2809
- return /* @__PURE__ */ jsxRuntime.jsx(
2810
- StyledButton,
2811
- {
2812
- type: "button",
2813
- onClick,
2814
- disabled: isDisabled,
2815
- background: "neutral0",
2816
- paddingTop: 3,
2817
- paddingBottom: 3,
2818
- paddingLeft: 4,
2819
- paddingRight: 4,
2820
- style: { cursor: isDisabled ? "not-allowed" : "pointer" },
2821
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
2822
- /* @__PURE__ */ jsxRuntime.jsx(StyledAddIcon, { "aria-hidden": true, $isOpen: isOpen, $hasError: hasError && !isOpen }),
2823
- /* @__PURE__ */ jsxRuntime.jsx(
2824
- AddComponentTitle,
2825
- {
2826
- variant: "pi",
2827
- fontWeight: "bold",
2828
- textColor: hasError && !isOpen ? "danger600" : "neutral500",
2829
- children
2830
- }
2831
- )
2832
- ] })
2833
- }
2834
- );
2835
- };
2836
- const StyledAddIcon = styledComponents.styled(Icons.PlusCircle)`
2837
- height: ${({ theme }) => theme.spaces[6]};
2838
- width: ${({ theme }) => theme.spaces[6]};
2839
- transform: ${({ $isOpen }) => $isOpen ? "rotate(45deg)" : "rotate(0deg)"};
2840
-
2841
- > circle {
2842
- fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
2843
- }
2844
- > path {
2845
- fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral600};
2846
- }
2847
- `;
2848
- const AddComponentTitle = styledComponents.styled(designSystem.Typography)``;
2849
- const StyledButton = styledComponents.styled(designSystem.BaseButton)`
2850
- border-radius: 26px;
2851
- border-color: ${({ theme }) => theme.colors.neutral150};
2852
- box-shadow: ${({ theme }) => theme.shadows.filterShadow};
2853
-
2854
- &:hover {
2855
- ${AddComponentTitle} {
2856
- color: ${({ theme }) => theme.colors.primary600};
2857
- }
2858
-
2859
- ${StyledAddIcon} {
2860
- > circle {
2861
- fill: ${({ theme }) => theme.colors.primary600};
2862
- }
2863
- > path {
2864
- fill: ${({ theme }) => theme.colors.neutral100};
2865
- }
2866
- }
2867
- }
2868
- &:active {
2869
- ${AddComponentTitle} {
2870
- color: ${({ theme }) => theme.colors.primary600};
3175
+ );
2871
3176
  }
2872
- ${StyledAddIcon} {
2873
- > circle {
2874
- fill: ${({ theme }) => theme.colors.primary600};
2875
- }
2876
- > path {
2877
- fill: ${({ theme }) => theme.colors.neutral100};
2878
- }
3177
+ if (hasError && dynamicDisplayedComponentsLength < min) {
3178
+ return formatMessage(
3179
+ {
3180
+ id: index.getTranslation(`components.DynamicZone.missing-components`),
3181
+ defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
3182
+ },
3183
+ { number: min - dynamicDisplayedComponentsLength }
3184
+ );
2879
3185
  }
2880
- }
2881
- `;
2882
- const ComponentCategory = ({
2883
- category,
2884
- components = [],
2885
- variant = "primary",
2886
- onAddComponent
2887
- }) => {
2888
- const { formatMessage } = reactIntl.useIntl();
2889
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
2890
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
2891
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(Grid, { paddingTop: 4, paddingBottom: 4, paddingLeft: 3, paddingRight: 3, children: components.map(({ uid, displayName, icon }) => /* @__PURE__ */ jsxRuntime.jsx(
2892
- ComponentBox,
3186
+ return formatMessage(
2893
3187
  {
2894
- tag: "button",
2895
- type: "button",
2896
- background: "neutral100",
2897
- justifyContent: "center",
2898
- onClick: onAddComponent(uid),
2899
- hasRadius: true,
2900
- height: "8.4rem",
2901
- shrink: 0,
2902
- borderColor: "neutral200",
2903
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
2904
- /* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
2905
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
2906
- ] })
3188
+ id: index.getTranslation("components.DynamicZone.add-component"),
3189
+ defaultMessage: "Add a component to {componentName}"
2907
3190
  },
2908
- uid
2909
- )) }) })
2910
- ] });
2911
- };
2912
- const Grid = styledComponents.styled(designSystem.Box)`
2913
- display: grid;
2914
- grid-template-columns: repeat(auto-fit, 14rem);
2915
- grid-gap: ${({ theme }) => theme.spaces[1]};
2916
- `;
2917
- const ComponentBox = styledComponents.styled(designSystem.Flex)`
2918
- color: ${({ theme }) => theme.colors.neutral600};
2919
- cursor: pointer;
2920
-
2921
- @media (prefers-reduced-motion: no-preference) {
2922
- transition: color 120ms ${(props) => props.theme.easings.easeOutQuad};
2923
- }
2924
-
2925
- &:focus,
2926
- &:hover {
2927
- border: 1px solid ${({ theme }) => theme.colors.primary200};
2928
- background: ${({ theme }) => theme.colors.primary100};
2929
- color: ${({ theme }) => theme.colors.primary600};
2930
- }
2931
- `;
2932
- const ComponentPicker = ({
2933
- dynamicComponentsByCategory = {},
2934
- isOpen,
2935
- onClickAddComponent
2936
- }) => {
2937
- const { formatMessage } = reactIntl.useIntl();
2938
- const handleAddComponentToDz = (componentUid) => () => {
2939
- onClickAddComponent(componentUid);
3191
+ { componentName: label || name2 }
3192
+ );
2940
3193
  };
2941
- if (!isOpen) {
2942
- return null;
2943
- }
2944
- return /* @__PURE__ */ jsxRuntime.jsxs(
2945
- designSystem.Box,
2946
- {
2947
- paddingTop: 6,
2948
- paddingBottom: 6,
2949
- paddingLeft: 5,
2950
- paddingRight: 5,
2951
- background: "neutral0",
2952
- shadow: "tableShadow",
2953
- borderColor: "neutral150",
2954
- hasRadius: true,
2955
- children: [
2956
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", textColor: "neutral600", children: formatMessage({
2957
- id: index.getTranslation("components.DynamicZone.ComponentPicker-label"),
2958
- defaultMessage: "Pick one component"
2959
- }) }) }),
2960
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 2, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { defaultValue: Object.keys(dynamicComponentsByCategory)[0], children: Object.entries(dynamicComponentsByCategory).map(([category, components], index2) => /* @__PURE__ */ jsxRuntime.jsx(
2961
- ComponentCategory,
2962
- {
2963
- category,
2964
- components,
2965
- onAddComponent: handleAddComponentToDz,
2966
- variant: index2 % 2 === 1 ? "primary" : "secondary"
2967
- },
2968
- category
2969
- )) }) })
2970
- ]
2971
- }
2972
- );
3194
+ const level = Relations.useComponent("DynamicZone", (state) => state.level);
3195
+ const ariaDescriptionId = React__namespace.useId();
3196
+ return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
3197
+ dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
3198
+ /* @__PURE__ */ jsxRuntime.jsx(
3199
+ DynamicZoneLabel,
3200
+ {
3201
+ hint,
3202
+ label,
3203
+ labelAction,
3204
+ name: name2,
3205
+ numberOfComponents: dynamicDisplayedComponentsLength,
3206
+ required
3207
+ }
3208
+ ),
3209
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
3210
+ id: index.getTranslation("dnd.instructions"),
3211
+ defaultMessage: `Press spacebar to grab and re-order`
3212
+ }) }),
3213
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
3214
+ /* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
3215
+ Relations.ComponentProvider,
3216
+ {
3217
+ level: level + 1,
3218
+ uid: field.__component,
3219
+ id: field.id,
3220
+ type: "dynamiczone",
3221
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3222
+ DynamicComponent,
3223
+ {
3224
+ disabled,
3225
+ name: name2,
3226
+ index: index2,
3227
+ componentUid: field.__component,
3228
+ onMoveComponent: handleMoveComponent,
3229
+ onRemoveComponentClick: handleRemoveComponent(name2, index2),
3230
+ onCancel: handleCancel,
3231
+ onDropItem: handleDropItem,
3232
+ onGrabItem: handleGrabItem,
3233
+ onAddComponent: handleAddComponent,
3234
+ dynamicComponentsByCategory,
3235
+ children
3236
+ }
3237
+ )
3238
+ },
3239
+ field.__temp_key__
3240
+ )) })
3241
+ ] }),
3242
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
3243
+ AddComponentButton,
3244
+ {
3245
+ hasError,
3246
+ isDisabled: disabled,
3247
+ isOpen: addComponentIsOpen,
3248
+ onClick: handleClickOpenPicker,
3249
+ children: renderButtonLabel()
3250
+ }
3251
+ ) }),
3252
+ /* @__PURE__ */ jsxRuntime.jsx(
3253
+ ComponentPicker,
3254
+ {
3255
+ dynamicComponentsByCategory,
3256
+ isOpen: addComponentIsOpen,
3257
+ onClickAddComponent: handleAddComponent
3258
+ }
3259
+ )
3260
+ ] }) });
2973
3261
  };
2974
3262
  const NotAllowedInput = ({ hint, label, required, name: name2 }) => {
2975
3263
  const { formatMessage } = reactIntl.useIntl();
@@ -2992,18 +3280,6 @@ const NotAllowedInput = ({ hint, label, required, name: name2 }) => {
2992
3280
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
2993
3281
  ] });
2994
3282
  };
2995
- function useDebounce(value, delay) {
2996
- const [debouncedValue, setDebouncedValue] = React.useState(value);
2997
- React.useEffect(() => {
2998
- const handler = setTimeout(() => {
2999
- setDebouncedValue(value);
3000
- }, delay);
3001
- return () => {
3002
- clearTimeout(handler);
3003
- };
3004
- }, [value, delay]);
3005
- return debouncedValue;
3006
- }
3007
3283
  const uidApi = index.contentManagerApi.injectEndpoints({
3008
3284
  endpoints: (builder) => ({
3009
3285
  getDefaultUID: builder.query({
@@ -3038,7 +3314,10 @@ const uidApi = index.contentManagerApi.injectEndpoints({
3038
3314
  config: {
3039
3315
  params
3040
3316
  }
3041
- })
3317
+ }),
3318
+ providesTags: (_res, _error, params) => [
3319
+ { type: "UidAvailability", id: params.contentTypeUID }
3320
+ ]
3042
3321
  })
3043
3322
  })
3044
3323
  });
@@ -3050,8 +3329,10 @@ const UIDInput = React__namespace.forwardRef(
3050
3329
  const allFormValues = strapiAdmin.useForm("InputUID", (form) => form.values);
3051
3330
  const [availability, setAvailability] = React__namespace.useState();
3052
3331
  const [showRegenerate, setShowRegenerate] = React__namespace.useState(false);
3332
+ const isCloning = reactRouterDom.useMatch(index.CLONE_PATH) !== null;
3053
3333
  const field = strapiAdmin.useField(name2);
3054
- const debouncedValue = useDebounce(field.value, 300);
3334
+ const debouncedValue = usePrev.useDebounce(field.value, 300);
3335
+ const hasChanged = debouncedValue !== field.initialValue;
3055
3336
  const { toggleNotification } = strapiAdmin.useNotification();
3056
3337
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
3057
3338
  const { formatMessage } = reactIntl.useIntl();
@@ -3127,8 +3408,9 @@ const UIDInput = React__namespace.forwardRef(
3127
3408
  params
3128
3409
  },
3129
3410
  {
3411
+ // Don't check availability if the value is empty or wasn't changed
3130
3412
  skip: !Boolean(
3131
- debouncedValue !== field.initialValue && debouncedValue && UID_REGEX.test(debouncedValue.trim())
3413
+ (hasChanged || isCloning) && debouncedValue && UID_REGEX.test(debouncedValue.trim())
3132
3414
  )
3133
3415
  }
3134
3416
  );
@@ -3157,6 +3439,7 @@ const UIDInput = React__namespace.forwardRef(
3157
3439
  const isLoading = isGeneratingDefaultUID || isGeneratingUID || isCheckingAvailability;
3158
3440
  const fieldRef = strapiAdmin.useFocusInputField(name2);
3159
3441
  const composedRefs = designSystem.useComposedRefs(ref, fieldRef);
3442
+ const shouldShowAvailability = (hasChanged || isCloning) && debouncedValue != null && availability && !showRegenerate;
3160
3443
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { hint, name: name2, error: field.error, required, children: [
3161
3444
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { action: labelAction, children: label }),
3162
3445
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -3165,7 +3448,7 @@ const UIDInput = React__namespace.forwardRef(
3165
3448
  ref: composedRefs,
3166
3449
  disabled: props.disabled,
3167
3450
  endAction: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { position: "relative", gap: 1, children: [
3168
- availability && !showRegenerate && /* @__PURE__ */ jsxRuntime.jsxs(
3451
+ shouldShowAvailability && /* @__PURE__ */ jsxRuntime.jsxs(
3169
3452
  TextValidation,
3170
3453
  {
3171
3454
  alignItems: "center",
@@ -3454,8 +3737,7 @@ const Wrapper = styledComponents.styled.div`
3454
3737
  `;
3455
3738
  var listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/, emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/, unorderedListRE = /[*+-]\s/;
3456
3739
  function newlineAndIndentContinueMarkdownList(cm) {
3457
- if (cm.getOption("disableInput"))
3458
- return CodeMirror__default.default.Pass;
3740
+ if (cm.getOption("disableInput")) return CodeMirror__default.default.Pass;
3459
3741
  var ranges = cm.listSelections(), replacements = [];
3460
3742
  for (var i = 0; i < ranges.length; i++) {
3461
3743
  var pos = ranges[i].head;
@@ -3489,8 +3771,7 @@ function newlineAndIndentContinueMarkdownList(cm) {
3489
3771
  var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0);
3490
3772
  var bullet = numbered ? parseInt(match[3], 10) + 1 + match[4] : match[2].replace("x", " ");
3491
3773
  replacements[i] = "\n" + indent + bullet + after;
3492
- if (numbered)
3493
- incrementRemainingMarkdownListNumbers(cm, pos);
3774
+ if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);
3494
3775
  }
3495
3776
  }
3496
3777
  cm.replaceSelections(replacements);
@@ -3508,10 +3789,8 @@ function incrementRemainingMarkdownListNumbers(cm, pos) {
3508
3789
  var newNumber = parseInt(startItem[3], 10) + lookAhead - skipCount;
3509
3790
  var nextNumber = parseInt(nextItem[3], 10), itemNumber = nextNumber;
3510
3791
  if (startIndent === nextIndent && !isNaN(nextNumber)) {
3511
- if (newNumber === nextNumber)
3512
- itemNumber = nextNumber + 1;
3513
- if (newNumber > nextNumber)
3514
- itemNumber = newNumber + 1;
3792
+ if (newNumber === nextNumber) itemNumber = nextNumber + 1;
3793
+ if (newNumber > nextNumber) itemNumber = newNumber + 1;
3515
3794
  cm.replaceRange(
3516
3795
  nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),
3517
3796
  {
@@ -3524,10 +3803,8 @@ function incrementRemainingMarkdownListNumbers(cm, pos) {
3524
3803
  }
3525
3804
  );
3526
3805
  } else {
3527
- if (startIndent.length > nextIndent.length)
3528
- return;
3529
- if (startIndent.length < nextIndent.length && lookAhead === 1)
3530
- return;
3806
+ if (startIndent.length > nextIndent.length) return;
3807
+ if (startIndent.length < nextIndent.length && lookAhead === 1) return;
3531
3808
  skipCount += 1;
3532
3809
  }
3533
3810
  }
@@ -3999,7 +4276,7 @@ const EditorLayout = ({
3999
4276
  justifyContent: "flex-end",
4000
4277
  shrink: 0,
4001
4278
  width: "100%",
4002
- children: /* @__PURE__ */ jsxRuntime.jsxs(ExpandButton$1, { onClick: onCollapse, children: [
4279
+ children: /* @__PURE__ */ jsxRuntime.jsxs(ExpandButton$1, { onClick: onCollapse, variant: "tertiary", size: "M", children: [
4003
4280
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
4004
4281
  id: "components.Wysiwyg.collapse",
4005
4282
  defaultMessage: "Collapse"
@@ -4017,12 +4294,14 @@ const EditorLayout = ({
4017
4294
  ) }) });
4018
4295
  }
4019
4296
  return /* @__PURE__ */ jsxRuntime.jsx(
4020
- designSystem.Box,
4297
+ designSystem.Flex,
4021
4298
  {
4022
4299
  borderColor: error ? "danger600" : "neutral200",
4023
4300
  borderStyle: "solid",
4024
4301
  borderWidth: "1px",
4025
4302
  hasRadius: true,
4303
+ direction: "column",
4304
+ alignItems: "stretch",
4026
4305
  children
4027
4306
  }
4028
4307
  );
@@ -4033,11 +4312,19 @@ const ExpandWrapper = styledComponents.styled(designSystem.Flex)`
4033
4312
  const BoxWithBorder = styledComponents.styled(designSystem.Box)`
4034
4313
  border-right: 1px solid ${({ theme }) => theme.colors.neutral200};
4035
4314
  `;
4036
- const ExpandButton$1 = styledComponents.styled(designSystem.BaseButton)`
4315
+ const ExpandButton$1 = styledComponents.styled(designSystem.Button)`
4037
4316
  background-color: transparent;
4038
4317
  border: none;
4039
4318
  align-items: center;
4040
4319
 
4320
+ & > span {
4321
+ display: flex;
4322
+ justify-content: space-between;
4323
+ align-items: center;
4324
+ width: 100%;
4325
+ font-weight: ${({ theme }) => theme.fontWeights.regular};
4326
+ }
4327
+
4041
4328
  svg {
4042
4329
  margin-left: ${({ theme }) => `${theme.spaces[2]}`};
4043
4330
 
@@ -4301,45 +4588,31 @@ const quoteAndCodeHandler = (editor, markdownType) => {
4301
4588
  if (textToEdit) {
4302
4589
  insertWithTextToEdit(editor, markdownType, line, contentLength, textToEdit);
4303
4590
  } else {
4304
- insertWithoutTextToEdit(editor, markdownType, line, contentLength);
4305
- }
4306
- };
4307
- const CustomIconButton = styledComponents.styled(designSystem.IconButton)`
4308
- padding: ${({ theme }) => theme.spaces[2]};
4309
- /* Trick to prevent the outline from overflowing because of the general outline-offset */
4310
- outline-offset: -2px !important;
4311
-
4312
- svg {
4313
- width: 1.8rem;
4314
- height: 1.8rem;
4315
- }
4316
- `;
4317
- const CustomLinkIconButton = styledComponents.styled(CustomIconButton)`
4318
- svg {
4319
- width: 0.8rem;
4320
- height: 0.8rem;
4591
+ insertWithoutTextToEdit(editor, markdownType, line, contentLength);
4321
4592
  }
4322
- `;
4593
+ };
4323
4594
  const MainButtons = styledComponents.styled(designSystem.IconButtonGroup)`
4324
4595
  margin-left: ${({ theme }) => theme.spaces[4]};
4325
4596
  `;
4326
4597
  const MoreButton = styledComponents.styled(designSystem.IconButton)`
4327
4598
  margin: ${({ theme }) => `0 ${theme.spaces[2]}`};
4328
- padding: ${({ theme }) => theme.spaces[2]};
4329
-
4330
- svg {
4331
- width: 1.8rem;
4332
- height: 1.8rem;
4333
- }
4334
4599
  `;
4335
4600
  const IconButtonGroupMargin = styledComponents.styled(designSystem.IconButtonGroup)`
4336
4601
  margin-right: ${({ theme }) => `${theme.spaces[2]}`};
4337
4602
  `;
4338
- const ExpandButton = styledComponents.styled(designSystem.BaseButton)`
4603
+ const ExpandButton = styledComponents.styled(designSystem.Button)`
4339
4604
  background-color: transparent;
4340
4605
  border: none;
4341
4606
  align-items: center;
4342
4607
 
4608
+ & > span {
4609
+ display: flex;
4610
+ justify-content: space-between;
4611
+ align-items: center;
4612
+ width: 100%;
4613
+ font-weight: ${({ theme }) => theme.fontWeights.regular};
4614
+ }
4615
+
4343
4616
  svg {
4344
4617
  margin-left: ${({ theme }) => `${theme.spaces[2]}`};
4345
4618
  path {
@@ -4351,8 +4624,8 @@ const ExpandButton = styledComponents.styled(designSystem.BaseButton)`
4351
4624
  `;
4352
4625
  const WysiwygFooter = ({ onToggleExpand }) => {
4353
4626
  const { formatMessage } = reactIntl.useIntl();
4354
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 2, background: "neutral100", borderRadius: `0 0 0.4rem 0.4rem`, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", alignItems: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsxs(ExpandButton, { id: "expand", onClick: onToggleExpand, children: [
4355
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
4627
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 2, background: "neutral100", borderRadius: `0 0 0.4rem 0.4rem`, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", alignItems: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsxs(ExpandButton, { id: "expand", onClick: onToggleExpand, variant: "tertiary", size: "M", children: [
4628
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: formatMessage({
4356
4629
  id: "components.WysiwygBottomControls.fullscreen",
4357
4630
  defaultMessage: "Expand"
4358
4631
  }) }),
@@ -4374,7 +4647,7 @@ const WysiwygNav = ({
4374
4647
  id: "components.Wysiwyg.selectOptions.title",
4375
4648
  defaultMessage: "Add a title"
4376
4649
  });
4377
- const buttonMoreRef = React__namespace.useRef(null);
4650
+ React__namespace.useRef(null);
4378
4651
  const handleTogglePopover = () => {
4379
4652
  setVisiblePopover((prev) => !prev);
4380
4653
  };
@@ -4388,18 +4661,27 @@ const WysiwygNav = ({
4388
4661
  borderRadius: `0.4rem 0.4rem 0 0`,
4389
4662
  children: [
4390
4663
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
4391
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.SingleSelect, { disabled: true, placeholder: selectPlaceholder, "aria-label": selectPlaceholder, children: [
4392
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h1", children: "h1" }),
4393
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h2", children: "h2" }),
4394
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h3", children: "h3" }),
4395
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h4", children: "h4" }),
4396
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h5", children: "h5" }),
4397
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h6", children: "h6" })
4398
- ] }) }),
4664
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsxs(
4665
+ designSystem.SingleSelect,
4666
+ {
4667
+ disabled: true,
4668
+ placeholder: selectPlaceholder,
4669
+ "aria-label": selectPlaceholder,
4670
+ size: "S",
4671
+ children: [
4672
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h1", children: "h1" }),
4673
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h2", children: "h2" }),
4674
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h3", children: "h3" }),
4675
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h4", children: "h4" }),
4676
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h5", children: "h5" }),
4677
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h6", children: "h6" })
4678
+ ]
4679
+ }
4680
+ ) }),
4399
4681
  /* @__PURE__ */ jsxRuntime.jsxs(MainButtons, { children: [
4400
- /* @__PURE__ */ jsxRuntime.jsx(CustomIconButton, { disabled: true, label: "Bold", name: "Bold", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {}) }),
4401
- /* @__PURE__ */ jsxRuntime.jsx(CustomIconButton, { disabled: true, label: "Italic", name: "Italic", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Italic, {}) }),
4402
- /* @__PURE__ */ jsxRuntime.jsx(CustomIconButton, { disabled: true, label: "Underline", name: "Underline", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Underline, {}) })
4682
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { disabled: true, label: "Bold", name: "Bold", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {}) }),
4683
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { disabled: true, label: "Italic", name: "Italic", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Italic, {}) }),
4684
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { disabled: true, label: "Underline", name: "Underline", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Underline, {}) })
4403
4685
  ] }),
4404
4686
  /* @__PURE__ */ jsxRuntime.jsx(MoreButton, { disabled: true, label: "More", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, {}) })
4405
4687
  ] }),
@@ -4426,6 +4708,7 @@ const WysiwygNav = ({
4426
4708
  placeholder: selectPlaceholder,
4427
4709
  "aria-label": selectPlaceholder,
4428
4710
  onChange: (value) => onActionClick(value, editorRef),
4711
+ size: "S",
4429
4712
  children: [
4430
4713
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h1", children: "h1" }),
4431
4714
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h2", children: "h2" }),
@@ -4437,17 +4720,9 @@ const WysiwygNav = ({
4437
4720
  }
4438
4721
  ) }),
4439
4722
  /* @__PURE__ */ jsxRuntime.jsxs(MainButtons, { children: [
4723
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { onClick: () => onActionClick("Bold", editorRef), label: "Bold", name: "Bold", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {}) }),
4440
4724
  /* @__PURE__ */ jsxRuntime.jsx(
4441
- CustomIconButton,
4442
- {
4443
- onClick: () => onActionClick("Bold", editorRef),
4444
- label: "Bold",
4445
- name: "Bold",
4446
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {})
4447
- }
4448
- ),
4449
- /* @__PURE__ */ jsxRuntime.jsx(
4450
- CustomIconButton,
4725
+ designSystem.IconButton,
4451
4726
  {
4452
4727
  onClick: () => onActionClick("Italic", editorRef),
4453
4728
  label: "Italic",
@@ -4456,7 +4731,7 @@ const WysiwygNav = ({
4456
4731
  }
4457
4732
  ),
4458
4733
  /* @__PURE__ */ jsxRuntime.jsx(
4459
- CustomIconButton,
4734
+ designSystem.IconButton,
4460
4735
  {
4461
4736
  onClick: () => onActionClick("Underline", editorRef),
4462
4737
  label: "Underline",
@@ -4465,79 +4740,81 @@ const WysiwygNav = ({
4465
4740
  }
4466
4741
  )
4467
4742
  ] }),
4468
- /* @__PURE__ */ jsxRuntime.jsx(MoreButton, { ref: buttonMoreRef, onClick: handleTogglePopover, label: "More", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, {}) }),
4469
- visiblePopover && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover, { onDismiss: handleTogglePopover, centered: true, source: buttonMoreRef, spacing: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
4470
- /* @__PURE__ */ jsxRuntime.jsxs(IconButtonGroupMargin, { children: [
4471
- /* @__PURE__ */ jsxRuntime.jsx(
4472
- CustomIconButton,
4473
- {
4474
- onClick: () => onActionClick("Strikethrough", editorRef, handleTogglePopover),
4475
- label: "Strikethrough",
4476
- name: "Strikethrough",
4477
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.StrikeThrough, {})
4478
- }
4479
- ),
4480
- /* @__PURE__ */ jsxRuntime.jsx(
4481
- CustomIconButton,
4482
- {
4483
- onClick: () => onActionClick("BulletList", editorRef, handleTogglePopover),
4484
- label: "BulletList",
4485
- name: "BulletList",
4486
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.BulletList, {})
4487
- }
4488
- ),
4489
- /* @__PURE__ */ jsxRuntime.jsx(
4490
- CustomIconButton,
4491
- {
4492
- onClick: () => onActionClick("NumberList", editorRef, handleTogglePopover),
4493
- label: "NumberList",
4494
- name: "NumberList",
4495
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.NumberList, {})
4496
- }
4497
- )
4498
- ] }),
4499
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.IconButtonGroup, { children: [
4500
- /* @__PURE__ */ jsxRuntime.jsx(
4501
- CustomIconButton,
4502
- {
4503
- onClick: () => onActionClick("Code", editorRef, handleTogglePopover),
4504
- label: "Code",
4505
- name: "Code",
4506
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Code, {})
4507
- }
4508
- ),
4509
- /* @__PURE__ */ jsxRuntime.jsx(
4510
- CustomIconButton,
4511
- {
4512
- onClick: () => {
4513
- handleTogglePopover();
4514
- onToggleMediaLib();
4515
- },
4516
- label: "Image",
4517
- name: "Image",
4518
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Image, {})
4519
- }
4520
- ),
4521
- /* @__PURE__ */ jsxRuntime.jsx(
4522
- CustomLinkIconButton,
4523
- {
4524
- onClick: () => onActionClick("Link", editorRef, handleTogglePopover),
4525
- label: "Link",
4526
- name: "Link",
4527
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Link, {})
4528
- }
4529
- ),
4530
- /* @__PURE__ */ jsxRuntime.jsx(
4531
- CustomIconButton,
4532
- {
4533
- onClick: () => onActionClick("Quote", editorRef, handleTogglePopover),
4534
- label: "Quote",
4535
- name: "Quote",
4536
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Quotes, {})
4537
- }
4538
- )
4539
- ] })
4540
- ] }) })
4743
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
4744
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(MoreButton, { label: "More", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, {}) }) }),
4745
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Content, { sideOffset: 12, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 2, children: [
4746
+ /* @__PURE__ */ jsxRuntime.jsxs(IconButtonGroupMargin, { children: [
4747
+ /* @__PURE__ */ jsxRuntime.jsx(
4748
+ designSystem.IconButton,
4749
+ {
4750
+ onClick: () => onActionClick("Strikethrough", editorRef, handleTogglePopover),
4751
+ label: "Strikethrough",
4752
+ name: "Strikethrough",
4753
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.StrikeThrough, {})
4754
+ }
4755
+ ),
4756
+ /* @__PURE__ */ jsxRuntime.jsx(
4757
+ designSystem.IconButton,
4758
+ {
4759
+ onClick: () => onActionClick("BulletList", editorRef, handleTogglePopover),
4760
+ label: "BulletList",
4761
+ name: "BulletList",
4762
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.BulletList, {})
4763
+ }
4764
+ ),
4765
+ /* @__PURE__ */ jsxRuntime.jsx(
4766
+ designSystem.IconButton,
4767
+ {
4768
+ onClick: () => onActionClick("NumberList", editorRef, handleTogglePopover),
4769
+ label: "NumberList",
4770
+ name: "NumberList",
4771
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.NumberList, {})
4772
+ }
4773
+ )
4774
+ ] }),
4775
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.IconButtonGroup, { children: [
4776
+ /* @__PURE__ */ jsxRuntime.jsx(
4777
+ designSystem.IconButton,
4778
+ {
4779
+ onClick: () => onActionClick("Code", editorRef, handleTogglePopover),
4780
+ label: "Code",
4781
+ name: "Code",
4782
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Code, {})
4783
+ }
4784
+ ),
4785
+ /* @__PURE__ */ jsxRuntime.jsx(
4786
+ designSystem.IconButton,
4787
+ {
4788
+ onClick: () => {
4789
+ handleTogglePopover();
4790
+ onToggleMediaLib();
4791
+ },
4792
+ label: "Image",
4793
+ name: "Image",
4794
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Image, {})
4795
+ }
4796
+ ),
4797
+ /* @__PURE__ */ jsxRuntime.jsx(
4798
+ designSystem.IconButton,
4799
+ {
4800
+ onClick: () => onActionClick("Link", editorRef, handleTogglePopover),
4801
+ label: "Link",
4802
+ name: "Link",
4803
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Link, {})
4804
+ }
4805
+ ),
4806
+ /* @__PURE__ */ jsxRuntime.jsx(
4807
+ designSystem.IconButton,
4808
+ {
4809
+ onClick: () => onActionClick("Quote", editorRef, handleTogglePopover),
4810
+ label: "Quote",
4811
+ name: "Quote",
4812
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Quotes, {})
4813
+ }
4814
+ )
4815
+ ] })
4816
+ ] }) })
4817
+ ] })
4541
4818
  ] }),
4542
4819
  onTogglePreviewMode && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onTogglePreviewMode, variant: "tertiary", children: formatMessage({
4543
4820
  id: "components.Wysiwyg.ToggleMode.preview-mode",
@@ -4664,15 +4941,19 @@ const Wysiwyg = React__namespace.forwardRef(
4664
4941
  );
4665
4942
  const MemoizedWysiwyg = React__namespace.memo(Wysiwyg);
4666
4943
  const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4667
- const { id } = index.useDoc();
4944
+ const { id, document: document2, collectionType } = index.useDoc();
4668
4945
  const isFormDisabled = strapiAdmin.useForm("InputRenderer", (state) => state.disabled);
4669
4946
  const isInDynamicZone = useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
4670
4947
  const canCreateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
4671
4948
  const canReadFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
4672
4949
  const canUpdateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
4673
4950
  const canUserAction = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUserAction);
4674
- const editableFields = id ? canUpdateFields : canCreateFields;
4675
- const readableFields = id ? canReadFields : canCreateFields;
4951
+ let idToCheck = id;
4952
+ if (collectionType === index.SINGLE_TYPES) {
4953
+ idToCheck = document2?.documentId;
4954
+ }
4955
+ const editableFields = idToCheck ? canUpdateFields : canCreateFields;
4956
+ const readableFields = idToCheck ? canReadFields : canCreateFields;
4676
4957
  const canUserReadField = canUserAction(props.name, readableFields, props.type);
4677
4958
  const canUserEditField = canUserAction(props.name, editableFields, props.type);
4678
4959
  const fields = strapiAdmin.useStrapiApp("InputRenderer", (app) => app.fields);
@@ -4683,6 +4964,7 @@ const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4683
4964
  const {
4684
4965
  edit: { components }
4685
4966
  } = index.useDocLayout();
4967
+ const field = strapiAdmin.useField(props.name);
4686
4968
  if (!visible) {
4687
4969
  return null;
4688
4970
  }
@@ -4693,551 +4975,643 @@ const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4693
4975
  if (attributeHasCustomFieldProperty(props.attribute)) {
4694
4976
  const CustomInput = lazyComponentStore[props.attribute.customField];
4695
4977
  if (CustomInput) {
4696
- return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4978
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, ...field, hint, disabled: fieldIsDisabled });
4979
+ }
4980
+ return /* @__PURE__ */ jsxRuntime.jsx(
4981
+ strapiAdmin.InputRenderer,
4982
+ {
4983
+ ...props,
4984
+ hint,
4985
+ type: props.attribute.customField,
4986
+ disabled: fieldIsDisabled
4987
+ }
4988
+ );
4989
+ }
4990
+ const addedInputTypes = Object.keys(fields);
4991
+ if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
4992
+ const CustomInput = fields[props.type];
4993
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4994
+ }
4995
+ switch (props.type) {
4996
+ case "blocks":
4997
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
4998
+ case "component":
4999
+ return /* @__PURE__ */ jsxRuntime.jsx(
5000
+ MemoizedComponentInput,
5001
+ {
5002
+ ...props,
5003
+ hint,
5004
+ layout: components[props.attribute.component].layout,
5005
+ disabled: fieldIsDisabled,
5006
+ children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...inputProps })
5007
+ }
5008
+ );
5009
+ case "dynamiczone":
5010
+ return /* @__PURE__ */ jsxRuntime.jsx(DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
5011
+ case "relation":
5012
+ return /* @__PURE__ */ jsxRuntime.jsx(Relations.MemoizedRelationsField, { ...props, hint, disabled: fieldIsDisabled });
5013
+ case "richtext":
5014
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5015
+ case "uid":
5016
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5017
+ case "enumeration":
5018
+ return /* @__PURE__ */ jsxRuntime.jsx(
5019
+ strapiAdmin.InputRenderer,
5020
+ {
5021
+ ...props,
5022
+ hint,
5023
+ options: props.attribute.enum.map((value) => ({ value })),
5024
+ type: props.customField ? "custom-field" : props.type,
5025
+ disabled: fieldIsDisabled
5026
+ }
5027
+ );
5028
+ default:
5029
+ const { unique: _unique, mainField: _mainField, ...restProps } = props;
5030
+ return /* @__PURE__ */ jsxRuntime.jsx(
5031
+ strapiAdmin.InputRenderer,
5032
+ {
5033
+ ...restProps,
5034
+ hint,
5035
+ type: props.customField ? "custom-field" : props.type,
5036
+ disabled: fieldIsDisabled
5037
+ }
5038
+ );
5039
+ }
5040
+ };
5041
+ const attributeHasCustomFieldProperty = (attribute) => "customField" in attribute && typeof attribute.customField === "string";
5042
+ const useFieldHint = (hint = void 0, attribute) => {
5043
+ const { formatMessage } = reactIntl.useIntl();
5044
+ const { maximum, minimum } = getMinMax(attribute);
5045
+ if (!maximum && !minimum) {
5046
+ return hint;
5047
+ }
5048
+ const units = !["biginteger", "integer", "number", "dynamiczone", "component"].includes(
5049
+ attribute.type
5050
+ ) ? formatMessage(
5051
+ {
5052
+ id: "content-manager.form.Input.hint.character.unit",
5053
+ defaultMessage: "{maxValue, plural, one { character} other { characters}}"
5054
+ },
5055
+ {
5056
+ maxValue: Math.max(minimum || 0, maximum || 0)
5057
+ }
5058
+ ) : null;
5059
+ const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
5060
+ return formatMessage(
5061
+ {
5062
+ id: "content-manager.form.Input.hint.text",
5063
+ defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
5064
+ },
5065
+ {
5066
+ min: minimum,
5067
+ max: maximum,
5068
+ description: hint,
5069
+ unit: units,
5070
+ divider: hasMinAndMax ? formatMessage({
5071
+ id: "content-manager.form.Input.hint.minMaxDivider",
5072
+ defaultMessage: " / "
5073
+ }) : null,
5074
+ br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
5075
+ }
5076
+ );
5077
+ };
5078
+ const getMinMax = (attribute) => {
5079
+ if ("min" in attribute || "max" in attribute) {
5080
+ return {
5081
+ maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
5082
+ minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
5083
+ };
5084
+ } else if ("maxLength" in attribute || "minLength" in attribute) {
5085
+ return { maximum: attribute.maxLength, minimum: attribute.minLength };
5086
+ } else {
5087
+ return { maximum: void 0, minimum: void 0 };
5088
+ }
5089
+ };
5090
+ const MemoizedInputRenderer = React.memo(InputRenderer);
5091
+ const RESPONSIVE_CONTAINER_BREAKPOINTS = {
5092
+ sm: "27.5rem"
5093
+ // 440px
5094
+ };
5095
+ const ResponsiveGridRoot = styledComponents.styled(designSystem.Grid.Root)`
5096
+ container-type: inline-size;
5097
+ `;
5098
+ const ResponsiveGridItem = styledComponents.styled(designSystem.Grid.Item)`
5099
+ grid-column: span 12;
5100
+
5101
+ @container (min-width: ${RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
5102
+ ${({ col }) => col && `grid-column: span ${col};`}
5103
+ }
5104
+ `;
5105
+ const FormLayout = ({ layout }) => {
5106
+ const { formatMessage } = reactIntl.useIntl();
5107
+ const { model } = index.useDoc();
5108
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((panel, index2) => {
5109
+ if (panel.some((row) => row.some((field) => field.type === "dynamiczone"))) {
5110
+ const [row] = panel;
5111
+ const [field] = row;
5112
+ const fieldWithTranslatedLabel = {
5113
+ ...field,
5114
+ label: formatMessage({
5115
+ id: `content-manager.content-types.${model}.${field.name}`,
5116
+ defaultMessage: field.label
5117
+ })
5118
+ };
5119
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 12, s: 12, xs: 12, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel }) }) }, field.name);
5120
+ }
5121
+ return /* @__PURE__ */ jsxRuntime.jsx(
5122
+ designSystem.Box,
5123
+ {
5124
+ hasRadius: true,
5125
+ background: "neutral0",
5126
+ shadow: "tableShadow",
5127
+ paddingLeft: 6,
5128
+ paddingRight: 6,
5129
+ paddingTop: 6,
5130
+ paddingBottom: 6,
5131
+ borderColor: "neutral150",
5132
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: panel.map((row, gridRowIndex) => /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5133
+ const fieldWithTranslatedLabel = {
5134
+ ...field,
5135
+ label: formatMessage({
5136
+ id: `content-manager.content-types.${model}.${field.name}`,
5137
+ defaultMessage: field.label
5138
+ })
5139
+ };
5140
+ return /* @__PURE__ */ jsxRuntime.jsx(
5141
+ ResponsiveGridItem,
5142
+ {
5143
+ col: size,
5144
+ s: 12,
5145
+ xs: 12,
5146
+ direction: "column",
5147
+ alignItems: "stretch",
5148
+ children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel })
5149
+ },
5150
+ field.name
5151
+ );
5152
+ }) }, gridRowIndex)) })
5153
+ },
5154
+ index2
5155
+ );
5156
+ }) });
5157
+ };
5158
+ const NonRepeatableComponent = ({
5159
+ attribute,
5160
+ name: name2,
5161
+ children,
5162
+ layout
5163
+ }) => {
5164
+ const { formatMessage } = reactIntl.useIntl();
5165
+ const { value } = strapiAdmin.useField(name2);
5166
+ const level = Relations.useComponent("NonRepeatableComponent", (state) => state.level);
5167
+ const isNested = level > 0;
5168
+ return /* @__PURE__ */ jsxRuntime.jsx(Relations.ComponentProvider, { id: value?.id, uid: attribute.component, level: level + 1, type: "component", children: /* @__PURE__ */ jsxRuntime.jsx(
5169
+ designSystem.Box,
5170
+ {
5171
+ background: "neutral100",
5172
+ paddingLeft: 6,
5173
+ paddingRight: 6,
5174
+ paddingTop: 6,
5175
+ paddingBottom: 6,
5176
+ hasRadius: isNested,
5177
+ borderColor: isNested ? "neutral200" : void 0,
5178
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index2) => {
5179
+ return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5180
+ const completeFieldName = `${name2}.${field.name}`;
5181
+ const translatedLabel = formatMessage({
5182
+ id: `content-manager.components.${attribute.component}.${field.name}`,
5183
+ defaultMessage: field.label
5184
+ });
5185
+ return /* @__PURE__ */ jsxRuntime.jsx(
5186
+ ResponsiveGridItem,
5187
+ {
5188
+ col: size,
5189
+ s: 12,
5190
+ xs: 12,
5191
+ direction: "column",
5192
+ alignItems: "stretch",
5193
+ children: children({ ...field, label: translatedLabel, name: completeFieldName })
5194
+ },
5195
+ completeFieldName
5196
+ );
5197
+ }) }, index2);
5198
+ }) })
5199
+ }
5200
+ ) });
5201
+ };
5202
+ const RepeatableComponent = ({
5203
+ attribute,
5204
+ disabled,
5205
+ name: name2,
5206
+ mainField,
5207
+ children,
5208
+ layout
5209
+ }) => {
5210
+ const { toggleNotification } = strapiAdmin.useNotification();
5211
+ const { formatMessage } = reactIntl.useIntl();
5212
+ const { search: searchString } = reactRouterDom.useLocation();
5213
+ const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
5214
+ const { components } = index.useDoc();
5215
+ const {
5216
+ value = [],
5217
+ error,
5218
+ rawError
5219
+ } = strapiAdmin.useField(name2);
5220
+ const addFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.addFieldRow);
5221
+ const moveFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.moveFieldRow);
5222
+ const removeFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.removeFieldRow);
5223
+ const { max = Infinity } = attribute;
5224
+ const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
5225
+ const [liveText, setLiveText] = React__namespace.useState("");
5226
+ React__namespace.useEffect(() => {
5227
+ const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;
5228
+ const hasNestedValue = value && Array.isArray(value) && value.length > 0;
5229
+ if (hasNestedErrors && hasNestedValue) {
5230
+ const errorOpenItems = rawError.map((_, idx) => {
5231
+ return value[idx] ? value[idx].__temp_key__ : null;
5232
+ }).filter((value2) => !!value2);
5233
+ if (errorOpenItems && errorOpenItems.length > 0) {
5234
+ setCollapseToOpen((collapseToOpen2) => {
5235
+ if (!errorOpenItems.includes(collapseToOpen2)) {
5236
+ return errorOpenItems[0];
5237
+ }
5238
+ return collapseToOpen2;
5239
+ });
5240
+ }
4697
5241
  }
4698
- return /* @__PURE__ */ jsxRuntime.jsx(
4699
- strapiAdmin.InputRenderer,
4700
- {
4701
- ...props,
4702
- hint,
4703
- type: props.attribute.customField,
4704
- disabled: fieldIsDisabled
5242
+ }, [rawError, value]);
5243
+ const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
5244
+ if (search.has("field")) {
5245
+ const fieldParam = search.get("field");
5246
+ if (!fieldParam) {
5247
+ return void 0;
5248
+ }
5249
+ const [, path] = fieldParam.split(`${name2}.`);
5250
+ if (objects.getIn(value, path, void 0) !== void 0) {
5251
+ const [subpath] = path.split(".");
5252
+ return objects.getIn(value, subpath, void 0)?.__temp_key__;
4705
5253
  }
5254
+ }
5255
+ return void 0;
5256
+ }, [search, name2, value]);
5257
+ const prevValue = usePrev.usePrev(value);
5258
+ React__namespace.useEffect(() => {
5259
+ if (prevValue && prevValue.length < value.length) {
5260
+ setCollapseToOpen(value[value.length - 1].__temp_key__);
5261
+ }
5262
+ }, [value, prevValue]);
5263
+ React__namespace.useEffect(() => {
5264
+ if (typeof componentTmpKeyWithFocussedField === "string") {
5265
+ setCollapseToOpen(componentTmpKeyWithFocussedField);
5266
+ }
5267
+ }, [componentTmpKeyWithFocussedField]);
5268
+ const toggleCollapses = () => {
5269
+ setCollapseToOpen("");
5270
+ };
5271
+ const handleClick = () => {
5272
+ if (value.length < max) {
5273
+ const schema = components[attribute.component];
5274
+ const form = index.createDefaultForm(schema, components);
5275
+ const data = index.transformDocument(schema, components)(form);
5276
+ addFieldRow(name2, data);
5277
+ } else if (value.length >= max) {
5278
+ toggleNotification({
5279
+ type: "info",
5280
+ message: formatMessage({
5281
+ id: index.getTranslation("components.notification.info.maximum-requirement")
5282
+ })
5283
+ });
5284
+ }
5285
+ };
5286
+ const handleMoveComponentField = (newIndex, currentIndex) => {
5287
+ setLiveText(
5288
+ formatMessage(
5289
+ {
5290
+ id: index.getTranslation("dnd.reorder"),
5291
+ defaultMessage: "{item}, moved. New position in list: {position}."
5292
+ },
5293
+ {
5294
+ item: `${name2}.${currentIndex}`,
5295
+ position: getItemPos(newIndex)
5296
+ }
5297
+ )
4706
5298
  );
4707
- }
4708
- const addedInputTypes = Object.keys(fields);
4709
- if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
4710
- const CustomInput = fields[props.type];
4711
- return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4712
- }
4713
- switch (props.type) {
4714
- case "blocks":
4715
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
4716
- case "component":
4717
- return /* @__PURE__ */ jsxRuntime.jsx(
4718
- MemoizedComponentInput,
5299
+ moveFieldRow(name2, currentIndex, newIndex);
5300
+ };
5301
+ const handleValueChange = (key) => {
5302
+ setCollapseToOpen(key);
5303
+ };
5304
+ const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
5305
+ const handleCancel = (index$1) => {
5306
+ setLiveText(
5307
+ formatMessage(
4719
5308
  {
4720
- ...props,
4721
- hint,
4722
- layout: components[props.attribute.component].layout,
4723
- disabled: fieldIsDisabled,
4724
- children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...inputProps })
5309
+ id: index.getTranslation("dnd.cancel-item"),
5310
+ defaultMessage: "{item}, dropped. Re-order cancelled."
5311
+ },
5312
+ {
5313
+ item: `${name2}.${index$1}`
4725
5314
  }
4726
- );
4727
- case "dynamiczone":
4728
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
4729
- case "relation":
4730
- return /* @__PURE__ */ jsxRuntime.jsx(Relations.MemoizedRelationsField, { ...props, hint, disabled: fieldIsDisabled });
4731
- case "richtext":
4732
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
4733
- case "uid":
4734
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
4735
- case "enumeration":
4736
- return /* @__PURE__ */ jsxRuntime.jsx(
4737
- strapiAdmin.InputRenderer,
5315
+ )
5316
+ );
5317
+ };
5318
+ const handleGrabItem = (index$1) => {
5319
+ setLiveText(
5320
+ formatMessage(
4738
5321
  {
4739
- ...props,
4740
- hint,
4741
- options: props.attribute.enum.map((value) => ({ value })),
4742
- type: props.customField ? "custom-field" : props.type,
4743
- disabled: fieldIsDisabled
5322
+ id: index.getTranslation("dnd.grab-item"),
5323
+ defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
5324
+ },
5325
+ {
5326
+ item: `${name2}.${index$1}`,
5327
+ position: getItemPos(index$1)
4744
5328
  }
4745
- );
4746
- default:
4747
- const { unique: _unique, mainField: _mainField, ...restProps } = props;
4748
- return /* @__PURE__ */ jsxRuntime.jsx(
4749
- strapiAdmin.InputRenderer,
5329
+ )
5330
+ );
5331
+ };
5332
+ const handleDropItem = (index$1) => {
5333
+ setLiveText(
5334
+ formatMessage(
4750
5335
  {
4751
- ...restProps,
4752
- hint,
4753
- type: props.customField ? "custom-field" : props.type,
4754
- disabled: fieldIsDisabled
5336
+ id: index.getTranslation("dnd.drop-item"),
5337
+ defaultMessage: `{item}, dropped. Final position in list: {position}.`
5338
+ },
5339
+ {
5340
+ item: `${name2}.${index$1}`,
5341
+ position: getItemPos(index$1)
4755
5342
  }
4756
- );
5343
+ )
5344
+ );
5345
+ };
5346
+ const ariaDescriptionId = React__namespace.useId();
5347
+ const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
5348
+ if (value.length === 0) {
5349
+ return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
4757
5350
  }
5351
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
5352
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
5353
+ id: index.getTranslation("dnd.instructions"),
5354
+ defaultMessage: `Press spacebar to grab and re-order`
5355
+ }) }),
5356
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
5357
+ /* @__PURE__ */ jsxRuntime.jsxs(
5358
+ AccordionRoot,
5359
+ {
5360
+ $error: error,
5361
+ value: collapseToOpen,
5362
+ onValueChange: handleValueChange,
5363
+ "aria-describedby": ariaDescriptionId,
5364
+ children: [
5365
+ value.map(({ __temp_key__: key, id }, index2) => {
5366
+ const nameWithIndex = `${name2}.${index2}`;
5367
+ return /* @__PURE__ */ jsxRuntime.jsx(
5368
+ Relations.ComponentProvider,
5369
+ {
5370
+ id,
5371
+ uid: attribute.component,
5372
+ level: level + 1,
5373
+ type: "repeatable",
5374
+ children: /* @__PURE__ */ jsxRuntime.jsx(
5375
+ Component,
5376
+ {
5377
+ disabled,
5378
+ name: nameWithIndex,
5379
+ attribute,
5380
+ index: index2,
5381
+ mainField,
5382
+ onMoveItem: handleMoveComponentField,
5383
+ onDeleteComponent: () => {
5384
+ removeFieldRow(name2, index2);
5385
+ toggleCollapses();
5386
+ },
5387
+ toggleCollapses,
5388
+ onCancel: handleCancel,
5389
+ onDropItem: handleDropItem,
5390
+ onGrabItem: handleGrabItem,
5391
+ __temp_key__: key,
5392
+ children: layout.map((row, index22) => {
5393
+ return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5394
+ const completeFieldName = `${nameWithIndex}.${field.name}`;
5395
+ const translatedLabel = formatMessage({
5396
+ id: `content-manager.components.${attribute.component}.${field.name}`,
5397
+ defaultMessage: field.label
5398
+ });
5399
+ return /* @__PURE__ */ jsxRuntime.jsx(
5400
+ ResponsiveGridItem,
5401
+ {
5402
+ col: size,
5403
+ s: 12,
5404
+ xs: 12,
5405
+ direction: "column",
5406
+ alignItems: "stretch",
5407
+ children: children({
5408
+ ...field,
5409
+ label: translatedLabel,
5410
+ name: completeFieldName
5411
+ })
5412
+ },
5413
+ completeFieldName
5414
+ );
5415
+ }) }, index22);
5416
+ })
5417
+ }
5418
+ )
5419
+ },
5420
+ key
5421
+ );
5422
+ }),
5423
+ /* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
5424
+ id: index.getTranslation("containers.EditView.add.new-entry"),
5425
+ defaultMessage: "Add an entry"
5426
+ }) })
5427
+ ]
5428
+ }
5429
+ )
5430
+ ] });
4758
5431
  };
4759
- const attributeHasCustomFieldProperty = (attribute) => "customField" in attribute && typeof attribute.customField === "string";
4760
- const useFieldHint = (hint = void 0, attribute) => {
4761
- const { formatMessage } = reactIntl.useIntl();
4762
- const { maximum, minimum } = getMinMax(attribute);
4763
- if (!maximum && !minimum) {
4764
- return hint;
4765
- }
4766
- const units = !["biginteger", "integer", "number"].includes(attribute.type) ? formatMessage(
4767
- {
4768
- id: "content-manager.form.Input.hint.character.unit",
4769
- defaultMessage: "{maxValue, plural, one { character} other { characters}}"
4770
- },
4771
- {
4772
- maxValue: Math.max(minimum || 0, maximum || 0)
4773
- }
4774
- ) : null;
4775
- const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
4776
- return formatMessage(
4777
- {
4778
- id: "content-manager.form.Input.hint.text",
4779
- defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
4780
- },
4781
- {
4782
- min: minimum,
4783
- max: maximum,
4784
- description: hint,
4785
- unit: units,
4786
- divider: hasMinAndMax ? formatMessage({
4787
- id: "content-manager.form.Input.hint.minMaxDivider",
4788
- defaultMessage: " / "
4789
- }) : null,
4790
- br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
5432
+ const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
5433
+ border: 1px solid
5434
+ ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
5435
+ `;
5436
+ const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
5437
+ width: 100%;
5438
+ display: flex;
5439
+ justify-content: center;
5440
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
5441
+ padding-inline: ${(props) => props.theme.spaces[6]};
5442
+ padding-block: ${(props) => props.theme.spaces[3]};
5443
+
5444
+ &:not([disabled]) {
5445
+ cursor: pointer;
5446
+
5447
+ &:hover {
5448
+ background-color: ${(props) => props.theme.colors.primary100};
4791
5449
  }
4792
- );
4793
- };
4794
- const getMinMax = (attribute) => {
4795
- if ("min" in attribute || "max" in attribute) {
4796
- return {
4797
- maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
4798
- minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
4799
- };
4800
- } else if ("maxLength" in attribute || "minLength" in attribute) {
4801
- return { maximum: attribute.maxLength, minimum: attribute.minLength };
4802
- } else {
4803
- return { maximum: void 0, minimum: void 0 };
4804
5450
  }
4805
- };
4806
- const MemoizedInputRenderer = React.memo(InputRenderer);
4807
- const DynamicComponent = ({
4808
- componentUid,
5451
+
5452
+ span {
5453
+ font-weight: 600;
5454
+ font-size: 1.4rem;
5455
+ line-height: 2.4rem;
5456
+ }
5457
+
5458
+ @media (prefers-reduced-motion: no-preference) {
5459
+ transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
5460
+ }
5461
+ `;
5462
+ const Component = ({
4809
5463
  disabled,
4810
5464
  index: index$1,
4811
5465
  name: name2,
4812
- onRemoveComponentClick,
4813
- onMoveComponent,
4814
- onGrabItem,
4815
- onDropItem,
4816
- onCancel,
4817
- dynamicComponentsByCategory = {},
4818
- onAddComponent
5466
+ mainField = {
5467
+ name: "id",
5468
+ type: "integer"
5469
+ },
5470
+ children,
5471
+ onDeleteComponent,
5472
+ toggleCollapses,
5473
+ __temp_key__,
5474
+ ...dragProps
4819
5475
  }) => {
4820
5476
  const { formatMessage } = reactIntl.useIntl();
4821
- const formValues = strapiAdmin.useForm("DynamicComponent", (state) => state.values);
4822
- const {
4823
- edit: { components }
4824
- } = index.useDocLayout();
4825
- const title = React__namespace.useMemo(() => {
4826
- const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
4827
- const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
4828
- const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
4829
- const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
4830
- return mainValue;
4831
- }, [componentUid, components, formValues, name2, index$1]);
4832
- const { icon, displayName } = React__namespace.useMemo(() => {
4833
- const [category] = componentUid.split(".");
4834
- const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
4835
- (component) => component.uid === componentUid
4836
- ) ?? { icon: null, displayName: null };
4837
- return { icon: icon2, displayName: displayName2 };
4838
- }, [componentUid, dynamicComponentsByCategory]);
5477
+ const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
5478
+ return objects.getIn(state.values, [...name2.split("."), mainField.name]);
5479
+ });
5480
+ const accordionRef = React__namespace.useRef(null);
5481
+ const componentKey = name2.split(".").slice(0, -1).join(".");
4839
5482
  const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
4840
- type: `${useDragAndDrop.ItemTypes.DYNAMIC_ZONE}_${name2}`,
5483
+ type: `${useDragAndDrop.ItemTypes.COMPONENT}_${componentKey}`,
4841
5484
  index: index$1,
4842
5485
  item: {
4843
5486
  index: index$1,
4844
- displayedValue: `${displayName} ${title}`,
4845
- icon
5487
+ displayedValue: displayValue
4846
5488
  },
4847
- onMoveItem: onMoveComponent,
4848
- onDropItem,
4849
- onGrabItem,
4850
- onCancel
5489
+ onStart() {
5490
+ toggleCollapses();
5491
+ },
5492
+ ...dragProps
4851
5493
  });
4852
5494
  React__namespace.useEffect(() => {
4853
5495
  dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
4854
5496
  }, [dragPreviewRef, index$1]);
4855
- const composedBoxRefs = designSystem.useComposedRefs(boxRef, dropRef);
4856
- const accordionActions = disabled ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4857
- /* @__PURE__ */ jsxRuntime.jsx(
4858
- designSystem.IconButton,
4859
- {
4860
- borderWidth: 0,
4861
- label: formatMessage(
5497
+ const composedAccordionRefs = designSystem.useComposedRefs(accordionRef, dragRef);
5498
+ const composedBoxRefs = designSystem.useComposedRefs(
5499
+ boxRef,
5500
+ dropRef
5501
+ );
5502
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview, {}) : /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { ref: composedBoxRefs, value: __temp_key__, children: [
5503
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
5504
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: displayValue }),
5505
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Actions, { children: [
5506
+ /* @__PURE__ */ jsxRuntime.jsx(
5507
+ designSystem.IconButton,
4862
5508
  {
4863
- id: index.getTranslation("components.DynamicZone.delete-label"),
4864
- defaultMessage: "Delete {name}"
4865
- },
4866
- { name: title }
5509
+ variant: "ghost",
5510
+ onClick: onDeleteComponent,
5511
+ label: formatMessage({
5512
+ id: index.getTranslation("containers.Edit.delete"),
5513
+ defaultMessage: "Delete"
5514
+ }),
5515
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5516
+ }
4867
5517
  ),
4868
- onClick: onRemoveComponentClick,
4869
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
4870
- }
4871
- ),
4872
- /* @__PURE__ */ jsxRuntime.jsx(
4873
- designSystem.IconButton,
4874
- {
4875
- borderWidth: 0,
4876
- onClick: (e) => e.stopPropagation(),
4877
- "data-handler-id": handlerId,
4878
- ref: dragRef,
4879
- label: formatMessage({
4880
- id: index.getTranslation("components.DragHandle-label"),
4881
- defaultMessage: "Drag"
4882
- }),
4883
- onKeyDown: handleKeyDown,
4884
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
4885
- }
4886
- ),
4887
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
4888
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
4889
- /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
4890
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { tag: "span", children: formatMessage({
4891
- id: index.getTranslation("components.DynamicZone.more-actions"),
4892
- defaultMessage: "More actions"
4893
- }) })
4894
- ] }),
4895
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
4896
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
4897
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
4898
- id: index.getTranslation("components.DynamicZone.add-item-above"),
4899
- defaultMessage: "Add component above"
4900
- }) }),
4901
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
4902
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
4903
- components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
4904
- ] }, category)) })
4905
- ] }),
4906
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
4907
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
4908
- id: index.getTranslation("components.DynamicZone.add-item-below"),
4909
- defaultMessage: "Add component below"
4910
- }) }),
4911
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
4912
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
4913
- components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
4914
- ] }, category)) })
4915
- ] })
4916
- ] })
4917
- ] })
4918
- ] });
4919
- const accordionTitle = title ? `${displayName} ${title}` : displayName;
4920
- const accordionValue = React__namespace.useId();
4921
- return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
4922
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
4923
- /* @__PURE__ */ jsxRuntime.jsx(StyledBox, { ref: composedBoxRefs, hasRadius: true, children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: accordionValue, children: [
4924
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
4925
5518
  /* @__PURE__ */ jsxRuntime.jsx(
4926
- designSystem.Accordion.Trigger,
5519
+ designSystem.IconButton,
4927
5520
  {
4928
- icon: icon && ComponentIcon.COMPONENT_ICONS[icon] ? ComponentIcon.COMPONENT_ICONS[icon] : ComponentIcon.COMPONENT_ICONS.dashboard,
4929
- children: accordionTitle
5521
+ ref: composedAccordionRefs,
5522
+ variant: "ghost",
5523
+ onClick: (e) => e.stopPropagation(),
5524
+ "data-handler-id": handlerId,
5525
+ label: formatMessage({
5526
+ id: index.getTranslation("components.DragHandle-label"),
5527
+ defaultMessage: "Drag"
5528
+ }),
5529
+ onKeyDown: handleKeyDown,
5530
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
4930
5531
  }
4931
- ),
4932
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
4933
- ] }),
4934
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(AccordionContentRadius, { background: "neutral0", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 6, paddingRight: 6, paddingTop: 6, paddingBottom: 6, children: components[componentUid]?.layout?.map((row, rowInd) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: row.map(({ size, ...field }) => {
4935
- const fieldName = `${name2}.${index$1}.${field.name}`;
4936
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: size, s: 12, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...field, name: fieldName }) }, fieldName);
4937
- }) }, rowInd)) }) }) })
4938
- ] }) }) })
4939
- ] });
4940
- };
4941
- const StyledBox = styledComponents.styled(designSystem.Box)`
4942
- > div:first-child {
4943
- box-shadow: ${({ theme }) => theme.shadows.tableShadow};
4944
- }
4945
- `;
4946
- const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
4947
- border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
4948
- `;
4949
- const Rectangle = styledComponents.styled(designSystem.Box)`
4950
- width: ${({ theme }) => theme.spaces[2]};
4951
- height: ${({ theme }) => theme.spaces[4]};
4952
- `;
4953
- const Preview = styledComponents.styled.span`
4954
- display: block;
4955
- background-color: ${({ theme }) => theme.colors.primary100};
4956
- outline: 1px dashed ${({ theme }) => theme.colors.primary500};
4957
- outline-offset: -1px;
4958
- padding: ${({ theme }) => theme.spaces[6]};
4959
- `;
4960
- const ComponentContainer = styledComponents.styled(designSystem.Box)`
4961
- list-style: none;
4962
- padding: 0;
4963
- margin: 0;
4964
- `;
4965
- const DynamicZoneLabel = ({
4966
- hint,
4967
- label,
4968
- labelAction,
4969
- name: name2,
4970
- numberOfComponents = 0,
4971
- required
4972
- }) => {
4973
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
4974
- designSystem.Box,
4975
- {
4976
- paddingTop: 3,
4977
- paddingBottom: 3,
4978
- paddingRight: 4,
4979
- paddingLeft: 4,
4980
- borderRadius: "26px",
4981
- background: "neutral0",
4982
- shadow: "filterShadow",
4983
- color: "neutral500",
4984
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
4985
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
4986
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
4987
- label || name2,
4988
- " "
4989
- ] }),
4990
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
4991
- "(",
4992
- numberOfComponents,
4993
- ")"
4994
- ] }),
4995
- required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
4996
- labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
4997
- ] }),
4998
- hint && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 1, maxWidth: "35.6rem", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", ellipsis: true, children: hint }) })
5532
+ )
4999
5533
  ] })
5000
- }
5001
- ) });
5534
+ ] }),
5535
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
5536
+ designSystem.Flex,
5537
+ {
5538
+ direction: "column",
5539
+ alignItems: "stretch",
5540
+ background: "neutral100",
5541
+ padding: 6,
5542
+ gap: 6,
5543
+ children
5544
+ }
5545
+ ) })
5546
+ ] }) });
5002
5547
  };
5003
- const [DynamicZoneProvider, useDynamicZone] = strapiAdmin.createContext(
5004
- "DynamicZone",
5005
- {
5006
- isInDynamicZone: false
5007
- }
5008
- );
5009
- const DynamicZone = ({
5010
- attribute,
5011
- disabled: disabledProp,
5012
- hint,
5548
+ const Preview = () => {
5549
+ return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
5550
+ };
5551
+ const StyledSpan = styledComponents.styled(designSystem.Box)`
5552
+ display: block;
5553
+ outline: 1px dashed ${({ theme }) => theme.colors.primary500};
5554
+ outline-offset: -1px;
5555
+ `;
5556
+ const ComponentInput = ({
5013
5557
  label,
5014
- labelAction,
5558
+ required,
5015
5559
  name: name2,
5016
- required = false
5560
+ attribute,
5561
+ disabled,
5562
+ labelAction,
5563
+ ...props
5017
5564
  }) => {
5018
- const { max = Infinity, min = -Infinity } = attribute ?? {};
5019
- const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
5020
- const [liveText, setLiveText] = React__namespace.useState("");
5021
- const { components, isLoading } = index.useDoc();
5022
- const disabled = disabledProp || isLoading;
5023
- const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
5024
- "DynamicZone",
5025
- ({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
5026
- addFieldRow: addFieldRow2,
5027
- removeFieldRow: removeFieldRow2,
5028
- moveFieldRow: moveFieldRow2
5029
- })
5030
- );
5031
- const { value = [], error } = strapiAdmin.useField(name2);
5032
- const dynamicComponentsByCategory = React__namespace.useMemo(() => {
5033
- return attribute.components.reduce((acc, componentUid) => {
5034
- const { category, info } = components[componentUid] ?? { info: {} };
5035
- const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
5036
- if (!acc[category]) {
5037
- acc[category] = [];
5038
- }
5039
- acc[category] = [...acc[category], component];
5040
- return acc;
5041
- }, {});
5042
- }, [attribute.components, components]);
5043
5565
  const { formatMessage } = reactIntl.useIntl();
5044
- const { toggleNotification } = strapiAdmin.useNotification();
5045
- const dynamicDisplayedComponentsLength = value.length;
5046
- const handleAddComponent = (uid, position) => {
5047
- setAddComponentIsOpen(false);
5048
- const schema = components[uid];
5049
- const form = createDefaultForm(schema, components);
5050
- const transformations = pipe__default.default(transformDocument(schema, components), (data2) => ({
5051
- ...data2,
5052
- __component: uid
5053
- }));
5054
- const data = transformations(form);
5055
- addFieldRow(name2, data, position);
5056
- };
5057
- const handleClickOpenPicker = () => {
5058
- if (dynamicDisplayedComponentsLength < max) {
5059
- setAddComponentIsOpen((prev) => !prev);
5060
- } else {
5061
- toggleNotification({
5062
- type: "info",
5063
- message: formatMessage({
5064
- id: index.getTranslation("components.notification.info.maximum-requirement")
5065
- })
5066
- });
5067
- }
5068
- };
5069
- const handleMoveComponent = (newIndex, currentIndex) => {
5070
- setLiveText(
5071
- formatMessage(
5072
- {
5073
- id: index.getTranslation("dnd.reorder"),
5074
- defaultMessage: "{item}, moved. New position in list: {position}."
5075
- },
5076
- {
5077
- item: `${name2}.${currentIndex}`,
5078
- position: getItemPos(newIndex)
5079
- }
5080
- )
5081
- );
5082
- moveFieldRow(name2, currentIndex, newIndex);
5083
- };
5084
- const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
5085
- const handleCancel = (index$1) => {
5086
- setLiveText(
5087
- formatMessage(
5088
- {
5089
- id: index.getTranslation("dnd.cancel-item"),
5090
- defaultMessage: "{item}, dropped. Re-order cancelled."
5091
- },
5092
- {
5093
- item: `${name2}.${index$1}`
5094
- }
5095
- )
5096
- );
5097
- };
5098
- const handleGrabItem = (index$1) => {
5099
- setLiveText(
5100
- formatMessage(
5101
- {
5102
- id: index.getTranslation("dnd.grab-item"),
5103
- defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
5104
- },
5105
- {
5106
- item: `${name2}.${index$1}`,
5107
- position: getItemPos(index$1)
5108
- }
5109
- )
5110
- );
5566
+ const field = strapiAdmin.useField(name2);
5567
+ const showResetComponent = !attribute.repeatable && field.value && !disabled;
5568
+ const { components } = index.useDoc();
5569
+ const handleInitialisationClick = () => {
5570
+ const schema = components[attribute.component];
5571
+ const form = index.createDefaultForm(schema, components);
5572
+ const data = index.transformDocument(schema, components)(form);
5573
+ field.onChange(name2, data);
5111
5574
  };
5112
- const handleDropItem = (index$1) => {
5113
- setLiveText(
5114
- formatMessage(
5115
- {
5116
- id: index.getTranslation("dnd.drop-item"),
5117
- defaultMessage: `{item}, dropped. Final position in list: {position}.`
5118
- },
5575
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
5576
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
5577
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
5578
+ label,
5579
+ attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5580
+ " (",
5581
+ Array.isArray(field.value) ? field.value.length : 0,
5582
+ ")"
5583
+ ] })
5584
+ ] }),
5585
+ showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
5586
+ designSystem.IconButton,
5119
5587
  {
5120
- item: `${name2}.${index$1}`,
5121
- position: getItemPos(index$1)
5588
+ label: formatMessage({
5589
+ id: index.getTranslation("components.reset-entry"),
5590
+ defaultMessage: "Reset Entry"
5591
+ }),
5592
+ variant: "ghost",
5593
+ onClick: () => {
5594
+ field.onChange(name2, null);
5595
+ },
5596
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5122
5597
  }
5123
5598
  )
5124
- );
5125
- };
5126
- const handleRemoveComponent = (name22, currentIndex) => () => {
5127
- removeFieldRow(name22, currentIndex);
5128
- };
5129
- const hasError = error !== void 0 || dynamicDisplayedComponentsLength < min || dynamicDisplayedComponentsLength > max;
5130
- const renderButtonLabel = () => {
5131
- if (addComponentIsOpen) {
5132
- return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
5133
- }
5134
- if (hasError && dynamicDisplayedComponentsLength > max) {
5135
- return formatMessage(
5136
- {
5137
- id: index.getTranslation(`components.DynamicZone.extra-components`),
5138
- defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
5139
- },
5140
- {
5141
- number: dynamicDisplayedComponentsLength - max
5142
- }
5143
- );
5144
- }
5145
- if (hasError && dynamicDisplayedComponentsLength < min) {
5146
- return formatMessage(
5147
- {
5148
- id: index.getTranslation(`components.DynamicZone.missing-components`),
5149
- defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
5150
- },
5151
- { number: min - dynamicDisplayedComponentsLength }
5152
- );
5153
- }
5154
- return formatMessage(
5155
- {
5156
- id: index.getTranslation("components.DynamicZone.add-component"),
5157
- defaultMessage: "Add a component to {componentName}"
5158
- },
5159
- { componentName: label || name2 }
5160
- );
5161
- };
5162
- const level = Relations.useComponent("DynamicZone", (state) => state.level);
5163
- const ariaDescriptionId = React__namespace.useId();
5164
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
5165
- dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
5166
- /* @__PURE__ */ jsxRuntime.jsx(
5167
- DynamicZoneLabel,
5168
- {
5169
- hint,
5170
- label,
5171
- labelAction,
5172
- name: name2,
5173
- numberOfComponents: dynamicDisplayedComponentsLength,
5174
- required
5175
- }
5176
- ),
5177
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
5178
- id: index.getTranslation("dnd.instructions"),
5179
- defaultMessage: `Press spacebar to grab and re-order`
5180
- }) }),
5181
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
5182
- /* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
5183
- Relations.ComponentProvider,
5184
- {
5185
- level: level + 1,
5186
- uid: field.__component,
5187
- id: field.id,
5188
- type: "dynamiczone",
5189
- children: /* @__PURE__ */ jsxRuntime.jsx(
5190
- DynamicComponent,
5191
- {
5192
- disabled,
5193
- name: name2,
5194
- index: index2,
5195
- componentUid: field.__component,
5196
- onMoveComponent: handleMoveComponent,
5197
- onRemoveComponentClick: handleRemoveComponent(name2, index2),
5198
- onCancel: handleCancel,
5199
- onDropItem: handleDropItem,
5200
- onGrabItem: handleGrabItem,
5201
- onAddComponent: handleAddComponent,
5202
- dynamicComponentsByCategory
5203
- }
5204
- )
5205
- },
5206
- field.__temp_key__
5207
- )) })
5208
5599
  ] }),
5209
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
5210
- AddComponentButton,
5211
- {
5212
- hasError,
5213
- isDisabled: disabled,
5214
- isOpen: addComponentIsOpen,
5215
- onClick: handleClickOpenPicker,
5216
- children: renderButtonLabel()
5217
- }
5218
- ) }),
5219
- /* @__PURE__ */ jsxRuntime.jsx(
5220
- ComponentPicker,
5221
- {
5222
- dynamicComponentsByCategory,
5223
- isOpen: addComponentIsOpen,
5224
- onClickAddComponent: handleAddComponent
5225
- }
5226
- )
5227
- ] }) });
5600
+ !attribute.repeatable && !field.value && /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleInitialisationClick }),
5601
+ !attribute.repeatable && field.value ? /* @__PURE__ */ jsxRuntime.jsx(NonRepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }) : null,
5602
+ attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }),
5603
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
5604
+ ] });
5228
5605
  };
5606
+ const MemoizedComponentInput = React__namespace.memo(ComponentInput);
5229
5607
  exports.DynamicZone = DynamicZone;
5608
+ exports.FormLayout = FormLayout;
5230
5609
  exports.MemoizedBlocksInput = MemoizedBlocksInput;
5231
5610
  exports.MemoizedComponentInput = MemoizedComponentInput;
5232
- exports.MemoizedInputRenderer = MemoizedInputRenderer;
5233
5611
  exports.MemoizedUIDInput = MemoizedUIDInput;
5234
5612
  exports.MemoizedWysiwyg = MemoizedWysiwyg;
5235
5613
  exports.NotAllowedInput = NotAllowedInput;
5236
- exports.createDefaultForm = createDefaultForm;
5237
- exports.prepareTempKeys = prepareTempKeys;
5238
- exports.removeFieldsThatDontExistOnSchema = removeFieldsThatDontExistOnSchema;
5239
- exports.transformDocument = transformDocument;
5240
5614
  exports.useDynamicZone = useDynamicZone;
5241
5615
  exports.useFieldHint = useFieldHint;
5242
5616
  exports.useLazyComponents = useLazyComponents;
5243
- //# sourceMappingURL=Field-ZdrmmQ4Y.js.map
5617
+ //# sourceMappingURL=Input-BwOibhc3.js.map