@capillarytech/creatives-library 8.0.250-alpha.2 → 8.0.251

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 (276) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +1 -3
  4. package/initialReducer.js +0 -2
  5. package/package.json +1 -1
  6. package/services/api.js +0 -15
  7. package/services/tests/api.test.js +0 -34
  8. package/translations/en.json +3 -4
  9. package/utils/common.js +0 -11
  10. package/utils/commonUtils.js +5 -28
  11. package/utils/tests/commonUtil.test.js +0 -224
  12. package/utils/tests/transformerUtils.test.js +0 -297
  13. package/utils/transformTemplateConfig.js +10 -0
  14. package/utils/transformerUtils.js +0 -40
  15. package/v2Components/CapDeviceContent/index.js +56 -61
  16. package/v2Components/CapImageUpload/constants.js +0 -2
  17. package/v2Components/CapImageUpload/index.js +16 -65
  18. package/v2Components/CapImageUpload/index.scss +1 -4
  19. package/v2Components/CapImageUpload/messages.js +1 -5
  20. package/v2Components/CapTagList/index.js +1 -6
  21. package/v2Components/CapTagListWithInput/index.js +1 -5
  22. package/v2Components/CapTagListWithInput/messages.js +1 -1
  23. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  24. package/v2Components/ErrorInfoNote/index.js +72 -455
  25. package/v2Components/ErrorInfoNote/messages.js +6 -36
  26. package/v2Components/ErrorInfoNote/style.scss +4 -280
  27. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  28. package/v2Components/HtmlEditor/HTMLEditor.js +94 -547
  29. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1358
  30. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  31. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  32. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  33. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -22
  34. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -146
  35. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  36. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  37. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +0 -9
  38. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  39. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  40. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  41. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  45. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  46. package/v2Components/HtmlEditor/components/PreviewPane/index.js +34 -24
  47. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  48. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  49. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  50. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -50
  51. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +41 -70
  52. package/v2Components/HtmlEditor/constants.js +20 -42
  53. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  54. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  55. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  56. package/v2Components/HtmlEditor/hooks/useValidation.js +53 -189
  57. package/v2Components/HtmlEditor/index.js +1 -1
  58. package/v2Components/HtmlEditor/messages.js +85 -95
  59. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -94
  60. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
  61. package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
  62. package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
  63. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +102 -134
  64. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  65. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  66. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  67. package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
  68. package/v2Components/TemplatePreview/index.js +32 -47
  69. package/v2Components/TemplatePreview/messages.js +0 -4
  70. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  71. package/v2Containers/App/constants.js +0 -5
  72. package/v2Containers/BeeEditor/index.js +90 -172
  73. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +3 -4
  74. package/v2Containers/CreativesContainer/SlideBoxContent.js +53 -184
  75. package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
  76. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -3
  77. package/v2Containers/CreativesContainer/constants.js +0 -4
  78. package/v2Containers/CreativesContainer/index.js +46 -407
  79. package/v2Containers/CreativesContainer/messages.js +0 -12
  80. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
  81. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  82. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -342
  83. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -106
  84. package/v2Containers/Email/actions.js +0 -7
  85. package/v2Containers/Email/constants.js +1 -5
  86. package/v2Containers/Email/index.js +29 -234
  87. package/v2Containers/Email/messages.js +0 -32
  88. package/v2Containers/Email/reducer.js +1 -12
  89. package/v2Containers/Email/sagas.js +7 -61
  90. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  91. package/v2Containers/Email/tests/reducer.test.js +0 -46
  92. package/v2Containers/Email/tests/sagas.test.js +29 -320
  93. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +19 -207
  94. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  95. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  96. package/v2Containers/EmailWrapper/constants.js +0 -2
  97. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
  98. package/v2Containers/EmailWrapper/index.js +23 -103
  99. package/v2Containers/EmailWrapper/messages.js +1 -61
  100. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  101. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
  102. package/v2Containers/InApp/actions.js +0 -7
  103. package/v2Containers/InApp/constants.js +4 -20
  104. package/v2Containers/InApp/index.js +359 -802
  105. package/v2Containers/InApp/index.scss +3 -4
  106. package/v2Containers/InApp/messages.js +3 -7
  107. package/v2Containers/InApp/reducer.js +3 -21
  108. package/v2Containers/InApp/sagas.js +9 -29
  109. package/v2Containers/InApp/selectors.js +5 -25
  110. package/v2Containers/InApp/tests/index.test.js +50 -154
  111. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  112. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  113. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +9 -15
  114. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +6 -10
  115. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +75 -102
  116. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +54 -81
  117. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +174 -244
  118. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +12 -16
  119. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +36 -52
  120. package/v2Containers/TagList/index.js +19 -62
  121. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  122. package/v2Containers/Templates/_templates.scss +1 -265
  123. package/v2Containers/Templates/actions.js +1 -2
  124. package/v2Containers/Templates/constants.js +0 -1
  125. package/v2Containers/Templates/index.js +38 -363
  126. package/v2Containers/Templates/messages.js +0 -28
  127. package/v2Containers/Templates/reducer.js +0 -4
  128. package/v2Containers/Templates/tests/index.test.js +0 -10
  129. package/v2Containers/TemplatesV2/index.js +7 -15
  130. package/v2Containers/TemplatesV2/messages.js +0 -4
  131. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +486 -682
  132. package/utils/imageUrlUpload.js +0 -141
  133. package/v2Components/CapImageUrlUpload/constants.js +0 -26
  134. package/v2Components/CapImageUrlUpload/index.js +0 -365
  135. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  136. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  137. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -874
  138. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
  139. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  140. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -364
  141. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  142. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.apiErrors.test.js +0 -795
  143. package/v2Components/HtmlEditor/utils/validationConstants.js +0 -40
  144. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
  145. package/v2Containers/BeePopupEditor/constants.js +0 -10
  146. package/v2Containers/BeePopupEditor/index.js +0 -194
  147. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  148. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1285
  149. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -1870
  150. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  151. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -643
  152. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  153. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  154. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  155. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
  156. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  157. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
  158. package/v2Containers/InAppWrapper/constants.js +0 -16
  159. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  160. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  161. package/v2Containers/InAppWrapper/index.js +0 -148
  162. package/v2Containers/InAppWrapper/messages.js +0 -49
  163. package/v2Containers/InappAdvance/index.js +0 -1099
  164. package/v2Containers/InappAdvance/index.scss +0 -10
  165. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
  166. package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
  167. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
  168. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  169. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -107
  170. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -160
  171. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -476
  172. package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
  173. package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
  174. package/v2Containers/WebPush/Create/components/MediaSection.js +0 -143
  175. package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
  176. package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
  177. package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
  178. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
  179. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
  180. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
  181. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
  182. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -82
  183. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
  184. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
  185. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
  186. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
  187. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
  188. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  189. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  190. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  191. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -515
  192. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  193. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  194. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -46
  195. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -150
  196. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
  197. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
  198. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
  199. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
  200. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
  201. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
  202. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
  203. package/v2Containers/WebPush/Create/index.js +0 -1148
  204. package/v2Containers/WebPush/Create/index.scss +0 -134
  205. package/v2Containers/WebPush/Create/messages.js +0 -203
  206. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
  207. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
  208. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
  209. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
  210. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  211. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
  212. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  213. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  214. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
  215. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
  216. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  217. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  218. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  219. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  220. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
  221. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
  222. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  223. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  224. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
  225. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
  226. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -47
  227. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -141
  228. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  229. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
  230. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
  231. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
  232. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
  233. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
  234. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -81
  235. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
  236. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
  237. package/v2Containers/WebPush/Create/preview/constants.js +0 -637
  238. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
  239. package/v2Containers/WebPush/Create/preview/preview.scss +0 -351
  240. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
  241. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  242. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  243. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  244. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
  245. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  246. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  247. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  248. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
  249. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
  250. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  251. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
  252. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
  253. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  254. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
  255. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  256. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
  257. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
  258. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
  259. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  260. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
  261. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
  262. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
  263. package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
  264. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
  265. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  266. package/v2Containers/WebPush/Create/utils/validation.js +0 -75
  267. package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
  268. package/v2Containers/WebPush/actions.js +0 -60
  269. package/v2Containers/WebPush/constants.js +0 -132
  270. package/v2Containers/WebPush/index.js +0 -2
  271. package/v2Containers/WebPush/reducer.js +0 -104
  272. package/v2Containers/WebPush/sagas.js +0 -119
  273. package/v2Containers/WebPush/selectors.js +0 -65
  274. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  275. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  276. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -8,43 +8,33 @@
