@strapi/content-manager 0.0.0-experimental.32c4b04580cc12400710050c8198e46b3644cfd4 → 0.0.0-experimental.332a7d5b6b1d23635d7e205657f0ff39ec133c9e

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 (215) hide show
  1. package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
  2. package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-BAgyHiMm.mjs → ComponentConfigurationPage-D4H-v0et.mjs} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-BAgyHiMm.mjs.map → ComponentConfigurationPage-D4H-v0et.mjs.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-5ukroXAh.js → ComponentConfigurationPage-DdkVGfXC.js} +5 -6
  6. package/dist/_chunks/{ComponentConfigurationPage-5ukroXAh.js.map → ComponentConfigurationPage-DdkVGfXC.js.map} +1 -1
  7. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
  8. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
  9. package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
  10. package/dist/_chunks/{EditConfigurationPage-DmoXawIh.mjs → EditConfigurationPage-D1nvB7Br.mjs} +4 -4
  11. package/dist/_chunks/{EditConfigurationPage-DmoXawIh.mjs.map → EditConfigurationPage-D1nvB7Br.mjs.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-Xp7lun0f.js → EditConfigurationPage-LYEvR4fW.js} +5 -6
  13. package/dist/_chunks/{EditConfigurationPage-Xp7lun0f.js.map → EditConfigurationPage-LYEvR4fW.js.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-BLsjc5F-.mjs → EditViewPage-Bcnff6Vd.mjs} +34 -46
  15. package/dist/_chunks/EditViewPage-Bcnff6Vd.mjs.map +1 -0
  16. package/dist/_chunks/{EditViewPage-C-ukDOB7.js → EditViewPage-DqelJ9UK.js} +36 -49
  17. package/dist/_chunks/EditViewPage-DqelJ9UK.js.map +1 -0
  18. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
  19. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
  20. package/dist/_chunks/{Form-CPYqIWDG.js → Form-CnHfBeiB.js} +39 -21
  21. package/dist/_chunks/Form-CnHfBeiB.js.map +1 -0
  22. package/dist/_chunks/{Form-Dg_GS5TQ.mjs → Form-CzPCJi3B.mjs} +37 -18
  23. package/dist/_chunks/Form-CzPCJi3B.mjs.map +1 -0
  24. package/dist/_chunks/{History-wrnHqf09.mjs → History-CcmSn3Mj.mjs} +71 -104
  25. package/dist/_chunks/History-CcmSn3Mj.mjs.map +1 -0
  26. package/dist/_chunks/{History-DNQkXANT.js → History-zArjENzj.js} +81 -115
  27. package/dist/_chunks/History-zArjENzj.js.map +1 -0
  28. package/dist/_chunks/{Field-Bfph5SOd.js → Input-CDHKQd7o.js} +1334 -1239
  29. package/dist/_chunks/Input-CDHKQd7o.js.map +1 -0
  30. package/dist/_chunks/{Field-Cs7duwWd.mjs → Input-aV8SSoTa.mjs} +1192 -1097
  31. package/dist/_chunks/Input-aV8SSoTa.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-DScmJVkW.mjs → ListConfigurationPage-BPvzENJJ.mjs} +19 -8
  33. package/dist/_chunks/ListConfigurationPage-BPvzENJJ.mjs.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-CUQxfpjT.js → ListConfigurationPage-ByZAO_9H.js} +19 -9
  35. package/dist/_chunks/ListConfigurationPage-ByZAO_9H.js.map +1 -0
  36. package/dist/_chunks/{ListViewPage-BsLiH2-2.js → ListViewPage-BVKBeQAA.js} +108 -74
  37. package/dist/_chunks/ListViewPage-BVKBeQAA.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-C4IvrMgY.mjs → ListViewPage-HljQVnFH.mjs} +109 -74
  39. package/dist/_chunks/ListViewPage-HljQVnFH.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-BZ-PnGAf.js → NoContentTypePage-BV5zfDxr.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-BZ-PnGAf.js.map → NoContentTypePage-BV5zfDxr.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-Djg8nPlj.mjs → NoContentTypePage-BfHaSM-K.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-Djg8nPlj.mjs.map → NoContentTypePage-BfHaSM-K.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-DSP7R-hv.mjs → NoPermissionsPage-D6ze2nQL.mjs} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-DSP7R-hv.mjs.map → NoPermissionsPage-D6ze2nQL.mjs.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-_lUqjGW3.js → NoPermissionsPage-vdNpc6jb.js} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-_lUqjGW3.js.map → NoPermissionsPage-vdNpc6jb.js.map} +1 -1
  48. package/dist/_chunks/Preview-DEHdENT1.js +305 -0
  49. package/dist/_chunks/Preview-DEHdENT1.js.map +1 -0
  50. package/dist/_chunks/Preview-vfWOtPG5.mjs +287 -0
  51. package/dist/_chunks/Preview-vfWOtPG5.mjs.map +1 -0
  52. package/dist/_chunks/{Relations-BZr8tL0R.mjs → Relations-B7_hbF0w.mjs} +79 -44
  53. package/dist/_chunks/Relations-B7_hbF0w.mjs.map +1 -0
  54. package/dist/_chunks/{Relations-CtELXYIK.js → Relations-DcoOBejP.js} +79 -45
  55. package/dist/_chunks/Relations-DcoOBejP.js.map +1 -0
  56. package/dist/_chunks/{en-uOUIxfcQ.js → en-BR48D_RH.js} +35 -15
  57. package/dist/_chunks/{en-uOUIxfcQ.js.map → en-BR48D_RH.js.map} +1 -1
  58. package/dist/_chunks/{en-BrCTWlZv.mjs → en-D65uIF6Y.mjs} +35 -15
  59. package/dist/_chunks/{en-BrCTWlZv.mjs.map → en-D65uIF6Y.mjs.map} +1 -1
  60. package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
  61. package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
  62. package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
  63. package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
  64. package/dist/_chunks/{fr-B7kGGg3E.js → fr-C43IbhA_.js} +16 -3
  65. package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-C43IbhA_.js.map} +1 -1
  66. package/dist/_chunks/{fr-CD9VFbPM.mjs → fr-DBseuRuB.mjs} +16 -3
  67. package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr-DBseuRuB.mjs.map} +1 -1
  68. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  69. package/dist/_chunks/{index-OerGjbAN.js → index-CxLSGwnk.js} +1304 -750
  70. package/dist/_chunks/index-CxLSGwnk.js.map +1 -0
  71. package/dist/_chunks/{index-c_5DdJi-.mjs → index-EH8ZtHd5.mjs} +1323 -769
  72. package/dist/_chunks/index-EH8ZtHd5.mjs.map +1 -0
  73. package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
  74. package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
  75. package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
  76. package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
  77. package/dist/_chunks/{layout-oPBiO7RY.mjs → layout-CxDMdJ13.mjs} +23 -10
  78. package/dist/_chunks/layout-CxDMdJ13.mjs.map +1 -0
  79. package/dist/_chunks/{layout-Ci7qHlFb.js → layout-DSeUTfMv.js} +23 -11
  80. package/dist/_chunks/layout-DSeUTfMv.js.map +1 -0
  81. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  82. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  83. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  84. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  85. package/dist/_chunks/{relations-BIdWFjdq.mjs → relations-B8_Uu38Q.mjs} +21 -8
  86. package/dist/_chunks/relations-B8_Uu38Q.mjs.map +1 -0
  87. package/dist/_chunks/{relations-COBpStiF.js → relations-S5nNKdN3.js} +20 -7
  88. package/dist/_chunks/relations-S5nNKdN3.js.map +1 -0
  89. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  90. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  91. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  92. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  93. package/dist/_chunks/usePrev-B9w_-eYc.js.map +1 -1
  94. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +1 -1
  95. package/dist/admin/index.js +3 -1
  96. package/dist/admin/index.js.map +1 -1
  97. package/dist/admin/index.mjs +6 -4
  98. package/dist/admin/src/content-manager.d.ts +3 -2
  99. package/dist/admin/src/exports.d.ts +2 -1
  100. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  101. package/dist/admin/src/hooks/useDocument.d.ts +49 -1
  102. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  103. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  104. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
  105. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  106. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  107. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  108. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
  109. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
  110. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  111. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  112. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
  113. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
  114. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  115. package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
  116. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  117. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  118. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  119. package/dist/admin/src/preview/index.d.ts +4 -0
  120. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  121. package/dist/admin/src/preview/routes.d.ts +3 -0
  122. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  123. package/dist/admin/src/router.d.ts +1 -1
  124. package/dist/admin/src/services/api.d.ts +1 -1
  125. package/dist/admin/src/services/components.d.ts +2 -2
  126. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  127. package/dist/admin/src/services/documents.d.ts +19 -20
  128. package/dist/admin/src/services/init.d.ts +1 -1
  129. package/dist/admin/src/services/relations.d.ts +2 -2
  130. package/dist/admin/src/services/uid.d.ts +3 -3
  131. package/dist/admin/src/utils/validation.d.ts +4 -1
  132. package/dist/server/index.js +727 -406
  133. package/dist/server/index.js.map +1 -1
  134. package/dist/server/index.mjs +728 -406
  135. package/dist/server/index.mjs.map +1 -1
  136. package/dist/server/src/bootstrap.d.ts.map +1 -1
  137. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  138. package/dist/server/src/controllers/index.d.ts.map +1 -1
  139. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  140. package/dist/server/src/controllers/utils/metadata.d.ts +16 -1
  141. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  142. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  143. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  144. package/dist/server/src/history/services/history.d.ts +3 -3
  145. package/dist/server/src/history/services/history.d.ts.map +1 -1
  146. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  147. package/dist/server/src/history/services/utils.d.ts +8 -12
  148. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  149. package/dist/server/src/index.d.ts +7 -6
  150. package/dist/server/src/index.d.ts.map +1 -1
  151. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  152. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  153. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  154. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  155. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  156. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  157. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  158. package/dist/server/src/preview/index.d.ts +4 -0
  159. package/dist/server/src/preview/index.d.ts.map +1 -0
  160. package/dist/server/src/preview/routes/index.d.ts +8 -0
  161. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  162. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  163. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  164. package/dist/server/src/preview/services/index.d.ts +16 -0
  165. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  166. package/dist/server/src/preview/services/preview-config.d.ts +32 -0
  167. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  168. package/dist/server/src/preview/services/preview.d.ts +12 -0
  169. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  170. package/dist/server/src/preview/utils.d.ts +19 -0
  171. package/dist/server/src/preview/utils.d.ts.map +1 -0
  172. package/dist/server/src/register.d.ts.map +1 -1
  173. package/dist/server/src/routes/index.d.ts.map +1 -1
  174. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  175. package/dist/server/src/services/document-metadata.d.ts +12 -10
  176. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  177. package/dist/server/src/services/index.d.ts +7 -6
  178. package/dist/server/src/services/index.d.ts.map +1 -1
  179. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  180. package/dist/server/src/services/utils/populate.d.ts +2 -2
  181. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  182. package/dist/server/src/utils/index.d.ts +2 -0
  183. package/dist/server/src/utils/index.d.ts.map +1 -1
  184. package/dist/shared/contracts/collection-types.d.ts +3 -1
  185. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  186. package/dist/shared/contracts/index.d.ts +1 -0
  187. package/dist/shared/contracts/index.d.ts.map +1 -1
  188. package/dist/shared/contracts/preview.d.ts +27 -0
  189. package/dist/shared/contracts/preview.d.ts.map +1 -0
  190. package/dist/shared/index.js +4 -0
  191. package/dist/shared/index.js.map +1 -1
  192. package/dist/shared/index.mjs +4 -0
  193. package/dist/shared/index.mjs.map +1 -1
  194. package/package.json +17 -16
  195. package/dist/_chunks/EditViewPage-BLsjc5F-.mjs.map +0 -1
  196. package/dist/_chunks/EditViewPage-C-ukDOB7.js.map +0 -1
  197. package/dist/_chunks/Field-Bfph5SOd.js.map +0 -1
  198. package/dist/_chunks/Field-Cs7duwWd.mjs.map +0 -1
  199. package/dist/_chunks/Form-CPYqIWDG.js.map +0 -1
  200. package/dist/_chunks/Form-Dg_GS5TQ.mjs.map +0 -1
  201. package/dist/_chunks/History-DNQkXANT.js.map +0 -1
  202. package/dist/_chunks/History-wrnHqf09.mjs.map +0 -1
  203. package/dist/_chunks/ListConfigurationPage-CUQxfpjT.js.map +0 -1
  204. package/dist/_chunks/ListConfigurationPage-DScmJVkW.mjs.map +0 -1
  205. package/dist/_chunks/ListViewPage-BsLiH2-2.js.map +0 -1
  206. package/dist/_chunks/ListViewPage-C4IvrMgY.mjs.map +0 -1
  207. package/dist/_chunks/Relations-BZr8tL0R.mjs.map +0 -1
  208. package/dist/_chunks/Relations-CtELXYIK.js.map +0 -1
  209. package/dist/_chunks/index-OerGjbAN.js.map +0 -1
  210. package/dist/_chunks/index-c_5DdJi-.mjs.map +0 -1
  211. package/dist/_chunks/layout-Ci7qHlFb.js.map +0 -1
  212. package/dist/_chunks/layout-oPBiO7RY.mjs.map +0 -1
  213. package/dist/_chunks/relations-BIdWFjdq.mjs.map +0 -1
  214. package/dist/_chunks/relations-COBpStiF.js.map +0 -1
  215. package/strapi-server.js +0 -3
@@ -3,23 +3,74 @@ 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-OerGjbAN.js");
9
- const fractionalIndexing = require("fractional-indexing");
10
- const Relations = require("./Relations-CtELXYIK.js");
11
6
  const Icons = require("@strapi/icons");
7
+ const reactIntl = require("react-intl");
8
+ const index = require("./index-CxLSGwnk.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");
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");
20
64
  const usePrev = require("./usePrev-B9w_-eYc.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-DcoOBejP.js");
71
+ const pipe$1 = require("lodash/fp/pipe");
72
+ const ComponentIcon = require("./ComponentIcon-CRbtQEUV.js");
73
+ const relations = require("./relations-S5nNKdN3.js");
23
74
  const CodeMirror = require("codemirror5");
24
75
  const sanitizeHtml = require("sanitize-html");
25
76
  const highlight_js = require("highlight.js");
@@ -37,8 +88,7 @@ require("highlight.js/styles/solarized-dark.css");
37
88
  require("codemirror5/addon/display/placeholder");
