@capillarytech/creatives-library 8.0.353-alpha.5 → 8.0.353-alpha.6

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 (136) hide show
  1. package/constants/unified.js +29 -0
  2. package/package.json +1 -1
  3. package/services/tests/api.test.js +35 -20
  4. package/utils/commonUtils.js +19 -1
  5. package/utils/rcsPayloadUtils.js +92 -0
  6. package/utils/templateVarUtils.js +201 -0
  7. package/utils/tests/rcsPayloadUtils.test.js +226 -0
  8. package/utils/tests/templateVarUtils.test.js +204 -0
  9. package/v2Components/CapActionButton/constants.js +7 -0
  10. package/v2Components/CapActionButton/index.js +166 -108
  11. package/v2Components/CapActionButton/index.scss +157 -6
  12. package/v2Components/CapActionButton/messages.js +19 -3
  13. package/v2Components/CapActionButton/tests/index.test.js +41 -17
  14. package/v2Components/CapTagList/index.js +10 -0
  15. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +72 -49
  16. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +8 -2
  17. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +213 -21
  18. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +16 -0
  19. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +85 -10
  20. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +30 -0
  21. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +79 -11
  22. package/v2Components/CommonTestAndPreview/SendTestMessage.js +10 -5
  23. package/v2Components/CommonTestAndPreview/UnifiedPreview/PreviewHeader.js +0 -17
  24. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +157 -15
  25. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +346 -146
  26. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +138 -48
  27. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +11 -0
  28. package/v2Components/CommonTestAndPreview/constants.js +38 -4
  29. package/v2Components/CommonTestAndPreview/index.js +691 -235
  30. package/v2Components/CommonTestAndPreview/messages.js +45 -3
  31. package/v2Components/CommonTestAndPreview/previewApiUtils.js +59 -0
  32. package/v2Components/CommonTestAndPreview/sagas.js +25 -6
  33. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +308 -284
  34. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +231 -65
  35. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +118 -5
  36. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +341 -0
  37. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +8 -1
  38. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +34 -13
  39. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/PreviewHeader.test.js +0 -159
  40. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +281 -283
  41. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +199 -256
  42. package/v2Components/CommonTestAndPreview/tests/constants.test.js +1 -2
  43. package/v2Components/CommonTestAndPreview/tests/index.test.js +132 -198
  44. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +67 -0
  45. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +36 -26
  46. package/v2Components/FormBuilder/index.js +11 -6
  47. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +91 -0
  48. package/v2Components/SmsFallback/constants.js +73 -0
  49. package/v2Components/SmsFallback/index.js +956 -0
  50. package/v2Components/SmsFallback/index.scss +265 -0
  51. package/v2Components/SmsFallback/messages.js +78 -0
  52. package/v2Components/SmsFallback/smsFallbackUtils.js +119 -0
  53. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +50 -0
  54. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +147 -0
  55. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +304 -0
  56. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +223 -0
  57. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +309 -0
  58. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +422 -0
  59. package/v2Components/SmsFallback/useLocalTemplateList.js +92 -0
  60. package/v2Components/TemplatePreview/_templatePreview.scss +38 -23
  61. package/v2Components/TemplatePreview/constants.js +2 -0
  62. package/v2Components/TemplatePreview/index.js +143 -31
  63. package/v2Components/TemplatePreview/tests/index.test.js +142 -0
  64. package/v2Components/TestAndPreviewSlidebox/index.js +15 -3
  65. package/v2Components/TestAndPreviewSlidebox/sagas.js +11 -4
  66. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +3 -1
  67. package/v2Components/VarSegmentMessageEditor/constants.js +2 -0
  68. package/v2Components/VarSegmentMessageEditor/index.js +125 -0
  69. package/v2Components/VarSegmentMessageEditor/index.scss +46 -0
  70. package/v2Containers/App/constants.js +0 -3
  71. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +43 -0
  72. package/v2Containers/CreativesContainer/SlideBoxContent.js +36 -4
  73. package/v2Containers/CreativesContainer/SlideBoxFooter.js +10 -1
  74. package/v2Containers/CreativesContainer/SlideBoxHeader.js +29 -4
  75. package/v2Containers/CreativesContainer/constants.js +9 -0
  76. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +79 -0
  77. package/v2Containers/CreativesContainer/index.js +322 -103
  78. package/v2Containers/CreativesContainer/index.scss +51 -1
  79. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +90 -0
  80. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +78 -34
  81. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +79 -16
  82. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +8 -0
  83. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +357 -98
  84. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +20 -15
  85. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +258 -0
  86. package/v2Containers/CreativesContainer/tests/index.test.js +71 -9
  87. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +125 -0
  88. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  89. package/v2Containers/Rcs/constants.js +119 -10
  90. package/v2Containers/Rcs/index.js +2445 -813
  91. package/v2Containers/Rcs/index.scss +280 -8
  92. package/v2Containers/Rcs/messages.js +34 -3
  93. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +225 -0
  94. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +98018 -70073
  95. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +0 -5
  96. package/v2Containers/Rcs/tests/index.test.js +152 -121
  97. package/v2Containers/Rcs/tests/mockData.js +38 -0
  98. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +318 -0
  99. package/v2Containers/Rcs/tests/utils.test.js +646 -30
  100. package/v2Containers/Rcs/utils.js +478 -11
  101. package/v2Containers/Sms/Create/index.js +106 -40
  102. package/v2Containers/Sms/smsFormDataHelpers.js +67 -0
  103. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +253 -0
  104. package/v2Containers/SmsTrai/Create/index.js +9 -4
  105. package/v2Containers/SmsTrai/Edit/constants.js +2 -0
  106. package/v2Containers/SmsTrai/Edit/index.js +640 -130
  107. package/v2Containers/SmsTrai/Edit/index.scss +121 -0
  108. package/v2Containers/SmsTrai/Edit/messages.js +14 -4
  109. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4328 -2375
  110. package/v2Containers/SmsWrapper/index.js +37 -8
  111. package/v2Containers/TagList/index.js +6 -0
  112. package/v2Containers/Templates/TemplatesActionBar.js +101 -0
  113. package/v2Containers/Templates/_templates.scss +166 -9
  114. package/v2Containers/Templates/actions.js +11 -0
  115. package/v2Containers/Templates/constants.js +2 -0
  116. package/v2Containers/Templates/index.js +122 -120
  117. package/v2Containers/Templates/sagas.js +56 -12
  118. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +120 -0
  119. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1062 -1017
  120. package/v2Containers/Templates/tests/sagas.test.js +199 -16
  121. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +180 -0
  122. package/v2Containers/Templates/utils/smsTemplatesListApi.js +79 -0
  123. package/v2Containers/TemplatesV2/TemplatesV2.style.js +72 -1
  124. package/v2Containers/TemplatesV2/index.js +86 -23
  125. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +131 -0
  126. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  127. package/v2Containers/WebPush/Create/index.js +8 -91
  128. package/v2Containers/WebPush/Create/index.scss +0 -7
  129. package/v2Containers/Whatsapp/index.js +3 -20
  130. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +578 -34
  131. package/v2Components/CommonTestAndPreview/UnifiedPreview/WebPushPreviewContent.js +0 -169
  132. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/WebPushPreviewContent.test.js +0 -522
  133. package/v2Containers/App/tests/constants.test.js +0 -61
  134. package/v2Containers/Templates/tests/webpush.test.js +0 -375
  135. package/v2Containers/WebPush/Create/tests/getTemplateContent.test.js +0 -338
  136. package/v2Containers/WebPush/Create/tests/testAndPreviewIntegration.test.js +0 -325
