@capillarytech/creatives-library 8.0.345-alpha.14 → 8.0.345-alpha.15

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 (129) hide show
  1. package/constants/unified.js +29 -0
  2. package/package.json +1 -1
  3. package/services/tests/api.test.js +13 -0
  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/templateVarUtils.test.js +204 -0
  8. package/v2Components/CapActionButton/constants.js +7 -0
  9. package/v2Components/CapActionButton/index.js +167 -109
  10. package/v2Components/CapActionButton/index.scss +157 -6
  11. package/v2Components/CapActionButton/messages.js +19 -3
  12. package/v2Components/CapActionButton/tests/index.test.js +41 -17
  13. package/v2Components/CapTagList/index.js +10 -0
  14. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +70 -49
  15. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +8 -2
  16. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +207 -21
  17. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +16 -0
  18. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +85 -10
  19. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +30 -0
  20. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +79 -11
  21. package/v2Components/CommonTestAndPreview/SendTestMessage.js +10 -5
  22. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +160 -15
  23. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js.rej +18 -0
  24. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +341 -76
  25. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +133 -4
  26. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +11 -0
  27. package/v2Components/CommonTestAndPreview/constants.js +38 -2
  28. package/v2Components/CommonTestAndPreview/index.js +676 -186
  29. package/v2Components/CommonTestAndPreview/messages.js +49 -3
  30. package/v2Components/CommonTestAndPreview/previewApiUtils.js +59 -0
  31. package/v2Components/CommonTestAndPreview/sagas.js +15 -6
  32. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +308 -284
  33. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +231 -65
  34. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +118 -5
  35. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +341 -0
  36. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +8 -1
  37. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +34 -13
  38. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +281 -283
  39. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +199 -1
  40. package/v2Components/CommonTestAndPreview/tests/index.test.js +132 -4
  41. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +67 -0
  42. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +2 -2
  43. package/v2Components/FormBuilder/index.js +8 -10
  44. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +87 -0
  45. package/v2Components/SmsFallback/constants.js +73 -0
  46. package/v2Components/SmsFallback/index.js +955 -0
  47. package/v2Components/SmsFallback/index.scss +265 -0
  48. package/v2Components/SmsFallback/messages.js +78 -0
  49. package/v2Components/SmsFallback/smsFallbackUtils.js +118 -0
  50. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +50 -0
  51. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +147 -0
  52. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +304 -0
  53. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +197 -0
  54. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +277 -0
  55. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +422 -0
  56. package/v2Components/SmsFallback/useLocalTemplateList.js +92 -0
  57. package/v2Components/TemplatePreview/_templatePreview.scss +33 -23
  58. package/v2Components/TemplatePreview/constants.js +2 -0
  59. package/v2Components/TemplatePreview/index.js +143 -28
  60. package/v2Components/TemplatePreview/tests/index.test.js +142 -0
  61. package/v2Components/TestAndPreviewSlidebox/index.js +13 -1
  62. package/v2Components/TestAndPreviewSlidebox/sagas.js +11 -4
  63. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +3 -1
  64. package/v2Components/VarSegmentMessageEditor/constants.js +2 -0
  65. package/v2Components/VarSegmentMessageEditor/index.js +125 -0
  66. package/v2Components/VarSegmentMessageEditor/index.scss +46 -0
  67. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +43 -0
  68. package/v2Containers/CreativesContainer/SlideBoxContent.js +36 -4
  69. package/v2Containers/CreativesContainer/SlideBoxFooter.js +10 -1
  70. package/v2Containers/CreativesContainer/SlideBoxHeader.js +29 -4
  71. package/v2Containers/CreativesContainer/constants.js +9 -0
  72. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +67 -0
  73. package/v2Containers/CreativesContainer/index.js +300 -103
  74. package/v2Containers/CreativesContainer/index.scss +51 -1
  75. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +90 -0
  76. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +78 -34
  77. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +79 -16
  78. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +8 -0
  79. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +357 -98
  80. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +20 -15
  81. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +258 -0
  82. package/v2Containers/CreativesContainer/tests/index.test.js +71 -9
  83. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +125 -0
  84. package/v2Containers/Email/reducer.js +3 -11
  85. package/v2Containers/Email/sagas.js +5 -9
  86. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -4
  87. package/v2Containers/Email/tests/sagas.test.js +3 -21
  88. package/v2Containers/Rcs/constants.js +119 -8
  89. package/v2Containers/Rcs/index.js +2379 -807
  90. package/v2Containers/Rcs/index.js.rej +1336 -0
  91. package/v2Containers/Rcs/index.scss +276 -6
  92. package/v2Containers/Rcs/index.scss.rej +74 -0
  93. package/v2Containers/Rcs/messages.js +38 -3
  94. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +225 -0
  95. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +98018 -70073
  96. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +0 -5
  97. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap.rej +128 -0
  98. package/v2Containers/Rcs/tests/index.test.js +152 -121
  99. package/v2Containers/Rcs/tests/mockData.js +38 -0
  100. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +318 -0
  101. package/v2Containers/Rcs/tests/utils.test.js +646 -30
  102. package/v2Containers/Rcs/utils.js +478 -11
  103. package/v2Containers/Sms/Create/index.js +100 -40
  104. package/v2Containers/Sms/smsFormDataHelpers.js +67 -0
  105. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +253 -0
  106. package/v2Containers/SmsTrai/Create/index.js +9 -4
  107. package/v2Containers/SmsTrai/Edit/constants.js +2 -0
  108. package/v2Containers/SmsTrai/Edit/index.js +636 -130
  109. package/v2Containers/SmsTrai/Edit/index.scss +121 -0
  110. package/v2Containers/SmsTrai/Edit/messages.js +14 -4
  111. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4328 -2375
  112. package/v2Containers/SmsWrapper/index.js +37 -8
  113. package/v2Containers/TagList/index.js +6 -0
  114. package/v2Containers/Templates/TemplatesActionBar.js +101 -0
  115. package/v2Containers/Templates/_templates.scss +163 -2
  116. package/v2Containers/Templates/actions.js +11 -0
  117. package/v2Containers/Templates/constants.js +2 -0
  118. package/v2Containers/Templates/index.js +119 -54
  119. package/v2Containers/Templates/sagas.js +57 -12
  120. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +120 -0
  121. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1043 -1079
  122. package/v2Containers/Templates/tests/sagas.test.js +193 -123
  123. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +180 -0
  124. package/v2Containers/Templates/utils/smsTemplatesListApi.js +79 -0
  125. package/v2Containers/TemplatesV2/TemplatesV2.style.js +72 -1
  126. package/v2Containers/TemplatesV2/index.js +86 -23
  127. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +131 -0
  128. package/v2Containers/Whatsapp/index.js +3 -20
  129. 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.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,256 @@
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 and suggestions should render like a CTA bar list (no extra margins)
988
+ .whatsapp-divider {
989
+ margin: 0;
990
+ border-top: 1px solid $CAP_WHITE;
991
+ }
992
+
993
+ // Stacked full-width CTA bars below card copy, separated by white gap (Figma RCS carousel)
994
+ .rcs-carousel-cta-stack.cap-row-v2 {
995
+ display: flex;
996
+ flex-direction: column;
997
+ flex-wrap: nowrap;
998
+ width: 100%;
999
+ gap: 0.25rem;
1000
+ box-sizing: border-box;
1001
+ align-items: stretch;
1002
+ }
1003
+
1004
+ .rcs-cta-preview--carousel-bar {
1005
+ display: flex;
1006
+ align-items: center;
1007
+ justify-content: center;
1008
+ gap: 0.375rem;
1009
+ width: 100%;
1010
+ margin: 0;
1011
+ padding: 0.625rem 0.75rem;
1012
+ box-sizing: border-box;
1013
+ background-color: #ebecf0;
1014
+ border-radius: 0.25rem;
1015
+ font-size: $FONT_SIZE_M;
1016
+ font-weight: $FONT_WEIGHT_MEDIUM;
1017
+ color: $CAP_G01;
1018
+ text-align: center;
1019
+ }
1020
+
1021
+ .rcs-cta-preview-phone-icon-end {
1022
+ margin-left: 0.25rem;
1023
+ flex-shrink: 0;
1024
+ }
1025
+ }
1026
+ }
1027
+ }
1028
+ }
1029
+
765
1030
  // WhatsApp Preview Content Styles (Phase 8)
