@capillarytech/creatives-library 9.0.15-alpha.3 → 9.0.16-beta.0

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 (146) hide show
  1. package/AppRoot.js +80 -0
  2. package/app.js +5 -3
  3. package/constants/unified.js +0 -29
  4. package/entry.js +67 -1
  5. package/global-styles.js +1 -1
  6. package/mfe-exposed-components.js +2 -4
  7. package/package.json +2 -2
  8. package/services/api.js +1 -1
  9. package/services/tests/api.test.js +20 -35
  10. package/styles/containers/layout/_layoutPage.scss +8 -6
  11. package/utils/commonUtils.js +1 -19
  12. package/utils/getDataLayer.js +15 -0
  13. package/utils/gtmTrackers/gtmEvents/creativeDetails.js +2 -1
  14. package/utils/mfeDetect.js +1 -0
  15. package/v2Components/CapActionButton/constants.js +1 -8
  16. package/v2Components/CapActionButton/index.js +144 -202
  17. package/v2Components/CapActionButton/index.scss +14 -232
  18. package/v2Components/CapActionButton/messages.js +3 -19
  19. package/v2Components/CapActionButton/tests/index.test.js +18 -42
  20. package/v2Components/CapImageUpload/index.js +2 -2
  21. package/v2Components/CapTagList/index.js +0 -10
  22. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +48 -70
  23. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
  24. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -214
  25. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
  26. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +9 -83
  27. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
  28. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -60
  29. package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
  30. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +22 -202
  31. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +80 -381
  32. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +8 -155
  33. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
  34. package/v2Components/CommonTestAndPreview/constants.js +2 -38
  35. package/v2Components/CommonTestAndPreview/index.js +222 -761
  36. package/v2Components/CommonTestAndPreview/messages.js +3 -45
  37. package/v2Components/CommonTestAndPreview/sagas.js +6 -25
  38. package/v2Components/CommonTestAndPreview/tests/CommonTestAndPreview.addTestCustomer.test.js +0 -1
  39. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +267 -284
  40. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
  41. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
  42. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
  43. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +1 -8
  44. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
  45. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +283 -281
  46. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
  47. package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -133
  48. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +24 -31
  49. package/v2Components/NavigationBar/index.js +9 -7
  50. package/v2Components/NavigationBar/mfeModuleHeader.config.js +16 -0
  51. package/v2Components/Pagination/_pagination.scss +2 -0
  52. package/v2Components/TemplatePreview/_templatePreview.scss +25 -45
  53. package/v2Components/TemplatePreview/index.js +32 -147
  54. package/v2Components/TemplatePreview/tests/index.test.js +0 -142
  55. package/v2Components/TestAndPreviewSlidebox/CustomValuesEditor.js +6 -6
  56. package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
  57. package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
  58. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
  59. package/v2Containers/Cap/constants.js +1 -0
  60. package/v2Containers/Cap/index.js +47 -21
  61. package/v2Containers/Cap/sagas.js +19 -0
  62. package/v2Containers/CommunicationFlow/Tests/CommunicationFlow.test.js +1 -4
  63. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/DeliverySettingsSection.test.js +0 -4
  64. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/SenderDetails.test.js +20 -20
  65. package/v2Containers/CreativesContainer/SlideBoxContent.js +7 -37
  66. package/v2Containers/CreativesContainer/SlideBoxFooter.js +5 -14
  67. package/v2Containers/CreativesContainer/SlideBoxHeader.js +5 -36
  68. package/v2Containers/CreativesContainer/constants.js +0 -11
  69. package/v2Containers/CreativesContainer/index.js +104 -323
  70. package/v2Containers/CreativesContainer/index.scss +1 -83
  71. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -79
  72. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
  73. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
  74. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +90 -333
  75. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -20
  76. package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
  77. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  78. package/v2Containers/Rcs/constants.js +11 -131
  79. package/v2Containers/Rcs/index.js +829 -2682
  80. package/v2Containers/Rcs/index.scss +8 -443
  81. package/v2Containers/Rcs/messages.js +6 -45
  82. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +39409 -74176
  83. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +74 -10
  84. package/v2Containers/Rcs/tests/index.test.js +40 -151
  85. package/v2Containers/Rcs/tests/mockData.js +0 -38
  86. package/v2Containers/Rcs/tests/utils.test.js +30 -643
  87. package/v2Containers/Rcs/utils.js +12 -466
  88. package/v2Containers/Sms/Create/index.js +48 -115
  89. package/v2Containers/SmsTrai/Create/index.js +4 -9
  90. package/v2Containers/SmsTrai/Edit/constants.js +0 -2
  91. package/v2Containers/SmsTrai/Edit/index.js +169 -678
  92. package/v2Containers/SmsTrai/Edit/messages.js +4 -14
  93. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2854 -5455
  94. package/v2Containers/SmsWrapper/index.js +8 -37
  95. package/v2Containers/TagList/index.js +0 -6
  96. package/v2Containers/Templates/_templates.scss +11 -196
  97. package/v2Containers/Templates/actions.js +0 -11
  98. package/v2Containers/Templates/constants.js +0 -2
  99. package/v2Containers/Templates/index.js +60 -131
  100. package/v2Containers/Templates/sagas.js +13 -57
  101. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1015 -1060
  102. package/v2Containers/Templates/tests/sagas.test.js +16 -199
  103. package/v2Containers/TemplatesV2/TemplatesV2.style.js +10 -75
  104. package/v2Containers/TemplatesV2/index.js +43 -86
  105. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  106. package/v2Containers/Whatsapp/index.js +25 -4
  107. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
  108. package/utils/rcsPayloadUtils.js +0 -92
  109. package/utils/templateVarUtils.js +0 -201
  110. package/utils/tests/rcsPayloadUtils.test.js +0 -226
  111. package/utils/tests/templateVarUtils.test.js +0 -204
  112. package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
  113. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
  114. package/v2Components/CommonTestAndPreview/utils.js +0 -84
  115. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -91
  116. package/v2Components/SmsFallback/constants.js +0 -94
  117. package/v2Components/SmsFallback/index.js +0 -958
  118. package/v2Components/SmsFallback/index.scss +0 -266
  119. package/v2Components/SmsFallback/messages.js +0 -78
  120. package/v2Components/SmsFallback/smsFallbackUtils.js +0 -120
  121. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
  122. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
  123. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
  124. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -208
  125. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -309
  126. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
  127. package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
  128. package/v2Components/TemplatePreview/constants.js +0 -2
  129. package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
  130. package/v2Components/VarSegmentMessageEditor/index.js +0 -125
  131. package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
  132. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -17
  133. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -79
  134. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
  135. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
  136. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
  137. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -227
  138. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
  139. package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
  140. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
  141. package/v2Containers/SmsTrai/Edit/index.scss +0 -126
  142. package/v2Containers/Templates/TemplatesActionBar.js +0 -101
  143. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
  144. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
  145. package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
  146. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +0 -131
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * UnifiedPreview Styles
5
- *
5
+ *
6
6
  * Consistent styling for preview across all channels