38
89
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
39
90
  function _interopNamespace(e) {
40
- if (e && e.__esModule)
41
- return e;
91
+ if (e && e.__esModule) return e;
42
92
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
43
93
  if (e) {
44
94
  for (const k in e) {
@@ -55,8 +105,9 @@ function _interopNamespace(e) {
55
105
  return Object.freeze(n);
56
106
  }
57
107
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
58
- const pipe__default = /* @__PURE__ */ _interopDefault(pipe$1);
108
+ const Prism__namespace = /* @__PURE__ */ _interopNamespace(Prism);
59
109
  const Toolbar__namespace = /* @__PURE__ */ _interopNamespace(Toolbar);
110
+ const pipe__default = /* @__PURE__ */ _interopDefault(pipe$1);
60
111
  const CodeMirror__default = /* @__PURE__ */ _interopDefault(CodeMirror);
61
112
  const sanitizeHtml__default = /* @__PURE__ */ _interopDefault(sanitizeHtml);
62
113
  const Markdown__default = /* @__PURE__ */ _interopDefault(Markdown);
@@ -69,93 +120,6 @@ const ins__default = /* @__PURE__ */ _interopDefault(ins);
69
120
  const mark__default = /* @__PURE__ */ _interopDefault(mark);
70
121
  const sub__default = /* @__PURE__ */ _interopDefault(sub);
71
122
  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
123
  const componentStore = /* @__PURE__ */ new Map();
160
124
  const useLazyComponents = (componentUids = []) => {
161
125
  const [lazyComponentStore, setLazyComponentStore] = React.useState(Object.fromEntries(componentStore));
@@ -197,7 +161,8 @@ const useLazyComponents = (componentUids = []) => {
197
161
  const codeLanguages = [
198
162
  {
199
163
  value: "asm",
200
- label: "Assembly"
164
+ label: "Assembly",
165
+ decorate: "asmatmel"
201
166
  },
202
167
  {
203
168
  value: "bash",
@@ -233,7 +198,8 @@ const codeLanguages = [
233
198
  },
234
199
  {
235
200
  value: "dockerfile",
236
- label: "Dockerfile"
201
+ label: "Dockerfile",
202
+ decorate: "docker"
237
203
  },
238
204
  {
239
205
  value: "elixir",
@@ -389,7 +355,8 @@ const codeLanguages = [
389
355
  },
390
356
  {
391
357
  value: "typescript",
392
- label: "TypeScript"
358
+ label: "TypeScript",
359
+ decorate: "ts"
393
360
  },
394
361
  {
395
362
  value: "tsx",
@@ -405,7 +372,8 @@ const codeLanguages = [
405
372
  },
406
373
  {
407
374
  value: "yaml",
408
- label: "YAML"
375
+ label: "YAML",
376
+ decorate: "yml"
409
377
  }
410
378
  ];
411
379
  const baseHandleConvert = (editor, attributesToSet) => {
@@ -471,6 +439,29 @@ const pressEnterTwiceToExit = (editor) => {
471
439
  });
472
440
  }
473
441
  };
442
+ const decorateCode = ([node, path]) => {
443
+ const ranges = [];
444
+ if (!slate.Element.isElement(node) || node.type !== "code") return ranges;
445
+ const text = slate.Node.string(node);
446
+ const language = codeLanguages.find((lang) => lang.value === node.language);
447
+ const decorateKey = language?.decorate ?? language?.value;
448
+ const selectedLanguage = Prism__namespace.languages[decorateKey || "plaintext"];
449
+ const tokens = Prism__namespace.tokenize(text, selectedLanguage);
450
+ let start = 0;
451
+ for (const token of tokens) {
452
+ const length = token.length;
453
+ const end = start + length;
454
+ if (typeof token !== "string") {
455
+ ranges.push({
456
+ anchor: { path, offset: start },
457
+ focus: { path, offset: end },
458
+ className: `token ${token.type}`
459
+ });
460
+ }
461
+ start = end;
462
+ }
463
+ return ranges;
464
+ };
474
465
  const CodeBlock = styledComponents.styled.pre`
475
466
  border-radius: ${({ theme }) => theme.borderRadius};
476
467
  background-color: ${({ theme }) => theme.colors.neutral100};
@@ -542,7 +533,7 @@ const CodeEditor = (props) => {
542
533
  const codeBlocks = {
543
534
  code: {
544
535
  renderElement: (props) => /* @__PURE__ */ jsxRuntime.jsx(CodeEditor, { ...props }),
545
- icon: Icons.Code,
536
+ icon: Icons.CodeBlock,
546
537
  label: {
547
538
  id: "components.Blocks.blocks.code",
548
539
  defaultMessage: "Code block"
@@ -555,8 +546,7 @@ const codeBlocks = {
555
546
  handleEnterKey(editor) {
556
547
  pressEnterTwiceToExit(editor);
557
548
  },
558
- snippets: ["```"],
559
- dragHandleTopMargin: "10px"
549
+ snippets: ["```"]
560
550
  }
561
551
  };
562
552
  const H1 = styledComponents.styled(designSystem.Typography).attrs({ tag: "h1" })`
@@ -731,8 +721,7 @@ const ImageDialog = () => {
731
721
  const [isOpen, setIsOpen] = React__namespace.useState(true);
732
722
  const { editor } = useBlocksEditorContext("ImageDialog");
733
723
  const components = strapiAdmin.useStrapiApp("ImageDialog", (state) => state.components);
734
- if (!components || !isOpen)
735
- return null;
724
+ if (!components || !isOpen) return null;
736
725
  const MediaLibraryDialog = components["media-library"];
737
726
  const insertImages = (images) => {
738
727
  slate.Transforms.unwrapNodes(editor, {
@@ -741,14 +730,12 @@ const ImageDialog = () => {
741
730
  });
742
731
  const nodeEntryBeingReplaced = slate.Editor.above(editor, {
743
732
  match(node) {
744
- if (slate.Editor.isEditor(node))
745
- return false;
733
+ if (slate.Editor.isEditor(node)) return false;
746
734
  const isInlineNode = ["text", "link"].includes(node.type);
747
735
  return !isInlineNode;
748
736
  }
749
737
  });
750
- if (!nodeEntryBeingReplaced)
751
- return;
738
+ if (!nodeEntryBeingReplaced) return;
752
739
  const [, pathToInsert] = nodeEntryBeingReplaced;
753
740
  slate.Transforms.removeNodes(editor);
754
741
  const nodesToInsert = images.map((image) => {
@@ -926,8 +913,7 @@ const LinkContent = React__namespace.forwardRef(
926
913
  slateReact.ReactEditor.focus(editor);
927
914
  };
928
915
  React__namespace.useEffect(() => {
929
- if (popoverOpen)
930
- linkInputRef.current?.focus();
916
+ if (popoverOpen) linkInputRef.current?.focus();
931
917
  }, [popoverOpen]);
932
918
  const inputNotDirty = !linkText || !linkUrl || link.url && link.url === linkUrl && elementText && elementText === linkText;
933
919
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { open: popoverOpen, children: [
@@ -997,11 +983,11 @@ const LinkContent = React__namespace.forwardRef(
997
983
  ),
998
984
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
999
985
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", onClick: handleClose, children: formatMessage({
1000
- id: "components.Blocks.popover.cancel",
986
+ id: "global.cancel",
1001
987
  defaultMessage: "Cancel"
1002
988
  }) }),
1003
989
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { disabled: Boolean(inputNotDirty) || isSaveDisabled, onClick: handleSave, children: formatMessage({
1004
- id: "components.Blocks.popover.save",
990
+ id: "global.save",
1005
991
  defaultMessage: "Save"
1006
992
  }) })
1007
993
  ] })
@@ -1082,8 +1068,7 @@ const isText$1 = (node) => {
1082
1068
  return slate.Node.isNode(node) && !slate.Editor.isEditor(node) && node.type === "text";
1083
1069
  };
1084
1070
  const handleBackspaceKeyOnList = (editor, event) => {
1085
- if (!editor.selection)
1086
- return;
1071
+ if (!editor.selection) return;
1087
1072
  const [currentListItem, currentListItemPath] = slate.Editor.parent(editor, editor.selection.anchor);
1088
1073
  const [currentList, currentListPath] = slate.Editor.parent(editor, currentListItemPath);
1089
1074
  const isListEmpty = currentList.children.length === 1 && isText$1(currentListItem.children[0]) && currentListItem.children[0].text === "";
@@ -1192,8 +1177,7 @@ const handleEnterKeyOnList = (editor) => {
1192
1177
  };
1193
1178
  const handleConvertToList = (editor, format) => {
1194
1179
  const convertedPath = baseHandleConvert(editor, { type: "list-item" });
1195
- if (!convertedPath)
1196
- return;
1180
+ if (!convertedPath) return;
1197
1181
  slate.Transforms.wrapNodes(editor, { type: "list", format, children: [] }, { at: convertedPath });
1198
1182
  };
1199
1183
  const handleTabOnList = (editor) => {
@@ -1205,8 +1189,7 @@ const handleTabOnList = (editor) => {
1205
1189
  }
1206
1190
  const [currentListItem, currentListItemPath] = currentListItemEntry;
1207
1191
  const [currentList] = slate.Editor.parent(editor, currentListItemPath);
1208
- if (currentListItem === currentList.children[0])
1209
- return;
1192
+ if (currentListItem === currentList.children[0]) return;
1210
1193
  const currentListItemIndex = currentList.children.findIndex((item) => item === currentListItem);
1211
1194
  const previousNode = currentList.children[currentListItemIndex - 1];
1212
1195
  if (previousNode.type === "list") {
@@ -1342,13 +1325,13 @@ const quoteBlocks = {
1342
1325
  handleEnterKey(editor) {
1343
1326
  pressEnterTwiceToExit(editor);
1344
1327
  },
1345
- snippets: [">"],
1346
- dragHandleTopMargin: "6px"
1328
+ snippets: [">"]
1347
1329
  }
1348
1330
  };
1349
1331
  const ToolbarWrapper = styledComponents.styled(designSystem.Flex)`
1350
1332
  &[aria-disabled='true'] {
1351
1333
  cursor: not-allowed;
1334
+ background: ${({ theme }) => theme.colors.neutral150};
1352
1335
  }
1353
1336
  `;
1354
1337
  const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
@@ -1359,7 +1342,7 @@ const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
1359
1342
  const FlexButton = styledComponents.styled(designSystem.Flex)`
1360
1343
  // Inherit the not-allowed cursor from ToolbarWrapper when disabled
1361
1344
  &[aria-disabled] {
1362
- cursor: inherit;
1345
+ cursor: not-allowed;
1363
1346
  }
1364
1347
 
1365
1348
  &[aria-disabled='false'] {
@@ -1441,7 +1424,7 @@ const ToolbarButton = ({
1441
1424
  width: 7,
1442
1425
  height: 7,
1443
1426
  hasRadius: true,
1444
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { width: "1.2rem", height: "1.2rem", fill: disabled ? "neutral300" : enabledColor })
1427
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { fill: disabled ? "neutral300" : enabledColor })
1445
1428
  }
1446
1429
  )
1447
1430
  }
@@ -1573,8 +1556,7 @@ const isListNode = (node) => {
1573
1556
  const ListButton = ({ block, format }) => {
1574
1557
  const { editor, disabled, blocks } = useBlocksEditorContext("ListButton");
1575
1558
  const isListActive = () => {
1576
- if (!editor.selection)
1577
- return false;
1559
+ if (!editor.selection) return false;
1578
1560
  const currentListEntry = slate.Editor.above(editor, {
1579
1561
  match: (node) => !slate.Editor.isEditor(node) && node.type === "list",
1580
1562
  at: editor.selection.anchor
@@ -1648,8 +1630,7 @@ const LinkButton = ({ disabled }) => {
1648
1630
  const { editor } = useBlocksEditorContext("LinkButton");
1649
1631
  const isLinkActive = () => {
1650
1632
  const { selection } = editor;
1651
- if (!selection)
1652
- return false;
1633
+ if (!selection) return false;
1653
1634
  const [match] = Array.from(
1654
1635
  slate.Editor.nodes(editor, {
1655
1636
  at: slate.Editor.unhangRange(editor, selection),
@@ -1713,7 +1694,7 @@ const BlocksToolbar = () => {
1713
1694
  return false;
1714
1695
  };
1715
1696
  const isButtonDisabled = checkButtonDisabled();
1716
- return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, children: [
1697
+ return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, width: "100%", children: [
1717
1698
  /* @__PURE__ */ jsxRuntime.jsx(BlocksDropdown, {}),
1718
1699
  /* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
1719
1700
  /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.ToggleGroup, { type: "multiple", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, children: [
@@ -1783,33 +1764,36 @@ const DragItem = styledComponents.styled(designSystem.Flex)`
1783
1764
  }
1784
1765
  `;
1785
1766
  const DragIconButton = styledComponents.styled(designSystem.IconButton)`
1767
+ user-select: none;
1786
1768
  display: flex;
1787
1769
  align-items: center;
1788
1770
  justify-content: center;
1771
+ border: none;
1789
1772
  border-radius: ${({ theme }) => theme.borderRadius};
1790
- width: ${({ theme }) => theme.spaces[4]};
1791
- height: ${({ theme }) => theme.spaces[6]};
1773
+ padding-left: ${({ theme }) => theme.spaces[0]};
1774
+ padding-right: ${({ theme }) => theme.spaces[0]};
1775
+ padding-top: ${({ theme }) => theme.spaces[1]};
1776
+ padding-bottom: ${({ theme }) => theme.spaces[1]};
1792
1777
  visibility: hidden;
1793
1778
  cursor: grab;
1794
1779
  opacity: inherit;
1795
1780
  margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};
1796
1781
 
1797
1782
  &:hover {
1798
- background: ${({ theme }) => theme.colors.neutral200};
1783
+ background: ${({ theme }) => theme.colors.neutral100};
1799
1784
  }
1800
1785
  &:active {
1801
1786
  cursor: grabbing;
1787
+ background: ${({ theme }) => theme.colors.neutral150};
1802
1788
  }
1803
1789
  &[aria-disabled='true'] {
1804
- cursor: not-allowed;
1805
- background: transparent;
1790
+ visibility: hidden;
1806
1791
  }
1807
1792
  svg {
1808
- height: auto;
1809
1793
  min-width: ${({ theme }) => theme.spaces[3]};
1810
1794
 
1811
1795
  path {
1812
- fill: ${({ theme }) => theme.colors.neutral700};
1796
+ fill: ${({ theme }) => theme.colors.neutral500};
1813
1797
  }
1814
1798
  }
1815
1799
  `;
@@ -1854,8 +1838,7 @@ const DragAndDropElement = ({
1854
1838
  displayedValue: children
1855
1839
  },
1856
1840
  onDropItem(currentIndex, newIndex) {
1857
- if (newIndex)
1858
- handleMoveBlock(newIndex, currentIndex);
1841
+ if (newIndex) handleMoveBlock(newIndex, currentIndex);
1859
1842
  }
1860
1843
  });
1861
1844
  const composedBoxRefs = designSystem.useComposedRefs(blockRef, dropRef);
@@ -1911,6 +1894,7 @@ const DragAndDropElement = ({
1911
1894
  DragIconButton,
1912
1895
  {
1913
1896
  tag: "div",
1897
+ contentEditable: false,
1914
1898
  role: "button",
1915
1899
  tabIndex: 0,
1916
1900
  withTooltip: false,
@@ -1960,7 +1944,7 @@ const baseRenderLeaf = (props, modifiers2) => {
1960
1944
  }
1961
1945
  return currentChildren;
1962
1946
  }, props.children);
1963
- return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, children: wrappedChildren });
1947
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, className: props.leaf.className, children: wrappedChildren });
1964
1948
  };
1965
1949
  const baseRenderElement = ({
1966
1950
  props,
@@ -1998,8 +1982,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
1998
1982
  [modifiers2]
1999
1983
  );
2000
1984
  const handleMoveBlocks = (editor2, event) => {
2001
- if (!editor2.selection)
2002
- return;
1985
+ if (!editor2.selection) return;
2003
1986
  const start = slate.Range.start(editor2.selection);
2004
1987
  const currentIndex = [start.path[0]];
2005
1988
  let newIndexPosition = 0;
@@ -2136,8 +2119,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
2136
2119
  }
2137
2120
  };
2138
2121
  const handleScrollSelectionIntoView = () => {
2139
- if (!editor.selection)
2140
- return;
2122
+ if (!editor.selection) return;
2141
2123
  const domRange = slateReact.ReactEditor.toDOMRange(editor, editor.selection);
2142
2124
  const domRect = domRange.getBoundingClientRect();
2143
2125
  const blocksInput = blocksRef.current;
@@ -2164,7 +2146,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
2164
2146
  background: "neutral0",
2165
2147
  color: "neutral800",
2166
2148
  lineHeight: 6,
2167
- paddingRight: 4,
2149
+ paddingRight: 7,
2168
2150
  paddingTop: 6,
2169
2151
  paddingBottom: 3,
2170
2152
  children: [
@@ -2175,6 +2157,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
2175
2157
  readOnly: disabled,
2176
2158
  placeholder,
2177
2159
  isExpandedMode,
2160
+ decorate: decorateCode,
2178
2161
  renderElement,
2179
2162
  renderLeaf,
2180
2163
  onKeyDown: handleKeyDown,
@@ -2331,8 +2314,7 @@ const InlineCode = styledComponents.styled.code`
2331
2314
  `;
2332
2315
  const baseCheckIsActive = (editor, name2) => {
2333
2316
  const marks = slate.Editor.marks(editor);
2334
- if (!marks)
2335
- return false;
2317
+ if (!marks) return false;
2336
2318
  return Boolean(marks[name2]);
2337
2319
  };
2338
2320
  const baseHandleToggle = (editor, name2) => {
@@ -2498,6 +2480,7 @@ const ExpandIconButton = styledComponents.styled(designSystem.IconButton)`
2498
2480
  position: absolute;
2499
2481
  bottom: 1.2rem;
2500
2482
  right: 1.2rem;
2483
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
2501
2484
  `;
2502
2485
  function useResetKey(value) {
2503
2486
  const slateUpdatesCount = React__namespace.useRef(0);
@@ -2629,26 +2612,6 @@ const BlocksInput = React__namespace.forwardRef(
2629
2612
  }
2630
2613
  );
2631
2614
  const MemoizedBlocksInput = React__namespace.memo(BlocksInput);
2632
- const createDefaultForm = (contentType, components = {}) => {
2633
- const traverseSchema = (attributes) => {
2634
- return Object.entries(attributes).reduce((acc, [key, attribute]) => {
2635
- if ("default" in attribute) {
2636
- acc[key] = attribute.default;
2637
- } else if (attribute.type === "component" && attribute.required) {
2638
- const defaultComponentForm = traverseSchema(components[attribute.component].attributes);
2639
- if (attribute.repeatable) {
2640
- acc[key] = attribute.min ? [...Array(attribute.min).fill(defaultComponentForm)] : [];
2641
- } else {
2642
- acc[key] = defaultComponentForm;
2643
- }
2644
- } else if (attribute.type === "dynamiczone" && attribute.required) {
2645
- acc[key] = [];
2646
- }
2647
- return acc;
2648
- }, {});
2649
- };
2650
- return traverseSchema(contentType.attributes);
2651
- };
2652
2615
  const Initializer = ({ disabled, name: name2, onClick }) => {
2653
2616
  const { formatMessage } = reactIntl.useIntl();
2654
2617
  const field = strapiAdmin.useField(name2);
@@ -2656,7 +2619,7 @@ const Initializer = ({ disabled, name: name2, onClick }) => {
2656
2619
  designSystem.Box,
2657
2620
  {
2658
2621
  tag: "button",
2659
- background: "neutral100",
2622
+ background: disabled ? "neutral150" : "neutral100",
2660
2623
  borderColor: field.error ? "danger600" : "neutral200",
2661
2624
  hasRadius: true,
2662
2625
  disabled,
@@ -2664,109 +2627,470 @@ const Initializer = ({ disabled, name: name2, onClick }) => {
2664
2627
  paddingTop: 9,
2665
2628
  paddingBottom: 9,
2666
2629
  type: "button",
2630
+ style: { cursor: disabled ? "not-allowed" : "pointer" },
2667
2631
  children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, children: [
2668
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(CircleIcon, {}) }),
2669
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "primary600", variant: "pi", fontWeight: "bold", children: formatMessage({
2670
- id: index.getTranslation("components.empty-repeatable"),
2671
- defaultMessage: "No entry yet. Click on the button below to add one."
2672
- }) }) })
2632
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", color: disabled ? "neutral500" : "primary600", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.PlusCircle, { width: "3.2rem", height: "3.2rem" }) }),
2633
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
2634
+ designSystem.Typography,
2635
+ {
2636
+ textColor: disabled ? "neutral600" : "primary600",
2637
+ variant: "pi",
2638
+ fontWeight: "bold",
2639
+ children: formatMessage({
2640
+ id: index.getTranslation("components.empty-repeatable"),
2641
+ defaultMessage: "No entry yet. Click to add one."
2642
+ })
2643
+ }
2644
+ ) })
2673
2645
  ] })
2674
2646
  }
2675
2647
  ) });
2676
2648
  };
2677
- const CircleIcon = styledComponents.styled(Icons.PlusCircle)`
2678
- width: 2.4rem;
2679
- height: 2.4rem;
2649
+ const AddComponentButton = ({
2650
+ hasError,
2651
+ isDisabled,
2652
+ isOpen,
2653
+ children,
2654
+ onClick
2655
+ }) => {
2656
+ return /* @__PURE__ */ jsxRuntime.jsx(
2657
+ StyledButton,
2658
+ {
2659
+ type: "button",
2660
+ onClick,
2661
+ disabled: isDisabled,
2662
+ background: "neutral0",
2663
+ style: { cursor: isDisabled ? "not-allowed" : "pointer" },
2664
+ variant: "tertiary",
2665
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
2666
+ /* @__PURE__ */ jsxRuntime.jsx(StyledAddIcon, { "aria-hidden": true, $isOpen: isOpen, $hasError: hasError && !isOpen }),
2667
+ /* @__PURE__ */ jsxRuntime.jsx(
2668
+ designSystem.Typography,
2669
+ {
2670
+ variant: "pi",
2671
+ fontWeight: "bold",
2672
+ textColor: hasError && !isOpen ? "danger600" : "neutral600",
2673
+ children
2674
+ }
2675
+ )
2676
+ ] })
2677
+ }
2678
+ );
2679
+ };
2680
+ const StyledAddIcon = styledComponents.styled(Icons.PlusCircle)`
2681
+ height: ${({ theme }) => theme.spaces[6]};
2682
+ width: ${({ theme }) => theme.spaces[6]};
2683
+ transform: ${({ $isOpen }) => $isOpen ? "rotate(45deg)" : "rotate(0deg)"};
2684
+
2680
2685
  > circle {
2681
- fill: ${({ theme }) => theme.colors.primary200};
2686
+ fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
2682
2687
  }
2683
2688
  > path {
2684
- fill: ${({ theme }) => theme.colors.primary600};
2689
+ fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral500};
2685
2690
  }
2686
2691
  `;
2687
- const NonRepeatableComponent = ({
2688
- attribute,
2689
- name: name2,
2690
- children,
2691
- layout
2692
+ const StyledButton = styledComponents.styled(designSystem.Button)`
2693
+ padding-left: ${({ theme }) => theme.spaces[3]};
2694
+ border-radius: 26px;
2695
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
2696
+ height: 5rem;
2697
+ `;
2698
+ const ComponentCategory = ({
2699
+ category,
2700
+ components = [],
2701
+ variant = "primary",
2702
+ onAddComponent
2692
2703
  }) => {
2693
- const { value } = strapiAdmin.useField(name2);
2694
- const level = Relations.useComponent("NonRepeatableComponent", (state) => state.level);
2695
- const isNested = level > 0;
2696
- return /* @__PURE__ */ jsxRuntime.jsx(Relations.ComponentProvider, { id: value?.id, uid: attribute.component, level: level + 1, type: "component", children: /* @__PURE__ */ jsxRuntime.jsx(
2704
+ const { formatMessage } = reactIntl.useIntl();
2705
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
2706
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
2707
+ /* @__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(
2708
+ ComponentBox,
2709
+ {
2710
+ tag: "button",
2711
+ type: "button",
2712
+ background: "neutral100",
2713
+ justifyContent: "center",
2714
+ onClick: onAddComponent(uid),
2715
+ hasRadius: true,
2716
+ height: "8.4rem",
2717
+ shrink: 0,
2718
+ borderColor: "neutral200",
2719
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
2720
+ /* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
2721
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
2722
+ ] })
2723
+ },
2724
+ uid
2725
+ )) }) })
2726
+ ] });
2727
+ };
2728
+ const ResponsiveAccordionContent = styledComponents.styled(designSystem.Accordion.Content)`
2729
+ container-type: inline-size;
2730
+ `;
2731
+ const Grid = styledComponents.styled(designSystem.Box)`
2732
+ display: grid;
2733
+ grid-template-columns: repeat(auto-fill, 100%);
2734
+ grid-gap: ${({ theme }) => theme.spaces[1]};
2735
+
2736
+ @container (min-width: ${() => RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
2737
+ grid-template-columns: repeat(auto-fill, 14rem);
2738
+ }
2739
+ `;
2740
+ const ComponentBox = styledComponents.styled(designSystem.Flex)`
2741
+ color: ${({ theme }) => theme.colors.neutral600};
2742
+ cursor: pointer;
2743
+
2744
+ @media (prefers-reduced-motion: no-preference) {
2745
+ transition: color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
2746
+ }
2747
+
2748
+ &:focus,
2749
+ &:hover {
2750
+ border: 1px solid ${({ theme }) => theme.colors.primary200};
2751
+ background: ${({ theme }) => theme.colors.primary100};
2752
+ color: ${({ theme }) => theme.colors.primary600};
2753
+ }
2754
+ `;
2755
+ const ComponentPicker = ({
2756
+ dynamicComponentsByCategory = {},
2757
+ isOpen,
2758
+ onClickAddComponent
2759
+ }) => {
2760
+ const { formatMessage } = reactIntl.useIntl();
2761
+ const handleAddComponentToDz = (componentUid) => () => {
2762
+ onClickAddComponent(componentUid);
2763
+ };
2764
+ if (!isOpen) {
2765
+ return null;
2766
+ }
2767
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2697
2768
  designSystem.Box,
2698
2769
  {
2699
- background: "neutral100",
2700
- paddingLeft: 6,
2701
- paddingRight: 6,
2702
2770
  paddingTop: 6,
2703
2771
  paddingBottom: 6,
2704
- hasRadius: isNested,
2705
- borderColor: isNested ? "neutral200" : void 0,
2706
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index2) => {
2707
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
2708
- const completeFieldName = `${name2}.${field.name}`;
2709
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, s: 12, xs: 12, children: children({ ...field, name: completeFieldName }) }, completeFieldName);
2710
- }) }, index2);
2711
- }) })
2772
+ paddingLeft: 5,
2773
+ paddingRight: 5,
2774
+ background: "neutral0",
2775
+ shadow: "tableShadow",
2776
+ borderColor: "neutral150",
2777
+ hasRadius: true,
2778
+ children: [
2779
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", textColor: "neutral600", children: formatMessage({
2780
+ id: index.getTranslation("components.DynamicZone.ComponentPicker-label"),
2781
+ defaultMessage: "Pick one component"
2782
+ }) }) }),
2783
+ /* @__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(
2784
+ ComponentCategory,
2785
+ {
2786
+ category,
2787
+ components,
2788
+ onAddComponent: handleAddComponentToDz,
2789
+ variant: index2 % 2 === 1 ? "primary" : "secondary"
2790
+ },
2791
+ category
2792
+ )) }) })
2793
+ ]
2712
2794
  }
2713
- ) });
2795
+ );
2714
2796
  };
2715
- const RepeatableComponent = ({
2716
- attribute,
2797
+ const DynamicComponent = ({
2798
+ componentUid,
2717
2799
  disabled,
2800
+ index: index$1,
2718
2801
  name: name2,
2719
- mainField,
2720
- children,
2721
- layout
2802
+ onRemoveComponentClick,
2803
+ onMoveComponent,
2804
+ onGrabItem,
2805
+ onDropItem,
2806
+ onCancel,
2807
+ dynamicComponentsByCategory = {},
2808
+ onAddComponent,
2809
+ children
2722
2810
  }) => {
2723
- const { toggleNotification } = strapiAdmin.useNotification();
2724
2811
  const { formatMessage } = reactIntl.useIntl();
2725
- const { search: searchString } = reactRouterDom.useLocation();
2726
- const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
2727
- const { components } = index.useDoc();
2728
- const { value = [], error } = strapiAdmin.useField(name2);
2729
- const addFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.addFieldRow);
2730
- const moveFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.moveFieldRow);
2731
- const removeFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.removeFieldRow);
2732
- const { max = Infinity } = attribute;
2733
- const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
2734
- const [liveText, setLiveText] = React__namespace.useState("");
2735
- const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
2736
- if (search.has("field")) {
2737
- const fieldParam = search.get("field");
2738
- if (!fieldParam) {
2739
- return void 0;
2740
- }
2741
- const [, path] = fieldParam.split(`${name2}.`);
2742
- if (objects.getIn(value, path, void 0) !== void 0) {
2743
- const [subpath] = path.split(".");
2744
- return objects.getIn(value, subpath, void 0)?.__temp_key__;
2745
- }
2746
- }
2747
- return void 0;
2748
- }, [search, name2, value]);
2749
- const prevValue = usePrev.usePrev(value);
2750
- React__namespace.useEffect(() => {
2751
- if (prevValue && prevValue.length < value.length) {
2752
- setCollapseToOpen(value[value.length - 1].__temp_key__);
2753
- }
2754
- }, [value, prevValue]);
2812
+ const formValues = strapiAdmin.useForm("DynamicComponent", (state) => state.values);
2813
+ const {
2814
+ edit: { components }
2815
+ } = index.useDocLayout();
2816
+ const title = React__namespace.useMemo(() => {
2817
+ const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
2818
+ const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
2819
+ const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
2820
+ const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
2821
+ return mainValue;
2822
+ }, [componentUid, components, formValues, name2, index$1]);
2823
+ const { icon, displayName } = React__namespace.useMemo(() => {
2824
+ const [category] = componentUid.split(".");
2825
+ const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
2826
+ (component) => component.uid === componentUid
2827
+ ) ?? { icon: null, displayName: null };
2828
+ return { icon: icon2, displayName: displayName2 };
2829
+ }, [componentUid, dynamicComponentsByCategory]);
2830
+ const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
2831
+ type: `${useDragAndDrop.ItemTypes.DYNAMIC_ZONE}_${name2}`,
2832
+ index: index$1,
2833
+ item: {
2834
+ index: index$1,
2835
+ displayedValue: `${displayName} ${title}`,
2836
+ icon
2837
+ },
2838
+ onMoveItem: onMoveComponent,
2839
+ onDropItem,
2840
+ onGrabItem,
2841
+ onCancel
2842
+ });
2755
2843
  React__namespace.useEffect(() => {
2756
- if (typeof componentTmpKeyWithFocussedField === "string") {
2757
- setCollapseToOpen(componentTmpKeyWithFocussedField);
2844
+ dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
2845
+ }, [dragPreviewRef, index$1]);
2846
+ const accordionValue = React__namespace.useId();
2847
+ const { value = [], rawError } = strapiAdmin.useField(`${name2}.${index$1}`);
2848
+ const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
2849
+ React__namespace.useEffect(() => {
2850
+ if (rawError && value) {
2851
+ setCollapseToOpen(accordionValue);
2758
2852
  }
2759
- }, [componentTmpKeyWithFocussedField]);
2760
- const toggleCollapses = () => {
2761
- setCollapseToOpen("");
2853
+ }, [rawError, value, accordionValue]);
2854
+ const composedBoxRefs = designSystem.useComposedRefs(boxRef, dropRef);
2855
+ const accordionActions = disabled ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2856
+ /* @__PURE__ */ jsxRuntime.jsx(
2857
+ designSystem.IconButton,
2858
+ {
2859
+ variant: "ghost",
2860
+ label: formatMessage(
2861
+ {
2862
+ id: index.getTranslation("components.DynamicZone.delete-label"),
2863
+ defaultMessage: "Delete {name}"
2864
+ },
2865
+ { name: title }
2866
+ ),
2867
+ onClick: onRemoveComponentClick,
2868
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
2869
+ }
2870
+ ),
2871
+ /* @__PURE__ */ jsxRuntime.jsx(
2872
+ designSystem.IconButton,
2873
+ {
2874
+ variant: "ghost",
2875
+ onClick: (e) => e.stopPropagation(),
2876
+ "data-handler-id": handlerId,
2877
+ ref: dragRef,
2878
+ label: formatMessage({
2879
+ id: index.getTranslation("components.DragHandle-label"),
2880
+ defaultMessage: "Drag"
2881
+ }),
2882
+ onKeyDown: handleKeyDown,
2883
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
2884
+ }
2885
+ ),
2886
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
2887
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 0, paddingRight: 0, children: /* @__PURE__ */ jsxRuntime.jsx(
2888
+ designSystem.IconButton,
2889
+ {
2890
+ variant: "ghost",
2891
+ label: formatMessage({
2892
+ id: index.getTranslation("components.DynamicZone.more-actions"),
2893
+ defaultMessage: "More actions"
2894
+ }),
2895
+ tag: "span",
2896
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false })
2897
+ }
2898
+ ) }),
2899
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
2900
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
2901
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
2902
+ id: index.getTranslation("components.DynamicZone.add-item-above"),
2903
+ defaultMessage: "Add component above"
2904
+ }) }),
2905
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2906
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
2907
+ components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
2908
+ ] }, category)) })
2909
+ ] }),
2910
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
2911
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
2912
+ id: index.getTranslation("components.DynamicZone.add-item-below"),
2913
+ defaultMessage: "Add component below"
2914
+ }) }),
2915
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2916
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
2917
+ components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
2918
+ ] }, category)) })
2919
+ ] })
2920
+ ] })
2921
+ ] })
2922
+ ] });
2923
+ const accordionTitle = title ? `${displayName} ${title}` : displayName;
2924
+ return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
2925
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
2926
+ /* @__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: [
2927
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
2928
+ /* @__PURE__ */ jsxRuntime.jsx(
2929
+ designSystem.Accordion.Trigger,
2930
+ {
2931
+ icon: icon && ComponentIcon.COMPONENT_ICONS[icon] ? ComponentIcon.COMPONENT_ICONS[icon] : ComponentIcon.COMPONENT_ICONS.dashboard,
2932
+ children: accordionTitle
2933
+ }
2934
+ ),
2935
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
2936
+ ] }),
2937
+ /* @__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(
2938
+ designSystem.Grid.Item,
2939
+ {
2940
+ col: 12,
2941
+ s: 12,
2942
+ xs: 12,
2943
+ direction: "column",
2944
+ alignItems: "stretch",
2945
+ children: /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
2946
+ const fieldName = `${name2}.${index$1}.${field.name}`;
2947
+ const fieldWithTranslatedLabel = {
2948
+ ...field,
2949
+ label: formatMessage({
2950
+ id: `content-manager.components.${componentUid}.${field.name}`,
2951
+ defaultMessage: field.label
2952
+ })
2953
+ };
2954
+ return /* @__PURE__ */ jsxRuntime.jsx(
2955
+ ResponsiveGridItem,
2956
+ {
2957
+ col: size,
2958
+ s: 12,
2959
+ xs: 12,
2960
+ direction: "column",
2961
+ alignItems: "stretch",
2962
+ children: children ? children({ ...fieldWithTranslatedLabel, name: fieldName }) : /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel, name: fieldName })
2963
+ },
2964
+ fieldName
2965
+ );
2966
+ }) })
2967
+ },
2968
+ rowInd
2969
+ )) }) }) }) })
2970
+ ] }) }) })
2971
+ ] });
2972
+ };
2973
+ const StyledBox = styledComponents.styled(designSystem.Box)`
2974
+ > div:first-child {
2975
+ box-shadow: ${({ theme }) => theme.shadows.tableShadow};
2976
+ }
2977
+ `;
2978
+ const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
2979
+ border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
2980
+ `;
2981
+ const Rectangle = styledComponents.styled(designSystem.Box)`
2982
+ width: ${({ theme }) => theme.spaces[2]};
2983
+ height: ${({ theme }) => theme.spaces[4]};
2984
+ `;
2985
+ const Preview$1 = styledComponents.styled.span`
2986
+ display: block;
2987
+ background-color: ${({ theme }) => theme.colors.primary100};
2988
+ outline: 1px dashed ${({ theme }) => theme.colors.primary500};
2989
+ outline-offset: -1px;
2990
+ padding: ${({ theme }) => theme.spaces[6]};
2991
+ `;
2992
+ const ComponentContainer = styledComponents.styled(designSystem.Box)`
2993
+ list-style: none;
2994
+ padding: 0;
2995
+ margin: 0;
2996
+ `;
2997
+ const DynamicZoneLabel = ({
2998
+ hint,
2999
+ label,
3000
+ labelAction,
3001
+ name: name2,
3002
+ numberOfComponents = 0,
3003
+ required
3004
+ }) => {
3005
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
3006
+ designSystem.Box,
3007
+ {
3008
+ paddingTop: 3,
3009
+ paddingBottom: 3,
3010
+ paddingRight: 4,
3011
+ paddingLeft: 4,
3012
+ borderRadius: "26px",
3013
+ background: "neutral0",
3014
+ shadow: "filterShadow",
3015
+ color: "neutral500",
3016
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
3017
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
3018
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
3019
+ label || name2,
3020
+ " "
3021
+ ] }),
3022
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
3023
+ "(",
3024
+ numberOfComponents,
3025
+ ")"
3026
+ ] }),
3027
+ required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
3028
+ labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
3029
+ ] }),
3030
+ 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 }) })
3031
+ ] })
3032
+ }
3033
+ ) });
3034
+ };
3035
+ const [DynamicZoneProvider, useDynamicZone] = strapiAdmin.createContext(
3036
+ "DynamicZone",
3037
+ {
3038
+ isInDynamicZone: false
3039
+ }
3040
+ );
3041
+ const DynamicZone = ({
3042
+ attribute,
3043
+ disabled: disabledProp,
3044
+ hint,
3045
+ label,
3046
+ labelAction,
3047
+ name: name2,
3048
+ required = false,
3049
+ children
3050
+ }) => {
3051
+ const { max = Infinity, min = -Infinity } = attribute ?? {};
3052
+ const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
3053
+ const [liveText, setLiveText] = React__namespace.useState("");
3054
+ const { components, isLoading } = index.useDoc();
3055
+ const disabled = disabledProp || isLoading;
3056
+ const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
3057
+ "DynamicZone",
3058
+ ({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
3059
+ addFieldRow: addFieldRow2,
3060
+ removeFieldRow: removeFieldRow2,
3061
+ moveFieldRow: moveFieldRow2
3062
+ })
3063
+ );
3064
+ const { value = [], error } = strapiAdmin.useField(name2);
3065
+ const dynamicComponentsByCategory = React__namespace.useMemo(() => {
3066
+ return attribute.components.reduce((acc, componentUid) => {
3067
+ const { category, info } = components[componentUid] ?? { info: {} };
3068
+ const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
3069
+ if (!acc[category]) {
3070
+ acc[category] = [];
3071
+ }
3072
+ acc[category] = [...acc[category], component];
3073
+ return acc;
3074
+ }, {});
3075
+ }, [attribute.components, components]);
3076
+ const { formatMessage } = reactIntl.useIntl();
3077
+ const { toggleNotification } = strapiAdmin.useNotification();
3078
+ const dynamicDisplayedComponentsLength = value.length;
3079
+ const handleAddComponent = (uid, position) => {
3080
+ setAddComponentIsOpen(false);
3081
+ const schema = components[uid];
3082
+ const form = index.createDefaultForm(schema, components);
3083
+ const transformations = pipe__default.default(index.transformDocument(schema, components), (data2) => ({
3084
+ ...data2,
3085
+ __component: uid
3086
+ }));
3087
+ const data = transformations(form);
3088
+ addFieldRow(name2, data, position);
2762
3089
  };
2763
- const handleClick = () => {
2764
- if (value.length < max) {
2765
- const schema = components[attribute.component];
2766
- const form = createDefaultForm(schema, components);
2767
- const data = transformDocument(schema, components)(form);
2768
- addFieldRow(name2, data);
2769
- } else if (value.length >= max) {
3090
+ const handleClickOpenPicker = () => {
3091
+ if (dynamicDisplayedComponentsLength < max) {
3092
+ setAddComponentIsOpen((prev) => !prev);
3093
+ } else {
2770
3094
  toggleNotification({
2771
3095
  type: "info",
2772
3096
  message: formatMessage({
@@ -2775,7 +3099,7 @@ const RepeatableComponent = ({
2775
3099
  });
2776
3100
  }
2777
3101
  };
2778
- const handleMoveComponentField = (newIndex, currentIndex) => {
3102
+ const handleMoveComponent = (newIndex, currentIndex) => {
2779
3103
  setLiveText(
2780
3104
  formatMessage(
2781
3105
  {
@@ -2790,9 +3114,6 @@ const RepeatableComponent = ({
2790
3114
  );
2791
3115
  moveFieldRow(name2, currentIndex, newIndex);
2792
3116
  };
2793
- const handleValueChange = (key) => {
2794
- setCollapseToOpen(key);
2795
- };
2796
3117
  const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
2797
3118
  const handleCancel = (index$1) => {
2798
3119
  setLiveText(
@@ -2835,419 +3156,109 @@ const RepeatableComponent = ({
2835
3156
  )
2836
3157
  );
2837
3158
  };
2838
- const ariaDescriptionId = React__namespace.useId();
2839
- const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
2840
- if (value.length === 0) {
2841
- return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
2842
- }
2843
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
2844
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
2845
- id: index.getTranslation("dnd.instructions"),
2846
- defaultMessage: `Press spacebar to grab and re-order`
2847
- }) }),
2848
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
2849
- /* @__PURE__ */ jsxRuntime.jsxs(
2850
- AccordionRoot,
2851
- {
2852
- $error: error,
2853
- value: collapseToOpen,
2854
- onValueChange: handleValueChange,
2855
- "aria-describedby": ariaDescriptionId,
2856
- children: [
2857
- value.map(({ __temp_key__: key, id }, index2) => {
2858
- const nameWithIndex = `${name2}.${index2}`;
2859
- return /* @__PURE__ */ jsxRuntime.jsx(
2860
- Relations.ComponentProvider,
2861
- {
2862
- id,
2863
- uid: attribute.component,
2864
- level: level + 1,
2865
- type: "repeatable",
2866
- children: /* @__PURE__ */ jsxRuntime.jsx(
2867
- Component,
2868
- {
2869
- disabled,
2870
- name: nameWithIndex,
2871
- attribute,
2872
- index: index2,
2873
- mainField,
2874
- onMoveItem: handleMoveComponentField,
2875
- onDeleteComponent: () => {
2876
- removeFieldRow(name2, index2);
2877
- toggleCollapses();
2878
- },
2879
- toggleCollapses,
2880
- onCancel: handleCancel,
2881
- onDropItem: handleDropItem,
2882
- onGrabItem: handleGrabItem,
2883
- __temp_key__: key,
2884
- children: layout.map((row, index22) => {
2885
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
2886
- const completeFieldName = `${nameWithIndex}.${field.name}`;
2887
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, s: 12, xs: 12, children: children({ ...field, name: completeFieldName }) }, completeFieldName);
2888
- }) }, index22);
2889
- })
2890
- }
2891
- )
2892
- },
2893
- key
2894
- );
2895
- }),
2896
- /* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
2897
- id: index.getTranslation("containers.EditView.add.new-entry"),
2898
- defaultMessage: "Add an entry"
2899
- }) })
2900
- ]
2901
- }
2902
- )
2903
- ] });
2904
- };
2905
- const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
2906
- border: 1px solid
2907
- ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
2908
- `;
2909
- const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
2910
- width: 100%;
2911
- display: flex;
2912
- justify-content: center;
2913
- border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
2914
- padding-inline: ${(props) => props.theme.spaces[6]};
2915
- padding-block: ${(props) => props.theme.spaces[3]};
2916
-
2917
- &:not([disabled]) {
2918
- cursor: pointer;
2919
-
2920
- &:hover {
2921
- background-color: ${(props) => props.theme.colors.primary100};
2922
- }
2923
- }
2924
-
2925
- span {
2926
- font-weight: 600;
2927
- font-size: 1.4rem;
2928
- line-height: 2.4rem;
2929
- }
2930
-
2931
- @media (prefers-reduced-motion: no-preference) {
2932
- transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
2933
- }
2934
- `;
2935
- const Component = ({
2936
- disabled,
2937
- index: index$1,
2938
- name: name2,
2939
- mainField = {
2940
- name: "id",
2941
- type: "integer"
2942
- },
2943
- children,
2944
- onDeleteComponent,
2945
- toggleCollapses,
2946
- __temp_key__,
2947
- ...dragProps
2948
- }) => {
2949
- const { formatMessage } = reactIntl.useIntl();
2950
- const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
2951
- return objects.getIn(state.values, [...name2.split("."), mainField.name]);
2952
- });
2953
- const accordionRef = React__namespace.useRef(null);
2954
- const componentKey = name2.split(".").slice(0, -1).join(".");
2955
- const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
2956
- type: `${useDragAndDrop.ItemTypes.COMPONENT}_${componentKey}`,
2957
- index: index$1,
2958
- item: {
2959
- index: index$1,
2960
- displayedValue: displayValue
2961
- },
2962
- onStart() {
2963
- toggleCollapses();
2964
- },
2965
- ...dragProps
2966
- });
2967
- React__namespace.useEffect(() => {
2968
- dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
2969
- }, [dragPreviewRef, index$1]);
2970
- const composedAccordionRefs = designSystem.useComposedRefs(accordionRef, dragRef);
2971
- const composedBoxRefs = designSystem.useComposedRefs(
2972
- boxRef,
2973
- dropRef
2974
- );
2975
- 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: [
2976
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
2977
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: displayValue }),
2978
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Actions, { children: [
2979
- /* @__PURE__ */ jsxRuntime.jsx(
2980
- designSystem.IconButton,
2981
- {
2982
- borderWidth: 0,
2983
- onClick: onDeleteComponent,
2984
- label: formatMessage({
2985
- id: index.getTranslation("containers.Edit.delete"),
2986
- defaultMessage: "Delete"
2987
- }),
2988
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
2989
- }
2990
- ),
2991
- /* @__PURE__ */ jsxRuntime.jsx(
2992
- designSystem.IconButton,
2993
- {
2994
- ref: composedAccordionRefs,
2995
- borderWidth: 0,
2996
- onClick: (e) => e.stopPropagation(),
2997
- "data-handler-id": handlerId,
2998
- label: formatMessage({
2999
- id: index.getTranslation("components.DragHandle-label"),
3000
- defaultMessage: "Drag"
3001
- }),
3002
- onKeyDown: handleKeyDown,
3003
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
3004
- }
3005
- )
3006
- ] })
3007
- ] }),
3008
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
3009
- designSystem.Flex,
3010
- {
3011
- direction: "column",
3012
- alignItems: "stretch",
3013
- background: "neutral100",
3014
- padding: 6,
3015
- gap: 6,
3016
- children
3017
- }
3018
- ) })
3019
- ] }) });
3020
- };
3021
- const Preview$1 = () => {
3022
- return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
3023
- };
3024
- const StyledSpan = styledComponents.styled(designSystem.Box)`
3025
- display: block;
3026
- outline: 1px dashed ${({ theme }) => theme.colors.primary500};
3027
- outline-offset: -1px;
3028
- `;
3029
- const ComponentInput = ({
3030
- label,
3031
- required,
3032
- name: name2,
3033
- attribute,
3034
- disabled,
3035
- labelAction,
3036
- ...props
3037
- }) => {
3038
- const { formatMessage } = reactIntl.useIntl();
3039
- const field = strapiAdmin.useField(name2);
3040
- const showResetComponent = !attribute.repeatable && field.value && !disabled;
3041
- const { components } = index.useDoc();
3042
- const handleInitialisationClick = () => {
3043
- const schema = components[attribute.component];
3044
- const form = createDefaultForm(schema, components);
3045
- const data = transformDocument(schema, components)(form);
3046
- field.onChange(name2, data);
3159
+ const handleRemoveComponent = (name22, currentIndex) => () => {
3160
+ removeFieldRow(name22, currentIndex);
3047
3161
  };
3048
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
3049
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
3050
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
3051
- label,
3052
- attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3053
- (",
3054
- Array.isArray(field.value) ? field.value.length : 0,
3055
- ")"
3056
- ] })
3057
- ] }),
3058
- showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
3059
- designSystem.IconButton,
3162
+ const hasError = error !== void 0;
3163
+ const renderButtonLabel = () => {
3164
+ if (addComponentIsOpen) {
3165
+ return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
3166
+ }
3167
+ if (hasError && dynamicDisplayedComponentsLength > max) {
3168
+ return formatMessage(
3060
3169
  {
3061
- label: formatMessage({
3062
- id: index.getTranslation("components.reset-entry"),
3063
- defaultMessage: "Reset Entry"
3064
- }),
3065
- borderWidth: 0,
3066
- onClick: () => {
3067
- field.onChange(name2, null);
3068
- },
3069
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
3170
+ id: index.getTranslation(`components.DynamicZone.extra-components`),
3171
+ defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
3172
+ },
3173
+ {
3174
+ number: dynamicDisplayedComponentsLength - max
3070
3175
  }
3071
- )
3072
- ] }),
3073
- !attribute.repeatable && !field.value && /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleInitialisationClick }),
3074
- !attribute.repeatable && field.value ? /* @__PURE__ */ jsxRuntime.jsx(NonRepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }) : null,
3075
- attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }),
3076
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
3077
- ] });
3078
- };
3079
- const MemoizedComponentInput = React__namespace.memo(ComponentInput);
3080
- const AddComponentButton = ({
3081
- hasError,
3082
- isDisabled,
3083
- isOpen,
3084
- children,
3085
- onClick
3086
- }) => {
3087
- return /* @__PURE__ */ jsxRuntime.jsx(
3088
- StyledButton,
3089
- {
3090
- type: "button",
3091
- onClick,
3092
- disabled: isDisabled,
3093
- background: "neutral0",
3094
- paddingTop: 3,
3095
- paddingBottom: 3,
3096
- paddingLeft: 4,
3097
- paddingRight: 4,
3098
- style: { cursor: isDisabled ? "not-allowed" : "pointer" },
3099
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
3100
- /* @__PURE__ */ jsxRuntime.jsx(StyledAddIcon, { "aria-hidden": true, $isOpen: isOpen, $hasError: hasError && !isOpen }),
3101
- /* @__PURE__ */ jsxRuntime.jsx(
3102
- AddComponentTitle,
3103
- {
3104
- variant: "pi",
3105
- fontWeight: "bold",
3106
- textColor: hasError && !isOpen ? "danger600" : "neutral500",
3107
- children
3108
- }
3109
- )
3110
- ] })
3111
- }
3112
- );
3113
- };
3114
- const StyledAddIcon = styledComponents.styled(Icons.PlusCircle)`
3115
- height: ${({ theme }) => theme.spaces[6]};
3116
- width: ${({ theme }) => theme.spaces[6]};
3117
- transform: ${({ $isOpen }) => $isOpen ? "rotate(45deg)" : "rotate(0deg)"};
3118
-
3119
- > circle {
3120
- fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
3121
- }
3122
- > path {
3123
- fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral600};
3124
- }
3125
- `;
3126
- const AddComponentTitle = styledComponents.styled(designSystem.Typography)``;
3127
- const StyledButton = styledComponents.styled(designSystem.BaseButton)`
3128
- border-radius: 26px;
3129
- border-color: ${({ theme }) => theme.colors.neutral150};
3130
- box-shadow: ${({ theme }) => theme.shadows.filterShadow};
3131
-
3132
- &:hover {
3133
- ${AddComponentTitle} {
3134
- color: ${({ theme }) => theme.colors.primary600};
3135
- }
3136
-
3137
- ${StyledAddIcon} {
3138
- > circle {
3139
- fill: ${({ theme }) => theme.colors.primary600};
3140
- }
3141
- > path {
3142
- fill: ${({ theme }) => theme.colors.neutral100};
3143
- }
3144
- }
3145
- }
3146
- &:active {
3147
- ${AddComponentTitle} {
3148
- color: ${({ theme }) => theme.colors.primary600};
3176
+ );
3149
3177
  }