8
8
  * - Theme support with proper styling
9
9
  */
10
10
 
11
- import React, {
12
- forwardRef, useImperativeHandle, useRef, useEffect, useCallback,
13
- } from 'react';
11
+ import React, { forwardRef, useImperativeHandle, useRef, useEffect, useState } from 'react';
14
12
  import PropTypes from 'prop-types';
15
13
 
16
14
  // CodeMirror 6 imports
17
15
  import { EditorState } from '@codemirror/state';
18
- import {
19
- EditorView, lineNumbers, highlightActiveLine, placeholder,
20
- } from '@codemirror/view';
16
+ import { EditorView, lineNumbers, highlightActiveLine } from '@codemirror/view';
21
17
 
22
- // Define Theme and Highlighting inline to avoid "multiple instances of @codemirror/state" error
18
+ // Import our comprehensive syntax highlighting solution
19
+ import { createRobustExtensions } from '../../utils/properSyntaxHighlighting';
23
20
 
24
21
 
25
22
  import { injectIntl, intlShape } from 'react-intl';
26
23
 
27
24
  // Messages
28
- import CapRow from '@capillarytech/cap-ui-library/CapRow';
29
25
  import messages from '../../messages';
30
26
 
31
27
  // Cap UI Components
28
+ import CapRow from '@capillarytech/cap-ui-library/CapRow';
32
29
 
