@capillarytech/creatives-library 9.0.15-alpha.0 → 9.0.15-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 (132) hide show
  1. package/constants/unified.js +29 -0
  2. package/global-styles.js +1 -1
  3. package/package.json +1 -1
  4. package/services/tests/api.test.js +35 -20
  5. package/utils/commonUtils.js +19 -1
  6. package/utils/rcsPayloadUtils.js +92 -0
  7. package/utils/templateVarUtils.js +201 -0
  8. package/utils/tests/rcsPayloadUtils.test.js +226 -0
  9. package/utils/tests/templateVarUtils.test.js +204 -0
  10. package/v2Components/CapActionButton/constants.js +7 -0
  11. package/v2Components/CapActionButton/index.js +168 -109
  12. package/v2Components/CapActionButton/index.scss +156 -5
  13. package/v2Components/CapActionButton/messages.js +19 -3
  14. package/v2Components/CapActionButton/tests/index.test.js +42 -18
  15. package/v2Components/CapImageUpload/index.js +2 -2
  16. package/v2Components/CapTagList/index.js +10 -0
  17. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +70 -48
  18. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +8 -2
  19. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +214 -21
  20. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +16 -0
  21. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +83 -9
  22. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +30 -0
  23. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +60 -11
  24. package/v2Components/CommonTestAndPreview/SendTestMessage.js +10 -5
  25. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +201 -23
  26. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +355 -76
  27. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +155 -8
  28. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +11 -0
  29. package/v2Components/CommonTestAndPreview/constants.js +38 -2
  30. package/v2Components/CommonTestAndPreview/index.js +761 -222
  31. package/v2Components/CommonTestAndPreview/messages.js +45 -3
  32. package/v2Components/CommonTestAndPreview/previewApiUtils.js +59 -0
  33. package/v2Components/CommonTestAndPreview/sagas.js +25 -6
  34. package/v2Components/CommonTestAndPreview/tests/CommonTestAndPreview.addTestCustomer.test.js +1 -0
  35. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +284 -267
  36. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +231 -65
  37. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +118 -5
  38. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +341 -0
  39. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +8 -1
  40. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +34 -13
  41. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +281 -283
  42. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +199 -1
  43. package/v2Components/CommonTestAndPreview/tests/index.test.js +133 -4
  44. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +67 -0
  45. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +31 -24
  46. package/v2Components/CommonTestAndPreview/utils.js +84 -0
  47. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +91 -0
  48. package/v2Components/SmsFallback/constants.js +94 -0
  49. package/v2Components/SmsFallback/index.js +958 -0
  50. package/v2Components/SmsFallback/index.scss +266 -0
  51. package/v2Components/SmsFallback/messages.js +78 -0
  52. package/v2Components/SmsFallback/smsFallbackUtils.js +120 -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 +208 -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 +41 -22
  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/CustomValuesEditor.js +6 -6
  65. package/v2Components/TestAndPreviewSlidebox/index.js +13 -1
  66. package/v2Components/TestAndPreviewSlidebox/sagas.js +11 -4
  67. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +3 -1
  68. package/v2Components/VarSegmentMessageEditor/constants.js +2 -0
  69. package/v2Components/VarSegmentMessageEditor/index.js +125 -0
  70. package/v2Components/VarSegmentMessageEditor/index.scss +46 -0
  71. package/v2Containers/CommunicationFlow/Tests/CommunicationFlow.test.js +4 -1
  72. package/v2Containers/CommunicationFlow/index.js +3 -3
  73. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/DeliverySettingsSection.test.js +4 -0
  74. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/SenderDetails.test.js +20 -20
  75. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +17 -0
  76. package/v2Containers/CreativesContainer/SlideBoxContent.js +36 -4
  77. package/v2Containers/CreativesContainer/SlideBoxFooter.js +14 -5
  78. package/v2Containers/CreativesContainer/SlideBoxHeader.js +36 -5
  79. package/v2Containers/CreativesContainer/constants.js +11 -0
  80. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +79 -0
  81. package/v2Containers/CreativesContainer/index.js +323 -104
  82. package/v2Containers/CreativesContainer/index.scss +83 -1
  83. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +90 -0
  84. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +79 -34
  85. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +79 -16
  86. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +8 -0
  87. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +333 -90
  88. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +20 -15
  89. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +258 -0
  90. package/v2Containers/CreativesContainer/tests/index.test.js +71 -9
  91. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +125 -0
  92. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  93. package/v2Containers/Rcs/constants.js +131 -11
  94. package/v2Containers/Rcs/index.js +2602 -807
  95. package/v2Containers/Rcs/index.scss +289 -8
  96. package/v2Containers/Rcs/messages.js +34 -3
  97. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +227 -0
  98. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +73535 -38537
  99. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +0 -8
  100. package/v2Containers/Rcs/tests/index.test.js +147 -36
  101. package/v2Containers/Rcs/tests/mockData.js +38 -0
  102. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +318 -0
  103. package/v2Containers/Rcs/tests/utils.test.js +646 -30
  104. package/v2Containers/Rcs/utils.js +478 -11
  105. package/v2Containers/Sms/Create/index.js +115 -48
  106. package/v2Containers/Sms/smsFormDataHelpers.js +67 -0
  107. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +253 -0
  108. package/v2Containers/SmsTrai/Create/index.js +9 -4
  109. package/v2Containers/SmsTrai/Edit/constants.js +2 -0
  110. package/v2Containers/SmsTrai/Edit/index.js +678 -169
  111. package/v2Containers/SmsTrai/Edit/index.scss +126 -0
  112. package/v2Containers/SmsTrai/Edit/messages.js +14 -4
  113. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +5615 -3014
  114. package/v2Containers/SmsWrapper/index.js +37 -8
  115. package/v2Containers/TagList/index.js +6 -0
  116. package/v2Containers/Templates/TemplatesActionBar.js +101 -0
  117. package/v2Containers/Templates/_templates.scss +171 -12
  118. package/v2Containers/Templates/actions.js +11 -0
  119. package/v2Containers/Templates/constants.js +2 -0
  120. package/v2Containers/Templates/index.js +125 -55
  121. package/v2Containers/Templates/sagas.js +57 -13
  122. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +120 -0
  123. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1060 -1015
  124. package/v2Containers/Templates/tests/sagas.test.js +199 -16
  125. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +180 -0
  126. package/v2Containers/Templates/utils/smsTemplatesListApi.js +79 -0
  127. package/v2Containers/TemplatesV2/TemplatesV2.style.js +72 -1
  128. package/v2Containers/TemplatesV2/index.js +86 -23
  129. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +131 -0
  130. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  131. package/v2Containers/Whatsapp/index.js +3 -20
  132. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +578 -34