3150
- ${StyledAddIcon} {
3151
- > circle {
3152
- fill: ${({ theme }) => theme.colors.primary600};
3153
- }
3154
- > path {
3155
- fill: ${({ theme }) => theme.colors.neutral100};
3156
- }
3178
+ if (hasError && dynamicDisplayedComponentsLength < min) {
3179
+ return formatMessage(
3180
+ {
3181
+ id: index.getTranslation(`components.DynamicZone.missing-components`),
3182
+ defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
3183
+ },
3184
+ { number: min - dynamicDisplayedComponentsLength }
3185
+ );
3157
3186
  }
3158
- }
3159
- `;
3160
- const ComponentCategory = ({
3161
- category,
3162
- components = [],
3163
- variant = "primary",
3164
- onAddComponent
3165
- }) => {
3166
- const { formatMessage } = reactIntl.useIntl();
3167
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
3168
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
3169
- /* @__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(
3170
- ComponentBox,
3187
+ return formatMessage(
3171
3188
  {
3172
- tag: "button",
3173
- type: "button",
3174
- background: "neutral100",
3175
- justifyContent: "center",
3176
- onClick: onAddComponent(uid),
3177
- hasRadius: true,
3178
- height: "8.4rem",
3179
- shrink: 0,
3180
- borderColor: "neutral200",
3181
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
3182
- /* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
3183
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
3184
- ] })
3189
+ id: index.getTranslation("components.DynamicZone.add-component"),
3190
+ defaultMessage: "Add a component to {componentName}"
3185
3191
  },
3186
- uid
3187
- )) }) })
3188
- ] });
3189
- };
3190
- const Grid = styledComponents.styled(designSystem.Box)`
3191
- display: grid;
3192
- grid-template-columns: repeat(auto-fit, 14rem);
3193
- grid-gap: ${({ theme }) => theme.spaces[1]};
3194
- `;
3195
- const ComponentBox = styledComponents.styled(designSystem.Flex)`
3196
- color: ${({ theme }) => theme.colors.neutral600};
3197
- cursor: pointer;
3198
-
3199
- @media (prefers-reduced-motion: no-preference) {
3200
- transition: color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
3201
- }
3202
-
3203
- &:focus,
3204
- &:hover {
3205
- border: 1px solid ${({ theme }) => theme.colors.primary200};
3206
- background: ${({ theme }) => theme.colors.primary100};
3207
- color: ${({ theme }) => theme.colors.primary600};
3208
- }
3209
- `;
3210
- const ComponentPicker = ({
3211
- dynamicComponentsByCategory = {},
3212
- isOpen,
3213
- onClickAddComponent
3214
- }) => {
3215
- const { formatMessage } = reactIntl.useIntl();
3216
- const handleAddComponentToDz = (componentUid) => () => {
3217
- onClickAddComponent(componentUid);
3192
+ { componentName: label || name2 }
3193
+ );
3218
3194
  };
3219
- if (!isOpen) {
3220
- return null;
3221
- }
3222
- return /* @__PURE__ */ jsxRuntime.jsxs(
3223
- designSystem.Box,
3224
- {
3225
- paddingTop: 6,
3226
- paddingBottom: 6,
3227
- paddingLeft: 5,
3228
- paddingRight: 5,
3229
- background: "neutral0",
3230
- shadow: "tableShadow",
3231
- borderColor: "neutral150",
3232
- hasRadius: true,
3233
- children: [
3234
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", textColor: "neutral600", children: formatMessage({
3235
- id: index.getTranslation("components.DynamicZone.ComponentPicker-label"),
3236
- defaultMessage: "Pick one component"
3237
- }) }) }),
3238
- /* @__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(
3239
- ComponentCategory,
3240
- {
3241
- category,
3242
- components,
3243
- onAddComponent: handleAddComponentToDz,
3244
- variant: index2 % 2 === 1 ? "primary" : "secondary"
3245
- },
3246
- category
3247
- )) }) })
3248
- ]
3249
- }
3250
- );
3195
+ const level = Relations.useComponent("DynamicZone", (state) => state.level);
3196
+ const ariaDescriptionId = React__namespace.useId();
3197
+ return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
3198
+ dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
3199
+ /* @__PURE__ */ jsxRuntime.jsx(
3200
+ DynamicZoneLabel,
3201
+ {
3202
+ hint,
3203
+ label,
3204
+ labelAction,
3205
+ name: name2,
3206
+ numberOfComponents: dynamicDisplayedComponentsLength,
3207
+ required
3208
+ }
3209
+ ),
3210
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
3211
+ id: index.getTranslation("dnd.instructions"),
3212
+ defaultMessage: `Press spacebar to grab and re-order`
3213
+ }) }),
3214
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
3215
+ /* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
3216
+ Relations.ComponentProvider,
3217
+ {
3218
+ level: level + 1,
3219
+ uid: field.__component,
3220
+ id: field.id,
3221
+ type: "dynamiczone",
3222
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3223
+ DynamicComponent,
3224
+ {
3225
+ disabled,
3226
+ name: name2,
3227
+ index: index2,
3228
+ componentUid: field.__component,
3229
+ onMoveComponent: handleMoveComponent,
3230
+ onRemoveComponentClick: handleRemoveComponent(name2, index2),
3231
+ onCancel: handleCancel,
3232
+ onDropItem: handleDropItem,
3233
+ onGrabItem: handleGrabItem,
3234
+ onAddComponent: handleAddComponent,
3235
+ dynamicComponentsByCategory,
3236
+ children
3237
+ }
3238
+ )
3239
+ },
3240
+ field.__temp_key__
3241
+ )) })
3242
+ ] }),
3243
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
3244
+ AddComponentButton,
3245
+ {
3246
+ hasError,
3247
+ isDisabled: disabled,
3248
+ isOpen: addComponentIsOpen,
3249
+ onClick: handleClickOpenPicker,
3250
+ children: renderButtonLabel()
3251
+ }
3252
+ ) }),
3253
+ /* @__PURE__ */ jsxRuntime.jsx(
3254
+ ComponentPicker,
3255
+ {
3256
+ dynamicComponentsByCategory,
3257
+ isOpen: addComponentIsOpen,
3258
+ onClickAddComponent: handleAddComponent
3259
+ }
3260
+ )
3261
+ ] }) });
3251
3262
  };
3252
3263
  const NotAllowedInput = ({ hint, label, required, name: name2 }) => {
3253
3264
  const { formatMessage } = reactIntl.useIntl();
@@ -3270,18 +3281,6 @@ const NotAllowedInput = ({ hint, label, required, name: name2 }) => {
3270
3281
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
3271
3282
  ] });
3272
3283
  };
3273
- function useDebounce(value, delay) {
3274
- const [debouncedValue, setDebouncedValue] = React.useState(value);
3275
- React.useEffect(() => {
3276
- const handler = setTimeout(() => {
3277
- setDebouncedValue(value);
3278
- }, delay);
3279
- return () => {
3280
- clearTimeout(handler);
3281
- };
3282
- }, [value, delay]);
3283
- return debouncedValue;
3284
- }
3285
3284
  const uidApi = index.contentManagerApi.injectEndpoints({
3286
3285
  endpoints: (builder) => ({
3287
3286
  getDefaultUID: builder.query({
@@ -3316,7 +3315,10 @@ const uidApi = index.contentManagerApi.injectEndpoints({
3316
3315
  config: {
3317
3316
  params
3318
3317
  }
3319
- })
3318
+ }),
3319
+ providesTags: (_res, _error, params) => [
3320
+ { type: "UidAvailability", id: params.contentTypeUID }
3321
+ ]
3320
3322
  })
3321
3323
  })
3322
3324
  });
@@ -3328,8 +3330,10 @@ const UIDInput = React__namespace.forwardRef(
3328
3330
  const allFormValues = strapiAdmin.useForm("InputUID", (form) => form.values);
3329
3331
  const [availability, setAvailability] = React__namespace.useState();
3330
3332
  const [showRegenerate, setShowRegenerate] = React__namespace.useState(false);
3333
+ const isCloning = reactRouterDom.useMatch(index.CLONE_PATH) !== null;
3331
3334
  const field = strapiAdmin.useField(name2);
3332
- const debouncedValue = useDebounce(field.value, 300);
3335
+ const debouncedValue = relations.useDebounce(field.value, 300);
3336
+ const hasChanged = debouncedValue !== field.initialValue;
3333
3337
  const { toggleNotification } = strapiAdmin.useNotification();
3334
3338
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
3335
3339
  const { formatMessage } = reactIntl.useIntl();
@@ -3405,8 +3409,9 @@ const UIDInput = React__namespace.forwardRef(
3405
3409
  params
3406
3410
  },
3407
3411
  {
3412
+ // Don't check availability if the value is empty or wasn't changed
3408
3413
  skip: !Boolean(
3409
- debouncedValue !== field.initialValue && debouncedValue && UID_REGEX.test(debouncedValue.trim())
3414
+ (hasChanged || isCloning) && debouncedValue && UID_REGEX.test(debouncedValue.trim())
3410
3415
  )
3411
3416
  }
3412
3417
  );
@@ -3435,6 +3440,7 @@ const UIDInput = React__namespace.forwardRef(
3435
3440
  const isLoading = isGeneratingDefaultUID || isGeneratingUID || isCheckingAvailability;
3436
3441
  const fieldRef = strapiAdmin.useFocusInputField(name2);
3437
3442
  const composedRefs = designSystem.useComposedRefs(ref, fieldRef);
3443
+ const shouldShowAvailability = (hasChanged || isCloning) && debouncedValue != null && availability && !showRegenerate;
3438
3444
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { hint, name: name2, error: field.error, required, children: [
3439
3445
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { action: labelAction, children: label }),
3440
3446
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -3443,7 +3449,7 @@ const UIDInput = React__namespace.forwardRef(
3443
3449
  ref: composedRefs,
3444
3450
  disabled: props.disabled,
3445
3451
  endAction: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { position: "relative", gap: 1, children: [
3446
- availability && !showRegenerate && /* @__PURE__ */ jsxRuntime.jsxs(
3452
+ shouldShowAvailability && /* @__PURE__ */ jsxRuntime.jsxs(
3447
3453
  TextValidation,
3448
3454
  {
3449
3455
  alignItems: "center",
@@ -3732,8 +3738,7 @@ const Wrapper = styledComponents.styled.div`
3732
3738
  `;
3733
3739
  var listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/, emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/, unorderedListRE = /[*+-]\s/;
3734
3740
  function newlineAndIndentContinueMarkdownList(cm) {
3735
- if (cm.getOption("disableInput"))
3736
- return CodeMirror__default.default.Pass;
3741
+ if (cm.getOption("disableInput")) return CodeMirror__default.default.Pass;
3737
3742
  var ranges = cm.listSelections(), replacements = [];
3738
3743
  for (var i = 0; i < ranges.length; i++) {
3739
3744
  var pos = ranges[i].head;
@@ -3767,8 +3772,7 @@ function newlineAndIndentContinueMarkdownList(cm) {
3767
3772
  var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0);
3768
3773
  var bullet = numbered ? parseInt(match[3], 10) + 1 + match[4] : match[2].replace("x", " ");
3769
3774
  replacements[i] = "\n" + indent + bullet + after;
3770
- if (numbered)
3771
- incrementRemainingMarkdownListNumbers(cm, pos);
3775
+ if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);
3772
3776
  }
3773
3777
  }
3774
3778
  cm.replaceSelections(replacements);
@@ -3786,10 +3790,8 @@ function incrementRemainingMarkdownListNumbers(cm, pos) {
3786
3790
  var newNumber = parseInt(startItem[3], 10) + lookAhead - skipCount;
3787
3791
  var nextNumber = parseInt(nextItem[3], 10), itemNumber = nextNumber;
3788
3792
  if (startIndent === nextIndent && !isNaN(nextNumber)) {
3789
- if (newNumber === nextNumber)
3790
- itemNumber = nextNumber + 1;
3791
- if (newNumber > nextNumber)
3792
- itemNumber = newNumber + 1;
3793
+ if (newNumber === nextNumber) itemNumber = nextNumber + 1;
3794
+ if (newNumber > nextNumber) itemNumber = newNumber + 1;
3793
3795
  cm.replaceRange(
3794
3796
  nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),
3795
3797
  {
@@ -3802,10 +3804,8 @@ function incrementRemainingMarkdownListNumbers(cm, pos) {
3802
3804
  }
3803
3805
  );
3804
3806
  } else {
3805
- if (startIndent.length > nextIndent.length)
3806
- return;
3807
- if (startIndent.length < nextIndent.length && lookAhead === 1)
3808
- return;
3807
+ if (startIndent.length > nextIndent.length) return;
3808
+ if (startIndent.length < nextIndent.length && lookAhead === 1) return;
3809
3809
  skipCount += 1;
3810
3810
  }
3811
3811
  }
@@ -4277,7 +4277,7 @@ const EditorLayout = ({
4277
4277
  justifyContent: "flex-end",
4278
4278
  shrink: 0,
4279
4279
  width: "100%",
4280
- children: /* @__PURE__ */ jsxRuntime.jsxs(ExpandButton$1, { onClick: onCollapse, children: [
4280
+ children: /* @__PURE__ */ jsxRuntime.jsxs(ExpandButton$1, { onClick: onCollapse, variant: "tertiary", size: "M", children: [
4281
4281
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
4282
4282
  id: "components.Wysiwyg.collapse",
4283
4283
  defaultMessage: "Collapse"
@@ -4295,12 +4295,14 @@ const EditorLayout = ({
4295
4295
  ) }) });
4296
4296
  }
4297
4297
  return /* @__PURE__ */ jsxRuntime.jsx(
4298
- designSystem.Box,
4298
+ designSystem.Flex,
4299
4299
  {
4300
4300
  borderColor: error ? "danger600" : "neutral200",
4301
4301
  borderStyle: "solid",
4302
4302
  borderWidth: "1px",
4303
4303
  hasRadius: true,
4304
+ direction: "column",
4305
+ alignItems: "stretch",
4304
4306
  children
4305
4307
  }
4306
4308
  );
@@ -4311,11 +4313,19 @@ const ExpandWrapper = styledComponents.styled(designSystem.Flex)`
4311
4313
  const BoxWithBorder = styledComponents.styled(designSystem.Box)`
4312
4314
  border-right: 1px solid ${({ theme }) => theme.colors.neutral200};
4313
4315
  `;