33
30
  // Components
34
31
  import TagList from '../../../../v2Containers/TagList';
35
- import ValidationErrorDisplay from '../ValidationErrorDisplay';
36
-
37
- // Constants - removed unused imports since tag fetching is handled by parent
38
32
 
39
33
  // Context
40
34
  import { useEditorContext } from '../common/EditorContext';
41
35
 
42
36
  // Styles
43
37
  import './_codeEditorPane.scss';
44
- import { INAPP } from '../../../../constants/unified';
45
-
46
- // Define Theme and Highlighting inline to avoid "multiple instances of @codemirror/state" error
47
-
48
38
 
49
39
  // Legacy CodeMirrorEditor removed - using enhanced implementation only
50
40
 
@@ -52,25 +42,12 @@ const CodeEditorPaneComponent = ({
52
42
  intl,
53
43
  readOnly = false,
54
44
  className = '',
55
- forwardedRef,
56
- // Tag-related props - tags are fetched and managed by parent component
57
- tags = [],
58
- injectedTags = {},
59
- location,
60
- eventContextTags = [],
61
- selectedOfferDetails = [],
62
- channel,
63
- userLocale = 'en',
64
- moduleFilterEnabled = true,
65
- onTagContextChange,
66
- // Validation props
67
- onErrorClick,
45
+ isFullscreenMode = false,
46
+ onLabelInsert,
47
+ forwardedRef
68
48
  }) => {
69
- const context = useEditorContext();
70
- const {
71
- content, validation, variant, isLiquidEnabled,
72
- } = context || {};
73
- const { content: contentValue, updateContent } = content || {};
49
+ const { content, validation } = useEditorContext();
50
+ const { content: contentValue, updateContent } = content;
74
51
  const editorRef = useRef(null);
75
52
  const viewRef = useRef(null);
76
53
 
@@ -84,7 +61,7 @@ const CodeEditorPaneComponent = ({
84
61
  get view() {
85
62
  return viewRef.current;
86
63
  },
87
- viewRef, // For compatibility with existing code
64
+ viewRef: viewRef, // For compatibility with existing code
88
65
 
89
66
  focus: () => {
90
67
  if (viewRef.current) {
@@ -98,7 +75,7 @@ const CodeEditorPaneComponent = ({
98
75
  const pos = position !== undefined ? position : head;
99
76
  view.dispatch({
100
77
  changes: { from: pos, insert: text },
101
- selection: { anchor: pos + text.length },
78
+ selection: { anchor: pos + text.length }
102
79
  });
103
80
  } else {
104
81
  throw new Error('CodeMirror view not initialized');
@@ -111,7 +88,9 @@ const CodeEditorPaneComponent = ({
111
88
  }
112
89
  return 0;
113
90
  },
114
- getValue: () => contentValue || '',
91
+ getValue: () => {
92
+ return contentValue || '';
93
+ },
115
94
  setValue: (value) => {
116
95
  updateContent(value);
117
96
  },
@@ -128,7 +107,7 @@ const CodeEditorPaneComponent = ({
128
107
 
129
108
  view.dispatch({
130
109
  selection: { anchor: pos },
131
- effects: EditorView.scrollIntoView(pos, { y: 'center' }),
110
+ effects: EditorView.scrollIntoView(pos, { y: 'center' })
132
111
  });
133
112
  view.focus();
134
113
  } catch (error) {
@@ -138,7 +117,7 @@ const CodeEditorPaneComponent = ({
138
117
  }
139
118
  }
140
119
  }
141
- },
120
+ }
142
121
  }), [contentValue]);
143
122
 
144
123
  // Note: handleContentChange removed - using updateContentRef directly in CodeMirror
@@ -154,9 +133,7 @@ const CodeEditorPaneComponent = ({
154
133
  if (typeof tagData === 'string') {
155
134
  tagText = tagData;
156
135
  } else if (tagData) {
157
- const {
158
- text, name, label, value,
159
- } = tagData;
136
+ const { text, name, label, value } = tagData;
160
137
  tagText = text || name || label || value;
161
138
  if (!tagText) {
162
139
  console.warn('Invalid tag data:', tagData);
@@ -170,68 +147,49 @@ const CodeEditorPaneComponent = ({
170
147
  // For unified HTML editor, insert as template variable
171
148
  const formattedTag = `{{${tagText}}}`;
172
149
 
173
- // Insert the tag at cursor position directly
150
+ // Insert the tag at cursor position
174
151
  view.dispatch({
175
152
  changes: { from: pos, insert: formattedTag },
176
- selection: { anchor: pos + formattedTag.length },
153
+ selection: { anchor: pos + formattedTag.length }
177
154
  });
178
155
 
179
156
  // Focus back to editor
180
157
  view.focus();
181
158
 
182
- // Note: We don't call onLabelInsert here because:
183
- // 1. The tag is already inserted directly into the editor
184
- // 2. onLabelInsert (handleLabelInsert from HTMLEditor) would try to insert again
185
- // 3. This causes "Editor method not available" error
186
- // The direct insertion via view.dispatch is sufficient
159
+ // Call the parent's handleLabelInsert if available
160
+ if (onLabelInsert) {
161
+ onLabelInsert(formattedTag, pos);
162
+ }
187
163
  }
188
164
  };
189
165
 
190
- // Handle tag context change - delegate to parent component
191
- // Tags are fetched in parent components (EmailHTMLEditor, INAPP, etc.)
192
- // This component just passes the context change event up
193
- const handleTagContextChange = useCallback((data) => {
194
- if (onTagContextChange) {
195
- // Parent component handles tag fetching and updates
196
- onTagContextChange(data);
197
- }
198
- // No fallback - tags must be managed by parent component
199
- }, [onTagContextChange]);
200
-
201
166
  // Initialize CodeMirror effect
202
167
  useEffect(() => {
203
- // Ensure editorRef.current is a valid DOM element before initializing CodeMirror
204
- if (editorRef.current && editorRef.current instanceof HTMLElement && !viewRef.current) {
205
- // Determine placeholder text based on channel
206
- let placeholderText = intl.formatMessage(messages.editorPlaceholderEmail); // Default to email
207
- if (channel === INAPP || channel === INAPP.toUpperCase()) {
208
- placeholderText = intl.formatMessage(messages.editorPlaceholderInapp);
209
- }
210
-
211
- // Add additional extensions for line numbers, active line, placeholder, line wrapping, and update listener
212
- const extensions = [
213
- lineNumbers(),
214
- highlightActiveLine(),
215
- placeholder(placeholderText),
216
- EditorView.lineWrapping, // Enable soft-wrapping of long lines
217
- // html(), // 1. HTML language support - TEMPORARILY DISABLED due to version conflict
218
- // syntaxHighlighting(comprehensiveVSCodeTheme), // 2. Syntax highlighting - TEMPORARILY DISABLED
219
- // cleanEditorTheme, // 3. Theme - TEMPORARILY DISABLED
220
- EditorView.updateListener.of((update) => {
221
- if (update.docChanged) {
222
- updateContentRef.current(update.state.doc.toString());
223
- }
224
- }),
225
- ];
168
+ if (editorRef.current && !viewRef.current) {
169
+ // Use the comprehensive extensions from properSyntaxHighlighting.js
170
+ // This includes: html(), syntaxHighlighting(comprehensiveVSCodeTheme), cleanEditorTheme
171
+ const robustExtensions = createRobustExtensions();
172
+
173
+ // Add additional extensions for line numbers, active line, and update listener
174
+ const extensions = [
175
+ lineNumbers(),
176
+ highlightActiveLine(),
177
+ ...robustExtensions, // Spread the robust extensions (html, syntax highlighting, theme)
178
+ EditorView.updateListener.of((update) => {
179
+ if (update.docChanged) {
180
+ updateContentRef.current(update.state.doc.toString());
181
+ }
182
+ })
183
+ ];
226
184
 
227
185
  const state = EditorState.create({
228
186
  doc: contentValue || '',
229
- extensions,
187
+ extensions
230
188
  });
231
189
 
232
190
  viewRef.current = new EditorView({
233
191
  state,
234
- parent: editorRef.current,
192
+ parent: editorRef.current
235
193
  });
236
194
  }
237
195
 
@@ -246,70 +204,116 @@ const CodeEditorPaneComponent = ({
246
204
  viewRef.current = null;
247
205
  }
248
206
  };
249
- }, [channel, intl]);
207
+ }, []);
250
208
 
251
209
  // Update editor content when content changes
252
210
  useEffect(() => {
253
- if (viewRef.current && contentValue && contentValue !== viewRef.current.state.doc.toString()) {
211
+ if (viewRef.current && contentValue !== viewRef.current.state.doc.toString()) {
254
212
  const { current: view } = viewRef;
255
213
  const { state: { doc: { length } } } = view;
256
214
  view.dispatch({
257
215
  changes: {
258
216
  from: 0,
259
217
  to: length,
260
- insert: contentValue || '',
261
- },
218
+ insert: contentValue || ''
219
+ }
262
220
  });
263
221
  }
264
222
  }, [contentValue]);
265
223
 
266
- return (
267
- <CapRow className={`code-editor-pane ${className}`}>
268
- {/* Code Editor Content - Stacked vertically with validation */}
269
- <div className="code-editor-pane__wrapper">
270
- {/* Code Editor with Floating Add Label Button */}
271
- <div className="codemirror-wrapper">
272
- <div ref={editorRef} className="codemirror-editor" />
273
- {/* Floating Add Label Button */}
274
- <CapRow className="code-editor-pane__actions">
275
- <TagList
276
- key="html-editor-taglist"
277
- label={intl.formatMessage(messages.addLabel)}
278
- onTagSelect={handleTagSelect}
279
- onContextChange={handleTagContextChange}
280
- className="tag-list-trigger"
281
- tags={tags}
282
- injectedTags={injectedTags}
283
- moduleFilterEnabled={moduleFilterEnabled}
284
- userLocale={userLocale}
285
- channel={channel}
286
- disabled={readOnly}
287
- location={location}
288
- selectedOfferDetails={selectedOfferDetails}
289
- eventContextTags={eventContextTags}
290
- popoverPlacement="rightTop"
291
- />
292
- </CapRow>
293
- </div>
294
-
295
- {/* Validation Error Display - Below editor, always visible */}
296
- <ValidationErrorDisplay
297
- validation={validation}
298
- onErrorClick={onErrorClick}
299
- isLiquidEnabled={isLiquidEnabled}
300
- className="code-editor-pane__validation"
301
- />
302
- </div>
303
- </CapRow>
304
- );
224
+ return (
225
+ <CapRow className={`code-editor-pane ${className}`}>
226
+ {/* Unified Code Editor with Floating Add Label Button */}
227
+ <CapRow className="code-editor-pane__content">
228
+ <div className="codemirror-wrapper">
229
+ <div ref={editorRef} className="codemirror-editor" />
230
+ {/* Floating Add Label Button */}
231
+ <CapRow className="code-editor-pane__actions">
232
+ <TagList
233
+ key="html-editor-taglist"
234
+ label={intl.formatMessage(messages.addLabel)}
235
+ onTagSelect={handleTagSelect}
236
+ onContextChange={(context) => {
237
+ }}
238
+ className="tag-list-trigger"
239
+ tags={[]} // Empty initially - TagList will fetch from API
240
+ injectedTags={{
241
+ // Add common HTML/Email specific tags as fallback
242
+ 'Customer Info': {
243
+ name: 'Customer Info',
244
+ desc: 'Customer information tags',
245
+ resolved: true,
246
+ 'tag-header': true,
247
+ subtags: {
248
+ 'customer.firstName': {
249
+ name: 'First Name',
250
+ desc: 'Customer first name',
251
+ resolved: true
252
+ },
253
+ 'customer.lastName': {
254
+ name: 'Last Name',
255
+ desc: 'Customer last name',
256
+ resolved: true
257
+ },
258
+ 'customer.email': {
259
+ name: 'Email',
260
+ desc: 'Customer email address',
261
+ resolved: true
262
+ },
263
+ 'customer.phone': {
264
+ name: 'Phone',
265
+ desc: 'Customer phone number',
266
+ resolved: true
267
+ }
268
+ }
269
+ },
270
+ 'Common Tags': {
271
+ name: 'Common Tags',
272
+ desc: 'Commonly used template tags',
273
+ resolved: true,
274
+ 'tag-header': true,
275
+ subtags: {
276
+ 'organization.name': {
277
+ name: 'Organization Name',
278
+ desc: 'Organization name',
279
+ resolved: true
280
+ },
281
+ 'currentDate': {
282
+ name: 'Current Date',
283
+ desc: 'Current date',
284
+ resolved: true
285
+ },
286
+ 'unsubscribeLink': {
287
+ name: 'Unsubscribe Link',
288
+ desc: 'Unsubscribe link',
289
+ resolved: true
290
+ }
291
+ }
292
+ }
293
+ }}
294
+ moduleFilterEnabled={true}
295
+ userLocale="en"
296
+ channel="email"
297
+ disabled={readOnly}
298
+ location={{
299
+ query: {
300
+ type: 'html-editor' // Identify the context
301
+ }
302
+ }}
303
+ selectedOfferDetails={[]}
304
+ eventContextTags={[]}
305
+ />
306
+ </CapRow>
307
+ </div>
308
+ </CapRow>
309
+
310
+ </CapRow>
311
+ );
305
312
  };
306
313
 
307
- // Apply injectIntl to the component first, then wrap with forwardRef
308
- const CodeEditorPaneWithIntl = injectIntl(CodeEditorPaneComponent);
309
-
310
- // Create the forwardRef wrapper that forwards ref to the intl-wrapped component
314
+ // Create the forwardRef wrapper
311
315
  const CodeEditorPane = forwardRef((props, ref) => (
312
- <CodeEditorPaneWithIntl {...props} forwardedRef={ref} />
316
+ <CodeEditorPaneComponent {...props} forwardedRef={ref} />
313
317
  ));
314
318
 
315
319
  CodeEditorPane.displayName = 'CodeEditorPane';
@@ -319,19 +323,9 @@ CodeEditorPane.propTypes = {
319
323
  readOnly: PropTypes.bool,
320
324
  className: PropTypes.string,
321
325
  isFullscreenMode: PropTypes.bool,
322
- onLabelInsert: PropTypes.func,
323
- onErrorClick: PropTypes.func,
324
- // Tag-related props - tags are fetched and managed by parent component
325
- tags: PropTypes.array,
326
- injectedTags: PropTypes.object,
327
- location: PropTypes.object,
328
- eventContextTags: PropTypes.array,
329
- selectedOfferDetails: PropTypes.array,
330
- channel: PropTypes.string,
331
- userLocale: PropTypes.string,
332
- moduleFilterEnabled: PropTypes.bool,
333
- onTagContextChange: PropTypes.func, // Required - parent must handle tag fetching
326
+ onLabelInsert: PropTypes.func
334
327
  };
335
328
 
336
- // Export the forwardRef-wrapped component
337
- export default CodeEditorPane;
329
+ // Export with injectIntl - ref forwarding is handled by forwardRef wrapper
330
+ export default injectIntl(CodeEditorPane);
331
+
@@ -9,7 +9,7 @@
9
9
  .html-editor .device-toggle {
10
10
  display: flex;
11
11
  align-items: center;
12
- margin-left: 2.5rem;
12
+ gap: 1rem;
13
13
  padding: 0;
14
14
  background-color: $CAP_G10;
15
15
  border-radius: 0.25rem 0.25rem 0 0;
@@ -220,7 +220,6 @@
220
220
 
221
221
  // Integration with editor toolbar
222
222
  .html-editor.html-editor--inapp {
223
- margin-top: 4%;
224
223
  .editor-toolbar {
225
224
  padding: 0 1rem 0 0; // Remove left padding to align with device toggle
226
225
  background-color: $CAP_G10;
@@ -32,7 +32,7 @@ const DeviceToggle = ({
32
32
  onDeviceChange,
33
33
  keepContentSame = false,
34
34
  onKeepContentSameChange,
35
- className = '',
35
+ className = ''
36
36
  }) => {
37
37
  const handleDeviceClick = (device) => {
38
38
  if (onDeviceChange && device !== activeDevice) {
@@ -97,7 +97,7 @@ DeviceToggle.propTypes = {
97
97
  onDeviceChange: PropTypes.func,
98
98
  keepContentSame: PropTypes.bool,
99
99
  onKeepContentSameChange: PropTypes.func,
100
- className: PropTypes.string,
100
+ className: PropTypes.string
101
101
  };
102
102
 
103
103
  DeviceToggle.defaultProps = {
@@ -105,7 +105,7 @@ DeviceToggle.defaultProps = {
105
105
  onDeviceChange: null,
106
106
  keepContentSame: false,
107
107
  onKeepContentSameChange: null,
108
- className: '',
108
+ className: ''
109
109
  };
110
110
 
111
111
  export default injectIntl(DeviceToggle);
@@ -15,7 +15,6 @@
15
15
  border-radius: 0.25rem 0.25rem 0 0;
16
16
  box-sizing: border-box;
17
17
  flex-shrink: 0;
18
- position: relative;
19
18
 
20
19
  &__left {
21
20
  display: flex;
@@ -111,12 +110,4 @@
111
110
  display: none;
112
111
  }
113
112
  }
114
- }
115
-
116
- // Library mode override for InApp variant - Position absolute for toolbar
117
- // These selectors target the toolbar when inside library mode InApp variant
118
- .html-editor--inapp.html-editor--library-mode .html-editor__header .editor-toolbar,
119
- .html-editor--inapp.html-editor--library-mode .html-editor__header .editor-toolbar.editor-toolbar,
120
- .html-editor--inapp.html-editor--library-mode .html-editor__header .ant-layout-header.editor-toolbar {
121
- position: absolute;
122
113
  }
@@ -81,7 +81,7 @@ const EditorToolbar = ({
81
81
  )}
82
82
  aria-pressed={isFullscreenMode}
83
83
  >
84
- <CapIcon type={isFullscreenMode ? "collapse2" : "expander"} size="m" />
84
+ <CapIcon type={isFullscreenMode ? "minimizer" : "expander"} size="m" />
85
85
  </CapButton>
86
86
  )}
87
87
  </CapRow>
@@ -49,31 +49,9 @@ body .ant-modal-mask+.ant-modal-wrap .ant-modal.html-editor-fullscreen-modal .an
49
49
  padding: 0;
50
50
  min-height: 3.25rem;
51
51
  height: 3.25rem;
52
- position: relative;
53
52
 
54
53
  &__right {
55
54
  margin-left: auto;
56
55
  }
57
56
  }
58
- }
59
-
60
- // Library mode overrides for INAPP variant - Position absolute for toolbar
61
- // These selectors match the high-specificity patterns above but include library-mode class
62
- .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
63
- .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
64
- .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar,
65
- .html-editor.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
66
- .html-editor.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
67
- .html-editor.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar,
68
- .html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .editor-toolbar,
69
- .html-editor__header.html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .editor-toolbar,
70
- .html-editor__header.html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .editor-toolbar.editor-toolbar,
71
- .html-editor__header.html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .ant-layout-header.editor-toolbar,
72
- .ant-modal .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
73
- .ant-modal .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
74
- .ant-modal .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar,
75
- .ant-modal-content .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
76
- .ant-modal-content .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
77
- .ant-modal-content .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar {
78
- position: absolute;
79
57
  }
@@ -14,7 +14,9 @@ const DeviceFrame = ({
14
14
  className = '',
15
15
  ...props
16
16
  }) => {
17
- const getFrameAsset = () => device === DEVICE_TYPES.IOS ? iosFrame : androidFrame;
17
+ const getFrameAsset = () => {
18
+ return device === DEVICE_TYPES.IOS ? iosFrame : androidFrame;
19
+ };
18
20
 
19
21
  const getFrameStyles = () => {
20
22
  const baseStyles = {
@@ -24,13 +26,14 @@ const DeviceFrame = ({
24
26
  backgroundRepeat: 'no-repeat',
25
27
  backgroundPosition: 'center',
26
28
  backgroundSize: 'contain',
29
+ filter: 'drop-shadow(0 12px 48px rgba(0, 0, 0, 0.25)) brightness(1.05) contrast(1.1)'
27
30
  };
28
31
 
29
32
  // Unified dimensions - both devices use the same size since assets are identical
30
33
  return {
31
34
  ...baseStyles,
32
35
  width: '450px',
33
- height: '920px',
36
+ height: '920px'
34
37
  };
35
38
  };
36
39
 
@@ -42,7 +45,7 @@ const DeviceFrame = ({
42
45
  {...props}
43
46
  >
44
47
 
45
- {children}
48
+ {children}
46
49
 
47
50
  </div>
48
51
  );
@@ -51,7 +54,7 @@ const DeviceFrame = ({
51
54
  DeviceFrame.propTypes = {
52
55
  device: PropTypes.oneOf(Object.values(DEVICE_TYPES)),
53
56
  children: PropTypes.node,
54
- className: PropTypes.string,
57
+ className: PropTypes.string
55
58
  };
56
59
 
57
60
  export default DeviceFrame;