@@ -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,25 +11,24 @@
11
11
  height: 100%;
12
12
  display: flex;
13
13
  flex-direction: column;
14
- background: $CAP_WHITE;
15
14
  overflow: hidden;
16
-
15
+
17
16
  // Preview Chrome wrapper (matches old TestAndPreviewSlidebox design)
18
17
  .preview-chrome {
19
18
  background: $CAP_WHITE;
20
19
  overflow: hidden;
21
-
20
+
22
21
  .preview-divider {
23
22
  margin: 0;
24
23
  }
25
-
24
+
26
25
  .preview-header {
27
26
  display: flex;
28
27
  justify-content: space-between;
29
28
  align-items: center;
30
29
  padding: $CAP_SPACE_08 $CAP_SPACE_16 $CAP_SPACE_06 $CAP_SPACE_16;
31
30
  background: $CAP_G09;
32
-
31
+
33
32
  .preview-for {
34
33
  font-size: $FONT_SIZE_M;
35
34
  color: #595959;
@@ -39,20 +38,20 @@
39
38
  margin-left: $CAP_SPACE_04;
40
39
  }
41
40
  }
42
-
41
+
43
42
  .device-toggle {
44
43
  display: flex;
45
44
  gap: $CAP_SPACE_08;
46
45
  background-color: #e0e0e0;
47
46
  padding: $CAP_SPACE_06 $CAP_SPACE_08;
48
47
  border-radius: $CAP_SPACE_08;
49
-
48
+
50
49
  .anticon {
51
50
  padding: $CAP_SPACE_04;
52
51
  border-radius: $CAP_SPACE_04;
53
52
  cursor: pointer;
54
53
  color: #595959;
55
-
54
+
56
55
  &.active {
57
56
  background-color: $CAP_WHITE;
58
57
  color: #262626;
@@ -62,7 +61,27 @@
62
61
  }
63
62
  }
64
63
  }
65
-
64
+
65
+ .unified-preview.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
+
66
85
  // Preview Content Container
67
86
  .preview-content-container {
68
87
  flex: 1;
@@ -75,25 +94,25 @@
75
94
  .preview-content-container-no-header {
76
95
  background-color: $CAP_WHITE;
77
96
  }
78
-
97
+
79
98
  // Device Frames
80
99
  .unified-preview-frame {
81
100
  width: 100%;
82
101
  display: flex;
83
102
  justify-content: center;
84
-
103
+
85
104
  .device-frame {
86
105
  background: $CAP_WHITE;
87
106
  border-radius: $CAP_SPACE_08;
88
107
  box-shadow: 0 $CAP_SPACE_04 $CAP_SPACE_12 rgba(0, 0, 0, 0.15);
89
108
  overflow: hidden;
90
109
  transition: all 0.3s ease;
91
-
110
+
92
111
  // Desktop Frame
93
112
  &.device-frame-desktop {
94
113
  width: 100%;
95
114
  min-height: 42.857rem;
96
-
115
+
97
116
  .desktop-chrome {
98
117
  height: $CAP_SPACE_40;
99
118
  background: $CAP_G12;
@@ -102,30 +121,30 @@
102
121
  align-items: center;
103
122
  padding: 0 $CAP_SPACE_12;
104
123
  gap: $CAP_SPACE_12;
105
-
124
+
106
125
  .chrome-dots {
107
126
  display: flex;
108
127
  gap: $CAP_SPACE_06;
109
-
128
+
110
129
  .dot {
111
130
  width: $CAP_SPACE_12;
112
131
  height: $CAP_SPACE_12;
113
132
  border-radius: 50%;
114
-
133
+
115
134
  &.dot-close {
116
135
  background: #ff5f56;
117
136
  }
118
-
137
+
119
138
  &.dot-minimize {
120
139
  background: #ffbd2e;
121
140
  }
122
-
141
+
123
142
  &.dot-maximize {
124
143
  background: #27c93f;
125
144
  }
126
145
  }
127
146
  }
128
-
147
+
129
148
  .chrome-address-bar {
130
149
  flex: 1;
131
150
  background: $CAP_WHITE;
@@ -135,25 +154,25 @@
135
154
  color: #8c8c8c;
136
155
  }
137
156
  }
138
-
157
+
139
158
  .device-content {
140
159
  min-height: 40rem;
141
160
  background: $CAP_WHITE;
142
161
  }
143
162
  }
144
-
163
+
145
164
  // Tablet Frame
146
165
  &.device-frame-tablet {
147
166
  width: 54.857rem;
148
167
  max-width: 90%;
149
-
168
+
150
169
  .tablet-chrome {
151
170
  height: $CAP_SPACE_24;
152
171
  background: #333333;
153
172
  display: flex;
154
173
  align-items: center;
155
174
  justify-content: center;
156
-
175
+
157
176
  .tablet-camera {
158
177
  width: $CAP_SPACE_08;
159
178
  height: $CAP_SPACE_08;
@@ -162,19 +181,19 @@
162
181
  border: $CAP_SPACE_01 solid #666666;
163
182
  }
164
183
  }
165
-
184
+
166
185
  .device-content {
167
186
  min-height: 73.143rem;
168
187
  background: $CAP_WHITE;
169
188
  }
170
-
189
+
171
190
  .tablet-footer {
172
191
  height: 3.571rem;
173
192
  background: #333333;
174
193
  display: flex;
175
194
  align-items: center;
176
195
  justify-content: center;
177
-
196
+
178
197
  .home-button {
179
198
  width: $CAP_SPACE_40;
180
199
  height: $CAP_SPACE_40;
@@ -184,19 +203,19 @@
184
203
  }
185
204
  }
186
205
  }
187
-
206
+
188
207
  // Mobile Frame
189
208
  &.device-frame-mobile {
190
209
  width: 26.786rem;
191
210
  max-width: 90%;
192
-
211
+
193
212
  .mobile-chrome {
194
213
  height: $CAP_SPACE_24;
195
214
  background: #000000;
196
215
  display: flex;
197
216
  align-items: center;
198
217
  justify-content: center;
199
-
218
+
200
219
  .mobile-notch {
201
220
  width: 10.714rem;
202
221
  height: 1.571rem;
@@ -204,19 +223,19 @@
204
223
  border-radius: 0 0 $CAP_SPACE_12 $CAP_SPACE_12;
205
224
  }
206
225
  }
207
-
226
+
208
227
  .device-content {
209
228
  min-height: 47.643rem;
210
229
  background: $CAP_WHITE;
211
230
  }
212
-
231
+
213
232
  .mobile-footer {
214
233
  height: $CAP_SPACE_24;
215
234
  background: #000000;
216
235
  display: flex;
217
236
  align-items: center;
218
237
  justify-content: center;
219
-
238
+
220
239
  .home-indicator {
221
240
  width: $CAP_SPACE_80;
222
241
  height: $CAP_SPACE_04;
@@ -228,7 +247,7 @@
228
247
  }
229
248
  }
230
249
  }
231
-
250
+
232
251
  // Channel Preview Placeholders (Phase 5)
233
252
  .channel-preview-placeholder {
234
253
  display: flex;
@@ -238,7 +257,7 @@
238
257
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
239
258
  text-align: center;
240
259
  min-height: 28.571rem;
241
-
260
+
242
261
  .question-circle {
243
262
  font-size: $CAP_SPACE_48;
244
263
  color: $CAP_COLOR_16;
@@ -249,13 +268,13 @@
249
268
  font-weight: 600;
250
269
  color: #262626;
251
270
  }
252
-
271
+
253
272
  p {
254
273
  margin-top: $CAP_SPACE_08;
255
274
  font-size: $FONT_SIZE_M;
256
275
  color: #8c8c8c;
257
276
  }
258
-
277
+
259
278
  .preview-subject {
260
279
  margin-top: $CAP_SPACE_24;
261
280
  padding: $CAP_SPACE_12 $CAP_SPACE_16;
@@ -264,26 +283,26 @@
264
283
  text-align: left;
265
284
  width: 100%;
266
285
  max-width: 35.714rem;
267
-
286
+
268
287
  strong {
269
288
  color: #595959;
270
289
  margin-right: $CAP_SPACE_08;
271
290
  }
272
291
  }
273
-
292
+
274
293
  .preview-body-placeholder {
275
294
  margin-top: $CAP_SPACE_12;
276
295
  padding: $CAP_SPACE_08 $CAP_SPACE_12;
277
296
  background: #fafafa;
278
297
  border: $CAP_SPACE_01 dashed $CAP_COLOR_16;
279
298
  border-radius: $CAP_SPACE_04;
280
-
299
+
281
300
  small {
282
301
  color: #8c8c8c;
283
302
  }
284
303
  }
285
304
  }
286
-
305
+
287
306
  // Loading State
288
307
  &.unified-preview-loading {
289
308
  .preview-loading-container {
@@ -294,14 +313,14 @@
294
313
  justify-content: center;
295
314
  gap: $CAP_SPACE_16;
296
315
  min-height: 28.571rem;
297
-
316
+
298
317
  .loading-text {
299
318
  font-size: $FONT_SIZE_M;
300
319
  color: #8c8c8c;
301
320
  }
302
321
  }
303
322
  }
304
-
323
+
305
324
  // Error State
306
325
  &.unified-preview-error {
307
326
  .preview-error-container {
@@ -312,7 +331,7 @@
312
331
  justify-content: center;
313
332
  gap: $CAP_SPACE_16;
314
333
  min-height: 28.571rem;
315
-
334
+
316
335
  .exclamation-circle {
317
336
  font-size: $CAP_SPACE_48;
318
337
  color: #ff4d4f;
@@ -322,7 +341,7 @@
322
341
  font-weight: 600;
323
342
  color: #262626;
324
343
  }
325
-
344
+
326
345
  .error-message {
327
346
  font-size: $FONT_SIZE_M;
328
347
  color: #ff4d4f;
@@ -331,7 +350,7 @@
331
350
  }
332
351
  }
333
352
  }
334
-
353
+
335
354
  // Preview Metadata
336
355
  .preview-metadata {
337
356
  padding: $CAP_SPACE_12 $CAP_SPACE_24;
@@ -341,7 +360,7 @@
341
360
  color: #8c8c8c;
342
361
  display: flex;
343
362
  gap: $CAP_SPACE_16;
344
-
363
+
345
364
  .metadata-item {
346
365
  display: flex;
347
366
  gap: $CAP_SPACE_04;
@@ -534,7 +553,7 @@
534
553
  font-weight: 600;
535
554
  color: #262626;
536
555
  }
537
-
556
+
538
557
  .error-message {
539
558
  font-size: $FONT_SIZE_M;
540
559
  color: #ff4d4f;
@@ -576,9 +595,12 @@
576
595
  transform: translateX(-50%);
577
596
  width: 100%;
578
597
  max-width: 26.786rem;
598
+ min-width: 0; // flex descendant overflow: allow shrink inside narrow screen
579
599
  height: calc(100% - 4.5rem);
580
600
  display: flex;
581
601
  flex-direction: column;
602
+ overflow-x: hidden;
603
+ box-sizing: border-box;
582
604
 
583
605
  &.sms-content-overlay-android {
584
606
  height: calc(100% - 3.8rem);
@@ -740,7 +762,7 @@
740
762
  font-weight: 600;
741
763
  color: #262626;
742
764
  }
743
-
765
+
744
766
  .sms-error-message {
745
767
  font-size: $FONT_SIZE_M;
746
768
  color: #ff4d4f;
@@ -762,13 +784,261 @@
762
784
  }
763
785
  }
764
786
 
787
+ // RCS carousel: allow cards to slide "behind" the phone frame/bezel
788
+ // (device png covers overflow while screen cutout still shows overlay)
789
+ .rcs-device-container.rcs-device-container-carousel {
790
+ .sms-device-image {
791
+ position: relative;
792
+ z-index: 0; // keep device image behind the overlay so preview never disappears
793
+ pointer-events: none; // allow horizontal scroll/drag on carousel underneath
794
+ }
795
+
796
+ .rcs-content-overlay {
797
+ z-index: 1; // overlay above device image (preview visible)
798
+ }
799
+ }
800
+
801
+ // RCS-only overrides for SMS-style preview frame (scoped; does not affect SMS channel preview)
802
+ .rcs-device-container {
803
+ .rcs-content-overlay {
804
+
805
+ &.sms-preview.sms-ios {
806
+ .sms-message-container.rcs-message-container-carousel {
807
+ margin-right: 0; // allow carousel to reach device edge
808
+ }
809
+ }
810
+
811
+ .sms-message-container {
812
+ &.rcs-message-container-carousel {
813
+ // Let carousel reach the right edge of the device frame (match expected)
814
+ padding-right: 0;
815
+ }
816
+
817
+ .sms-message-bubble {
818
+ &.rcs-message-bubble-carousel {
819
+ background: transparent;
820
+ padding: 0;
821
+ max-width: 100%;
822
+ border-radius: 0;
823
+ width: 100%;
824
+
825
+ .sms-message-text {
826
+ width: 100%;
827
+ }
828
+ }
829
+ }
830
+ }
831
+ }
832
+ }
833
+
834
+ // RCS Carousel preview inside SMS-style device frame
835
+ // RcsPreviewContent uses msg-container-carousel/scroll-container/message-pop-carousel classes.
836
+ .rcs-device-container {
837
+ .rcs-content-overlay {
838
+ .sms-message-text {
839
+ .message-pop.sms {
840
+ width: 100%;
841
+ .msg-container-carousel {
842
+ display: flex;
843
+ flex-direction: column;
844
+ width: 100%;
845
+ }
846
+
847
+ .scroll-container {
848
+ overflow-x: auto;
849
+ overflow-y: hidden;
850
+ display: flex;
851
+ flex-wrap: nowrap; // CapRow defaults can wrap; carousel must stay in one row
852
+ align-items: stretch;
853
+ padding-top: $CAP_SPACE_06;
854
+ padding-right: 0; // allow cards to align flush on the right
855
+ white-space: nowrap;
856
+ scrollbar-width: none; // Hide scrollbar in Firefox
857
+ gap: 0.75rem; // 12px; no trailing whitespace like margin-right
858
+ width: 100%;
859
+
860
+ &::-webkit-scrollbar {
861
+ display: none; // Hide scrollbar in Chrome/Safari/Opera
862
+ }
863
+ }
864
+
865
+ .message-pop-carousel {
866
+ // Match TemplatePreview carousel card look (big card + subtle shadow)
867
+ background-color: $CAP_WHITE;
868
+ border-radius: $CAP_SPACE_08;
869
+ // Ensure card width is stable and does not shrink to text width
870
+ width: 16.125rem; // 258px (shows 1 card + a peek of the next)
871
+ min-width: 16.125rem;
872
+ flex: 0 0 16.125rem;
873
+ padding: 0;
874
+ margin-right: 0; // spacing handled by scroll-container gap
875
+ color: $CAP_G01;
876
+ overflow: hidden;
877
+ box-shadow: 0 0 0.625rem 0 rgba(0, 0, 0, 0.08);
878
+ position: relative;
879
+ }
880
+
881
+ .whatsapp-content {
882
+ font-family: Roboto, 'Open Sans', sans-serif;
883
+ margin: 0;
884
+ width: 100%;
885
+ }
886
+
887
+ // Height follows width × aspect-ratio; inline style from carouselPreviewDimensions overrides fallback.
888
+ .whatsapp-image.rcs-carousel-media-wrap {
889
+ width: 100%;
890
+ height: auto;
891
+ aspect-ratio: 1280 / 720; // MEDIUM_MEDIUM image fallback when dimensions not passed
892
+ display: block;
893
+ overflow: hidden;
894
+ border-radius: 0.5rem 0.5rem 0 0; // 8px
895
+ margin-bottom: 0;
896
+
897
+ // CapImage (antd Image) applies className on wrapper; ensure inner img is constrained too.
898
+ img,
899
+ .ant-image-img {
900
+ width: 100%;
901
+ height: 100%;
902
+ object-fit: cover;
903
+ border-radius: inherit;
904
+ display: block;
905
+ }
906
+
907
+ // Plain <img> in RCS carousel preview (not CapImage)
908
+ .rcs-carousel-img {
909
+ width: 100%;
910
+ height: 100%;
911
+ object-fit: cover;
912
+ border-radius: inherit;
913
+ display: block;
914
+ }
915
+ }
916
+
917
+ .video-preview {
918
+ position: relative;
919
+ width: 100%;
920
+ margin-bottom: 0;
921
+
922
+ .whatsapp-image.rcs-carousel-media-wrap {
923
+ width: 100%;
924
+ height: auto;
925
+ aspect-ratio: 796 / 448; // MEDIUM_MEDIUM video thumbnail fallback
926
+ margin-bottom: 0;
927
+
928
+ img,
929
+ .ant-image-img,
930
+ .rcs-carousel-img {
931
+ width: 100%;
932
+ height: 100%;
933
+ object-fit: cover;
934
+ border-radius: inherit;
935
+ display: block;
936
+ }
937
+ }
938
+
939
+ .icon-position {
940
+ position: absolute;
941
+ top: 50%;
942
+ left: 50%;
943
+ transform: translate(-50%, -50%);
944
+ display: flex;
945
+ align-items: center;
946
+ justify-content: center;
947
+
948
+ .video-icon {
949
+ width: $CAP_SPACE_48;
950
+ height: $CAP_SPACE_48;
951
+ }
952
+ }
953
+ }
954
+
955
+ .carousel-content {
956
+ padding: 0.625rem 0.75rem; // 10px 12px
957
+ width: 100%;
958
+ background-color: #ebecf0;
959
+ white-space: normal; // override scroll-container's nowrap so text can wrap
960
+ display: flex;
961
+ flex-direction: column;
962
+ border-bottom-left-radius: 0.25rem; // 4px — text panel tucks above CTA gap (Figma)
963
+ border-bottom-right-radius: 0.25rem;
964
+
965
+ // Title/body typography via CapLabel type (label1 / label2, etc.)
966
+ .carousel-title {
967
+ margin-bottom: 0.25rem; // 4px
968
+ display: block;
969
+ overflow: visible;
970
+ white-space: normal;
971
+ overflow-wrap: anywhere;
972
+ }
973
+
974
+ .carousel-message {
975
+ display: block;
976
+ overflow: visible;
977
+ white-space: normal;
978
+ overflow-wrap: anywhere;
979
+ }
980
+
981
+ .rcs-carousel-field-placeholder {
982
+ color: $CAP_G05;
983
+ font-weight: $FONT_WEIGHT_REGULAR;
984
+ }
985
+ }
986
+
987
+ // Divider between message body and suggestions — subtle gray on the gray bubble
988
+ .whatsapp-divider {
989
+ margin: 0;
990
+ border-top: 1px solid $CAP_G07;
991
+ }
992
+
993
+ // Inside a carousel card (white bg) dividers should stay white
994
+ .message-pop-carousel .whatsapp-divider {
995
+ border-top: 1px solid $CAP_WHITE;
996
+ }
997
+
998
+ // Stacked full-width CTA bars below card copy, separated by white gap (Figma RCS carousel)
999
+ .rcs-carousel-cta-stack.cap-row-v2 {
1000
+ display: flex;
1001
+ flex-direction: column;
1002
+ flex-wrap: nowrap;
1003
+ width: 100%;
1004
+ gap: 0.25rem;
1005
+ box-sizing: border-box;
1006
+ align-items: stretch;
1007
+ }
1008
+
1009
+ .rcs-cta-preview--carousel-bar {
1010
+ display: flex;
1011
+ align-items: center;
1012
+ justify-content: center;
1013
+ gap: 0.375rem;
1014
+ width: 100%;
1015
+ margin: 0;
1016
+ padding: 0.625rem 0.75rem;
1017
+ box-sizing: border-box;
1018
+ background-color: #ebecf0;
1019
+ border-radius: 0.25rem;
1020
+ font-size: $FONT_SIZE_M;
1021
+ font-weight: $FONT_WEIGHT_MEDIUM;
1022
+ color: $CAP_G01;
1023
+ text-align: center;
1024
+ }
1025
+
1026
+ .rcs-cta-preview-phone-icon-end {
1027
+ margin-left: 0.25rem;
1028
+ flex-shrink: 0;
1029
+ }
1030
+ }
1031
+ }
1032
+ }
1033
+ }
1034
+
765
1035
  // WhatsApp Preview Content Styles (Phase 8)
766
1036
  // All WhatsApp styles wrapped in parent class for increased specificity
767
1037
  // This prevents other CSS (like CapLabel) from overriding WhatsApp-specific styles
768
1038
  .whatsapp-preview-wrapper {
769
1039
  // Using same CSS classes as TemplatePreview for consistency
770
1040
  // Styles are copied from TemplatePreview/_templatePreview.scss to ensure they work
771
-
1041
+
772
1042
  .shell-v2-whatsapp {
773
1043
  position: relative;
774
1044
  -webkit-transform: translate(-50%);
@@ -843,23 +1113,23 @@
843
1113
  }
844
1114
 
845
1115
  // WhatsApp message pop styles (matching TemplatePreview)
846
- &.whatsapp-message-pop {
1116
+ &.whatsapp-message-pop,
1117
+ &.whatsapp-message-pop-carousel {
847
1118
  padding: $CAP_SPACE_04 0 $CAP_SPACE_08;
848
1119
  border-radius: $CAP_SPACE_06;
849
1120
  background-color: $CAP_WHITE;
850
- width: 88%;
851
1121
  left: 0;
852
1122
  }
853
1123
 
1124
+ &.whatsapp-message-pop {
1125
+ width: 88%;
1126
+ }
1127
+
854
1128
  // WhatsApp carousel message pop styles
855
1129
  &.whatsapp-message-pop-carousel {
856
- padding: $CAP_SPACE_04 0 $CAP_SPACE_08;
857
- border-radius: $CAP_SPACE_06;
858
- background-color: $CAP_WHITE;
859
1130
  width: 10.4rem;
860
1131
  cursor: pointer;
861
1132
  flex-shrink: 0;
862
- left: 0;
863
1133
  }
864
1134
  }
865
1135
  }
@@ -924,7 +1194,7 @@
924
1194
  line-height: 1rem;
925
1195
  font-family: Roboto, 'Open Sans', sans-serif;
926
1196
  }
927
-
1197
+
928
1198
  .whatsapp-template-footer-preview {
929
1199
  // From WhatsApp/index.scss: color: $CAP_G04, but use white for preview
930
1200
  color: $CAP_G01;
@@ -1007,19 +1277,19 @@
1007
1277
  color: #8c8c8c;
1008
1278
  font-size: $FONT_SIZE_M;
1009
1279
  }
1010
-
1280
+
1011
1281
  .whatsapp-error-text {
1012
1282
  font-size: $FONT_SIZE_L;
1013
1283
  font-weight: 600;
1014
1284
  color: #262626;
1015
1285
  }
1016
-
1286
+
1017
1287
  .whatsapp-error-message {
1018
1288
  font-size: $FONT_SIZE_M;
1019
1289
  color: #ff4d4f;
1020
1290
  text-align: center;
1021
1291
  }
1022
-
1292
+
1023
1293
  .whatsapp-no-content {
1024
1294
  color: #8c8c8c;
1025
1295
  font-size: $FONT_SIZE_M;
@@ -1071,14 +1341,14 @@
1071
1341
  color: #8c8c8c;
1072
1342
  margin-top: $CAP_SPACE_04;
1073
1343
  }
1074
-
1344
+
1075
1345
  .url-preview {
1076
1346
  font-size: $FONT_SIZE_S;
1077
1347
  color: #1890ff;
1078
1348
  word-break: break-all;
1079
1349
  }
1080
1350
  }
1081
-
1351
+
1082
1352
  // InApp Preview Content Styles (Phase 10)
1083
1353
  // Styles copied from TemplatePreview/_templatePreview.scss to ensure consistency
1084
1354
  // These styles work within the SMS device container structure
@@ -1139,11 +1409,11 @@
1139
1409
  .inapp-message-container-FULLSCREEN {
1140
1410
  position: relative;
1141
1411
  background-color: $CAP_WHITE;
1142
- width: 100%;
1412
+ width: 100%;
1143
1413
  height: 100%;
1144
1414
  align-items: center;
1145
1415
  padding: 0 $CAP_SPACE_16;
1146
- border-bottom-left-radius: 2.6rem;
1416
+ border-bottom-left-radius: 2.6rem;
1147
1417
  border-bottom-right-radius: 2.6rem;
1148
1418
  .inapp-title-FULLSCREEN {
1149
1419
  align-items: center;
@@ -1973,7 +2243,7 @@
1973
2243
  max-height: 7.5rem;
1974
2244
  margin-left: $CAP_SPACE_24;
1975
2245
  }
1976
-
2246
+
1977
2247
  .mpush-gif-preview {
1978
2248
  max-width: 100%;
1979
2249
  max-height: 7.5rem;
@@ -2233,6 +2503,7 @@
2233
2503
  font-weight: 500;
2234
2504
  display: -webkit-box;
2235
2505
  -webkit-line-clamp: 1;
2506
+ line-clamp: 1;
2236
2507
  -webkit-box-orient: vertical;
2237
2508
  overflow: hidden;
2238
2509
  color: $CAP_WHITE;
@@ -2284,7 +2555,7 @@
2284
2555
  color: $FONT_COLOR_01;
2285
2556
  margin-bottom: $CAP_SPACE_12;
2286
2557
  }
2287
-
2558
+
2288
2559
  .preview-text {
2289
2560
  font-weight: 400;
2290
2561
  font-size: $FONT_SIZE_S;
@@ -2319,13 +2590,13 @@
2319
2590
  justify-content: center;
2320
2591
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2321
2592
  gap: $CAP_SPACE_16;
2322
-
2593
+
2323
2594
  .zalo-loading-text {
2324
2595
  color: #8c8c8c;
2325
2596
  font-size: $FONT_SIZE_M;
2326
2597
  }
2327
2598
  }
2328
-
2599
+
2329
2600
  // Error state
2330
2601
  .zalo-error-container {
2331
2602
  display: flex;
@@ -2334,13 +2605,13 @@
2334
2605
  justify-content: center;
2335
2606
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2336
2607
  gap: $CAP_SPACE_16;
2337
-
2608
+
2338
2609
  .zalo-error-text {
2339
2610
  font-size: $FONT_SIZE_L;
2340
2611
  font-weight: 600;
2341
2612
  color: #262626;
2342
2613
  }
2343
-
2614
+
2344
2615
  .zalo-error-message {
2345
2616
  font-size: $FONT_SIZE_M;
2346
2617
  color: #ff4d4f;
@@ -2350,76 +2621,6 @@
2350
2621
  }
2351
2622
  }
2352
2623
 
2353
- // WebPush Test & Preview Styles
2354
- .webpush-test-preview-container {
2355
- width: 100%;
2356
- position: relative;
2357
- padding-left: $CAP_SPACE_16;
2358
- padding-right: $CAP_SPACE_16;
2359
- }
2360
-
2361
- .webpush-preview-panel {
2362
- position: relative;
2363
- width: 100%;
2364
- }
2365
-
2366
- .webpush-expand-btn {
2367
- position: absolute;
2368
- top: 8px;
2369
- right: 8px;
2370
- z-index: 10;
2371
- padding: 4px;
2372
- display: flex;
2373
- align-items: center;
2374
- justify-content: center;
2375
-
2376
- &:hover {
2377
- background-color: rgba(0, 0, 0, 0.06);
2378
- border-radius: 4px;
2379
- }
2380
- }
2381
-
2382
- .webpush-fullscreen-modal {
2383
- .webpush-fullscreen-divider {
2384
- margin-top: 0;
2385
- margin-bottom: $CAP_SPACE_16;
2386
- }
2387
- .ant-modal.cap-modal-v2 {
2388
- width: 90%;
2389
- max-width: 100%;
2390
- margin-top: $CAP_SPACE_40;
2391
- }
2392
- // Preview Chrome wrapper (matches old TestAndPreviewSlidebox design)
2393
- .webpush-preview-header {
2394
- background: $CAP_WHITE;
2395
- overflow: hidden;
2396
-
2397
- .preview-divider {
2398
- margin: 0;
2399
- }
2400
-
2401
- .webpush-heading-container {
2402
- display: flex;
2403
- justify-content: space-between;
2404
- align-items: center;
2405
- padding: $CAP_SPACE_16 0 $CAP_SPACE_16 0;
2406
-
2407
- .preview-for {
2408
- gap: $CAP_SPACE_04;
2409
- align-items: center;
2410
- b {
2411
- margin-left: $CAP_SPACE_08;
2412
- }
2413
- }
2414
-
2415
- .webpush-fullscreen-close-icon {
2416
- width: $CAP_SPACE_24;
2417
- height: $CAP_SPACE_24;
2418
- }
2419
- }
2420
- }
2421
- }
2422
-
2423
2624
  // Responsive adjustments
2424
2625
  @media (max-width: 85.714rem) {
2425
2626
  .unified-preview {
@@ -2428,31 +2629,31 @@
2428
2629
  }
2429
2630
  }
2430
2631
  }
2431
-
2632
+
2432
2633
  @media (max-width: 54.857rem) {
2433
2634
  .unified-preview {
2434
2635
  .preview-header {
2435
2636
  flex-direction: column;
2436
2637
  align-items: flex-start;
2437
2638
  gap: $CAP_SPACE_12;
2438
-
2639
+
2439
2640
  .preview-header-right {
2440
2641
  width: 100%;
2441
2642
  justify-content: flex-start;
2442
2643
  }
2443
2644
  }
2444
-
2645
+
2445
2646
  .preview-content-container {
2446
2647
  padding: $CAP_SPACE_16;
2447
2648
  }
2448
-
2649
+
2449
2650
  .device-frame {
2450
2651
  &.device-frame-desktop,
2451
2652
  &.device-frame-tablet {
2452
2653
  width: 100% !important;
2453
2654
  max-width: 100% !important;
2454
2655
  }
2455
-
2656
+
2456
2657
  &.device-frame-mobile {
2457
2658
  width: 100% !important;
2458
2659
  max-width: 100% !important;
@@ -2460,4 +2661,3 @@
2460
2661
  }
2461
2662
  }
2462
2663
  }
2463
-