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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +2 -1
  4. package/initialReducer.js +2 -0
  5. package/package.json +1 -1
  6. package/sagas/__tests__/assetPolling.test.js +74 -3
  7. package/sagas/assetPolling.js +8 -1
  8. package/services/api.js +10 -5
  9. package/services/tests/api.test.js +18 -0
  10. package/translations/en.json +0 -1
  11. package/utils/common.js +5 -0
  12. package/utils/commonUtils.js +14 -1
  13. package/utils/tests/commonUtil.test.js +224 -0
  14. package/utils/transformTemplateConfig.js +0 -10
  15. package/utils/transformerUtils.js +0 -42
  16. package/v2Components/CapDeviceContent/index.js +61 -56
  17. package/v2Components/CapImageUpload/constants.js +0 -2
  18. package/v2Components/CapImageUpload/index.js +14 -54
  19. package/v2Components/CapImageUpload/index.scss +1 -4
  20. package/v2Components/CapImageUpload/messages.js +0 -4
  21. package/v2Components/CapTagList/index.js +6 -1
  22. package/v2Components/CapTagListWithInput/index.js +5 -1
  23. package/v2Components/CapTagListWithInput/messages.js +1 -1
  24. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  25. package/v2Components/ErrorInfoNote/index.js +412 -72
  26. package/v2Components/ErrorInfoNote/messages.js +22 -0
  27. package/v2Components/ErrorInfoNote/style.scss +279 -2
  28. package/v2Components/HtmlEditor/HTMLEditor.js +210 -89
  29. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
  30. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
  31. package/v2Components/HtmlEditor/_htmlEditor.scss +8 -23
  32. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  33. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
  34. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
  35. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
  36. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  37. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  38. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +1 -0
  39. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  40. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  41. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  44. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
  45. package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
  46. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  47. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +87 -62
  48. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
  49. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
  50. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
  51. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  52. package/v2Components/HtmlEditor/constants.js +29 -20
  53. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  54. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  55. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  56. package/v2Components/HtmlEditor/index.js +1 -1
  57. package/v2Components/HtmlEditor/messages.js +95 -85
  58. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
  59. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  60. package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
  61. package/v2Components/MobilePushPreviewV2/index.js +32 -7
  62. package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
  63. package/v2Components/TemplatePreview/index.js +47 -32
  64. package/v2Components/TemplatePreview/messages.js +4 -0
  65. package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
  66. package/v2Containers/App/constants.js +0 -5
  67. package/v2Containers/BeeEditor/index.js +82 -80
  68. package/v2Containers/BeePopupEditor/constants.js +10 -0
  69. package/v2Containers/BeePopupEditor/index.js +193 -0
  70. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  71. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
  72. package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
  73. package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
  74. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  75. package/v2Containers/CreativesContainer/constants.js +1 -2
  76. package/v2Containers/CreativesContainer/index.js +173 -193
  77. package/v2Containers/CreativesContainer/messages.js +4 -4
  78. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
  79. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
  80. package/v2Containers/Email/actions.js +7 -0
  81. package/v2Containers/Email/constants.js +5 -1
  82. package/v2Containers/Email/index.js +13 -0
  83. package/v2Containers/Email/messages.js +32 -0
  84. package/v2Containers/Email/reducer.js +12 -1
  85. package/v2Containers/Email/sagas.js +41 -6
  86. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  87. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1045 -0
  88. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
  89. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  90. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  91. package/v2Containers/EmailWrapper/constants.js +2 -0
  92. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
  93. package/v2Containers/EmailWrapper/index.js +99 -23
  94. package/v2Containers/EmailWrapper/messages.js +61 -1
  95. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +26 -1
  96. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
  97. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  98. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  99. package/v2Containers/InApp/actions.js +7 -0
  100. package/v2Containers/InApp/constants.js +20 -4
  101. package/v2Containers/InApp/index.js +800 -357
  102. package/v2Containers/InApp/index.scss +4 -3
  103. package/v2Containers/InApp/messages.js +7 -3
  104. package/v2Containers/InApp/reducer.js +21 -3
  105. package/v2Containers/InApp/sagas.js +29 -9
  106. package/v2Containers/InApp/selectors.js +25 -5
  107. package/v2Containers/InApp/tests/index.test.js +154 -50
  108. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  109. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  110. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  111. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
  112. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  113. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
  114. package/v2Containers/InAppWrapper/constants.js +16 -0
  115. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  116. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  117. package/v2Containers/InAppWrapper/index.js +148 -0
  118. package/v2Containers/InAppWrapper/messages.js +49 -0
  119. package/v2Containers/InappAdvance/index.js +1099 -0
  120. package/v2Containers/InappAdvance/index.scss +10 -0
  121. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  122. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -3
  123. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
  124. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
  125. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
  126. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
  127. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
  128. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
  129. package/v2Containers/TagList/index.js +67 -1
  130. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  131. package/v2Containers/Templates/_templates.scss +56 -200
  132. package/v2Containers/Templates/actions.js +1 -2
  133. package/v2Containers/Templates/constants.js +0 -1
  134. package/v2Containers/Templates/index.js +124 -277
  135. package/v2Containers/Templates/messages.js +4 -24
  136. package/v2Containers/Templates/reducer.js +0 -2
  137. package/v2Containers/Templates/tests/index.test.js +0 -10
  138. package/v2Containers/TemplatesV2/index.js +2 -3
  139. package/v2Containers/TemplatesV2/messages.js +0 -4
  140. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
  141. package/v2Components/CapImageUrlUpload/constants.js +0 -19
  142. package/v2Components/CapImageUrlUpload/index.js +0 -455
  143. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  144. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  145. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
  146. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  147. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
  148. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  149. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  150. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  151. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  152. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  153. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  154. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
  155. package/v2Containers/WebPush/Create/index.js +0 -1755
  156. package/v2Containers/WebPush/Create/index.scss +0 -123
  157. package/v2Containers/WebPush/Create/messages.js +0 -199
  158. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
  159. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
  160. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
  161. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
  162. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  163. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
  164. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  165. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  166. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  167. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  168. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  169. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  170. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  171. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  172. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
  173. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
  174. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  175. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
  176. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
  177. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
  178. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
  179. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
  180. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
  181. package/v2Containers/WebPush/Create/preview/constants.js +0 -162
  182. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
  183. package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
  184. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
  185. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  186. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  187. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  188. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
  189. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  190. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  191. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  192. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
  193. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
  194. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  195. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
  196. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
  197. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  198. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
  199. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  200. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
  201. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
  202. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
  203. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  204. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
  205. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
  206. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  207. package/v2Containers/WebPush/actions.js +0 -60
  208. package/v2Containers/WebPush/constants.js +0 -108
  209. package/v2Containers/WebPush/index.js +0 -2
  210. package/v2Containers/WebPush/reducer.js +0 -104
  211. package/v2Containers/WebPush/sagas.js +0 -119
  212. package/v2Containers/WebPush/selectors.js +0 -65
  213. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  214. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  215. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -9,13 +9,13 @@ import { render, screen } from '@testing-library/react';