@@ -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-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 {
@@ -293,14 +312,14 @@
293
312
  justify-content: center;
294
313
  gap: $CAP_SPACE_16;
295
314
  min-height: 28.571rem;
296
-
315
+
297
316
  .loading-text {
298
317
  font-size: $FONT_SIZE_M;
299
318
  color: #8c8c8c;
300
319
  }
301
320
  }
302
321
  }
303
-
322
+
304
323
  // Error State
305
324
  &.unified-preview-error {
306
325
  .preview-error-container {
@@ -311,7 +330,7 @@
311
330
  justify-content: center;
312
331
  gap: $CAP_SPACE_16;
313
332
  min-height: 28.571rem;
314
-
333
+
315
334
  .exclamation-circle {
316
335
  font-size: $CAP_SPACE_48;
317
336
  color: #ff4d4f;
@@ -321,7 +340,7 @@
321
340
  font-weight: 600;
322
341
  color: #262626;
323
342
  }
324
-
343
+
325
344
  .error-message {
326
345
  font-size: $FONT_SIZE_M;
327
346
  color: #ff4d4f;
@@ -330,7 +349,7 @@
330
349
  }
331
350
  }
332
351
  }
333
-
352
+
334
353
  // Preview Metadata
335
354
  .preview-metadata {
336
355
  padding: $CAP_SPACE_12 $CAP_SPACE_24;
@@ -340,7 +359,7 @@
340
359
  color: #8c8c8c;
341
360
  display: flex;
342
361
  gap: $CAP_SPACE_16;
343
-
362
+
344
363
  .metadata-item {
345
364
  display: flex;
346
365
  gap: $CAP_SPACE_04;
@@ -532,7 +551,7 @@
532
551
  font-weight: 600;
533
552
  color: #262626;
534
553
  }
535
-
554
+
536
555
  .error-message {
537
556
  font-size: $FONT_SIZE_M;
538
557
  color: #ff4d4f;
@@ -571,9 +590,12 @@
571
590
  transform: translateX(-50%);
572
591
  width: 100%;
573
592
  max-width: 26.786rem;
593
+ min-width: 0; // flex descendant overflow: allow shrink inside narrow screen
574
594
  height: calc(100% - 4.5rem);
575
595
  display: flex;
576
596
  flex-direction: column;
597
+ overflow-x: hidden;
598
+ box-sizing: border-box;
577
599
 
578
600
  &.sms-content-overlay-android {
579
601
  height: calc(100% - 3.8rem);
@@ -741,7 +763,7 @@
741
763
  font-weight: 600;
742
764
  color: #262626;
743
765
  }
744
-
766
+
745
767
  .sms-error-message {
746
768
  font-size: $FONT_SIZE_M;
747
769
  color: #ff4d4f;
@@ -763,13 +785,270 @@
763
785
  }
764
786
  }
765
787
 
788
+ // RCS-only overrides for SMS-style preview frame (scoped; does not affect SMS channel preview)
789
+ .rcs-device-container {
790
+
791
+ // Carousel panel: sibling of .sms-content-overlay, positioned absolutely within
792
+ // .sms-device-container (position:relative). Has NO overflow-x:hidden ancestor,
793
+ // mirroring the WhatsApp carousel approach so horizontal scroll events reach the
794
+ // inner .scroll-container directly.
795
+ &.rcs-device-container-carousel {
796
+ // Carousel panel: same geometry as .sms-content-overlay but NO overflow-x:hidden.
797
+ // padding-top skips past the nav bar ($CAP_SPACE_48 = 3.428rem) and date separator
798
+ // (~2.429rem), placing the carousel right where the original .sms-message-container
799
+ // started (which had flex:1 and filled from below the date separator downward).
800
+ .rcs-carousel-panel {
801
+ position: absolute;
802
+ left: 50%;
803
+ transform: translateX(-50%);
804
+ width: 100%;
805
+ max-width: 26.786rem;
806
+ box-sizing: border-box;
807
+ top: 4.143rem;
808
+ height: calc(100% - 4.5rem);
809
+ display: flex;
810
+ flex-direction: column;
811
+ padding-top: 5.857rem; // nav (3.428rem) + date separator (~2.429rem)
812
+ padding-bottom: $CAP_SPACE_16;
813
+
814
+ &.rcs-carousel-panel-android {
815
+ top: 3.1rem;
816
+ height: calc(100% - 3.8rem);
817
+ }
818
+
819
+ &.rcs-carousel-panel-ios {
820
+ height: calc(100% - 5rem);
821
+ }
822
+
823
+ .msg-container-carousel {
824
+ display: flex;
825
+ flex-direction: column;
826
+ width: 100%;
827
+ padding: 0 $CAP_SPACE_16;
828
+ }
829
+
830
+ .scroll-container {
831
+ display: flex;
832
+ flex-wrap: nowrap;
833
+ gap: 0.75rem;
834
+ overflow-x: auto;
835
+ overflow-y: hidden;
836
+ width: 100%;
837
+ scrollbar-width: none;
838
+
839
+ &::-webkit-scrollbar {
840
+ display: none;
841
+ }
842
+ }
843
+
844
+ .rcs-carousel-timestamp {
845
+ font-size: $FONT_SIZE_S;
846
+ color: #8c8c8c;
847
+ align-self: flex-end;
848
+ padding-right: $CAP_SPACE_04;
849
+ padding-top: $CAP_SPACE_04;
850
+ }
851
+ }
852
+ }
853
+
854
+ .rcs-content-overlay {
855
+ // no carousel-specific overlay overrides needed (carousel lives outside the overlay now)
856
+ }
857
+ }
858
+
859
+ // RCS Carousel card styles — scoped to .rcs-carousel-panel (which lives outside the
860
+ // overflow-x:hidden overlay so horizontal scroll events reach .scroll-container freely).
861
+ .rcs-device-container {
862
+ .rcs-carousel-panel {
863
+
864
+ .message-pop-carousel {
865
+ // Match TemplatePreview carousel card look (big card + subtle shadow)
866
+ background-color: $CAP_WHITE;
867
+ border-radius: $CAP_SPACE_08;
868
+ // Ensure card width is stable and does not shrink to text width
869
+ width: 15.375rem; // ~246px; fills container leaving ~50% of next card peeking
870
+ min-width: 15.375rem;
871
+ flex: 0 0 15.375rem;
872
+ padding: 0;
873
+ margin-right: 0; // spacing handled by scroll-container gap
874
+ color: $CAP_G01;
875
+ overflow: hidden;
876
+ box-shadow: 0 0 0.625rem 0 rgba(0, 0, 0, 0.08);
877
+ position: relative;
878
+ }
879
+
880
+ .whatsapp-content {
881
+ font-family: Roboto, 'Open Sans', sans-serif;
882
+ margin: 0;
883
+ width: 100%;
884
+ }
885
+
886
+ // Height follows width × aspect-ratio; inline style from carouselPreviewDimensions overrides fallback.
887
+ .whatsapp-image.rcs-carousel-media-wrap {
888
+ width: 100%;
889
+ height: auto;
890
+ aspect-ratio: 1280 / 720; // MEDIUM_MEDIUM image fallback when dimensions not passed
891
+ display: block;
892
+ overflow: hidden;
893
+ border-radius: 0.5rem 0.5rem 0 0; // 8px
894
+ margin-bottom: 0;
895
+
896
+ // CapImage (antd Image) applies className on wrapper; ensure inner img is constrained too.
897
+ img,
898
+ .ant-image-img {
899
+ width: 100%;
900
+ height: 100%;
901
+ object-fit: cover;
902
+ border-radius: inherit;
903
+ display: block;
904
+ }
905
+
906
+ // Plain <img> in RCS carousel preview (not CapImage)
907
+ .rcs-carousel-img {
908
+ width: 100%;
909
+ height: 100%;
910
+ object-fit: cover;
911
+ border-radius: inherit;
912
+ display: block;
913
+ }
914
+ }
915
+
916
+ .video-preview {
917
+ position: relative;
918
+ width: 100%;
919
+ margin-bottom: 0;
920
+
921
+ .whatsapp-image.rcs-carousel-media-wrap {
922
+ width: 100%;
923
+ height: auto;
924
+ aspect-ratio: 796 / 448; // MEDIUM_MEDIUM video thumbnail fallback
925
+ margin-bottom: 0;
926
+
927
+ img,
928
+ .ant-image-img,
929
+ .rcs-carousel-img {
930
+ width: 100%;
931
+ height: 100%;
932
+ object-fit: cover;
933
+ border-radius: inherit;
934
+ display: block;
935
+ }
936
+ }
937
+
938
+ .icon-position {
939
+ position: absolute;
940
+ top: 50%;
941
+ left: 50%;
942
+ transform: translate(-50%, -50%);
943
+ display: flex;
944
+ align-items: center;
945
+ justify-content: center;
946
+
947
+ .video-icon {
948
+ width: $CAP_SPACE_48;
949
+ height: $CAP_SPACE_48;
950
+ }
951
+ }
952
+ }
953
+
954
+ // CapTooltip shrink-wraps its wrapper/trigger by default and forces `display: inline-block`
955
+ // inline on the trigger span, so .video-preview's width:100% collapses to content width
956
+ // unless these are stretched to fill the card (inline style needs !important to override).
957
+ .rcs-carousel-video-tooltip-wrapper {
958
+ display: block;
959
+ width: 100%;
960
+ }
961
+
962
+ .rcs-carousel-video-tooltip-trigger {
963
+ display: block !important;
964
+ width: 100%;
965
+ }
966
+
967
+ .carousel-content {
968
+ padding: 0.625rem 0.75rem; // 10px 12px
969
+ width: 100%;
970
+ background-color: $CAP_WHITE;
971
+ white-space: normal; // override scroll-container's nowrap so text can wrap
972
+ display: flex;
973
+ flex-direction: column;
974
+ border-bottom-left-radius: 0.25rem; // 4px — text panel tucks above CTA gap (Figma)
975
+ border-bottom-right-radius: 0.25rem;
976
+
977
+ // Title/body typography via CapLabel type (label1 / label2, etc.)
978
+ .carousel-title {
979
+ margin-bottom: 0.25rem; // 4px
980
+ display: block;
981
+ overflow: visible;
982
+ white-space: normal;
983
+ overflow-wrap: anywhere;
984
+ }
985
+
986
+ .carousel-message {
987
+ display: block;
988
+ overflow: visible;
989
+ white-space: normal;
990
+ overflow-wrap: anywhere;
991
+ }
992
+
993
+ .rcs-carousel-field-placeholder {
994
+ color: $CAP_G05;
995
+ font-weight: $FONT_WEIGHT_REGULAR;
996
+ }
997
+ }
998
+
999
+ // Divider between message body and suggestions — subtle gray on the gray bubble
1000
+ .whatsapp-divider {
1001
+ margin: 0;
1002
+ border-top: 1px solid $CAP_G07;
1003
+ }
1004
+
1005
+ // Inside a carousel card (white bg) dividers should stay white
1006
+ .message-pop-carousel .whatsapp-divider {
1007
+ border-top: 1px solid $CAP_WHITE;
1008
+ }
1009
+
1010
+ // Stacked full-width CTA bars below card copy, separated by white gap (Figma RCS carousel)
1011
+ .rcs-carousel-cta-stack.cap-row-v2 {
1012
+ display: flex;
1013
+ flex-direction: column;
1014
+ flex-wrap: nowrap;
1015
+ width: 100%;
1016
+ gap: 0.25rem;
1017
+ box-sizing: border-box;
1018
+ align-items: stretch;
1019
+ }
1020
+
1021
+ .rcs-cta-preview--carousel-bar {
1022
+ display: flex;
1023
+ align-items: center;
1024
+ justify-content: center;
1025
+ gap: 0.375rem;
1026
+ width: 100%;
1027
+ margin: 0;
1028
+ padding: 0.625rem 0.75rem;
1029
+ box-sizing: border-box;
1030
+ background-color: $CAP_WHITE;
1031
+ border-radius: 0.25rem;
1032
+ font-size: $FONT_SIZE_M;
1033
+ font-weight: $FONT_WEIGHT_MEDIUM;
1034
+ color: $CAP_G01;
1035
+ text-align: center;
1036
+ }
1037
+
1038
+ .rcs-cta-preview-phone-icon-end {
1039
+ margin-left: 0.25rem;
1040
+ flex-shrink: 0;
1041
+ }
1042
+ }
1043
+ }
1044
+
766
1045
  // WhatsApp Preview Content Styles (Phase 8)
767
1046
  // All WhatsApp styles wrapped in parent class for increased specificity
768
1047
  // This prevents other CSS (like CapLabel) from overriding WhatsApp-specific styles
769
1048
  .whatsapp-preview-wrapper {
770
1049
  // Using same CSS classes as TemplatePreview for consistency
771
1050
  // Styles are copied from TemplatePreview/_templatePreview.scss to ensure they work
772
-
1051
+
773
1052
  .shell-v2-whatsapp {
774
1053
  position: relative;
775
1054
  -webkit-transform: translate(-50%);
@@ -844,23 +1123,23 @@
844
1123
  }
845
1124
 
846
1125
  // WhatsApp message pop styles (matching TemplatePreview)
847
- &.whatsapp-message-pop {
1126
+ &.whatsapp-message-pop,
1127
+ &.whatsapp-message-pop-carousel {
848
1128
  padding: $CAP_SPACE_04 0 $CAP_SPACE_08;
849
1129
  border-radius: $CAP_SPACE_06;
850
1130
  background-color: $CAP_WHITE;
851
- width: 88%;
852
1131
  left: 0;
853
1132
  }
854
1133
 
1134
+ &.whatsapp-message-pop {
1135
+ width: 88%;
1136
+ }
1137
+
855
1138
  // WhatsApp carousel message pop styles
856
1139
  &.whatsapp-message-pop-carousel {
857
- padding: $CAP_SPACE_04 0 $CAP_SPACE_08;
858
- border-radius: $CAP_SPACE_06;
859
- background-color: $CAP_WHITE;
860
1140
  width: 10.4rem;
861
1141
  cursor: pointer;
862
1142
  flex-shrink: 0;
863
- left: 0;
864
1143
  }
865
1144
  }
866
1145
  }
@@ -925,7 +1204,7 @@
925
1204
  line-height: 1rem;
926
1205
  font-family: Roboto, 'Open Sans', sans-serif;
927
1206
  }