4314
- const ExpandButton$1 = styledComponents.styled(designSystem.BaseButton)`
4316
+ const ExpandButton$1 = styledComponents.styled(designSystem.Button)`
4315
4317
  background-color: transparent;
4316
4318
  border: none;
4317
4319
  align-items: center;
4318
4320
 
4321
+ & > span {
4322
+ display: flex;
4323
+ justify-content: space-between;
4324
+ align-items: center;
4325
+ width: 100%;
4326
+ font-weight: ${({ theme }) => theme.fontWeights.regular};
4327
+ }
4328
+
4319
4329
  svg {
4320
4330
  margin-left: ${({ theme }) => `${theme.spaces[2]}`};
4321
4331
 
@@ -4582,40 +4592,28 @@ const quoteAndCodeHandler = (editor, markdownType) => {
4582
4592
  insertWithoutTextToEdit(editor, markdownType, line, contentLength);
4583
4593
  }
4584
4594
  };
4585
- const CustomIconButton = styledComponents.styled(designSystem.IconButton)`
4586
- padding: ${({ theme }) => theme.spaces[2]};
4587
-
4588
- svg {
4589
- width: 1.8rem;
4590
- height: 1.8rem;
4591
- }
4592
- `;
4593
- const CustomLinkIconButton = styledComponents.styled(CustomIconButton)`
4594
- svg {
4595
- width: 0.8rem;
4596
- height: 0.8rem;
4597
- }
4598
- `;
4599
4595
  const MainButtons = styledComponents.styled(designSystem.IconButtonGroup)`
4600
4596
  margin-left: ${({ theme }) => theme.spaces[4]};
4601
4597
  `;