766
1031
  // All WhatsApp styles wrapped in parent class for increased specificity
767
1032
  // This prevents other CSS (like CapLabel) from overriding WhatsApp-specific styles
768
1033
  .whatsapp-preview-wrapper {
769
1034
  // Using same CSS classes as TemplatePreview for consistency
770
1035
  // Styles are copied from TemplatePreview/_templatePreview.scss to ensure they work
771
-
1036
+
772
1037
  .shell-v2-whatsapp {
773
1038
  position: relative;
774
1039
  -webkit-transform: translate(-50%);
@@ -843,23 +1108,23 @@
843
1108
  }
844
1109
 
845
1110
  // WhatsApp message pop styles (matching TemplatePreview)
846
- &.whatsapp-message-pop {
1111
+ &.whatsapp-message-pop,
1112
+ &.whatsapp-message-pop-carousel {
847
1113
  padding: $CAP_SPACE_04 0 $CAP_SPACE_08;
848
1114
  border-radius: $CAP_SPACE_06;
849
1115
  background-color: $CAP_WHITE;
850
- width: 88%;
851
1116
  left: 0;
852
1117
  }
853
1118
 
1119
+ &.whatsapp-message-pop {
1120
+ width: 88%;
1121
+ }
1122
+
854
1123
  // WhatsApp carousel message pop styles
855
1124
  &.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
1125
  width: 10.4rem;
860
1126
  cursor: pointer;
861
1127
  flex-shrink: 0;
862
- left: 0;
863
1128
  }
864
1129
  }