928
-
1207
+
929
1208
  .whatsapp-template-footer-preview {
930
1209
  // From WhatsApp/index.scss: color: $CAP_G04, but use white for preview
931
1210
  color: $CAP_G01;
@@ -1007,19 +1286,19 @@
1007
1286
  color: #8c8c8c;
1008
1287
  font-size: $FONT_SIZE_M;
1009
1288
  }
1010
-
1289
+
1011
1290
  .whatsapp-error-text {
1012
1291
  font-size: $FONT_SIZE_L;
1013
1292
  font-weight: 600;
1014
1293
  color: #262626;
1015
1294
  }
1016
-
1295
+
1017
1296
  .whatsapp-error-message {
1018
1297
  font-size: $FONT_SIZE_M;
1019
1298
  color: #ff4d4f;
1020
1299
  text-align: center;
1021
1300
  }
1022
-
1301
+
1023
1302
  .whatsapp-no-content {
1024
1303
  color: #8c8c8c;
1025
1304
  font-size: $FONT_SIZE_M;
@@ -1071,14 +1350,14 @@
1071
1350
  color: #8c8c8c;
1072
1351
  margin-top: $CAP_SPACE_04;
1073
1352
  }
1074
-
1353
+
1075
1354
  .url-preview {
1076
1355
  font-size: $FONT_SIZE_S;
1077
1356
  color: #1890ff;
1078
1357
  word-break: break-all;
1079
1358
  }