4602
4598
  const MoreButton = styledComponents.styled(designSystem.IconButton)`
4603
4599
  margin: ${({ theme }) => `0 ${theme.spaces[2]}`};
4604
- padding: ${({ theme }) => theme.spaces[2]};
4605
-
4606
- svg {
4607
- width: 1.8rem;
4608
- height: 1.8rem;
4609
- }
4610
4600
  `;
4611
4601
  const IconButtonGroupMargin = styledComponents.styled(designSystem.IconButtonGroup)`
4612
4602
  margin-right: ${({ theme }) => `${theme.spaces[2]}`};
4613
4603
  `;
4614
- const ExpandButton = styledComponents.styled(designSystem.BaseButton)`
4604
+ const ExpandButton = styledComponents.styled(designSystem.Button)`
4615
4605
  background-color: transparent;
4616
4606
  border: none;
4617
4607
  align-items: center;
4618
4608
 
4609
+ & > span {
4610
+ display: flex;
4611
+ justify-content: space-between;
4612
+ align-items: center;
4613
+ width: 100%;
4614
+ font-weight: ${({ theme }) => theme.fontWeights.regular};
4615
+ }
4616
+
4619
4617
  svg {
4620
4618
  margin-left: ${({ theme }) => `${theme.spaces[2]}`};
4621
4619
  path {
@@ -4627,7 +4625,7 @@ const ExpandButton = styledComponents.styled(designSystem.BaseButton)`
4627
4625
  `;
4628
4626
  const WysiwygFooter = ({ onToggleExpand }) => {
4629
4627
  const { formatMessage } = reactIntl.useIntl();
4630
- 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: [
4628
+ 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: [
4631
4629
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: formatMessage({
4632
4630
  id: "components.WysiwygBottomControls.fullscreen",
4633
4631
  defaultMessage: "Expand"
@@ -4664,18 +4662,27 @@ const WysiwygNav = ({
4664
4662
  borderRadius: `0.4rem 0.4rem 0 0`,
4665
4663
  children: [
4666
4664
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
4667
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.SingleSelect, { disabled: true, placeholder: selectPlaceholder, "aria-label": selectPlaceholder, children: [
4668
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h1", children: "h1" }),
4669
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h2", children: "h2" }),
4670
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h3", children: "h3" }),
4671
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h4", children: "h4" }),
4672
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h5", children: "h5" }),
4673
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h6", children: "h6" })
4674
- ] }) }),
4665
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsxs(
4666
+ designSystem.SingleSelect,
4667
+ {
4668
+ disabled: true,
4669
+ placeholder: selectPlaceholder,
4670
+ "aria-label": selectPlaceholder,
4671
+ size: "S",
4672
+ children: [
4673
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h1", children: "h1" }),
4674
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h2", children: "h2" }),
4675
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h3", children: "h3" }),
4676
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h4", children: "h4" }),
4677
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h5", children: "h5" }),
4678
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h6", children: "h6" })
4679
+ ]
4680
+ }
4681
+ ) }),
4675
4682
  /* @__PURE__ */ jsxRuntime.jsxs(MainButtons, { children: [
4676
- /* @__PURE__ */ jsxRuntime.jsx(CustomIconButton, { disabled: true, label: "Bold", name: "Bold", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {}) }),
4677
- /* @__PURE__ */ jsxRuntime.jsx(CustomIconButton, { disabled: true, label: "Italic", name: "Italic", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Italic, {}) }),
4678
- /* @__PURE__ */ jsxRuntime.jsx(CustomIconButton, { disabled: true, label: "Underline", name: "Underline", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Underline, {}) })
4683
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { disabled: true, label: "Bold", name: "Bold", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {}) }),
4684
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { disabled: true, label: "Italic", name: "Italic", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Italic, {}) }),
4685
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { disabled: true, label: "Underline", name: "Underline", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Underline, {}) })
4679
4686
  ] }),
