@capillarytech/creatives-library 8.0.242-alpha.1 → 8.0.242-alpha.11

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 (255) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/config/app.js +1 -1
  4. package/constants/unified.js +2 -2
  5. package/initialReducer.js +0 -2
  6. package/package.json +1 -1
  7. package/services/api.js +5 -10
  8. package/services/tests/api.test.js +0 -18
  9. package/translations/en.json +4 -3
  10. package/utils/common.js +6 -5
  11. package/utils/commonUtils.js +1 -14
  12. package/utils/imageUrlUpload.js +141 -0
  13. package/utils/tests/commonUtil.test.js +0 -224
  14. package/utils/transformTemplateConfig.js +10 -0
  15. package/v2Components/CapDeviceContent/index.js +56 -61
  16. package/v2Components/CapImageUpload/constants.js +2 -0
  17. package/v2Components/CapImageUpload/index.js +65 -16
  18. package/v2Components/CapImageUpload/index.scss +4 -1
  19. package/v2Components/CapImageUpload/messages.js +5 -1
  20. package/v2Components/CapImageUrlUpload/constants.js +26 -0
  21. package/v2Components/CapImageUrlUpload/index.js +365 -0
  22. package/v2Components/CapImageUrlUpload/index.scss +35 -0
  23. package/v2Components/CapImageUrlUpload/messages.js +47 -0
  24. package/v2Components/CapTagList/index.js +1 -6
  25. package/v2Components/CapTagListWithInput/index.js +1 -5
  26. package/v2Components/CapTagListWithInput/messages.js +1 -1
  27. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  28. package/v2Components/ErrorInfoNote/index.js +72 -412
  29. package/v2Components/ErrorInfoNote/messages.js +0 -22
  30. package/v2Components/ErrorInfoNote/style.scss +2 -279
  31. package/v2Components/HtmlEditor/HTMLEditor.js +89 -210
  32. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1132
  33. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +12 -17
  34. package/v2Components/HtmlEditor/_htmlEditor.scss +23 -8
  35. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  36. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -13
  37. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +139 -148
  38. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  39. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  40. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  41. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -1
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  47. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  48. package/v2Components/HtmlEditor/components/PreviewPane/index.js +11 -10
  49. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  50. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +62 -87
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  52. package/v2Components/HtmlEditor/constants.js +20 -29
  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/index.js +1 -1
  57. package/v2Components/HtmlEditor/messages.js +85 -95
  58. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +101 -99
  59. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  60. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -34
  61. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  62. package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
  63. package/v2Components/TemplatePreview/index.js +32 -47
  64. package/v2Components/TemplatePreview/messages.js +0 -4
  65. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  66. package/v2Containers/App/constants.js +5 -0
  67. package/v2Containers/BeeEditor/index.js +80 -82
  68. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
  69. package/v2Containers/CreativesContainer/SlideBoxContent.js +118 -148
  70. package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
  71. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  72. package/v2Containers/CreativesContainer/constants.js +2 -1
  73. package/v2Containers/CreativesContainer/index.js +41 -173
  74. package/v2Containers/CreativesContainer/messages.js +4 -4
  75. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
  76. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
  77. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -36
  78. package/v2Containers/Email/actions.js +0 -7
  79. package/v2Containers/Email/constants.js +1 -5
  80. package/v2Containers/Email/index.js +0 -13
  81. package/v2Containers/Email/messages.js +0 -32
  82. package/v2Containers/Email/reducer.js +1 -12
  83. package/v2Containers/Email/sagas.js +6 -41
  84. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  85. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
  86. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  87. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  88. package/v2Containers/EmailWrapper/constants.js +0 -2
  89. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +67 -436
  90. package/v2Containers/EmailWrapper/index.js +23 -99
  91. package/v2Containers/EmailWrapper/messages.js +1 -61
  92. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +1 -26
  93. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -111
  94. package/v2Containers/InApp/actions.js +0 -7
  95. package/v2Containers/InApp/constants.js +4 -20
  96. package/v2Containers/InApp/index.js +357 -800
  97. package/v2Containers/InApp/index.scss +3 -4
  98. package/v2Containers/InApp/messages.js +3 -7
  99. package/v2Containers/InApp/reducer.js +3 -21
  100. package/v2Containers/InApp/sagas.js +9 -29
  101. package/v2Containers/InApp/selectors.js +5 -25
  102. package/v2Containers/InApp/tests/index.test.js +50 -154
  103. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  104. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  105. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +12 -12
  106. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  107. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
  108. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
  109. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +184 -150
  110. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
  111. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +32 -28
  112. package/v2Containers/TagList/index.js +1 -67
  113. package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
  114. package/v2Containers/Templates/_templates.scss +202 -56
  115. package/v2Containers/Templates/actions.js +2 -1
  116. package/v2Containers/Templates/constants.js +1 -0
  117. package/v2Containers/Templates/index.js +278 -128
  118. package/v2Containers/Templates/messages.js +24 -4
  119. package/v2Containers/Templates/reducer.js +2 -0
  120. package/v2Containers/Templates/tests/index.test.js +10 -0
  121. package/v2Containers/TemplatesV2/index.js +8 -1
  122. package/v2Containers/TemplatesV2/messages.js +4 -0
  123. package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
  124. package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
  125. package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
  126. package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
  127. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
  128. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
  129. package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
  130. package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
  131. package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
  132. package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
  133. package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
  134. package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
  135. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
  136. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
  137. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
  138. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
  139. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
  140. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
  141. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
  142. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
  143. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
  144. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
  145. package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
  146. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
  147. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
  148. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
  149. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
  150. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
  151. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
  152. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
  153. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
  154. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
  155. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
  156. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
  157. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
  158. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
  159. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
  160. package/v2Containers/WebPush/Create/index.js +1056 -0
  161. package/v2Containers/WebPush/Create/index.scss +134 -0
  162. package/v2Containers/WebPush/Create/messages.js +203 -0
  163. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
  164. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
  165. package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
  166. package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
  167. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
  168. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +150 -0
  169. package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
  170. package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
  171. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
  172. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
  173. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  174. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  175. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
  176. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
  177. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
  178. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
  179. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
  180. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
  181. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
  182. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
  183. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
  184. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
  185. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
  186. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
  187. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
  188. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
  189. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
  190. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
  191. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
  192. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
  193. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
  194. package/v2Containers/WebPush/Create/preview/constants.js +637 -0
  195. package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
  196. package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
  197. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
  198. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
  199. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
  200. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
  201. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
  202. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
  203. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
  204. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
  205. package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
  206. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
  207. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
  208. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
  209. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
  210. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
  211. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
  212. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
  213. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +943 -0
  214. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
  215. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
  216. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
  217. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
  218. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +94 -0
  219. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +390 -0
  220. package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
  221. package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
  222. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
  223. package/v2Containers/WebPush/Create/utils/validation.js +75 -0
  224. package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
  225. package/v2Containers/WebPush/actions.js +60 -0
  226. package/v2Containers/WebPush/constants.js +128 -0
  227. package/v2Containers/WebPush/index.js +2 -0
  228. package/v2Containers/WebPush/reducer.js +104 -0
  229. package/v2Containers/WebPush/sagas.js +119 -0
  230. package/v2Containers/WebPush/selectors.js +65 -0
  231. package/v2Containers/WebPush/tests/reducer.test.js +863 -0
  232. package/v2Containers/WebPush/tests/sagas.test.js +566 -0
  233. package/v2Containers/WebPush/tests/selectors.test.js +843 -0
  234. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +528 -431
  235. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  236. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -362
  237. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  238. package/v2Containers/BeePopupEditor/constants.js +0 -10
  239. package/v2Containers/BeePopupEditor/index.js +0 -193
  240. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  241. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1045
  242. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  243. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  244. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  245. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
  246. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  247. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
  248. package/v2Containers/InAppWrapper/constants.js +0 -16
  249. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  250. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  251. package/v2Containers/InAppWrapper/index.js +0 -148
  252. package/v2Containers/InAppWrapper/messages.js +0 -49
  253. package/v2Containers/InappAdvance/index.js +0 -1099
  254. package/v2Containers/InappAdvance/index.scss +0 -10
  255. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