7
7
  */
8
8
 
@@ -11,24 +11,25 @@
11
11
  height: 100%;
12
12
  display: flex;
13
13
  flex-direction: column;
14
+ background: $CAP_WHITE;
14
15
  overflow: hidden;
15
-
16
+
16
17
  // Preview Chrome wrapper (matches old TestAndPreviewSlidebox design)
17
18
  .preview-chrome {
18
19
  background: $CAP_WHITE;
19
20
  overflow: hidden;
20
-
21
+
21
22
  .preview-divider {
22
23
  margin: 0;
23
24
  }
24
-
25
+
25
26
  .preview-header {
26
27
  display: flex;
27
28
  justify-content: space-between;
28
29
  align-items: center;
29
30
  padding: $CAP_SPACE_08 $CAP_SPACE_16 $CAP_SPACE_06 $CAP_SPACE_16;
30
31
  background: $CAP_G09;
31
-
32
+
32
33
  .preview-for {
33
34
  font-size: $FONT_SIZE_M;
34
35
  color: #595959;
@@ -38,20 +39,20 @@
38
39
  margin-left: $CAP_SPACE_04;
39
40
  }
40
41
  }
41
-
42
+
42
43
  .device-toggle {
43
44
  display: flex;
44
45
  gap: $CAP_SPACE_08;
45
46
  background-color: #e0e0e0;
46
47
  padding: $CAP_SPACE_06 $CAP_SPACE_08;
47
48
  border-radius: $CAP_SPACE_08;
48
-
49
+
49
50
  .anticon {
50
51
  padding: $CAP_SPACE_04;
51
52
  border-radius: $CAP_SPACE_04;
52
53
  cursor: pointer;
53
54
  color: #595959;
54
-
55
+
55
56
  &.active {
56
57
  background-color: $CAP_WHITE;
57
58
  color: #262626;
@@ -61,27 +62,7 @@
61
62
  }
62
63
  }
63
64
  }
64
-
65
- &.unified-preview-rcs-tabs {
66
- .ant-tabs-nav {
67
- margin: 0;
68
- padding: 0 $CAP_SPACE_16;
69
- }
70
-
71
- // Prevent white hover/active backgrounds from default antd styles
72
- .ant-tabs-tab,
73
- .ant-tabs-tab:hover,
74
- .ant-tabs-tab-active {
75
- background: transparent;
76
- }
77
-
78
- .ant-tabs-tab-btn,
79
- .ant-tabs-tab-btn:hover,
80
- .ant-tabs-tab-btn:active {
81
- background: transparent;
82
- }
83
- }
84
-
65
+
85
66
  // Preview Content Container
86
67
  .preview-content-container {
87
68
  flex: 1;
@@ -94,33 +75,25 @@
94
75
  .preview-content-container-no-header {
95
76
  background-color: $CAP_WHITE;
96
77
  }
97
-
78
+
98
79
  // Device Frames
99
80
  .unified-preview-frame {
100
81
  width: 100%;
101
82
  display: flex;
102
83
  justify-content: center;
103
-
84
+
104
85
  .device-frame {
105
86
  background: $CAP_WHITE;
106
87
  border-radius: $CAP_SPACE_08;
107
88
  box-shadow: 0 $CAP_SPACE_04 $CAP_SPACE_12 rgba(0, 0, 0, 0.15);
108
89
  overflow: hidden;
109
90
  transition: all 0.3s ease;
110
- // iOS Safari fails to clip a `transform`ed descendant (.rcs-carousel-panel
111
- // uses translateX(-50%) to center itself) to this ancestor's border-radius —
112
- // its white background bleeds past the rounded edge on real devices, even
113
- // though overflow:hidden clips it correctly everywhere else. Forcing Safari
114
- // onto its masking render path (instead of the buggy transform+overflow-clip
115
- // path) fixes this; no-op on every other browser.
116
- -webkit-mask-image: -webkit-radial-gradient(white, black);
117
- mask-image: radial-gradient(white, black);
118
-
91
+
119
92
  // Desktop Frame
120
93
  &.device-frame-desktop {
121
94
  width: 100%;
122
95
  min-height: 42.857rem;
123
-
96
+
124
97
  .desktop-chrome {
125
98
  height: $CAP_SPACE_40;
126
99
  background: $CAP_G12;
@@ -129,30 +102,30 @@
129
102
  align-items: center;
130
103
  padding: 0 $CAP_SPACE_12;
131
104
  gap: $CAP_SPACE_12;
132
-
105
+
133
106
  .chrome-dots {
134
107
  display: flex;
135
108
  gap: $CAP_SPACE_06;
136
-
109
+
137
110
  .dot {
138
111
  width: $CAP_SPACE_12;
139
112
  height: $CAP_SPACE_12;
140
113
  border-radius: 50%;
141
-
114
+
142
115
  &.dot-close {
143
116
  background: #ff5f56;
144
117
  }
145
-
118
+
146
119
  &.dot-minimize {
147
120
  background: #ffbd2e;
148
121
  }
149
-
122
+
150
123
  &.dot-maximize {
151
124
  background: #27c93f;
152
125
  }
153
126
  }
154
127
  }
155
-
128
+
156
129
  .chrome-address-bar {
157
130
  flex: 1;
158
131
  background: $CAP_WHITE;
@@ -162,25 +135,25 @@
162
135
  color: #8c8c8c;
163
136
  }
164
137
  }
165
-
138
+
166
139
  .device-content {
167
140
  min-height: 40rem;
168
141
  background: $CAP_WHITE;
169
142
  }
170
143
  }
171
-
144
+
172
145
  // Tablet Frame
173
146
  &.device-frame-tablet {
174
147
  width: 54.857rem;
175
148
  max-width: 90%;
176
-
149
+
177
150
  .tablet-chrome {
178
151
  height: $CAP_SPACE_24;
179
152
  background: #333333;
180
153
  display: flex;
181
154
  align-items: center;
182
155
  justify-content: center;
183
-
156
+
184
157
  .tablet-camera {
185
158
  width: $CAP_SPACE_08;
186
159
  height: $CAP_SPACE_08;
@@ -189,19 +162,19 @@
189
162
  border: $CAP_SPACE_01 solid #666666;
190
163
  }
191
164
  }
192
-
165
+
193
166
  .device-content {
194
167
  min-height: 73.143rem;
195
168
  background: $CAP_WHITE;
196
169
  }
197
-
170
+
198
171
  .tablet-footer {
199
172
  height: 3.571rem;
200
173
  background: #333333;
201
174
  display: flex;
202
175
  align-items: center;
203
176
  justify-content: center;
204
-
177
+
205
178
  .home-button {
206
179
  width: $CAP_SPACE_40;
207
180
  height: $CAP_SPACE_40;
@@ -211,19 +184,19 @@
211
184
  }
212
185
  }
213
186
  }
214
-
187
+
215
188
  // Mobile Frame
216
189
  &.device-frame-mobile {
217
190
  width: 26.786rem;
218
191
  max-width: 90%;
219
-
192
+
220
193
  .mobile-chrome {
221
194
  height: $CAP_SPACE_24;
222
195
  background: #000000;
223
196
  display: flex;
224
197
  align-items: center;
225
198
  justify-content: center;
226
-
199
+
227
200
  .mobile-notch {
228
201
  width: 10.714rem;
229
202
  height: 1.571rem;
@@ -231,19 +204,19 @@
231
204
  border-radius: 0 0 $CAP_SPACE_12 $CAP_SPACE_12;
232
205
  }
233
206
  }
234
-
207
+
235
208
  .device-content {
236
209
  min-height: 47.643rem;
237
210
  background: $CAP_WHITE;
238
211
  }
239
-
212
+
240
213
  .mobile-footer {
241
214
  height: $CAP_SPACE_24;
242
215
  background: #000000;
243
216
  display: flex;
244
217
  align-items: center;
245
218
  justify-content: center;
246
-
219
+
247
220
  .home-indicator {
248
221
  width: $CAP_SPACE_80;
249
222
  height: $CAP_SPACE_04;
@@ -255,7 +228,7 @@
255
228
  }
256
229
  }
257
230
  }
258
-
231
+
259
232
  // Channel Preview Placeholders (Phase 5)
260
233
  .channel-preview-placeholder {
261
234
  display: flex;
@@ -265,7 +238,7 @@
265
238
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
266
239
  text-align: center;
267
240
  min-height: 28.571rem;
268
-
241
+
269
242
  .question-circle {
270
243
  font-size: $CAP_SPACE_48;
271
244
  color: $CAP_COLOR_16;
@@ -276,13 +249,13 @@
276
249
  font-weight: 600;
277
250
  color: #262626;
278
251
  }
279
-
252
+
280
253
  p {
281
254
  margin-top: $CAP_SPACE_08;
282
255
  font-size: $FONT_SIZE_M;
283
256
  color: #8c8c8c;
284
257
  }
285
-
258
+
286
259
  .preview-subject {
287
260
  margin-top: $CAP_SPACE_24;
288
261
  padding: $CAP_SPACE_12 $CAP_SPACE_16;
@@ -291,26 +264,26 @@
291
264
  text-align: left;
292
265
  width: 100%;
293
266
  max-width: 35.714rem;
294
-
267
+
295
268
  strong {
296
269
  color: #595959;
297
270
  margin-right: $CAP_SPACE_08;
298
271
  }
299
272
  }
300
-
273
+
301
274
  .preview-body-placeholder {
302
275
  margin-top: $CAP_SPACE_12;
303
276
  padding: $CAP_SPACE_08 $CAP_SPACE_12;
304
277
  background: #fafafa;
305
278
  border: $CAP_SPACE_01 dashed $CAP_COLOR_16;
306
279
  border-radius: $CAP_SPACE_04;
307
-
280
+
308
281
  small {
309
282
  color: #8c8c8c;
310
283
  }
311
284
  }
312
285
  }
313
-
286
+
314
287
  // Loading State
315
288
  &.unified-preview-loading {
316
289
  .preview-loading-container {
@@ -320,14 +293,14 @@
320
293
  justify-content: center;
321
294
  gap: $CAP_SPACE_16;
322
295
  min-height: 28.571rem;
323
-
296
+
324
297
  .loading-text {
325
298
  font-size: $FONT_SIZE_M;
326
299
  color: #8c8c8c;
327
300
  }
328
301
  }
329
302
  }
330
-
303
+
331
304
  // Error State
332
305
  &.unified-preview-error {
333
306
  .preview-error-container {
@@ -338,7 +311,7 @@
338
311
  justify-content: center;
339
312
  gap: $CAP_SPACE_16;
340
313
  min-height: 28.571rem;
341
-
314
+
342
315
  .exclamation-circle {
343
316
  font-size: $CAP_SPACE_48;
344
317
  color: #ff4d4f;
@@ -348,7 +321,7 @@
348
321
  font-weight: 600;
349
322
  color: #262626;
350
323
  }
351
-
324
+
352
325
  .error-message {
353
326
  font-size: $FONT_SIZE_M;
354
327
  color: #ff4d4f;
@@ -357,7 +330,7 @@
357
330
  }
358
331
  }
359
332
  }
360
-
333
+
361
334
  // Preview Metadata
362
335
  .preview-metadata {
363
336
  padding: $CAP_SPACE_12 $CAP_SPACE_24;
@@ -367,7 +340,7 @@
367
340
  color: #8c8c8c;
368
341
  display: flex;
369
342
  gap: $CAP_SPACE_16;
370
-
343
+
371
344
  .metadata-item {
372
345
  display: flex;
373
346
  gap: $CAP_SPACE_04;
@@ -559,7 +532,7 @@
559
532
  font-weight: 600;
560
533
  color: #262626;
561
534
  }
562
-
535
+
563
536
  .error-message {
564
537
  font-size: $FONT_SIZE_M;
565
538
  color: #ff4d4f;
@@ -598,12 +571,9 @@
598
571
  transform: translateX(-50%);
599
572
  width: 100%;
600
573
  max-width: 26.786rem;
601
- min-width: 0; // flex descendant overflow: allow shrink inside narrow screen
602
574
  height: calc(100% - 4.5rem);
603
575
  display: flex;
604
576
  flex-direction: column;
605
- overflow-x: hidden;
606
- box-sizing: border-box;
607
577
 
608
578
  &.sms-content-overlay-android {
609
579
  height: calc(100% - 3.8rem);
@@ -771,7 +741,7 @@
771
741
  font-weight: 600;
772
742
  color: #262626;
773
743
  }
774
-
744
+
775
745
  .sms-error-message {
776
746
  font-size: $FONT_SIZE_M;
777
747
  color: #ff4d4f;
@@ -793,280 +763,13 @@
793
763
  }
794
764
  }
795
765
 
796
- // RCS Carousel card styles — scoped to .rcs-carousel-panel (which lives outside the
797
- // overflow-x:hidden overlay so horizontal scroll events reach .scroll-container freely).
798
- .rcs-device-container {
799
- .rcs-carousel-panel {
800
- position: absolute;
801
- // Centered via left/right auto-margins instead of left:50% + translateX(-50%) —
802
- // a `transform` on this element put every rounded+overflow:hidden box nested
803
- // inside it (this panel's own corners, the card corners, the image corners...)
804
- // in a transformed stacking context that iOS Safari fails to clip correctly,
805
- // letting their square corners/backgrounds bleed past the rounded edges. Plain
806
- // auto-margin centering has no such bug.
807
- left: 0;
808
- right: 0;
809
- margin-left: auto;
810
- margin-right: auto;
811
- width: 100%;
812
- max-width: 26.786rem;
813
- box-sizing: border-box;
814
- top: 4.143rem;
815
- height: calc(100% - 2.5rem);
816
- display: flex;
817
- flex-direction: column;
818
- padding-top: 5.857rem; // nav (3.428rem) + date separator (~2.429rem)
819
- padding-bottom: $CAP_SPACE_16;
820
- padding-left: 0.4rem;
821
- padding-right: 0.4rem;
822
- background-color: $CAP_WHITE;
823
- background-clip: content-box;
824
- border-bottom-left-radius: 2.429rem;
825
- border-bottom-right-radius: 2.429rem;
826
- // background-clip only clips the background fill to these rounded corners —
827
- // it does NOT clip child content, so message/card boxes could render past the
828
- // rounded edge regardless of browser. This doesn't affect the horizontal touch
829
- // scroll .scroll-container needs: that workaround was about not nesting inside
830
- // the *other* sibling overlay (.sms-content-overlay's overflow-x:hidden), not
831
- // about this element's own overflow.
832
- overflow: hidden;
833
-
834
- &.rcs-carousel-panel-android {
835
- top: 3.1rem;
836
- border-radius: 4rem;
837
- }
838
-
839
- &.rcs-carousel-panel-ios {
840
- height: calc(100% - 4.2rem);
841
- }
842
-
843
- .rcs-carousel-timestamp {
844
- font-size: $FONT_SIZE_S;
845
- color: #8c8c8c;
846
- align-self: flex-end;
847
- padding-right: $CAP_SPACE_04;
848
- padding-top: $CAP_SPACE_04;
849
- }
850
-
851
- .msg-container-carousel {
852
- display: flex;
853
- flex-direction: column;
854
- width: 100%;
855
- padding: 0 $CAP_SPACE_16;
856
-
857
- .scroll-container {
858
- display: flex;
859
- flex-wrap: nowrap;
860
- gap: 0.75rem;
861
- overflow-x: auto;
862
- overflow-y: hidden;
863
- width: 100%;
864
- scrollbar-width: none;
865
-
866
- &::-webkit-scrollbar {
867
- display: none;
868
- }
869
- }
870
- }
871
-
872
- // Wraps the card + its CTA bar so both scroll horizontally together as one unit,
873
- // while remaining two visually distinct, separately-rounded elements (Figma reference —
874
- // the CTA bar is its own floating pill below the card, not part of it).
875
- .rcs-carousel-item {
876
- display: flex;
877
- flex-direction: column;
878
- gap: $CAP_SPACE_04;
879
- // Ensure item width is stable and does not shrink to text width
880
- flex: 0 0 15.375rem; // ~246px; fills container leaving ~50% of next card peeking
881
- margin-right: 0; // spacing handled by scroll-container gap
882
- }
883
-
884
- .message-pop-carousel {
885
- // Match TemplatePreview carousel card look (big card + subtle shadow)
886
- background-color: $CAP_WHITE;
887
- border: 1px solid $CAP_G07; // #dfe2e7 — keeps the card visible against the
888
- // chat background when there's no photo yet to provide contrast (Figma empty state)
889
- border-radius: $CAP_SPACE_04; // 4px (Figma RCS carousel card corner)
890
- width: 100%;
891
- padding: 0;
892
- color: $CAP_G01;
893
- overflow: hidden;
894
- box-shadow: 0 0 0.625rem 0 rgba(0, 0, 0, 0.08);
895
- position: relative;
896
- }
897
-
898
- .whatsapp-content {
899
- font-family: Roboto, 'Open Sans', sans-serif;
900
- margin: 0;
901
- width: 100%;
902
- }
903
-
904
- // Height follows width × aspect-ratio; inline style from carouselPreviewDimensions overrides fallback.
905
- .whatsapp-image.rcs-carousel-media-wrap {
906
- width: 100%;
907
- height: auto;
908
- aspect-ratio: 1280 / 720; // MEDIUM_MEDIUM image fallback when dimensions not passed
909
- display: block;
910
- overflow: hidden;
911
- border-radius: $CAP_SPACE_04 $CAP_SPACE_04 0 0; // 4px (Figma)
912
- margin-bottom: 0;
913
-
914
- // CapImage (antd Image) applies className on wrapper; ensure inner img is constrained too.
915
- img,
916
- .ant-image-img {
917
- width: 100%;
918
- height: 100%;
919
- object-fit: cover;
920
- border-radius: inherit;
921
- display: block;
922
- }
923
-
924
- // Plain <img> in RCS carousel preview (not CapImage)
925
- .rcs-carousel-img {
926
- width: 100%;
927
- height: 100%;
928
- object-fit: cover;
929
- border-radius: inherit;
930
- display: block;
931
- }
932
- }
933
-
934
- .video-preview {
935
- position: relative;
936
- width: 100%;
937
- margin-bottom: 0;
938
-
939
- .whatsapp-image.rcs-carousel-media-wrap {
940
- width: 100%;
941
- height: auto;
942
- aspect-ratio: 796 / 448; // MEDIUM_MEDIUM video thumbnail fallback
943
- margin-bottom: 0;
944
-
945
- img,
946
- .ant-image-img,
947
- .rcs-carousel-img {
948
- width: 100%;
949
- height: 100%;
950
- object-fit: cover;
951
- border-radius: inherit;
952
- display: block;
953
- }
954
- }
955
-
956
- .icon-position {
957
- position: absolute;
958
- top: 50%;
959
- left: 50%;
960
- transform: translate(-50%, -50%);
961
- display: flex;
962
- align-items: center;
963
- justify-content: center;
964
-
965
- .video-icon {
966
- width: $CAP_SPACE_48;
967
- height: $CAP_SPACE_48;
968
- }
969
- }
970
- }
971
-
972
- // CapTooltip shrink-wraps its wrapper/trigger by default and forces `display: inline-block`
973
- // inline on the trigger span, so .video-preview's width:100% collapses to content width
974
- // unless these are stretched to fill the card (inline style needs !important to override).
975
- .rcs-carousel-video-tooltip-wrapper {
976
- display: block;
977
- width: 100%;
978
- }
979
-
980
- .rcs-carousel-video-tooltip-trigger {
981
- display: block !important;
982
- width: 100%;
983
- }
984
-
985
- .carousel-content {
986
- padding: 0.625rem 0.75rem; // 10px 12px
987
- width: 100%;
988
- background-color: $CAP_G08; // #ebecf0 (Figma: grey info panel, not white)
989
- white-space: normal; // override scroll-container's nowrap so text can wrap
990
- display: flex;
991
- flex-direction: column;
992
- border-bottom-left-radius: 0.25rem; // 4px — this is the card's own bottom edge;
993
- border-bottom-right-radius: 0.25rem; // the CTA bar below is a separate element (Figma)
994
-
995
- // Title/body typography via CapLabel type (label1 / label2, etc.)
996
- .carousel-title {
997
- margin-bottom: 0.25rem; // 4px
998
- display: block;
999
- overflow: visible;
1000
- white-space: normal;
1001
- overflow-wrap: anywhere;
1002
- color: $CAP_G04; // #5e6c84 (Figma)
1003
- font-weight: $FONT_WEIGHT_BOLD;
1004
- }
1005
-
1006
- .carousel-message {
1007
- display: block;
1008
- overflow: visible;
1009
- white-space: normal;
1010
- overflow-wrap: anywhere;
1011
- color: $FONT_COLOR_03; // #97a0af (Figma)
1012
- font-weight: $FONT_WEIGHT_REGULAR;
1013
- }
1014
-
1015
- .rcs-carousel-field-placeholder {
1016
- color: $CAP_G05;
1017
- font-weight: $FONT_WEIGHT_REGULAR;
1018
- }
1019
- }
1020
-
1021
- // Divider between message body and suggestions — subtle gray on the gray bubble
1022
- .whatsapp-divider {
1023
- margin: 0;
1024
- border-top: 1px solid $CAP_G07;
1025
- }
1026
-
1027
- // Inside a carousel card (white bg) dividers should stay white
1028
- .message-pop-carousel .whatsapp-divider {
1029
- border-top: 1px solid $CAP_WHITE;
1030
- }
1031
-
1032
- // Own floating pill(s) below the card (NOT part of .message-pop-carousel) — sits in
1033
- // .rcs-carousel-item, separated from the card by that wrapper's `gap` (Figma reference).
1034
- .rcs-carousel-cta-stack.cap-row-v2 {
1035
- display: flex;
1036
- flex-direction: column;
1037
- flex-wrap: nowrap;
1038
- width: 100%;
1039
- gap: 0.25rem;
1040
- box-sizing: border-box;
1041
- align-items: stretch;
1042
- }
1043
-
1044
- .rcs-cta-preview--carousel-bar {
1045
- display: flex;
1046
- align-items: center;
1047
- justify-content: center;
1048
- gap: 0.375rem;
1049
- width: 100%;
1050
- margin: 0;
1051
- padding: 0.625rem 0.75rem;
1052
- box-sizing: border-box;
1053
- background-color: $CAP_G08; // #ebecf0 (Figma: grey "Call Now" pill, not white)
1054
- border-radius: 0.25rem;
1055
- font-size: $FONT_SIZE_M;
1056
- font-weight: $FONT_WEIGHT_MEDIUM;
1057
- color: $CAP_G04; // #5e6c84 (Figma)
1058
- text-align: center;
1059
- }
1060
- }
1061
- }
1062
-
1063
766
  // WhatsApp Preview Content Styles (Phase 8)
1064
767
  // All WhatsApp styles wrapped in parent class for increased specificity
1065
768
  // This prevents other CSS (like CapLabel) from overriding WhatsApp-specific styles
1066
769
  .whatsapp-preview-wrapper {
1067
770
  // Using same CSS classes as TemplatePreview for consistency
1068
771
  // Styles are copied from TemplatePreview/_templatePreview.scss to ensure they work
1069
-
772
+
1070
773
  .shell-v2-whatsapp {
1071
774
  position: relative;
1072
775
  -webkit-transform: translate(-50%);
@@ -1141,23 +844,23 @@
1141
844
  }
1142
845
 
1143
846
  // WhatsApp message pop styles (matching TemplatePreview)
1144
- &.whatsapp-message-pop,
1145
- &.whatsapp-message-pop-carousel {
847
+ &.whatsapp-message-pop {
1146
848
  padding: $CAP_SPACE_04 0 $CAP_SPACE_08;
1147
849
  border-radius: $CAP_SPACE_06;
1148
850
  background-color: $CAP_WHITE;
1149
- left: 0;
1150
- }
1151
-
1152
- &.whatsapp-message-pop {
1153
851
  width: 88%;
852
+ left: 0;
1154
853
  }
1155
854
 
1156
855
  // WhatsApp carousel message pop styles
1157
856
  &.whatsapp-message-pop-carousel {
857
+ padding: $CAP_SPACE_04 0 $CAP_SPACE_08;
858
+ border-radius: $CAP_SPACE_06;
859
+ background-color: $CAP_WHITE;
1158
860
  width: 10.4rem;
1159
861
  cursor: pointer;
1160
862
  flex-shrink: 0;
863
+ left: 0;
1161
864
  }
1162
865
  }
1163
866
  }
@@ -1222,7 +925,7 @@
1222
925
  line-height: 1rem;
1223
926
  font-family: Roboto, 'Open Sans', sans-serif;
1224
927
  }
1225
-
928
+
1226
929
  .whatsapp-template-footer-preview {
1227
930
  // From WhatsApp/index.scss: color: $CAP_G04, but use white for preview
1228
931
  color: $CAP_G01;
@@ -1304,19 +1007,19 @@
1304
1007
  color: #8c8c8c;
1305
1008
  font-size: $FONT_SIZE_M;
1306
1009
  }
1307
-
1010
+
1308
1011
  .whatsapp-error-text {
1309
1012
  font-size: $FONT_SIZE_L;
1310
1013
  font-weight: 600;
1311
1014
  color: #262626;
1312
1015
  }
1313
-
1016
+
1314
1017
  .whatsapp-error-message {
1315
1018
  font-size: $FONT_SIZE_M;
1316
1019
  color: #ff4d4f;
1317
1020
  text-align: center;
1318
1021
  }
1319
-
1022
+
1320
1023
  .whatsapp-no-content {
1321
1024
  color: #8c8c8c;
1322
1025
  font-size: $FONT_SIZE_M;
@@ -1368,14 +1071,14 @@
1368
1071
  color: #8c8c8c;
1369
1072
  margin-top: $CAP_SPACE_04;
1370
1073
  }
1371
-
1074
+
1372
1075
  .url-preview {
1373
1076
  font-size: $FONT_SIZE_S;
1374
1077
  color: #1890ff;
1375
1078
  word-break: break-all;
1376
1079
  }
1377
1080
  }
1378
-
1081
+
1379
1082
  // InApp Preview Content Styles (Phase 10)
1380
1083
  // Styles copied from TemplatePreview/_templatePreview.scss to ensure consistency
1381
1084
  // These styles work within the SMS device container structure
@@ -1436,11 +1139,11 @@
1436
1139
  .inapp-message-container-FULLSCREEN {
1437
1140
  position: relative;
1438
1141
  background-color: $CAP_WHITE;
1439
- width: 100%;
1142
+ width: 100%;
1440
1143
  height: 100%;
1441
1144
  align-items: center;
1442
1145
  padding: 0 $CAP_SPACE_16;
1443
- border-bottom-left-radius: 2.6rem;
1146
+ border-bottom-left-radius: 2.6rem;
1444
1147
  border-bottom-right-radius: 2.6rem;
1445
1148
  .inapp-title-FULLSCREEN {
1446
1149
  align-items: center;
@@ -2270,7 +1973,7 @@
2270
1973
  max-height: 7.5rem;
2271
1974
  margin-left: $CAP_SPACE_24;
2272
1975
  }
2273
-
1976
+
2274
1977
  .mpush-gif-preview {
2275
1978
  max-width: 100%;
2276
1979
  max-height: 7.5rem;
@@ -2528,7 +2231,6 @@
2528
2231
  font-weight: 500;
2529
2232
  display: -webkit-box;
2530
2233
  -webkit-line-clamp: 1;
2531
- line-clamp: 1;
2532
2234
  -webkit-box-orient: vertical;
2533
2235
  overflow: hidden;
2534
2236
  color: $CAP_WHITE;
@@ -2580,7 +2282,7 @@
2580
2282
  color: $FONT_COLOR_01;
2581
2283
  margin-bottom: $CAP_SPACE_12;
2582
2284
  }
2583
-
2285
+
2584
2286
  .preview-text {
2585
2287
  font-weight: 400;
2586
2288
  font-size: $FONT_SIZE_S;
@@ -2615,13 +2317,13 @@
2615
2317
  justify-content: center;
2616
2318
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2617
2319
  gap: $CAP_SPACE_16;
2618
-
2320
+
2619
2321
  .zalo-loading-text {
2620
2322
  color: #8c8c8c;
2621
2323
  font-size: $FONT_SIZE_M;
2622
2324
  }
2623
2325
  }
2624
-
2326
+
2625
2327
  // Error state
2626
2328
  .zalo-error-container {
2627
2329
  display: flex;
@@ -2630,13 +2332,13 @@
2630
2332
  justify-content: center;
2631
2333
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2632
2334
  gap: $CAP_SPACE_16;
2633
-
2335
+
2634
2336
  .zalo-error-text {
2635
2337
  font-size: $FONT_SIZE_L;
2636
2338
  font-weight: 600;
2637
2339
  color: #262626;
2638
2340
  }
2639
-
2341
+
2640
2342
  .zalo-error-message {
2641
2343
  font-size: $FONT_SIZE_M;
2642
2344
  color: #ff4d4f;
@@ -2708,39 +2410,36 @@
2708
2410
  }
2709
2411
  }
2710
2412
  }
2711
-
2413
+
2712
2414
  @media (max-width: 54.857rem) {
2713
2415
  .unified-preview {
2714
2416
  .preview-header {
2715
2417
  flex-direction: column;
2716
2418
  align-items: flex-start;
2717
2419
  gap: $CAP_SPACE_12;
2718
-
2420
+
2719
2421
  .preview-header-right {
2720
2422
  width: 100%;
2721
2423
  justify-content: flex-start;
2722
2424
  }
2723
2425
  }
2724
-
2426
+
2725
2427
  .preview-content-container {
2726
2428
  padding: $CAP_SPACE_16;
2727
2429
  }
2728
-
2430
+
2729
2431
  .device-frame {
2730
2432
  &.device-frame-desktop,
2731
2433
  &.device-frame-tablet {
2732
2434
  width: 100% !important;
2733
2435
  max-width: 100% !important;
2734
2436
  }
2735
-
2736
- // NOT stretched to 100% here like desktop/tablet — this frame simulates a
2737
- // phone, so on a narrow (e.g. real iOS) viewport it should stay phone-width
2738
- // and shrink via its own `max-width: 90%` rule, not stretch to fill the
2739
- // container. The old `width: 100% !important` made the frame's white
2740
- // background render far wider than the phone silhouette, visibly eating
2741
- // into the grey backdrop around it, while the carousel content inside
2742
- // stayed capped at its normal phone width — a width mismatch, not a
2743
- // clipping bug.
2437
+
2438
+ &.device-frame-mobile {
2439
+ width: 100% !important;
2440
+ max-width: 100% !important;
2441
+ }
2744
2442
  }
2745
2443
  }
2746
2444
  }
2445
+