4680
4687
  /* @__PURE__ */ jsxRuntime.jsx(MoreButton, { disabled: true, label: "More", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, {}) })
4681
4688
  ] }),
@@ -4702,6 +4709,7 @@ const WysiwygNav = ({
4702
4709
  placeholder: selectPlaceholder,
4703
4710
  "aria-label": selectPlaceholder,
4704
4711
  onChange: (value) => onActionClick(value, editorRef),
4712
+ size: "S",
4705
4713
  children: [
4706
4714
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h1", children: "h1" }),
4707
4715
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "h2", children: "h2" }),
@@ -4713,17 +4721,9 @@ const WysiwygNav = ({
4713
4721
  }
4714
4722
  ) }),
4715
4723
  /* @__PURE__ */ jsxRuntime.jsxs(MainButtons, { children: [
4724
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { onClick: () => onActionClick("Bold", editorRef), label: "Bold", name: "Bold", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {}) }),
4716
4725
  /* @__PURE__ */ jsxRuntime.jsx(
4717
- CustomIconButton,
4718
- {
4719
- onClick: () => onActionClick("Bold", editorRef),
4720
- label: "Bold",
4721
- name: "Bold",
4722
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Bold, {})
4723
- }
4724
- ),
4725
- /* @__PURE__ */ jsxRuntime.jsx(
4726
- CustomIconButton,
4726
+ designSystem.IconButton,
4727
4727
  {
4728
4728
  onClick: () => onActionClick("Italic", editorRef),
4729
4729
  label: "Italic",
@@ -4732,7 +4732,7 @@ const WysiwygNav = ({
4732
4732
  }
4733
4733
  ),
4734
4734
  /* @__PURE__ */ jsxRuntime.jsx(
4735
- CustomIconButton,
4735
+ designSystem.IconButton,
4736
4736
  {
4737
4737
  onClick: () => onActionClick("Underline", editorRef),
4738
4738
  label: "Underline",
@@ -4746,7 +4746,7 @@ const WysiwygNav = ({
4746
4746
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Content, { sideOffset: 12, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 2, children: [
4747
4747
  /* @__PURE__ */ jsxRuntime.jsxs(IconButtonGroupMargin, { children: [
4748
4748
  /* @__PURE__ */ jsxRuntime.jsx(
4749
- CustomIconButton,
4749
+ designSystem.IconButton,
4750
4750
  {
4751
4751
  onClick: () => onActionClick("Strikethrough", editorRef, handleTogglePopover),
4752
4752
  label: "Strikethrough",
@@ -4755,7 +4755,7 @@ const WysiwygNav = ({
4755
4755
  }
4756
4756
  ),
4757
4757
  /* @__PURE__ */ jsxRuntime.jsx(
4758
- CustomIconButton,
4758
+ designSystem.IconButton,
4759
4759
  {
4760
4760
  onClick: () => onActionClick("BulletList", editorRef, handleTogglePopover),
4761
4761
  label: "BulletList",
@@ -4764,7 +4764,7 @@ const WysiwygNav = ({
4764
4764
  }
4765
4765
  ),
4766
4766
  /* @__PURE__ */ jsxRuntime.jsx(
4767
- CustomIconButton,
4767
+ designSystem.IconButton,
4768
4768
  {
4769
4769
  onClick: () => onActionClick("NumberList", editorRef, handleTogglePopover),
4770
4770
  label: "NumberList",
@@ -4775,7 +4775,7 @@ const WysiwygNav = ({
4775
4775
  ] }),
4776
4776
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.IconButtonGroup, { children: [
4777
4777
  /* @__PURE__ */ jsxRuntime.jsx(
4778
- CustomIconButton,
4778
+ designSystem.IconButton,
4779
4779
  {
4780
4780
  onClick: () => onActionClick("Code", editorRef, handleTogglePopover),
4781
4781
  label: "Code",
@@ -4784,7 +4784,7 @@ const WysiwygNav = ({
4784
4784
  }
4785
4785
  ),
4786
4786
  /* @__PURE__ */ jsxRuntime.jsx(
4787
- CustomIconButton,
4787
+ designSystem.IconButton,
4788
4788
  {
4789
4789
  onClick: () => {
4790
4790
  handleTogglePopover();
@@ -4796,7 +4796,7 @@ const WysiwygNav = ({
4796
4796
  }
4797
4797
  ),
4798
4798
  /* @__PURE__ */ jsxRuntime.jsx(
4799
- CustomLinkIconButton,
4799
+ designSystem.IconButton,
4800
4800
  {
4801
4801
  onClick: () => onActionClick("Link", editorRef, handleTogglePopover),
4802
4802
  label: "Link",
@@ -4805,7 +4805,7 @@ const WysiwygNav = ({
4805
4805
  }
4806
4806
  ),
4807
4807
  /* @__PURE__ */ jsxRuntime.jsx(
4808
- CustomIconButton,
4808
+ designSystem.IconButton,
4809
4809
  {
4810
4810
  onClick: () => onActionClick("Quote", editorRef, handleTogglePopover),
4811
4811
  label: "Quote",
@@ -4942,15 +4942,19 @@ const Wysiwyg = React__namespace.forwardRef(
4942
4942
  );
4943
4943
  const MemoizedWysiwyg = React__namespace.memo(Wysiwyg);
4944
4944
  const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4945
- const { id } = index.useDoc();
4945
+ const { id, document: document2, collectionType } = index.useDoc();
4946
4946
  const isFormDisabled = strapiAdmin.useForm("InputRenderer", (state) => state.disabled);
4947
4947
  const isInDynamicZone = useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
4948
4948
  const canCreateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
4949
4949
  const canReadFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
4950
4950
  const canUpdateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
4951
4951
  const canUserAction = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUserAction);
4952
- const editableFields = id ? canUpdateFields : canCreateFields;
4953
- const readableFields = id ? canReadFields : canCreateFields;
4952
+ let idToCheck = id;
4953
+ if (collectionType === index.SINGLE_TYPES) {
4954
+ idToCheck = document2?.documentId;
4955
+ }
4956
+ const editableFields = idToCheck ? canUpdateFields : canCreateFields;
4957
+ const readableFields = idToCheck ? canReadFields : canCreateFields;
4954
4958
  const canUserReadField = canUserAction(props.name, readableFields, props.type);
4955
4959
  const canUserEditField = canUserAction(props.name, editableFields, props.type);
4956
4960
  const fields = strapiAdmin.useStrapiApp("InputRenderer", (app) => app.fields);
@@ -4961,6 +4965,7 @@ const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4961
4965
  const {
4962
4966
  edit: { components }
4963
4967
  } = index.useDocLayout();
4968
+ const field = strapiAdmin.useField(props.name);
4964
4969
  if (!visible) {
4965
4970
  return null;
4966
4971
  }
@@ -4971,553 +4976,643 @@ const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4971
4976
  if (attributeHasCustomFieldProperty(props.attribute)) {
4972
4977
  const CustomInput = lazyComponentStore[props.attribute.customField];
4973
4978
  if (CustomInput) {
4974
- return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4979
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, ...field, hint, disabled: fieldIsDisabled });
4980
+ }
4981
+ return /* @__PURE__ */ jsxRuntime.jsx(
4982
+ strapiAdmin.InputRenderer,
4983
+ {
4984
+ ...props,
4985
+ hint,
4986
+ type: props.attribute.customField,
4987
+ disabled: fieldIsDisabled
4988
+ }
4989
+ );
4990
+ }
4991
+ const addedInputTypes = Object.keys(fields);
4992
+ if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
4993
+ const CustomInput = fields[props.type];
4994
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4995
+ }
4996
+ switch (props.type) {
4997
+ case "blocks":
4998
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
4999
+ case "component":
5000
+ return /* @__PURE__ */ jsxRuntime.jsx(
5001
+ MemoizedComponentInput,
5002
+ {
5003
+ ...props,
5004
+ hint,
5005
+ layout: components[props.attribute.component].layout,
5006
+ disabled: fieldIsDisabled,
5007
+ children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...inputProps })
5008
+ }
5009
+ );
5010
+ case "dynamiczone":
5011
+ return /* @__PURE__ */ jsxRuntime.jsx(DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
5012
+ case "relation":
5013
+ return /* @__PURE__ */ jsxRuntime.jsx(Relations.MemoizedRelationsField, { ...props, hint, disabled: fieldIsDisabled });
5014
+ case "richtext":
5015
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5016
+ case "uid":
5017
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5018
+ case "enumeration":
5019
+ return /* @__PURE__ */ jsxRuntime.jsx(
5020
+ strapiAdmin.InputRenderer,
5021
+ {
5022
+ ...props,
5023
+ hint,
5024
+ options: props.attribute.enum.map((value) => ({ value })),
5025
+ type: props.customField ? "custom-field" : props.type,
5026
+ disabled: fieldIsDisabled
5027
+ }
5028
+ );
5029
+ default:
5030
+ const { unique: _unique, mainField: _mainField, ...restProps } = props;
5031
+ return /* @__PURE__ */ jsxRuntime.jsx(
5032
+ strapiAdmin.InputRenderer,
5033
+ {
5034
+ ...restProps,
5035
+ hint,
5036
+ type: props.customField ? "custom-field" : props.type,
5037
+ disabled: fieldIsDisabled
5038
+ }
5039
+ );
5040
+ }
5041
+ };
5042
+ const attributeHasCustomFieldProperty = (attribute) => "customField" in attribute && typeof attribute.customField === "string";
5043
+ const useFieldHint = (hint = void 0, attribute) => {
5044
+ const { formatMessage } = reactIntl.useIntl();
5045
+ const { maximum, minimum } = getMinMax(attribute);
5046
+ if (!maximum && !minimum) {
5047
+ return hint;
5048
+ }
5049
+ const units = !["biginteger", "integer", "number", "dynamiczone", "component"].includes(
5050
+ attribute.type
5051
+ ) ? formatMessage(
5052
+ {
5053
+ id: "content-manager.form.Input.hint.character.unit",
5054
+ defaultMessage: "{maxValue, plural, one { character} other { characters}}"
5055
+ },
5056
+ {
5057
+ maxValue: Math.max(minimum || 0, maximum || 0)
5058
+ }
5059
+ ) : null;
5060
+ const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
5061
+ return formatMessage(
5062
+ {
5063
+ id: "content-manager.form.Input.hint.text",
5064
+ defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
5065
+ },
5066
+ {
5067
+ min: minimum,
5068
+ max: maximum,
5069
+ description: hint,
5070
+ unit: units,
5071
+ divider: hasMinAndMax ? formatMessage({
5072
+ id: "content-manager.form.Input.hint.minMaxDivider",
5073
+ defaultMessage: " / "
5074
+ }) : null,
5075
+ br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
5076
+ }
5077
+ );
5078
+ };
5079
+ const getMinMax = (attribute) => {
5080
+ if ("min" in attribute || "max" in attribute) {
5081
+ return {
5082
+ maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
5083
+ minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
5084
+ };
5085
+ } else if ("maxLength" in attribute || "minLength" in attribute) {
5086
+ return { maximum: attribute.maxLength, minimum: attribute.minLength };
5087
+ } else {
5088
+ return { maximum: void 0, minimum: void 0 };
5089
+ }
5090
+ };
5091
+ const MemoizedInputRenderer = React.memo(InputRenderer);
5092
+ const RESPONSIVE_CONTAINER_BREAKPOINTS = {
5093
+ sm: "27.5rem"
5094
+ // 440px
5095
+ };
5096
+ const ResponsiveGridRoot = styledComponents.styled(designSystem.Grid.Root)`
5097
+ container-type: inline-size;
5098
+ `;
5099
+ const ResponsiveGridItem = styledComponents.styled(designSystem.Grid.Item)`
5100
+ grid-column: span 12;
5101
+
5102
+ @container (min-width: ${RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
5103
+ ${({ col }) => col && `grid-column: span ${col};`}
5104
+ }
5105
+ `;
5106
+ const FormLayout = ({ layout }) => {
5107
+ const { formatMessage } = reactIntl.useIntl();
5108
+ const { model } = index.useDoc();
5109
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((panel, index2) => {
5110
+ if (panel.some((row) => row.some((field) => field.type === "dynamiczone"))) {
5111
+ const [row] = panel;
5112
+ const [field] = row;
5113
+ const fieldWithTranslatedLabel = {
5114
+ ...field,
5115
+ label: formatMessage({
5116
+ id: `content-manager.content-types.${model}.${field.name}`,
5117
+ defaultMessage: field.label
5118
+ })
5119
+ };
5120
+ 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);
5121
+ }
5122
+ return /* @__PURE__ */ jsxRuntime.jsx(
5123
+ designSystem.Box,
5124
+ {
5125
+ hasRadius: true,
5126
+ background: "neutral0",
5127
+ shadow: "tableShadow",
5128
+ paddingLeft: 6,
5129
+ paddingRight: 6,
5130
+ paddingTop: 6,
5131
+ paddingBottom: 6,
5132
+ borderColor: "neutral150",
5133
+ 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 }) => {
5134
+ const fieldWithTranslatedLabel = {
5135
+ ...field,
5136
+ label: formatMessage({
5137
+ id: `content-manager.content-types.${model}.${field.name}`,
5138
+ defaultMessage: field.label
5139
+ })
5140
+ };
5141
+ return /* @__PURE__ */ jsxRuntime.jsx(
5142
+ ResponsiveGridItem,
5143
+ {
5144
+ col: size,
5145
+ s: 12,
5146
+ xs: 12,
5147
+ direction: "column",
5148
+ alignItems: "stretch",
5149
+ children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel })
5150
+ },
5151
+ field.name
5152
+ );
5153
+ }) }, gridRowIndex)) })
5154
+ },
5155
+ index2
5156
+ );
5157
+ }) });
5158
+ };
5159
+ const NonRepeatableComponent = ({
5160
+ attribute,
5161
+ name: name2,
5162
+ children,
5163
+ layout
5164
+ }) => {
5165
+ const { formatMessage } = reactIntl.useIntl();
5166
+ const { value } = strapiAdmin.useField(name2);
5167
+ const level = Relations.useComponent("NonRepeatableComponent", (state) => state.level);
5168
+ const isNested = level > 0;
5169
+ return /* @__PURE__ */ jsxRuntime.jsx(Relations.ComponentProvider, { id: value?.id, uid: attribute.component, level: level + 1, type: "component", children: /* @__PURE__ */ jsxRuntime.jsx(
5170
+ designSystem.Box,
5171
+ {
5172
+ background: "neutral100",
5173
+ paddingLeft: 6,
5174
+ paddingRight: 6,
5175
+ paddingTop: 6,
5176
+ paddingBottom: 6,
5177
+ hasRadius: isNested,
5178
+ borderColor: isNested ? "neutral200" : void 0,
5179
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index2) => {
5180
+ return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5181
+ const completeFieldName = `${name2}.${field.name}`;
5182
+ const translatedLabel = formatMessage({
5183
+ id: `content-manager.components.${attribute.component}.${field.name}`,
5184
+ defaultMessage: field.label
5185
+ });
5186
+ return /* @__PURE__ */ jsxRuntime.jsx(
5187
+ ResponsiveGridItem,
5188
+ {
5189
+ col: size,
5190
+ s: 12,
5191
+ xs: 12,
5192
+ direction: "column",
5193
+ alignItems: "stretch",
5194
+ children: children({ ...field, label: translatedLabel, name: completeFieldName })
5195
+ },
5196
+ completeFieldName
5197
+ );
5198
+ }) }, index2);
5199
+ }) })
5200
+ }
5201
+ ) });
5202
+ };
5203
+ const RepeatableComponent = ({
5204
+ attribute,
5205
+ disabled,
5206
+ name: name2,
5207
+ mainField,
5208
+ children,
5209
+ layout
5210
+ }) => {
5211
+ const { toggleNotification } = strapiAdmin.useNotification();
5212
+ const { formatMessage } = reactIntl.useIntl();
5213
+ const { search: searchString } = reactRouterDom.useLocation();
5214
+ const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
5215
+ const { components } = index.useDoc();
5216
+ const {
5217
+ value = [],
5218
+ error,
5219
+ rawError
5220
+ } = strapiAdmin.useField(name2);
5221
+ const addFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.addFieldRow);
5222
+ const moveFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.moveFieldRow);
5223
+ const removeFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.removeFieldRow);
5224
+ const { max = Infinity } = attribute;
5225
+ const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
5226
+ const [liveText, setLiveText] = React__namespace.useState("");
5227
+ React__namespace.useEffect(() => {
5228
+ const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;
5229
+ const hasNestedValue = value && Array.isArray(value) && value.length > 0;
5230
+ if (hasNestedErrors && hasNestedValue) {
5231
+ const errorOpenItems = rawError.map((_, idx) => {
5232
+ return value[idx] ? value[idx].__temp_key__ : null;
5233
+ }).filter((value2) => !!value2);
5234
+ if (errorOpenItems && errorOpenItems.length > 0) {
5235
+ setCollapseToOpen((collapseToOpen2) => {
5236
+ if (!errorOpenItems.includes(collapseToOpen2)) {
5237
+ return errorOpenItems[0];
5238
+ }
5239
+ return collapseToOpen2;
5240
+ });
5241
+ }
4975
5242
  }
4976
- return /* @__PURE__ */ jsxRuntime.jsx(
4977
- strapiAdmin.InputRenderer,
4978
- {
4979
- ...props,
4980
- hint,
4981
- type: props.attribute.customField,
4982
- disabled: fieldIsDisabled
5243
+ }, [rawError, value]);
5244
+ const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
5245
+ if (search.has("field")) {
5246
+ const fieldParam = search.get("field");
5247
+ if (!fieldParam) {
5248
+ return void 0;
4983
5249
  }
5250
+ const [, path] = fieldParam.split(`${name2}.`);
5251
+ if (objects.getIn(value, path, void 0) !== void 0) {
5252
+ const [subpath] = path.split(".");
5253
+ return objects.getIn(value, subpath, void 0)?.__temp_key__;
5254
+ }
5255
+ }
5256
+ return void 0;
5257
+ }, [search, name2, value]);
5258
+ const prevValue = usePrev.usePrev(value);
5259
+ React__namespace.useEffect(() => {
5260
+ if (prevValue && prevValue.length < value.length) {
5261
+ setCollapseToOpen(value[value.length - 1].__temp_key__);
5262
+ }
5263
+ }, [value, prevValue]);
5264
+ React__namespace.useEffect(() => {
5265
+ if (typeof componentTmpKeyWithFocussedField === "string") {
5266
+ setCollapseToOpen(componentTmpKeyWithFocussedField);
5267
+ }
5268
+ }, [componentTmpKeyWithFocussedField]);
5269
+ const toggleCollapses = () => {
5270
+ setCollapseToOpen("");
5271
+ };
5272
+ const handleClick = () => {
5273
+ if (value.length < max) {
5274
+ const schema = components[attribute.component];
5275
+ const form = index.createDefaultForm(schema, components);
5276
+ const data = index.transformDocument(schema, components)(form);
5277
+ addFieldRow(name2, data);
5278
+ } else if (value.length >= max) {
5279
+ toggleNotification({
5280
+ type: "info",
5281
+ message: formatMessage({
5282
+ id: index.getTranslation("components.notification.info.maximum-requirement")
5283
+ })
5284
+ });
5285
+ }
5286
+ };
5287
+ const handleMoveComponentField = (newIndex, currentIndex) => {
5288
+ setLiveText(
5289
+ formatMessage(
5290
+ {
5291
+ id: index.getTranslation("dnd.reorder"),
5292
+ defaultMessage: "{item}, moved. New position in list: {position}."
5293
+ },
5294
+ {
5295
+ item: `${name2}.${currentIndex}`,
5296
+ position: getItemPos(newIndex)
5297
+ }
5298
+ )
4984
5299
  );
4985
- }
4986
- const addedInputTypes = Object.keys(fields);
4987
- if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
4988
- const CustomInput = fields[props.type];
4989
- return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4990
- }
4991
- switch (props.type) {
4992
- case "blocks":
4993
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
4994
- case "component":
4995
- return /* @__PURE__ */ jsxRuntime.jsx(
4996
- MemoizedComponentInput,
5300
+ moveFieldRow(name2, currentIndex, newIndex);
5301
+ };
5302
+ const handleValueChange = (key) => {
5303
+ setCollapseToOpen(key);
5304
+ };
5305
+ const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
5306
+ const handleCancel = (index$1) => {
5307
+ setLiveText(
5308
+ formatMessage(
4997
5309
  {
4998
- ...props,
4999
- hint,
5000
- layout: components[props.attribute.component].layout,
5001
- disabled: fieldIsDisabled,
5002
- children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...inputProps })
5310
+ id: index.getTranslation("dnd.cancel-item"),
5311
+ defaultMessage: "{item}, dropped. Re-order cancelled."
5312
+ },
5313
+ {
5314
+ item: `${name2}.${index$1}`
5003
5315
  }
5004
- );
5005
- case "dynamiczone":
5006
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
5007
- case "relation":
5008
- return /* @__PURE__ */ jsxRuntime.jsx(Relations.MemoizedRelationsField, { ...props, hint, disabled: fieldIsDisabled });
5009
- case "richtext":
5010
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5011
- case "uid":
5012
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5013
- case "enumeration":
5014
- return /* @__PURE__ */ jsxRuntime.jsx(
5015
- strapiAdmin.InputRenderer,
5316
+ )
5317
+ );
5318
+ };
5319
+ const handleGrabItem = (index$1) => {
5320
+ setLiveText(
5321
+ formatMessage(
5016
5322
  {
5017
- ...props,
5018
- hint,
5019
- options: props.attribute.enum.map((value) => ({ value })),
5020
- type: props.customField ? "custom-field" : props.type,
5021
- disabled: fieldIsDisabled
5323
+ id: index.getTranslation("dnd.grab-item"),
5324
+ defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
5325
+ },
5326
+ {
5327
+ item: `${name2}.${index$1}`,
5328
+ position: getItemPos(index$1)
5022
5329
  }
5023
- );
5024
- default:
5025
- const { unique: _unique, mainField: _mainField, ...restProps } = props;
5026
- return /* @__PURE__ */ jsxRuntime.jsx(
5027
- strapiAdmin.InputRenderer,
5330
+ )
5331
+ );
5332
+ };
5333
+ const handleDropItem = (index$1) => {
5334
+ setLiveText(
5335
+ formatMessage(
5028
5336
  {
5029
- ...restProps,
5030
- hint,
5031
- type: props.customField ? "custom-field" : props.type,
5032
- disabled: fieldIsDisabled
5337
+ id: index.getTranslation("dnd.drop-item"),
5338
+ defaultMessage: `{item}, dropped. Final position in list: {position}.`
5339
+ },
5340
+ {
5341
+ item: `${name2}.${index$1}`,
5342
+ position: getItemPos(index$1)
5033
5343
  }
5034
- );
5344
+ )
5345
+ );
5346
+ };
5347
+ const ariaDescriptionId = React__namespace.useId();
5348
+ const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
5349
+ if (value.length === 0) {
5350
+ return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
5035
5351
  }