865
1130
  }
@@ -924,7 +1189,7 @@
924
1189
  line-height: 1rem;
925
1190
  font-family: Roboto, 'Open Sans', sans-serif;
926
1191
  }
927
-
1192
+
928
1193
  .whatsapp-template-footer-preview {
929
1194
  // From WhatsApp/index.scss: color: $CAP_G04, but use white for preview
930
1195
  color: $CAP_G01;
@@ -980,19 +1245,19 @@
980
1245
  color: #8c8c8c;
981
1246
  font-size: $FONT_SIZE_M;
982
1247
  }
983
-
1248
+
984
1249
  .whatsapp-error-text {
985
1250
  font-size: $FONT_SIZE_L;
986
1251
  font-weight: 600;
987
1252
  color: #262626;
988
1253
  }
989
-
1254
+
990
1255
  .whatsapp-error-message {
991
1256
  font-size: $FONT_SIZE_M;
992
1257
  color: #ff4d4f;
993
1258
  text-align: center;
994
1259
  }
995
-
1260
+
996
1261
  .whatsapp-no-content {
997
1262
  color: #8c8c8c;
998
1263
  font-size: $FONT_SIZE_M;
@@ -1044,14 +1309,14 @@
1044
1309
  color: #8c8c8c;
1045
1310
  margin-top: $CAP_SPACE_04;
1046
1311
  }
1047
-
1312
+
1048
1313
  .url-preview {
1049
1314
  font-size: $FONT_SIZE_S;
1050
1315
  color: #1890ff;
1051
1316
  word-break: break-all;
1052
1317
  }
1053
1318
  }
1054
-
1319
+
1055
1320
  // InApp Preview Content Styles (Phase 10)
1056
1321
  // Styles copied from TemplatePreview/_templatePreview.scss to ensure consistency
1057
1322
  // These styles work within the SMS device container structure