@@ -1,254 +0,0 @@
1
- /**
2
- * ValidationTabs Styles
3
- */
4
-
5
- @import '~@capillarytech/cap-ui-library/styles/_variables.scss';
6
-
7
- .validation-tabs {
8
- overflow-y: hidden;
9
- width: 100%;
10
- background-color: $CAP_COLOR_05; // Light pink background
11
- border-radius: 0.25rem;
12
- padding: 0.5rem 0.75rem;
13
- box-sizing: border-box;
14
-
15
- &__header {
16
- display: flex;
17
- align-items: flex-start;
18
- justify-content: space-between;
19
- width: 100%;
20
- }
21
-
22
- &__tabs {
23
- flex: 1;
24
-
25
- // Override CapTab styles for proper spacing
26
- .cap-tab-v2 {
27
- .ant-tabs-nav {
28
- margin-bottom: 0;
29
-
30
- &::before {
31
- border-bottom: none;
32
- }
33
- }
34
-
35
- .ant-tabs-tab {
36
- padding: 0.5rem 0.75rem; // Add horizontal padding for spacing
37
- margin-right: 0; // Remove margin, use padding instead
38
- color: $CAP_G03;
39
- font-size: 0.875rem;
40
- font-weight: 500;
41
-
42
- & + .ant-tabs-tab {
43
- margin-left: 1.5rem; // Add space between tabs
44
- }
45
-
46
- &:hover {
47
- color: $CAP_COLOR_05;
48
- background: transparent;
49
- }
50
-
51
- &.ant-tabs-tab-active {
52
- .ant-tabs-tab-btn {
53
- color: $CAP_COLOR_05;
54
- font-weight: 600;
55
- }
56
- }
57
- }
58
-
59
- .ant-tabs-ink-bar {
60
- background-color: $CAP_COLOR_05;
61
- height: 0.125rem;
62
- }
63
-
64
- .ant-tabs-content-holder {
65
- padding-top: 0.25rem; // Reduced from 0.5rem
66
- padding-bottom: 0; // No bottom padding
67
- }
68
- }
69
- }
70
-
71
- &__tab-label {
72
- display: flex;
73
- align-items: center;
74
- gap: 0.25rem;
75
- }
76
-
77
- &__tab-count {
78
- color: inherit;
79
- }
80
-
81
- &__actions {
82
- display: flex;
83
- align-items: center;
84
- gap: 0.5rem;
85
- flex-shrink: 0;
86
- padding-top: 0.5rem;
87
- }
88
-
89
- &__close {
90
- display: flex;
91
- align-items: center;
92
- justify-content: center;
93
- width: 1.5rem;
94
- height: 1.5rem;
95
- padding: 0;
96
- background: transparent;
97
- border: none;
98
- border-radius: 0.25rem;
99
- cursor: pointer;
100
- color: $CAP_G03;
101
- transition: all 0.2s ease;
102
-
103
- &:hover {
104
- background-color: rgba($CAP_COLOR_05, 0.1);
105
- color: $CAP_COLOR_05;
106
- }
107
-
108
- .cap-icon-v2 {
109
- font-size: 0.875rem;
110
- }
111
- }
112
-
113
- &__content {
114
- max-height: 15rem; // Limit height for many errors
115
- overflow-y: auto;
116
- padding-right: 0.25rem;
117
- padding-bottom: 0; // Remove bottom padding completely
118
-
119
- // Custom scrollbar
120
- &::-webkit-scrollbar {
121
- width: 0.375rem;
122
- }
123
-
124
- &::-webkit-scrollbar-track {
125
- background: transparent;
126
- }
127
-
128
- &::-webkit-scrollbar-thumb {
129
- background-color: $CAP_G06;
130
- border-radius: 0.1875rem;
131
-
132
- &:hover {
133
- background-color: $CAP_G04;
134
- }
135
- }
136
- }
137
-
138
- &__item {
139
- display: flex;
140
- align-items: flex-start;
141
- gap: 0.5rem;
142
- padding: 0.25rem 0; // Reduced from 0.375rem
143
- border-bottom: 1px solid rgba($CAP_G06, 0.3);
144
-
145
- &:last-child {
146
- border-bottom: none;
147
- padding-bottom: 0.25rem; // Minimal padding on last item
148
- }
149
-
150
- &--error {
151
- .validation-tabs__icon--error {
152
- color: $CAP_RED;
153
- }
154
- }
155
-
156
- &--warning {
157
- .validation-tabs__icon--warning {
158
- color: $CAP_YELLOW;
159
- }
160
- }
161
- }
162
-
163
- &__item-icon {
164
- flex-shrink: 0;
165
- display: flex;
166
- align-items: center;
167
- padding-top: 0.125rem;
168
- }
169
-
170
- &__icon {
171
- font-size: 0.875rem;
172
-
173
- &--error {
174
- color: $CAP_RED;
175
- }
176
-
177
- &--warning {
178
- color: $CAP_YELLOW;
179
- }
180
- }
181
-
182
- &__item-content {
183
- flex: 1;
184
- display: flex;
185
- flex-wrap: wrap;
186
- align-items: baseline;
187
- gap: 0.25rem;
188
- font-size: 0.75rem;
189
- line-height: 1.4;
190
- color: $CAP_G01;
191
- }
192
-
193
- &__item-message {
194
- color: $CAP_G01;
195
- }
196
-
197
- &__item-location {
198
- color: $CAP_G03;
199
- white-space: nowrap;
200
- }
201
-
202
- &__item-rule {
203
- color: $CAP_G04;
204
- font-family: monospace;
205
- font-size: 0.6875rem;
206
- }
207
-
208
- &__item-navigate {
209
- flex-shrink: 0;
210
- display: flex;
211
- align-items: center;
212
- justify-content: center;
213
- width: 1.25rem;
214
- height: 1.25rem;
215
- padding: 0;
216
- background: transparent;
217
- border: none;
218
- border-radius: 0.25rem;
219
- cursor: pointer;
220
- color: $CAP_G04;
221
- transition: all 0.2s ease;
222
-
223
- &:hover {
224
- background-color: rgba($CAP_G01, 0.1);
225
- color: $CAP_G01;
226
- }
227
-
228
- .anticon {
229
- font-size: 0.75rem;
230
- }
231
- }
232
- }
233
-
234
- // Responsive adjustments
235
- @media (max-width: 768px) {
236
- .validation-tabs {
237
- padding: 0.375rem 0.5rem;
238
-
239
- &__tabs {
240
- .ant-tabs-tab {
241
- margin-right: 1rem;
242
- font-size: 0.8125rem;
243
- }
244
- }
245
-
246
- &__content {
247
- max-height: 10rem;
248
- }
249
-
250
- &__item-content {
251
- font-size: 0.6875rem;
252
- }
253
- }
254
- }
@@ -1,362 +0,0 @@
1
- /**
2
- * ValidationTabs Component
3
- *
4
- * Displays validation errors in a tabbed interface with 3 categories:
5
- * - HTML issues: General HTML/CSS validation errors and warnings
6
- * - Label issues: Tag syntax errors (open/close tags, attributes, brackets)
7
- * - Liquid issues: Liquid expression errors (only when liquid feature enabled)
8
- */
9
-
10
- import React, { useState, useMemo } from 'react';
11
- import PropTypes from 'prop-types';
12
- import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
13
-
14
- // Cap UI Library
15
- import CapRow from '@capillarytech/cap-ui-library/CapRow';
16
- import CapIcon from '@capillarytech/cap-ui-library/CapIcon';
17
- import CapTab from '@capillarytech/cap-ui-library/CapTab';
18
- import CapTooltip from '@capillarytech/cap-ui-library/CapTooltip';
19
-
20
- // Messages
21
- import messages from './messages';
22
-
23
- // Styles
24
- import './_validationTabs.scss';
25
-
26
- // Constants for issue sources
27
- const ISSUE_SOURCES = {
28
- HTMLHINT: 'htmlhint',
29
- CSS_VALIDATOR: 'css-validator',
30
- CUSTOM: 'custom',
31
- SECURITY: 'security',
32
- LIQUID: 'liquid-validator',
33
- };
34
-
35
- // Label issue patterns - syntax errors related to tags
36
- const LABEL_ISSUE_PATTERNS = [
37
- 'tag must be paired',
38
- 'open tag match failed',
39
- 'closed tag match failed',
40
- 'unclosed',
41
- 'missing required',
42
- 'tag-pair',
43
- 'attr-value-not-empty',
44
- 'attr-no-duplication',
45
- 'tag-self-close',
46
- 'spec-char-escape',
47
- 'tagname-lowercase',
48
- 'attr-lowercase',
49
- 'id-unique',
50
- 'src-not-empty',
51
- 'alt-require',
52
- ];
53
-
54
- /**
55
- * Categorize issues into HTML, Label, and Liquid categories
56
- */
57
- const categorizeIssues = (allIssues) => {
58
- const htmlIssues = [];
59
- const labelIssues = [];
60
- const liquidIssues = [];
61
-
62
- allIssues.forEach((issue) => {
63
- const { source, rule, message } = issue;
64
- const messageLower = (message || '').toLowerCase();
65
- const ruleLower = (rule || '').toLowerCase();
66
-
67
- // Check if it's a Liquid issue - ONLY by source, not by message content
68
- // This prevents false positives where HTML errors mention liquid syntax
69
- if (source === ISSUE_SOURCES.LIQUID) {
70
- liquidIssues.push(issue);
71
- return;
72
- }
73
-
74
- // Check if it's a Label (tag syntax) issue
75
- const isLabelIssue = LABEL_ISSUE_PATTERNS.some(
76
- (pattern) => messageLower.includes(pattern.toLowerCase())
77
- || ruleLower.includes(pattern.toLowerCase()),
78
- );
79
-
80
- if (isLabelIssue) {
81
- labelIssues.push(issue);
82
- return;
83
- }
84
-
85
- // Default to HTML issues
86
- htmlIssues.push(issue);
87
- });
88
-
89
- return { htmlIssues, labelIssues, liquidIssues };
90
- };
91
-
92
- /**
93
- * Get icon based on severity
94
- */
95
- const getSeverityIcon = (severity) => {
96
- if (severity === 'warning') {
97
- return <CapIcon type="alert-warning" className="validation-tabs__icon validation-tabs__icon--warning" />;
98
- }
99
- return <CapIcon type="warning-circle" className="validation-tabs__icon validation-tabs__icon--error" />;
100
- };
101
-
102
- /**
103
- * ValidationTabContent - Renders the content for each tab
104
- */
105
- const ValidationTabContent = ({
106
- issues,
107
- onErrorClick,
108
- intl,
109
- }) => {
110
- if (!issues || issues.length === 0) {
111
- return null;
112
- }
113
-
114
- const handleNavigateClick = (issue, e) => {
115
- e.stopPropagation();
116
- if (onErrorClick && issue.line) {
117
- onErrorClick({
118
- line: issue.line,
119
- column: issue.column || 1,
120
- message: issue.message,
121
- severity: issue.severity,
122
- });
123
- }
124
- };
125
-
126
- return (
127
- <div className="validation-tabs__content">
128
- {issues.map((issue, index) => {
129
- const {
130
- severity, message, line, column, rule,
131
- } = issue;
132
- const key = `${message}-${line}-${column}-${index}`;
133
-
134
- return (
135
- <div
136
- key={key}
137
- className={`validation-tabs__item validation-tabs__item--${severity || 'error'}`}
138
- >
139
- <div className="validation-tabs__item-icon">
140
- {getSeverityIcon(severity)}
141
- </div>
142
- <div className="validation-tabs__item-content">
143
- <span className="validation-tabs__item-message">
144
- {message}
145
- </span>
146
- {line && (
147
- <span className="validation-tabs__item-location">
148
- <FormattedMessage
149
- {...messages.lineChar}
150
- values={{ line, char: column || 1 }}
151
- />
152
- </span>
153
- )}
154
- </div>
155
- {line && (
156
- <CapTooltip title={`Line ${line}, Char ${column || 1}`}>
157
- <button
158
- type="button"
159
- className="validation-tabs__item-navigate"
160
- onClick={(e) => handleNavigateClick(issue, e)}
161
- aria-label={`Line ${line}, Char ${column || 1}`}
162
- >
163
- <CapIcon type="redirection" />
164
- </button>
165
- </CapTooltip>
166
- )}
167
- </div>
168
- );
169
- })}
170
- </div>
171
- );
172
- };
173
-
174
- ValidationTabContent.propTypes = {
175
- issues: PropTypes.array,
176
- onErrorClick: PropTypes.func,
177
- intl: intlShape.isRequired,
178
- };
179
-
180
- ValidationTabContent.defaultProps = {
181
- issues: [],
182
- onErrorClick: null,
183
- };
184
-
185
- /**
186
- * ValidationTabs Component
187
- */
188
- const ValidationTabs = ({
189
- intl,
190
- validation,
191
- onErrorClick,
192
- onClose,
193
- isLiquidEnabled,
194
- className,
195
- }) => {
196
- const [activeKey, setActiveKey] = useState(null);
197
-
198
- // Categorize issues
199
- const { htmlIssues, labelIssues, liquidIssues } = useMemo(() => {
200
- if (!validation) {
201
- return { htmlIssues: [], labelIssues: [], liquidIssues: [] };
202
- }
203
-
204
- // Get all issues from validation
205
- const allIssues = validation.getAllIssues ? validation.getAllIssues() : [];
206
- const categorized = categorizeIssues(allIssues);
207
- return categorized;
208
- }, [validation]);
209
-
210
- // Calculate counts
211
- const htmlCount = htmlIssues.length;
212
- const labelCount = labelIssues.length;
213
- const liquidCount = liquidIssues.length;
214
- const totalCount = htmlCount + labelCount + (isLiquidEnabled ? liquidCount : 0);
215
-
216
- // Set default active key when issues change
217
- useMemo(() => {
218
- if (htmlCount > 0 && !activeKey) {
219
- setActiveKey('html');
220
- } else if (labelCount > 0 && !activeKey) {
221
- setActiveKey('label');
222
- } else if (liquidCount > 0 && isLiquidEnabled && !activeKey) {
223
- setActiveKey('liquid');
224
- }
225
- }, [htmlCount, labelCount, liquidCount, isLiquidEnabled, activeKey]);
226
-
227
- // Don't render if no issues
228
- if (totalCount === 0) {
229
- return null;
230
- }
231
-
232
- // Build tab panes (CapTab uses 'panes' with 'tab' and 'content' properties)
233
- const tabPanes = [];
234
-
235
- if (htmlCount > 0) {
236
- tabPanes.push({
237
- key: 'html',
238
- tab: (
239
- <CapTooltip title={`${intl.formatMessage(messages.htmlIssues)} (${htmlCount})`}>
240
- <span className="validation-tabs__tab-label">
241
- <FormattedMessage {...messages.htmlIssues} />
242
- <span className="validation-tabs__tab-count">
243
- (
244
- {htmlCount}
245
- )
246
- </span>
247
- </span>
248
- </CapTooltip>
249
- ),
250
- content: (
251
- <ValidationTabContent
252
- issues={htmlIssues}
253
- onErrorClick={onErrorClick}
254
- intl={intl}
255
- />
256
- ),
257
- });
258
- }
259
-
260
- if (labelCount > 0) {
261
- tabPanes.push({
262
- key: 'label',
263
- tab: (
264
- <CapTooltip title={`${intl.formatMessage(messages.labelIssues)} (${labelCount})`}>
265
- <span className="validation-tabs__tab-label">
266
- <FormattedMessage {...messages.labelIssues} />
267
- <span className="validation-tabs__tab-count">
268
- (
269
- {labelCount}
270
- )
271
- </span>
272
- </span>
273
- </CapTooltip>
274
- ),
275
- content: (
276
- <ValidationTabContent
277
- issues={labelIssues}
278
- onErrorClick={onErrorClick}
279
- intl={intl}
280
- />
281
- ),
282
- });
283
- }
284
-
285
- if (isLiquidEnabled && liquidCount > 0) {
286
- tabPanes.push({
287
- key: 'liquid',
288
- tab: (
289
- <CapTooltip title={`${intl.formatMessage(messages.liquidIssues)} (${liquidCount})`}>
290
- <span className="validation-tabs__tab-label">
291
- <FormattedMessage {...messages.liquidIssues} />
292
- <span className="validation-tabs__tab-count">
293
- (
294
- {liquidCount}
295
- )
296
- </span>
297
- </span>
298
- </CapTooltip>
299
- ),
300
- content: (
301
- <ValidationTabContent
302
- issues={liquidIssues}
303
- onErrorClick={onErrorClick}
304
- intl={intl}
305
- />
306
- ),
307
- });
308
- }
309
-
310
- // Handle close
311
- const handleClose = () => {
312
- if (onClose) {
313
- onClose();
314
- }
315
- };
316
-
317
- return (
318
- <div className={`validation-tabs ${className || ''}`}>
319
- <CapRow className="validation-tabs__header">
320
- <CapTab
321
- activeKey={activeKey || (tabPanes[0]?.key)}
322
- onChange={setActiveKey}
323
- panes={tabPanes}
324
- className="validation-tabs__tabs"
325
- />
326
- <CapRow className="validation-tabs__actions">
327
- <CapTooltip title={intl.formatMessage(messages.closePanel)}>
328
- <button
329
- type="button"
330
- className="validation-tabs__close"
331
- onClick={handleClose}
332
- aria-label={intl.formatMessage(messages.closePanel)}
333
- >
334
- <CapIcon type="close" />
335
- </button>
336
- </CapTooltip>
337
- </CapRow>
338
- </CapRow>
339
- </div>
340
- );
341
- };
342
-
343
- ValidationTabs.propTypes = {
344
- intl: intlShape.isRequired,
345
- validation: PropTypes.shape({
346
- getAllIssues: PropTypes.func,
347
- }),
348
- onErrorClick: PropTypes.func,
349
- onClose: PropTypes.func,
350
- isLiquidEnabled: PropTypes.bool,
351
- className: PropTypes.string,
352
- };
353
-
354
- ValidationTabs.defaultProps = {
355
- validation: null,
356
- onErrorClick: null,
357
- onClose: null,
358
- isLiquidEnabled: false,
359
- className: '',
360
- };
361
-
362
- export default injectIntl(ValidationTabs);
@@ -1,51 +0,0 @@
1
- /**
2
- * ValidationTabs Messages
3
- *
4
- * Internationalization messages for the ValidationTabs component
5
- */
6
-
7
- import { defineMessages } from 'react-intl';
8
-
9
- const scope = 'app.components.HtmlEditor.ValidationTabs';
10
-
11
- export default defineMessages({
12
- // Tab labels
13
- htmlIssues: {
14
- id: `${scope}.htmlIssues`,
15
- defaultMessage: 'HTML issues',
16
- },
17
- labelIssues: {
18
- id: `${scope}.labelIssues`,
19
- defaultMessage: 'Label issues',
20
- },
21
- liquidIssues: {
22
- id: `${scope}.liquidIssues`,
23
- defaultMessage: 'Liquid issues',
24
- },
25
-
26
- // Error item labels
27
- syntaxError: {
28
- id: `${scope}.syntaxError`,
29
- defaultMessage: 'Syntax Error',
30
- },
31
- lineChar: {
32
- id: `${scope}.lineChar`,
33
- defaultMessage: 'Line {line}, Char {char}.',
34
- },
35
-
36
- // Tooltips
37
- navigateToError: {
38
- id: `${scope}.navigateToError`,
39
- defaultMessage: 'Go to error location',
40
- },
41
- closePanel: {
42
- id: `${scope}.closePanel`,
43
- defaultMessage: 'Close validation panel',
44
- },
45
-
46
- // Liquid documentation
47
- liquidDocumentation: {
48
- id: `${scope}.liquidDocumentation`,
49
- defaultMessage: 'Liquid documentation',
50
- },
51
- });
@@ -1,10 +0,0 @@
1
- export const BEE_LAYOUT_OPTIONS = {
2
- POPUP: "classic-center",
3
- HEADER: "bar-top",
4
- FOOTER: "bar-bottom",
5
- FULLSCREEN: "classic-center",
6
- };
7
- export const MOBILE = "mobile";
8
- export const UNSUBSCRIBE = 'unsubscribe';
9
- export const ANDROID = 'ANDROID';
10
- export const IOS = 'IOS';