5352
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
5353
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
5354
+ id: index.getTranslation("dnd.instructions"),
5355
+ defaultMessage: `Press spacebar to grab and re-order`
5356
+ }) }),
5357
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
5358
+ /* @__PURE__ */ jsxRuntime.jsxs(
5359
+ AccordionRoot,
5360
+ {
5361
+ $error: error,
5362
+ value: collapseToOpen,
5363
+ onValueChange: handleValueChange,
5364
+ "aria-describedby": ariaDescriptionId,
5365
+ children: [
5366
+ value.map(({ __temp_key__: key, id }, index2) => {
5367
+ const nameWithIndex = `${name2}.${index2}`;
5368
+ return /* @__PURE__ */ jsxRuntime.jsx(
5369
+ Relations.ComponentProvider,
5370
+ {
5371
+ id,
5372
+ uid: attribute.component,
5373
+ level: level + 1,
5374
+ type: "repeatable",
5375
+ children: /* @__PURE__ */ jsxRuntime.jsx(
5376
+ Component,
5377
+ {
5378
+ disabled,
5379
+ name: nameWithIndex,
5380
+ attribute,
5381
+ index: index2,
5382
+ mainField,
5383
+ onMoveItem: handleMoveComponentField,
5384
+ onDeleteComponent: () => {
5385
+ removeFieldRow(name2, index2);
5386
+ toggleCollapses();
5387
+ },
5388
+ toggleCollapses,
5389
+ onCancel: handleCancel,
5390
+ onDropItem: handleDropItem,
5391
+ onGrabItem: handleGrabItem,
5392
+ __temp_key__: key,
5393
+ children: layout.map((row, index22) => {
5394
+ return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5395
+ const completeFieldName = `${nameWithIndex}.${field.name}`;
5396
+ const translatedLabel = formatMessage({
5397
+ id: `content-manager.components.${attribute.component}.${field.name}`,
5398
+ defaultMessage: field.label
5399
+ });
5400
+ return /* @__PURE__ */ jsxRuntime.jsx(
5401
+ ResponsiveGridItem,
5402
+ {
5403
+ col: size,
5404
+ s: 12,
5405
+ xs: 12,
5406
+ direction: "column",
5407
+ alignItems: "stretch",
5408
+ children: children({
5409
+ ...field,
5410
+ label: translatedLabel,
5411
+ name: completeFieldName
5412
+ })
5413
+ },
5414
+ completeFieldName
5415
+ );
5416
+ }) }, index22);
5417
+ })
5418
+ }
5419
+ )
5420
+ },
5421
+ key
5422
+ );
5423
+ }),
5424
+ /* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
5425
+ id: index.getTranslation("containers.EditView.add.new-entry"),
5426
+ defaultMessage: "Add an entry"
5427
+ }) })
5428
+ ]
5429
+ }
5430
+ )
5431
+ ] });
5036
5432
  };
5037
- const attributeHasCustomFieldProperty = (attribute) => "customField" in attribute && typeof attribute.customField === "string";
5038
- const useFieldHint = (hint = void 0, attribute) => {
5039
- const { formatMessage } = reactIntl.useIntl();
5040
- const { maximum, minimum } = getMinMax(attribute);
5041
- if (!maximum && !minimum) {
5042
- return hint;
5043
- }
5044
- const units = !["biginteger", "integer", "number", "dynamiczone", "component"].includes(
5045
- attribute.type
5046
- ) ? formatMessage(
5047
- {
5048
- id: "content-manager.form.Input.hint.character.unit",
5049
- defaultMessage: "{maxValue, plural, one { character} other { characters}}"
5050
- },
5051
- {
5052
- maxValue: Math.max(minimum || 0, maximum || 0)
5053
- }
5054
- ) : null;
5055
- const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
5056
- return formatMessage(
5057
- {
5058
- id: "content-manager.form.Input.hint.text",
5059
- defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
5060
- },
5061
- {
5062
- min: minimum,
5063
- max: maximum,
5064
- description: hint,
5065
- unit: units,
5066
- divider: hasMinAndMax ? formatMessage({
5067
- id: "content-manager.form.Input.hint.minMaxDivider",
5068
- defaultMessage: " / "
5069
- }) : null,
5070
- br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
5433
+ const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
5434
+ border: 1px solid
5435
+ ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
5436
+ `;
5437
+ const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
5438
+ width: 100%;
5439
+ display: flex;
5440
+ justify-content: center;
5441
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
5442
+ padding-inline: ${(props) => props.theme.spaces[6]};
5443
+ padding-block: ${(props) => props.theme.spaces[3]};
5444
+
5445
+ &:not([disabled]) {
5446
+ cursor: pointer;
5447
+
5448
+ &:hover {
5449
+ background-color: ${(props) => props.theme.colors.primary100};
5071
5450
  }
5072
- );
5073
- };
5074
- const getMinMax = (attribute) => {
5075
- if ("min" in attribute || "max" in attribute) {
5076
- return {
5077
- maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
5078
- minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
5079
- };
5080
- } else if ("maxLength" in attribute || "minLength" in attribute) {
5081
- return { maximum: attribute.maxLength, minimum: attribute.minLength };
5082
- } else {
5083
- return { maximum: void 0, minimum: void 0 };
5084
5451
  }
5085
- };
5086
- const MemoizedInputRenderer = React.memo(InputRenderer);
5087
- const DynamicComponent = ({
5088
- componentUid,
5452
+
5453
+ span {
5454
+ font-weight: 600;
5455
+ font-size: 1.4rem;
5456
+ line-height: 2.4rem;
5457
+ }
5458
+
5459
+ @media (prefers-reduced-motion: no-preference) {
5460
+ transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
5461
+ }
5462
+ `;
5463
+ const Component = ({
5089
5464
  disabled,
5090
5465
  index: index$1,
5091
5466
  name: name2,
5092
- onRemoveComponentClick,
5093
- onMoveComponent,
5094
- onGrabItem,
5095
- onDropItem,
5096
- onCancel,
5097
- dynamicComponentsByCategory = {},
5098
- onAddComponent
5467
+ mainField = {
5468
+ name: "id",
5469
+ type: "integer"
5470
+ },
5471
+ children,
5472
+ onDeleteComponent,
5473
+ toggleCollapses,
5474
+ __temp_key__,
5475
+ ...dragProps
5099
5476
  }) => {
5100
5477
  const { formatMessage } = reactIntl.useIntl();
5101
- const formValues = strapiAdmin.useForm("DynamicComponent", (state) => state.values);
5102
- const {
5103
- edit: { components }
5104
- } = index.useDocLayout();
5105
- const title = React__namespace.useMemo(() => {
5106
- const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
5107
- const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
5108
- const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
5109
- const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
5110
- return mainValue;
5111
- }, [componentUid, components, formValues, name2, index$1]);
5112
- const { icon, displayName } = React__namespace.useMemo(() => {
5113
- const [category] = componentUid.split(".");
5114
- const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
5115
- (component) => component.uid === componentUid
5116
- ) ?? { icon: null, displayName: null };
5117
- return { icon: icon2, displayName: displayName2 };
5118
- }, [componentUid, dynamicComponentsByCategory]);
5478
+ const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
5479
+ return objects.getIn(state.values, [...name2.split("."), mainField.name]);
5480
+ });
5481
+ const accordionRef = React__namespace.useRef(null);
5482
+ const componentKey = name2.split(".").slice(0, -1).join(".");
5119
5483
  const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
5120
- type: `${useDragAndDrop.ItemTypes.DYNAMIC_ZONE}_${name2}`,
5484
+ type: `${useDragAndDrop.ItemTypes.COMPONENT}_${componentKey}`,
5121
5485
  index: index$1,
5122
5486
  item: {
5123
5487
  index: index$1,
5124
- displayedValue: `${displayName} ${title}`,
5125
- icon
5488
+ displayedValue: displayValue
5126
5489
  },
5127
- onMoveItem: onMoveComponent,
5128
- onDropItem,
5129
- onGrabItem,
5130
- onCancel
5490
+ onStart() {
5491
+ toggleCollapses();
5492
+ },
5493
+ ...dragProps
5131
5494
  });
5132
5495
  React__namespace.useEffect(() => {
5133
5496
  dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
5134
5497
  }, [dragPreviewRef, index$1]);
5135
- const composedBoxRefs = designSystem.useComposedRefs(boxRef, dropRef);
5136
- const accordionActions = disabled ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5137
- /* @__PURE__ */ jsxRuntime.jsx(
5138
- designSystem.IconButton,
5139
- {
5140
- borderWidth: 0,
5141
- label: formatMessage(
5498
+ const composedAccordionRefs = designSystem.useComposedRefs(accordionRef, dragRef);
5499
+ const composedBoxRefs = designSystem.useComposedRefs(
5500
+ boxRef,
5501
+ dropRef
5502
+ );
5503
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview, {}) : /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { ref: composedBoxRefs, value: __temp_key__, children: [
5504
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
5505
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: displayValue }),
5506
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Actions, { children: [
5507
+ /* @__PURE__ */ jsxRuntime.jsx(
5508
+ designSystem.IconButton,
5142
5509
  {
5143
- id: index.getTranslation("components.DynamicZone.delete-label"),
5144
- defaultMessage: "Delete {name}"
5145
- },
5146
- { name: title }
5510
+ variant: "ghost",
5511
+ onClick: onDeleteComponent,
5512
+ label: formatMessage({
5513
+ id: index.getTranslation("containers.Edit.delete"),
5514
+ defaultMessage: "Delete"
5515
+ }),
5516
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5517
+ }
5147
5518
  ),
5148
- onClick: onRemoveComponentClick,
5149
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5150
- }
5151
- ),
5152
- /* @__PURE__ */ jsxRuntime.jsx(
5153
- designSystem.IconButton,
5154
- {
5155
- borderWidth: 0,
5156
- onClick: (e) => e.stopPropagation(),
5157
- "data-handler-id": handlerId,
5158
- ref: dragRef,
5159
- label: formatMessage({
5160
- id: index.getTranslation("components.DragHandle-label"),
5161
- defaultMessage: "Drag"
5162
- }),
5163
- onKeyDown: handleKeyDown,
5164
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
5165
- }
5166
- ),
5167
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
5168
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
5169
- /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
5170
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { tag: "span", children: formatMessage({
5171
- id: index.getTranslation("components.DynamicZone.more-actions"),
5172
- defaultMessage: "More actions"
5173
- }) })
5174
- ] }),
5175
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
5176
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
5177
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
5178
- id: index.getTranslation("components.DynamicZone.add-item-above"),
5179
- defaultMessage: "Add component above"
5180
- }) }),
5181
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
5182
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
5183
- components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
5184
- ] }, category)) })
5185
- ] }),
5186
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
5187
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
5188
- id: index.getTranslation("components.DynamicZone.add-item-below"),
5189
- defaultMessage: "Add component below"
5190
- }) }),
5191
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
5192
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
5193
- components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
5194
- ] }, category)) })
5195
- ] })
5196
- ] })
5197
- ] })
5198
- ] });
5199
- const accordionTitle = title ? `${displayName} ${title}` : displayName;
5200
- const accordionValue = React__namespace.useId();
5201
- return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
5202
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
5203
- /* @__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: [
5204
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
5205
5519
  /* @__PURE__ */ jsxRuntime.jsx(
5206
- designSystem.Accordion.Trigger,
5520
+ designSystem.IconButton,
5207
5521
  {
5208
- icon: icon && ComponentIcon.COMPONENT_ICONS[icon] ? ComponentIcon.COMPONENT_ICONS[icon] : ComponentIcon.COMPONENT_ICONS.dashboard,
5209
- children: accordionTitle
5522
+ ref: composedAccordionRefs,
5523
+ variant: "ghost",
5524
+ onClick: (e) => e.stopPropagation(),
5525
+ "data-handler-id": handlerId,
5526
+ label: formatMessage({
5527
+ id: index.getTranslation("components.DragHandle-label"),
5528
+ defaultMessage: "Drag"
5529
+ }),
5530
+ onKeyDown: handleKeyDown,
5531
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
5210
5532
  }
5211
- ),
5212
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
5213
- ] }),
5214
- /* @__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.Root, { gap: 4, children: row.map(({ size, ...field }) => {
5215
- const fieldName = `${name2}.${index$1}.${field.name}`;
5216
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, s: 12, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...field, name: fieldName }) }, fieldName);
5217
- }) }, rowInd)) }) }) })
5218
- ] }) }) })
5219
- ] });
5220
- };
5221
- const StyledBox = styledComponents.styled(designSystem.Box)`
5222
- > div:first-child {
5223
- box-shadow: ${({ theme }) => theme.shadows.tableShadow};
5224
- }
5225
- `;
5226
- const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
5227
- border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
5228
- `;
5229
- const Rectangle = styledComponents.styled(designSystem.Box)`
5230
- width: ${({ theme }) => theme.spaces[2]};
5231
- height: ${({ theme }) => theme.spaces[4]};
5232
- `;
5233
- const Preview = styledComponents.styled.span`
5234
- display: block;
5235
- background-color: ${({ theme }) => theme.colors.primary100};
5236
- outline: 1px dashed ${({ theme }) => theme.colors.primary500};
5237
- outline-offset: -1px;
5238
- padding: ${({ theme }) => theme.spaces[6]};
5239
- `;
5240
- const ComponentContainer = styledComponents.styled(designSystem.Box)`
5241
- list-style: none;
5242
- padding: 0;
5243
- margin: 0;
5244
- `;
5245
- const DynamicZoneLabel = ({
5246
- hint,
5247
- label,
5248
- labelAction,
5249
- name: name2,
5250
- numberOfComponents = 0,
5251
- required
5252
- }) => {
5253
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
5254
- designSystem.Box,
5255
- {
5256
- paddingTop: 3,
5257
- paddingBottom: 3,
5258
- paddingRight: 4,
5259
- paddingLeft: 4,
5260
- borderRadius: "26px",
5261
- background: "neutral0",
5262
- shadow: "filterShadow",
5263
- color: "neutral500",
5264
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
5265
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
5266
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
5267
- label || name2,
5268
- " "
5269
- ] }),
5270
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
5271
- "(",
5272
- numberOfComponents,
5273
- ")"
5274
- ] }),
5275
- required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
5276
- labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
5277
- ] }),
5278
- 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 }) })
5533
+ )
5279
5534
  ] })
5280
- }
5281
- ) });
5535
+ ] }),
5536
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
5537
+ designSystem.Flex,
5538
+ {
5539
+ direction: "column",
5540
+ alignItems: "stretch",
5541
+ background: "neutral100",
5542
+ padding: 6,
5543
+ gap: 6,
5544
+ children
5545
+ }
5546
+ ) })
5547
+ ] }) });
5548
+ };
5549
+ const Preview = () => {
5550
+ return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
5282
5551
  };
5283
- const [DynamicZoneProvider, useDynamicZone] = strapiAdmin.createContext(
5284
- "DynamicZone",
5285
- {
5286
- isInDynamicZone: false
5287
- }
5288
- );
5289
- const DynamicZone = ({
5290
- attribute,
5291
- disabled: disabledProp,
5292
- hint,
5552
+ const StyledSpan = styledComponents.styled(designSystem.Box)`
5553
+ display: block;
5554
+ outline: 1px dashed ${({ theme }) => theme.colors.primary500};
5555
+ outline-offset: -1px;
5556
+ `;
5557
+ const ComponentInput = ({
5293
5558
  label,
5294
- labelAction,
5559
+ required,
5295
5560
  name: name2,
5296
- required = false
5561
+ attribute,
5562
+ disabled,
5563
+ labelAction,
5564
+ ...props
5297
5565
  }) => {
5298
- const { max = Infinity, min = -Infinity } = attribute ?? {};
5299
- const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
5300
- const [liveText, setLiveText] = React__namespace.useState("");
5301
- const { components, isLoading } = index.useDoc();
5302
- const disabled = disabledProp || isLoading;
5303
- const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
5304
- "DynamicZone",
5305
- ({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
5306
- addFieldRow: addFieldRow2,
5307
- removeFieldRow: removeFieldRow2,
5308
- moveFieldRow: moveFieldRow2
5309
- })
5310
- );
5311
- const { value = [], error } = strapiAdmin.useField(name2);
5312
- const dynamicComponentsByCategory = React__namespace.useMemo(() => {
5313
- return attribute.components.reduce((acc, componentUid) => {
5314
- const { category, info } = components[componentUid] ?? { info: {} };
5315
- const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
5316
- if (!acc[category]) {
5317
- acc[category] = [];
5318
- }
5319
- acc[category] = [...acc[category], component];
5320
- return acc;
5321
- }, {});
5322
- }, [attribute.components, components]);
5323
5566
  const { formatMessage } = reactIntl.useIntl();
5324
- const { toggleNotification } = strapiAdmin.useNotification();
5325
- const dynamicDisplayedComponentsLength = value.length;
5326
- const handleAddComponent = (uid, position) => {
5327
- setAddComponentIsOpen(false);
5328
- const schema = components[uid];
5329
- const form = createDefaultForm(schema, components);
5330
- const transformations = pipe__default.default(transformDocument(schema, components), (data2) => ({
5331
- ...data2,
5332
- __component: uid
5333
- }));
5334
- const data = transformations(form);
5335
- addFieldRow(name2, data, position);
5336
- };
5337
- const handleClickOpenPicker = () => {
5338
- if (dynamicDisplayedComponentsLength < max) {
5339
- setAddComponentIsOpen((prev) => !prev);
5340
- } else {
5341
- toggleNotification({
5342
- type: "info",
5343
- message: formatMessage({
5344
- id: index.getTranslation("components.notification.info.maximum-requirement")
5345
- })
5346
- });
5347
- }
5348
- };
5349
- const handleMoveComponent = (newIndex, currentIndex) => {
5350
- setLiveText(
5351
- formatMessage(
5352
- {
5353
- id: index.getTranslation("dnd.reorder"),
5354
- defaultMessage: "{item}, moved. New position in list: {position}."
5355
- },
5356
- {
5357
- item: `${name2}.${currentIndex}`,
5358
- position: getItemPos(newIndex)
5359
- }
5360
- )
5361
- );
5362
- moveFieldRow(name2, currentIndex, newIndex);
5363
- };
5364
- const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
5365
- const handleCancel = (index$1) => {
5366
- setLiveText(
5367
- formatMessage(
5368
- {
5369
- id: index.getTranslation("dnd.cancel-item"),
5370
- defaultMessage: "{item}, dropped. Re-order cancelled."
5371
- },
5372
- {
5373
- item: `${name2}.${index$1}`
5374
- }
5375
- )
5376
- );
5377
- };
5378
- const handleGrabItem = (index$1) => {
5379
- setLiveText(
5380
- formatMessage(
5381
- {
5382
- id: index.getTranslation("dnd.grab-item"),
5383
- defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
5384
- },
5385
- {
5386
- item: `${name2}.${index$1}`,
5387
- position: getItemPos(index$1)
5388
- }
5389
- )
5390
- );
5567
+ const field = strapiAdmin.useField(name2);
5568
+ const showResetComponent = !attribute.repeatable && field.value && !disabled;
5569
+ const { components } = index.useDoc();
5570
+ const handleInitialisationClick = () => {
5571
+ const schema = components[attribute.component];
5572
+ const form = index.createDefaultForm(schema, components);
5573
+ const data = index.transformDocument(schema, components)(form);
5574
+ field.onChange(name2, data);
5391
5575
  };
5392
- const handleDropItem = (index$1) => {
5393
- setLiveText(
5394
- formatMessage(
5395
- {
5396
- id: index.getTranslation("dnd.drop-item"),
5397
- defaultMessage: `{item}, dropped. Final position in list: {position}.`
5398
- },
5576
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
5577
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
5578
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
5579
+ label,
5580
+ attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5581
+ " (",
5582
+ Array.isArray(field.value) ? field.value.length : 0,
5583
+ ")"
5584
+ ] })
5585
+ ] }),
5586
+ showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
5587
+ designSystem.IconButton,
5399
5588
  {
5400
- item: `${name2}.${index$1}`,
5401
- position: getItemPos(index$1)
5589
+ label: formatMessage({
5590
+ id: index.getTranslation("components.reset-entry"),
5591
+ defaultMessage: "Reset Entry"
5592
+ }),
5593
+ variant: "ghost",
5594
+ onClick: () => {
5595
+ field.onChange(name2, null);
5596
+ },
5597
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5402
5598
  }
5403
5599
  )
5404
- );
5405
- };
5406
- const handleRemoveComponent = (name22, currentIndex) => () => {
5407
- removeFieldRow(name22, currentIndex);
5408
- };
5409
- const hasError = error !== void 0;
5410
- const renderButtonLabel = () => {
5411
- if (addComponentIsOpen) {
5412
- return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
5413
- }
5414
- if (hasError && dynamicDisplayedComponentsLength > max) {
5415
- return formatMessage(
5416
- {
5417
- id: index.getTranslation(`components.DynamicZone.extra-components`),
5418
- defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
5419
- },
5420
- {
5421
- number: dynamicDisplayedComponentsLength - max
5422
- }
5423
- );
5424
- }
5425
- if (hasError && dynamicDisplayedComponentsLength < min) {
5426
- return formatMessage(
5427
- {
5428
- id: index.getTranslation(`components.DynamicZone.missing-components`),
5429
- defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
5430
- },
5431
- { number: min - dynamicDisplayedComponentsLength }
5432
- );
5433
- }
5434
- return formatMessage(
5435
- {
5436
- id: index.getTranslation("components.DynamicZone.add-component"),
5437
- defaultMessage: "Add a component to {componentName}"
5438
- },
5439
- { componentName: label || name2 }
5440
- );
5441
- };
5442
- const level = Relations.useComponent("DynamicZone", (state) => state.level);
5443
- const ariaDescriptionId = React__namespace.useId();
5444
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
5445
- dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
5446
- /* @__PURE__ */ jsxRuntime.jsx(
5447
- DynamicZoneLabel,
5448
- {
5449
- hint,
5450
- label,
5451
- labelAction,
5452
- name: name2,
5453
- numberOfComponents: dynamicDisplayedComponentsLength,
5454
- required
5455
- }
5456
- ),
5457
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
5458
- id: index.getTranslation("dnd.instructions"),
5459
- defaultMessage: `Press spacebar to grab and re-order`
5460
- }) }),
5461
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
5462
- /* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
5463
- Relations.ComponentProvider,
5464
- {
5465
- level: level + 1,
5466
- uid: field.__component,
5467
- id: field.id,
5468
- type: "dynamiczone",
5469
- children: /* @__PURE__ */ jsxRuntime.jsx(
5470
- DynamicComponent,
5471
- {
5472
- disabled,
5473
- name: name2,
5474
- index: index2,
5475
- componentUid: field.__component,
5476
- onMoveComponent: handleMoveComponent,
5477
- onRemoveComponentClick: handleRemoveComponent(name2, index2),
5478
- onCancel: handleCancel,
5479
- onDropItem: handleDropItem,
5480
- onGrabItem: handleGrabItem,
5481
- onAddComponent: handleAddComponent,
5482
- dynamicComponentsByCategory
5483
- }
5484
- )
5485
- },
5486
- field.__temp_key__
5487
- )) })
5488
5600
  ] }),