@@ -1112,11 +1377,11 @@
1112
1377
  .inapp-message-container-FULLSCREEN {
1113
1378
  position: relative;
1114
1379
  background-color: $CAP_WHITE;
1115
- width: 100%;
1380
+ width: 100%;
1116
1381
  height: 100%;
1117
1382
  align-items: center;
1118
1383
  padding: 0 $CAP_SPACE_16;
1119
- border-bottom-left-radius: 2.6rem;
1384
+ border-bottom-left-radius: 2.6rem;
1120
1385
  border-bottom-right-radius: 2.6rem;
1121
1386
  .inapp-title-FULLSCREEN {
1122
1387
  align-items: center;
@@ -1946,7 +2211,7 @@
1946
2211
  max-height: 7.5rem;
1947
2212
  margin-left: $CAP_SPACE_24;
1948
2213
  }
1949
-
2214
+
1950
2215
  .mpush-gif-preview {
1951
2216
  max-width: 100%;
1952
2217
  max-height: 7.5rem;
@@ -2206,6 +2471,7 @@
2206
2471
  font-weight: 500;
2207
2472
  display: -webkit-box;
2208
2473
  -webkit-line-clamp: 1;
2474
+ line-clamp: 1;
2209
2475
  -webkit-box-orient: vertical;
2210
2476
  overflow: hidden;
2211
2477
  color: $CAP_WHITE;
@@ -2257,7 +2523,7 @@
2257
2523
  color: $FONT_COLOR_01;
2258
2524
  margin-bottom: $CAP_SPACE_12;
2259
2525
  }
2260
-
2526
+
2261
2527
  .preview-text {
2262
2528
  font-weight: 400;
2263
2529
  font-size: $FONT_SIZE_S;
@@ -2292,13 +2558,13 @@
2292
2558
  justify-content: center;
2293
2559
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2294
2560
  gap: $CAP_SPACE_16;
2295
-
2561
+
2296
2562
  .zalo-loading-text {
2297
2563
  color: #8c8c8c;
2298
2564
  font-size: $FONT_SIZE_M;
2299
2565
  }
2300
2566
  }
2301
-
2567
+
2302
2568
  // Error state
2303
2569
  .zalo-error-container {
2304
2570
  display: flex;
@@ -2307,13 +2573,13 @@
2307
2573
  justify-content: center;
2308
2574
  padding: $CAP_SPACE_60 $CAP_SPACE_24;
2309
2575
  gap: $CAP_SPACE_16;
2310
-
2576
+
2311
2577
  .zalo-error-text {
2312
2578
  font-size: $FONT_SIZE_L;
2313
2579
  font-weight: 600;
2314
2580
  color: #262626;
2315
2581
  }
2316
-
2582
+
2317
2583
  .zalo-error-message {
2318
2584
  font-size: $FONT_SIZE_M;
2319
2585
  color: #ff4d4f;
@@ -2331,31 +2597,31 @@
2331
2597
  }
2332
2598
  }
2333
2599
  }
2334
-
2600
+
2335
2601
  @media (max-width: 54.857rem) {
2336
2602
  .unified-preview {
2337
2603
  .preview-header {
2338
2604
  flex-direction: column;
2339
2605
  align-items: flex-start;
2340
2606
  gap: $CAP_SPACE_12;
2341
-
2607
+
2342
2608
  .preview-header-right {
2343
2609
  width: 100%;
2344
2610
  justify-content: flex-start;
2345
2611
  }
2346
2612
  }
2347
-
2613
+
2348
2614
  .preview-content-container {
2349
2615
  padding: $CAP_SPACE_16;
2350
2616
  }
2351
-
2617
+
2352
2618
  .device-frame {
2353
2619
  &.device-frame-desktop,
2354
2620
  &.device-frame-tablet {
2355
2621
  width: 100% !important;
2356
2622
  max-width: 100% !important;
2357
2623
  }
2358
-
2624
+
2359
2625
  &.device-frame-mobile {
2360
2626
  width: 100% !important;
2361
2627
  max-width: 100% !important;
@@ -2363,4 +2629,3 @@
2363
2629
  }
2364
2630
  }
2365
2631
  }
2366
-