1080
1359
  }
1081
-
1360
+
1082
1361
  // InApp Preview Content Styles (Phase 10)
1083
1362
  // Styles copied from TemplatePreview/_templatePreview.scss to ensure consistency
1084
1363
  // These styles work within the SMS device container structure
@@ -1139,11 +1418,11 @@
1139
1418
  .inapp-message-container-FULLSCREEN {
1140
1419
  position: relative;
1141
1420
  background-color: $CAP_WHITE;
1142
- width: 100%;
1421
+ width: 100%;
1143
1422
  height: 100%;
1144
1423
  align-items: center;
1145
1424
  padding: 0 $CAP_SPACE_16;
1146
- border-bottom-left-radius: 2.6rem;
1425
+ border-bottom-left-radius: 2.6rem;
1147
1426
  border-bottom-right-radius: 2.6rem;
1148
1427
  .inapp-title-FULLSCREEN {
1149
1428
  align-items: center;
@@ -1973,7 +2252,7 @@
1973
2252
  max-height: 7.5rem;
1974
2253
  margin-left: $CAP_SPACE_24;
1975
2254
  }
1976
-
2255
+
1977
2256
  .mpush-gif-preview {
1978
2257
  max-width: 100%;
1979
2258
  max-height: 7.5rem;
@@ -2231,6 +2510,7 @@
2231
2510
  font-weight: 500;
2232
2511
  display: -webkit-box;
2233
2512
  -webkit-line-clamp: 1;
2513
+ line-clamp: 1;
2234
2514
  -webkit-box-orient: vertical;
2235
2515
  overflow: hidden;
2236
2516
  color: $CAP_WHITE;
@@ -2282,7 +2562,7 @@
2282
2562
  color: $FONT_COLOR_01;
2283
2563
  margin-bottom: $CAP_SPACE_12;
2284
2564
  }
2285
-
2565
+
2286
2566
  .preview-text {
2287
2567
  font-weight: 400;
2288
2568
  font-size: $FONT_SIZE_S;
@@ -2317,13 +2597,13 @@
2317
2597
  justify-content: center;
2318
2598
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2319
2599
  gap: $CAP_SPACE_16;
2320
-
2600
+
2321
2601
  .zalo-loading-text {
2322
2602
  color: #8c8c8c;
2323
2603
  font-size: $FONT_SIZE_M;
2324
2604
  }
2325
2605
  }
2326
-
2606
+
2327
2607
  // Error state
2328
2608
  .zalo-error-container {
2329
2609
  display: flex;
@@ -2332,13 +2612,13 @@
2332
2612
  justify-content: center;
2333
2613
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2334
2614
  gap: $CAP_SPACE_16;
2335
-
2615
+
2336
2616
  .zalo-error-text {
2337
2617
  font-size: $FONT_SIZE_L;
2338
2618
  font-weight: 600;
2339
2619
  color: #262626;
2340
2620
  }
2341
-
2621
+
2342
2622
  .zalo-error-message {
2343
2623
  font-size: $FONT_SIZE_M;
2344
2624
  color: #ff4d4f;
@@ -2410,31 +2690,31 @@
2410
2690
  }
2411
2691
  }
2412
2692
  }
2413
-
2693
+
2414
2694
  @media (max-width: 54.857rem) {
2415
2695
  .unified-preview {
2416
2696
  .preview-header {
2417
2697
  flex-direction: column;
2418
2698
  align-items: flex-start;
2419
2699
  gap: $CAP_SPACE_12;
2420
-
2700
+
2421
2701
  .preview-header-right {
2422
2702
  width: 100%;
2423
2703
  justify-content: flex-start;
2424
2704
  }
2425
2705
  }
2426
-
2706
+
2427
2707
  .preview-content-container {
2428
2708
  padding: $CAP_SPACE_16;
2429
2709
  }
2430
-
2710
+
2431
2711
  .device-frame {
2432
2712
  &.device-frame-desktop,
2433
2713
  &.device-frame-tablet {
2434
2714
  width: 100% !important;
2435
2715
  max-width: 100% !important;
2436
2716
  }
2437
-
2717
+
2438
2718
  &.device-frame-mobile {
2439
2719
  width: 100% !important;
2440
2720
  max-width: 100% !important;
@@ -2442,4 +2722,3 @@
2442
2722
  }
2443
2723
  }
2444
2724
  }
2445
-