5489
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
5490
- AddComponentButton,
5491
- {
5492
- hasError,
5493
- isDisabled: disabled,
5494
- isOpen: addComponentIsOpen,
5495
- onClick: handleClickOpenPicker,
5496
- children: renderButtonLabel()
5497
- }
5498
- ) }),
5499
- /* @__PURE__ */ jsxRuntime.jsx(
5500
- ComponentPicker,
5501
- {
5502
- dynamicComponentsByCategory,
5503
- isOpen: addComponentIsOpen,
5504
- onClickAddComponent: handleAddComponent
5505
- }
5506
- )
5507
- ] }) });
5601
+ !attribute.repeatable && !field.value && /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleInitialisationClick }),
5602
+ !attribute.repeatable && field.value ? /* @__PURE__ */ jsxRuntime.jsx(NonRepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }) : null,
5603
+ attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }),
5604
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
5605
+ ] });
5508
5606
  };
5607
+ const MemoizedComponentInput = React__namespace.memo(ComponentInput);
5509
5608
  exports.DynamicZone = DynamicZone;
5609
+ exports.FormLayout = FormLayout;
5510
5610
  exports.MemoizedBlocksInput = MemoizedBlocksInput;
5511
5611
  exports.MemoizedComponentInput = MemoizedComponentInput;
5512
- exports.MemoizedInputRenderer = MemoizedInputRenderer;
5513
5612
  exports.MemoizedUIDInput = MemoizedUIDInput;
5514
5613
  exports.MemoizedWysiwyg = MemoizedWysiwyg;
5515
5614
  exports.NotAllowedInput = NotAllowedInput;
5516
- exports.createDefaultForm = createDefaultForm;
5517
- exports.prepareTempKeys = prepareTempKeys;
5518
- exports.removeFieldsThatDontExistOnSchema = removeFieldsThatDontExistOnSchema;
5519
- exports.transformDocument = transformDocument;
5520
5615
  exports.useDynamicZone = useDynamicZone;
5521
5616
  exports.useFieldHint = useFieldHint;
5522
5617
  exports.useLazyComponents = useLazyComponents;
5523
- //# sourceMappingURL=Field-Bfph5SOd.js.map
5618
+ //# sourceMappingURL=Input-CDHKQd7o.js.map