9
9
  import '@testing-library/jest-dom';
10
10
  import { DEVICE_TYPES } from '../../../constants';
11
11
 
12
+ // Import after mocking
13
+ import DeviceFrame from '../DeviceFrame';
14
+
12
15
  // Mock the entire DeviceFrame module to bypass image import issues
13
16
  jest.mock('../../../../assets/Android.png', () => 'mocked-android-frame.png');
14
17
  jest.mock('../../../../assets/iOS.png', () => 'mocked-ios-frame.png');
15
18
 
16
- // Import after mocking
17
- import DeviceFrame from '../DeviceFrame';
18
-
19
19
  describe('DeviceFrame', () => {
20
20
  describe('Basic Rendering', () => {
21
21
  it('renders without crashing', () => {
@@ -26,7 +26,7 @@ describe('DeviceFrame', () => {
26
26
  it('renders with default props', () => {
27
27
  const { container } = render(<DeviceFrame />);
28
28
  const frame = container.firstChild;
29
-
29
+
30
30
  expect(frame).toHaveClass('device-frame');
31
31
  expect(frame).toHaveClass('device-frame--android'); // Default device
32
32
  });
@@ -37,7 +37,7 @@ describe('DeviceFrame', () => {
37
37
  <div data-testid="child-content">Test Content</div>
38
38
  </DeviceFrame>
39
39
  );
40
-
40
+
41
41
  expect(screen.getByTestId('child-content')).toBeInTheDocument();
42
42
  expect(screen.getByTestId('child-content')).toHaveTextContent('Test Content');
43
43
  });
@@ -50,7 +50,7 @@ describe('DeviceFrame', () => {
50
50
  <div data-testid="child-3">Child 3</div>
51
51
  </DeviceFrame>
52
52
  );
53
-
53
+
54
54
  expect(screen.getByTestId('child-1')).toBeInTheDocument();
55
55
  expect(screen.getByTestId('child-2')).toBeInTheDocument();
56
56
  expect(screen.getByTestId('child-3')).toBeInTheDocument();
@@ -61,7 +61,7 @@ describe('DeviceFrame', () => {
61
61
  it('renders Android frame correctly', () => {
62
62
  const { container } = render(<DeviceFrame device={DEVICE_TYPES.ANDROID} />);
63
63
  const frame = container.firstChild;
64
-
64
+
65
65
  expect(frame).toHaveClass('device-frame--android');
66
66
  expect(frame.style.backgroundImage).toBeTruthy();
67
67
  expect(frame.style.backgroundImage).toMatch(/url\(/);
@@ -70,7 +70,7 @@ describe('DeviceFrame', () => {
70
70
  it('renders iOS frame correctly', () => {
71
71
  const { container } = render(<DeviceFrame device={DEVICE_TYPES.IOS} />);
72
72
  const frame = container.firstChild;
73
-
73
+
74
74
  expect(frame).toHaveClass('device-frame--ios');
75
75
  expect(frame.style.backgroundImage).toBeTruthy();
76
76
  expect(frame.style.backgroundImage).toMatch(/url\(/);
@@ -79,7 +79,7 @@ describe('DeviceFrame', () => {
79
79
  it('defaults to Android when no device specified', () => {
80
80
  const { container } = render(<DeviceFrame />);
81
81
  const frame = container.firstChild;
82
-
82
+
83
83
  expect(frame).toHaveClass('device-frame--android');
84
84
  expect(frame.style.backgroundImage).toBeTruthy();
85
85
  expect(frame.style.backgroundImage).toMatch(/url\(/);
@@ -102,7 +102,7 @@ describe('DeviceFrame', () => {
102
102
  it('applies correct dimensions', () => {
103
103
  const { container } = render(<DeviceFrame />);
104
104
  const frame = container.firstChild;
105
-
105
+
106
106
  expect(frame.style.width).toBe('450px');
107
107
  expect(frame.style.height).toBe('920px');
108
108
  });
@@ -117,7 +117,7 @@ describe('DeviceFrame', () => {
117
117
  <DeviceFrame device={DEVICE_TYPES.IOS} />
118
118
  );
119
119
  const iosFrame = iosContainer.firstChild;
120
-
120
+
121
121
  expect(androidFrame.style.width).toBe(iosFrame.style.width);
122
122
  expect(androidFrame.style.height).toBe(iosFrame.style.height);
123
123
  });
@@ -125,7 +125,7 @@ describe('DeviceFrame', () => {
125
125
  it('applies background styles correctly', () => {
126
126
  const { container } = render(<DeviceFrame />);
127
127
  const frame = container.firstChild;
128
-
128
+
129
129
  expect(frame.style.position).toBe('relative');
130
130
  expect(frame.style.display).toBe('inline-block');
131
131
  expect(frame.style.backgroundRepeat).toBe('no-repeat');
@@ -133,19 +133,10 @@ describe('DeviceFrame', () => {
133
133
  expect(frame.style.backgroundSize).toBe('contain');
134
134
  });
135
135
 
136
- it('applies drop-shadow filter', () => {
137
- const { container } = render(<DeviceFrame />);
138
- const frame = container.firstChild;
139
-
140
- expect(frame.style.filter).toContain('drop-shadow');
141
- expect(frame.style.filter).toContain('brightness');
142
- expect(frame.style.filter).toContain('contrast');
143
- });
144
-
145
136
  it('sets correct background image for Android', () => {
146
137
  const { container } = render(<DeviceFrame device={DEVICE_TYPES.ANDROID} />);
147
138
  const frame = container.firstChild;
148
-
139
+
149
140
  // Verify background image is set (actual mock value may vary)
150
141
  expect(frame.style.backgroundImage).toBeTruthy();
151
142
  expect(frame.style.backgroundImage).toMatch(/^url\(.+\)$/);
@@ -154,7 +145,7 @@ describe('DeviceFrame', () => {
154
145
  it('sets correct background image for iOS', () => {
155
146
  const { container } = render(<DeviceFrame device={DEVICE_TYPES.IOS} />);
156
147
  const frame = container.firstChild;
157
-
148
+
158
149
  // Verify background image is set (actual mock value may vary)
159
150
  expect(frame.style.backgroundImage).toBeTruthy();
160
151
  expect(frame.style.backgroundImage).toMatch(/^url\(.+\)$/);
@@ -165,7 +156,7 @@ describe('DeviceFrame', () => {
165
156
  it('accepts and applies custom className', () => {
166
157
  const { container } = render(<DeviceFrame className="custom-frame" />);
167
158
  const frame = container.firstChild;
168
-
159
+
169
160
  expect(frame).toHaveClass('custom-frame');
170
161
  expect(frame).toHaveClass('device-frame'); // Base class still present
171
162
  });
@@ -175,7 +166,7 @@ describe('DeviceFrame', () => {
175
166
  <DeviceFrame className="custom-class another-class" />
176
167
  );
177
168
  const frame = container.firstChild;
178
-
169
+
179
170
  expect(frame).toHaveClass('custom-class');
180
171
  expect(frame).toHaveClass('another-class');
181
172
  expect(frame).toHaveClass('device-frame');
@@ -186,7 +177,7 @@ describe('DeviceFrame', () => {
186
177
  <DeviceFrame data-testid="custom-frame" aria-label="Device Preview" />
187
178
  );
188
179
  const frame = container.firstChild;
189
-
180
+
190
181
  expect(frame).toHaveAttribute('data-testid', 'custom-frame');
191
182
  expect(frame).toHaveAttribute('aria-label', 'Device Preview');
192
183
  });
@@ -195,7 +186,7 @@ describe('DeviceFrame', () => {
195
186
  const handleClick = jest.fn();
196
187
  const { container } = render(<DeviceFrame onClick={handleClick} />);
197
188
  const frame = container.firstChild;
198
-
189
+
199
190
  frame.click();
200
191
  expect(handleClick).toHaveBeenCalledTimes(1);
201
192
  });
@@ -204,7 +195,7 @@ describe('DeviceFrame', () => {
204
195
  const customStyle = { border: '2px solid red' };
205
196
  const { container } = render(<DeviceFrame style={customStyle} />);
206
197
  const frame = container.firstChild;
207
-
198
+
208
199
  // Note: inline styles from props override component styles
209
200
  expect(frame.style.border).toBe('2px solid red');
210
201
  });
@@ -270,7 +261,7 @@ describe('DeviceFrame', () => {
270
261
  it('renders with empty string className', () => {
271
262
  const { container } = render(<DeviceFrame className="" />);
272
263
  const frame = container.firstChild;
273
-
264
+
274
265
  expect(frame).toHaveClass('device-frame');
275
266
  });
276
267
 
@@ -283,7 +274,7 @@ describe('DeviceFrame', () => {
283
274
  </>
284
275
  </DeviceFrame>
285
276
  );
286
-
277
+
287
278
  expect(screen.getByTestId('fragment-child-1')).toBeInTheDocument();
288
279
  expect(screen.getByTestId('fragment-child-2')).toBeInTheDocument();
289
280
  });
@@ -298,7 +289,7 @@ describe('DeviceFrame', () => {
298
289
  </div>
299
290
  </DeviceFrame>
300
291
  );
301
-
292
+
302
293
  expect(screen.getByTestId('nested-child')).toBeInTheDocument();
303
294
  });
304
295
  });
@@ -306,7 +297,7 @@ describe('DeviceFrame', () => {
306
297
  describe('Component Structure', () => {
307
298
  it('renders a single root div element', () => {
308
299
  const { container } = render(<DeviceFrame />);
309
-
300
+
310
301
  expect(container.firstChild.tagName).toBe('DIV');
311
302
  expect(container.children).toHaveLength(1);
312
303
  });
@@ -316,8 +307,8 @@ describe('DeviceFrame', () => {
316
307
  <DeviceFrame device={DEVICE_TYPES.ANDROID} className="custom" />
317
308
  );
318
309
  const androidFrame = androidContainer.firstChild;
319
-
320
- const classes = androidFrame.className.split(' ').filter(c => c);
310
+
311
+ const classes = androidFrame.className.split(' ').filter((c) => c);
321
312
  expect(classes).toContain('device-frame');
322
313
  expect(classes).toContain('device-frame--android');
323
314
  expect(classes).toContain('custom');
@@ -326,7 +317,7 @@ describe('DeviceFrame', () => {
326
317
  it('applies styles as inline styles object', () => {
327
318
  const { container } = render(<DeviceFrame />);
328
319
  const frame = container.firstChild;
329
-
320
+
330
321
  // Verify style is an object
331
322
  expect(typeof frame.style).toBe('object');
332
323
  expect(frame.style).not.toBeNull();
@@ -343,7 +334,7 @@ describe('DeviceFrame', () => {
343
334
  />
344
335
  );
345
336
  const frame = container.firstChild;
346
-
337
+
347
338
  expect(frame).toHaveAttribute('role', 'img');
348
339
  expect(frame).toHaveAttribute('aria-label', 'Mobile Device Preview');
349
340
  expect(frame).toHaveAttribute('aria-describedby', 'device-description');
@@ -358,7 +349,7 @@ describe('DeviceFrame', () => {
358
349
  />
359
350
  );
360
351
  const frame = container.firstChild;
361
-
352
+
362
353
  expect(frame).toHaveAttribute('data-device', 'android');
363
354
  expect(frame).toHaveAttribute('data-testid', 'device-frame');
364
355
  expect(frame).toHaveAttribute('data-analytics', 'preview-frame');
@@ -378,7 +369,7 @@ describe('DeviceFrame', () => {
378
369
  </div>
379
370
  </DeviceFrame>
380
371
  );
381
-
372
+
382
373
  expect(screen.getByTestId('preview-iframe')).toBeInTheDocument();
383
374
  });
384
375
 
@@ -388,16 +379,16 @@ describe('DeviceFrame', () => {
388
379
  <div data-testid="content">Content</div>
389
380
  </DeviceFrame>
390
381
  );
391
-
382
+
392
383
  expect(container.firstChild).toHaveClass('device-frame--android');
393
384
  expect(screen.getByTestId('content')).toBeInTheDocument();
394
-
385
+
395
386
  rerender(
396
387
  <DeviceFrame device={DEVICE_TYPES.IOS}>
397
388
  <div data-testid="content">Content</div>
398
389
  </DeviceFrame>
399
390
  );
400
-
391
+
401
392
  expect(container.firstChild).toHaveClass('device-frame--ios');
402
393
  expect(screen.getByTestId('content')).toBeInTheDocument();
403
394
  });
@@ -408,17 +399,16 @@ describe('DeviceFrame', () => {
408
399
  <div data-testid="dynamic-content">Initial</div>
409
400
  </DeviceFrame>
410
401
  );
411
-
402
+
412
403
  expect(screen.getByTestId('dynamic-content')).toHaveTextContent('Initial');
413
-
404
+
414
405
  rerender(
415
406
  <DeviceFrame>
416
407
  <div data-testid="dynamic-content">Updated</div>
417
408
  </DeviceFrame>
418
409
  );
419
-
410
+
420
411
  expect(screen.getByTestId('dynamic-content')).toHaveTextContent('Updated');
421
412
  });
422
413
  });
423
414
  });
424
-
@@ -24,7 +24,7 @@ $empty-state-meta-opacity: 0.7;
24
24
  .inapp-preview-pane {
25
25
  height: 100%;
26
26
  position: relative;
27
- background-color: $CAP_G08;
27
+ background-color: $CAP_G07;
28
28
  background-image: radial-gradient(circle at 50% 50%, rgba($CAP_WHITE, 0.1) 0%, transparent 70%);
29
29
  display: flex;
30
30
  flex-direction: column;
@@ -123,11 +123,9 @@ $empty-state-meta-opacity: 0.7;
123
123
  .device-frame {
124
124
  position: relative;
125
125
  display: inline-block;
126
- filter: drop-shadow(0 0.75rem 3rem rgba($CAP_G01, 0.25));
127
126
  transition: all 0.3s ease-in-out;
128
127
 
129
128
  &:hover {
130
- filter: drop-shadow(0 1rem 3.5rem rgba($CAP_G01, 0.3));
131
129
  transform: translateY(-0.125rem);
132
130
  }
133
131
 
@@ -6,55 +6,55 @@ export const LAYOUT_TYPES = {
6
6
  MODAL: 'POPUP',
7
7
  HEADER: 'HEADER',
8
8
  FOOTER: 'FOOTER',
9
- FULLSCREEN: 'FULLSCREEN'
9
+ FULLSCREEN: 'FULLSCREEN',
10
10
  };
11
11
 
12
12
  export const LAYOUT_OPTIONS = [
13
13
  {
14
14
  value: LAYOUT_TYPES.MODAL,
15
15
  label: 'Modal',
16
- description: 'Content displayed in center like a modal dialog'
16
+ description: 'Content displayed in center like a modal dialog',
17
17
  },
18
18
  {
19
19
  value: LAYOUT_TYPES.HEADER,
20
20
  label: 'Top Banner',
21
- description: 'Content displayed at the top of the screen'
21
+ description: 'Content displayed at the top of the screen',
22
22
  },
23
23
  {
24
24
  value: LAYOUT_TYPES.FOOTER,
25
25
  label: 'Bottom Banner',
26
- description: 'Content displayed at the bottom of the screen'
26
+ description: 'Content displayed at the bottom of the screen',
27
27
  },
28
28
  {
29
29
  value: LAYOUT_TYPES.FULLSCREEN,
30
30
  label: 'Fullscreen',
31
- description: 'Content covers the entire screen'
32
- }
31
+ description: 'Content covers the entire screen',
32
+ },
33
33
  ];
34
34
 
35
35
  export const COMPONENT_SIZES = ['small', 'middle', 'large'];
36
36
 
37
37
  export const DEVICE_FRAMES = {
38
38
  ANDROID: 'android-frame.svg',
39
- IOS: 'ios-frame.svg'
39
+ IOS: 'ios-frame.svg',
40
40
  };
41
41
 
42
42
  // Screen area dimensions within device frames (accounting for PNG bezels)
43
43
  export const DEVICE_SCREEN_AREAS = {
44
44
  IOS: {
45
45
  // iOS screen area within 450x920 frame - accurate values for PNG asset
46
- top: '85px', // Top bezel including notch area
47
- left: '35px', // Side bezel width
48
- width: '380px', // Actual screen width within bezels
49
- height: '710px' // Actual screen height within bezels
46
+ top: '85px', // Top bezel including notch area
47
+ left: '35px', // Side bezel width
48
+ width: '380px', // Actual screen width within bezels
49
+ height: '710px', // Actual screen height within bezels
50
50
  },
51
51
  ANDROID: {
52
52
  // Android screen area within 450x920 frame - accurate values for PNG asset
53
- top: '85px', // Top bezel including status bar
54
- left: '35px', // Side bezel width (same as iOS for consistency)
55
- width: '380px', // Actual screen width within bezels
56
- height: '710px' // Actual screen height within bezels
57
- }
53
+ top: '85px', // Top bezel including status bar
54
+ left: '35px', // Side bezel width (same as iOS for consistency)
55
+ width: '380px', // Actual screen width within bezels
56
+ height: '710px', // Actual screen height within bezels
57
+ },
58
58
  };
59
59
 
60
60
  // Content positioning configurations within the screen area (not the full frame)
@@ -63,42 +63,42 @@ export const LAYOUT_POSITIONS = {
63
63
  top: '50%',
64
64
  left: '50%',
65
65
  transform: 'translate(-50%, -50%)',
66
- width: '85%', // Reduced to ensure content stays within screen
67
- height: '55%', // Reduced to ensure content stays within screen
66
+ width: '85%', // Reduced to ensure content stays within screen
67
+ height: '55%', // Reduced to ensure content stays within screen
68
68
  maxWidth: '320px', // Adjusted for screen area
69
69
  maxHeight: '380px',
70
- minHeight: '180px'
70
+ minHeight: '180px',
71
71
  },
72
72
  [LAYOUT_TYPES.HEADER]: {
73
- top: '2%', // More margin from top of screen
73
+ top: '2%', // More margin from top of screen
74
74
  left: '50%',
75
75
  transform: 'translateX(-50%)',
76
- width: '90%', // Reduced to stay within screen bounds
76
+ width: '90%', // Reduced to stay within screen bounds
77
77
  height: '22%',
78
78
  maxHeight: '160px',
79
- minHeight: '100px'
79
+ minHeight: '100px',
80
80
  },
81
81
  [LAYOUT_TYPES.FOOTER]: {
82
- bottom: '2%', // More margin from bottom of screen
82
+ bottom: '2%', // More margin from bottom of screen
83
83
  left: '50%',
84
84
  transform: 'translateX(-50%)',
85
- width: '90%', // Reduced to stay within screen bounds
85
+ width: '90%', // Reduced to stay within screen bounds
86
86
  height: '22%',
87
87
  maxHeight: '160px',
88
- minHeight: '100px'
88
+ minHeight: '100px',
89
89
  },
90
90
  [LAYOUT_TYPES.FULLSCREEN]: {
91
- top: '2%', // Small margin to account for screen bounds
91
+ top: '2%', // Small margin to account for screen bounds
92
92
  left: '2%',
93
- width: '96%', // Slightly smaller to ensure it stays within screen
94
- height: '96%'
95
- }
93
+ width: '96%', // Slightly smaller to ensure it stays within screen
94
+ height: '96%',
95
+ },
96
96
  };
97
97
 
98
98
  // Scroll position multipliers for adaptive scrolling in InAppPreviewPane
99
99
  export const SCROLL_POSITION_MULTIPLIERS = {
100
- [LAYOUT_TYPES.HEADER]: 0.0, // Top of screen
101
- [LAYOUT_TYPES.FOOTER]: 1.0, // Bottom of screen
102
- [LAYOUT_TYPES.MODAL]: 0.4, // Center-ish position
103
- [LAYOUT_TYPES.FULLSCREEN]: 0.3 // Slightly above center
100
+ [LAYOUT_TYPES.HEADER]: 0.0, // Top of screen
101
+ [LAYOUT_TYPES.FOOTER]: 1.0, // Bottom of screen
102
+ [LAYOUT_TYPES.MODAL]: 0.4, // Center-ish position
103
+ [LAYOUT_TYPES.FULLSCREEN]: 0.3, // Slightly above center
104
104
  };
@@ -2,7 +2,9 @@
2
2
  * InAppPreviewPane - Complete InApp preview with device frames and dynamic positioning
3
3
  */
4
4
 
5
- import React, { useMemo, useRef, useEffect, useCallback } from 'react';
5
+ import React, {
6
+ useMemo, useRef, useEffect, useCallback,
7
+ } from 'react';
6
8
  import PropTypes from 'prop-types';
7
9
  import { injectIntl, intlShape } from 'react-intl';
8
10
 
@@ -16,7 +18,6 @@ import ContentOverlay from './ContentOverlay';
16
18
  import { useEditorContext } from '../common/EditorContext';
17
19
 
18
20
  // Constants
19
- import { DEVICE_TYPES } from '../../constants';
20
21
  import { LAYOUT_TYPES, SCROLL_POSITION_MULTIPLIERS } from './constants';
21
22
 
22
23
  // Styles
@@ -27,14 +28,14 @@ const InAppPreviewPane = ({
27
28
  className = '',
28
29
  isFullscreenMode = false,
29
30
  isModalContext = false,
30
- layoutType: propLayoutType = LAYOUT_TYPES.MODAL
31
+ layoutType: propLayoutType = LAYOUT_TYPES.MODAL,
31
32
  }) => {
32
33
  const {
33
34
  content,
34
35
  activeDevice,
35
36
  getDeviceContent,
36
37
  layoutType: contextLayoutType,
37
- isFullscreenMode: contextIsFullscreenMode
38
+ isFullscreenMode: contextIsFullscreenMode,
38
39
  } = useEditorContext();
39
40
 
40
41
  // Refs for adaptive scrolling
@@ -83,7 +84,7 @@ const InAppPreviewPane = ({
83
84
  requestAnimationFrame(() => {
84
85
  container.scrollTo({
85
86
  top: targetScrollTop,
86
- behavior: 'smooth'
87
+ behavior: 'smooth',
87
88
  });
88
89
  });
89
90
  } catch (error) {
@@ -173,7 +174,7 @@ InAppPreviewPane.propTypes = {
173
174
  className: PropTypes.string,
174
175
  isFullscreenMode: PropTypes.bool,
175
176
  isModalContext: PropTypes.bool,
176
- layoutType: PropTypes.oneOf(Object.values(LAYOUT_TYPES))
177
+ layoutType: PropTypes.oneOf(Object.values(LAYOUT_TYPES)),
177
178
  };
178
179
 
179
180
  export default injectIntl(InAppPreviewPane);
@@ -14,8 +14,8 @@
14
14
 
15
15
  &__mode-controls {
16
16
  position: absolute;
17
- top: 0.5rem;
18
- right: 0.5rem;
17
+ top: 1.5rem;
18
+ right: 2rem;
19
19
  z-index: 10;
20
20
  background-color: $CAP_G07;
21
21
  border-radius: 0.5rem;
@@ -59,7 +59,7 @@
59
59
 
60
60
  &:hover,
61
61
  &.preview-mode-group__btn--active {
62
- background-color: rgba($CAP_WHITE, 0.5);
62
+ background-color: $CAP_WHITE;
63
63
  }
64
64
  }
65
65
  }
@@ -191,9 +191,6 @@
191
191
  height: calc(100% - 2rem);
192
192
  color: $CAP_G10;
193
193
  text-align: center;
194
- background-color: $CAP_WHITE;
195
- border-radius: 0.25rem;
196
- box-shadow: 0 0.0625rem 0.1875rem rgba($CAP_G01, 0.1);
197
194
  margin: 0;
198
195
  width: 100%;
199
196
 
@@ -55,7 +55,7 @@ const PreviewPane = ({
55
55
  className = '',
56
56
  isFullscreenMode = false,
57
57
  isModalContext = false,
58
- layoutType = LAYOUT_TYPES.MODAL
58
+ layoutType = LAYOUT_TYPES.MODAL,
59
59
  }) => {
60
60
  const { content, layout, variant } = useEditorContext();
61
61
 
@@ -124,13 +124,11 @@ const PreviewPane = ({
124
124
  }, [combinedContent]);
125
125
 
126
126
  // Cleanup blob URL on unmount
127
- useEffect(() => {
128
- return () => {
129
- if (blobUrlRef.current) {
130
- URL.revokeObjectURL(blobUrlRef.current);
131
- blobUrlRef.current = null;
132
- }
133
- };
127
+ useEffect(() => () => {
128
+ if (blobUrlRef.current) {
129
+ URL.revokeObjectURL(blobUrlRef.current);
130
+ blobUrlRef.current = null;
131
+ }
134
132
  }, []);
135
133
 
136
134
  // Generate CSS classes based on view mode
@@ -173,10 +171,11 @@ const PreviewPane = ({
173
171
  const renderEmptyState = () => (
174
172
  <div className="preview-empty">
175
173
  <div className="empty-content">
176
- <div className="empty-icon">📝</div>
177
174
  <p>{intl.formatMessage(messages.startTypingHtml)}</p>
178
175
  <p className="preview-mode-info">
179
- {intl.formatMessage(messages.previewMode)}: {
176
+ {intl.formatMessage(messages.previewMode)}
177
+ :
178
+ {
180
179
  viewMode === PREVIEW_MODES.DESKTOP
181
180
  ? intl.formatMessage(messages.desktop)
182
181
  : viewMode === PREVIEW_MODES.MOBILE
@@ -223,7 +222,7 @@ PreviewPane.propTypes = {
223
222
  className: PropTypes.string,
224
223
  isFullscreenMode: PropTypes.bool,
225
224
  isModalContext: PropTypes.bool,
226
- layoutType: PropTypes.oneOf(Object.values(LAYOUT_TYPES))
225
+ layoutType: PropTypes.oneOf(Object.values(LAYOUT_TYPES)),
227
226
  };
228
227
 
229
228
  export default injectIntl(PreviewPane);
@@ -161,7 +161,7 @@
161
161
 
162
162
  // Dragging state styling
163
163
  &--dragging &__splitter {
164
- background-color: map-get($CAP_PRIMARY, base);
164
+ background-color: map-get($CAP_SECONDARY, base);
165
165
  }
166
166
 
167
167
  &--dragging &__splitter-line {