@capillarytech/creatives-library 8.0.242-alpha.10 → 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 (256) 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 +91 -220
  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 +45 -107
  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/_editorToolbar.scss +0 -9
  41. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  42. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  47. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  48. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  49. package/v2Components/HtmlEditor/components/PreviewPane/index.js +11 -10
  50. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +72 -70
  52. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  53. package/v2Components/HtmlEditor/constants.js +20 -29
  54. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  55. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  56. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  57. package/v2Components/HtmlEditor/index.js +1 -1
  58. package/v2Components/HtmlEditor/messages.js +85 -95
  59. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +101 -99
  60. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  61. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -34
  62. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  63. package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
  64. package/v2Components/TemplatePreview/index.js +32 -47
  65. package/v2Components/TemplatePreview/messages.js +0 -4
  66. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  67. package/v2Containers/App/constants.js +5 -0
  68. package/v2Containers/BeeEditor/index.js +80 -82
  69. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
  70. package/v2Containers/CreativesContainer/SlideBoxContent.js +118 -148
  71. package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
  72. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  73. package/v2Containers/CreativesContainer/constants.js +2 -1
  74. package/v2Containers/CreativesContainer/index.js +41 -173
  75. package/v2Containers/CreativesContainer/messages.js +4 -4
  76. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
  77. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
  78. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -36
  79. package/v2Containers/Email/actions.js +0 -7
  80. package/v2Containers/Email/constants.js +1 -5
  81. package/v2Containers/Email/index.js +0 -13
  82. package/v2Containers/Email/messages.js +0 -32
  83. package/v2Containers/Email/reducer.js +1 -12
  84. package/v2Containers/Email/sagas.js +6 -41
  85. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  86. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
  87. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  88. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  89. package/v2Containers/EmailWrapper/constants.js +0 -2
  90. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +67 -436
  91. package/v2Containers/EmailWrapper/index.js +23 -99
  92. package/v2Containers/EmailWrapper/messages.js +1 -61
  93. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  94. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -111
  95. package/v2Containers/InApp/actions.js +0 -7
  96. package/v2Containers/InApp/constants.js +4 -20
  97. package/v2Containers/InApp/index.js +357 -801
  98. package/v2Containers/InApp/index.scss +3 -4
  99. package/v2Containers/InApp/messages.js +3 -7
  100. package/v2Containers/InApp/reducer.js +3 -21
  101. package/v2Containers/InApp/sagas.js +9 -29
  102. package/v2Containers/InApp/selectors.js +5 -25
  103. package/v2Containers/InApp/tests/index.test.js +50 -154
  104. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  105. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  106. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +12 -12
  107. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  108. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
  109. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
  110. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +184 -150
  111. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
  112. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +32 -28
  113. package/v2Containers/TagList/index.js +1 -67
  114. package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
  115. package/v2Containers/Templates/_templates.scss +202 -56
  116. package/v2Containers/Templates/actions.js +2 -1
  117. package/v2Containers/Templates/constants.js +1 -0
  118. package/v2Containers/Templates/index.js +278 -128
  119. package/v2Containers/Templates/messages.js +24 -4
  120. package/v2Containers/Templates/reducer.js +2 -0
  121. package/v2Containers/Templates/tests/index.test.js +10 -0
  122. package/v2Containers/TemplatesV2/index.js +8 -1
  123. package/v2Containers/TemplatesV2/messages.js +4 -0
  124. package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
  125. package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
  126. package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
  127. package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
  128. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
  129. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
  130. package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
  131. package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
  132. package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
  133. package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
  134. package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
  135. package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
  136. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
  137. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
  138. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
  139. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
  140. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
  141. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
  142. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
  143. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
  144. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
  145. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
  146. package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
  147. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
  148. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
  149. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
  150. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
  151. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
  152. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
  153. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
  154. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
  155. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
  156. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
  157. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
  158. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
  159. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
  160. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
  161. package/v2Containers/WebPush/Create/index.js +1056 -0
  162. package/v2Containers/WebPush/Create/index.scss +134 -0
  163. package/v2Containers/WebPush/Create/messages.js +203 -0
  164. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
  165. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
  166. package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
  167. package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
  168. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
  169. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +150 -0
  170. package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
  171. package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
  172. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
  173. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
  174. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  175. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  176. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
  177. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
  178. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
  179. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
  180. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
  181. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
  182. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
  183. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
  184. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
  185. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
  186. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
  187. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
  188. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
  189. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
  190. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
  191. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
  192. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
  193. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
  194. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
  195. package/v2Containers/WebPush/Create/preview/constants.js +637 -0
  196. package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
  197. package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
  198. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
  199. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
  200. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
  201. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
  202. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
  203. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
  204. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
  205. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
  206. package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
  207. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
  208. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
  209. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
  210. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
  211. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
  212. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
  213. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
  214. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +943 -0
  215. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
  216. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
  217. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
  218. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
  219. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +94 -0
  220. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +390 -0
  221. package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
  222. package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
  223. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
  224. package/v2Containers/WebPush/Create/utils/validation.js +75 -0
  225. package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
  226. package/v2Containers/WebPush/actions.js +60 -0
  227. package/v2Containers/WebPush/constants.js +128 -0
  228. package/v2Containers/WebPush/index.js +2 -0
  229. package/v2Containers/WebPush/reducer.js +104 -0
  230. package/v2Containers/WebPush/sagas.js +119 -0
  231. package/v2Containers/WebPush/selectors.js +65 -0
  232. package/v2Containers/WebPush/tests/reducer.test.js +863 -0
  233. package/v2Containers/WebPush/tests/sagas.test.js +566 -0
  234. package/v2Containers/WebPush/tests/selectors.test.js +843 -0
  235. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +528 -431
  236. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  237. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -362
  238. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  239. package/v2Containers/BeePopupEditor/constants.js +0 -10
  240. package/v2Containers/BeePopupEditor/index.js +0 -193
  241. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  242. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1046
  243. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  244. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  245. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  246. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
  247. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  248. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
  249. package/v2Containers/InAppWrapper/constants.js +0 -16
  250. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  251. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  252. package/v2Containers/InAppWrapper/index.js +0 -148
  253. package/v2Containers/InAppWrapper/messages.js +0 -49
  254. package/v2Containers/InappAdvance/index.js +0 -1099
  255. package/v2Containers/InappAdvance/index.scss +0 -10
  256. 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';