@capillarytech/creatives-library 6.12.1 → 6.12.3

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 (47) hide show
  1. package/package.json +2 -2
  2. package/v2Components/BeeEditor/index.js +263 -0
  3. package/v2Components/BeeEditor/index.scss +11 -0
  4. package/v2Components/BeeEditor/messages.js +71 -0
  5. package/v2Components/BeeEditor/tests/index.test.js +10 -0
  6. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +151 -151
  7. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +33 -33
  8. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/tests/index.test.js +10 -10
  9. package/v2Components/TemplatePreview/assets/images/androidPushMessage.svg +44 -44
  10. package/v2Components/TemplatePreview/assets/images/home-screen-android.svg +21 -21
  11. package/v2Components/TemplatePreview/assets/images/home-screen-ios.svg +16 -16
  12. package/v2Components/TemplatePreview/assets/images/iPhonePushMessage.svg +134 -134
  13. package/v2Components/TemplatePreview/assets/images/mobile.svg +23 -23
  14. package/v2Components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -22
  15. package/v2Components/TemplatePreview/assets/images/user-icon.svg +18 -18
  16. package/v2Components/TemplatePreview/assets/images/wechat-home-screen-android.svg +21 -21
  17. package/v2Components/TemplatePreview/assets/images/wechat-mobile.svg +77 -77
  18. package/v2Components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -20
  19. package/v2Components/TemplatePreview/tests/index.test.js +10 -10
  20. package/v2Containers/CreativesContainer/actions.js +27 -27
  21. package/v2Containers/CreativesContainer/constants.js +17 -17
  22. package/v2Containers/CreativesContainer/index.scss +44 -44
  23. package/v2Containers/CreativesContainer/messages.js +305 -305
  24. package/v2Containers/CreativesContainer/reducer.js +29 -29
  25. package/v2Containers/CreativesContainer/sagas.js +11 -11
  26. package/v2Containers/CreativesContainer/selectors.js +30 -30
  27. package/v2Containers/CreativesContainer/tests/actions.test.js +18 -18
  28. package/v2Containers/CreativesContainer/tests/index.test.js +10 -10
  29. package/v2Containers/CreativesContainer/tests/reducer.test.js +9 -9
  30. package/v2Containers/CreativesContainer/tests/sagas.test.js +15 -15
  31. package/v2Containers/CreativesContainer/tests/selectors.test.js +10 -10
  32. package/v2Containers/Templates/tests/actions.test.js +18 -18
  33. package/v2Containers/Templates/tests/index.test.js +10 -10
  34. package/v2Containers/Templates/tests/reducer.test.js +9 -9
  35. package/v2Containers/Templates/tests/sagas.test.js +15 -15
  36. package/v2Containers/Templates/tests/selectors.test.js +10 -10
  37. package/v2Containers/TemplatesV2/TemplatesV2.style.js +29 -29
  38. package/v2Containers/TemplatesV2/actions.js +16 -16
  39. package/v2Containers/TemplatesV2/constants.js +10 -10
  40. package/v2Containers/TemplatesV2/index.js +3 -2
  41. package/v2Containers/TemplatesV2/messages.js +61 -61
  42. package/v2Containers/TemplatesV2/selectors.js +25 -25
  43. package/v2Containers/TemplatesV2/tests/actions.test.js +18 -18
  44. package/v2Containers/TemplatesV2/tests/index.test.js +10 -10
  45. package/v2Containers/TemplatesV2/tests/reducer.test.js +9 -9
  46. package/v2Containers/TemplatesV2/tests/sagas.test.js +15 -15
  47. package/v2Containers/TemplatesV2/tests/selectors.test.js +10 -10
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "6.12.1",
4
+ "version": "6.12.3",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -15,7 +15,7 @@
15
15
  "@babel/polyfill": "7.4.3",
16
16
  "@bugsnag/js": "^7.2.1",
17
17
  "@bugsnag/plugin-react": "^7.2.1",
18
- "@capillarytech/cap-ui-utils": "1.2.6",
18
+ "@capillarytech/cap-ui-utils": "^1.2.8",
19
19
  "@mailupinc/bee-plugin": "^1.2.0",
20
20
  "babel-cli": "^6.26.0",
21
21
  "chalk": "1.1.3",
@@ -0,0 +1,263 @@
1
+ /**
2
+ *
3
+ * Beeeditor
4
+ *
5
+ */
6
+ import React, { useEffect, useState, useRef, useCallback } from 'react';
7
+ import PropTypes from 'prop-types';
8
+ import { injectIntl, intlShape, FormattedMessage } from 'react-intl';
9
+ import TagList from '../../v2Containers/TagList';
10
+ import
11
+ {
12
+ CapModal,
13
+ CapButton,
14
+ CapInput,
15
+ CapSelect,
16
+ }
17
+ from '@capillarytech/cap-ui-library';
18
+ import messages from './messages';
19
+ import './index.scss';
20
+
21
+ function BeeEditor(props) {
22
+ const {
23
+ uid,
24
+ beeJson,
25
+ tokenData,
26
+ id,
27
+ location = {},
28
+ moduleFilterEnabled,
29
+ label,
30
+ className,
31
+ userLocale,
32
+ selectedOfferDetails,
33
+ tags,
34
+ injectedTags,
35
+ saveBeeInstance,
36
+ saveBeeData,
37
+ intl,
38
+ onContextChange,
39
+ } = props;
40
+ const {formatMessage} = intl;
41
+ const UNSUBSCRIBE = 'unsubscribe';
42
+ let beePluginInstance = null;
43
+ const categoryOptions = [{key: 'cta', value: 'cta', label: formatMessage(messages.cta)},
44
+ {key: 'footer', value: 'footer', label: formatMessage(messages.footer)},
45
+ {key: 'header', value: 'header', label: formatMessage(messages.header)},
46
+ {key: 'sp', value: 'sp', label: formatMessage(messages.socialPlatform)},
47
+ {key: 'others', value: 'others', label: formatMessage(messages.others)},
48
+ ];
49
+ const [visibleTaglist, setVisibleTaglist] = useState(false);
50
+ const [showRowMetaModal, setRowMetaModal] = useState(false);
51
+ const [selectedTag, setSelectedTag] = useState({});
52
+ const [rowMetaInfo, setRowMetaInfo] = useState({});
53
+ const [rowName, setRowName] = useState('');
54
+ const [rowCategory, setRowCategory] = useState('');
55
+
56
+ const savedCallback = useRef();
57
+ const filteredTags = (tags || []).filter((obj) => obj.definition.value !== UNSUBSCRIBE);
58
+ let intervalTimer;
59
+
60
+ useEffect(() => {
61
+ savedCallback.current = Object.keys(selectedTag).length > 0 ? selectedTag : rowMetaInfo;
62
+ }, [selectedTag, rowMetaInfo]);
63
+
64
+ useEffect(() => {
65
+ const beeConfig = {
66
+ uid,
67
+ container: 'bee-plugin-container',
68
+ rowsConfiguration: {
69
+ emptyRows: true,
70
+ defaultRows: true,
71
+ },
72
+ contentDialog: {
73
+ specialLinks: {
74
+ label: UNSUBSCRIBE,
75
+ handler(resolve) {
76
+ resolve({
77
+ type: 'custom',
78
+ label: UNSUBSCRIBE,
79
+ link: `{{${UNSUBSCRIBE}}}`,
80
+ });
81
+ },
82
+ },
83
+ mergeTags: {
84
+ label: formatMessage(messages.addLabel),
85
+ handler: async (resolve, reject) => {
86
+ // this will open tag modal
87
+ await setVisibleTaglist(true);
88
+ // until tag modal will not open promise will not execute
89
+ // once tag modal is opened it will start 2 sec interval to wait use has selected any tag or cancel the tag selection
90
+ const promise = new Promise((resolveP) => {
91
+ intervalTimer = setInterval(() => {
92
+ // this will execute, if user cancel the tag selection
93
+ if ((savedCallback.current || {}).close === true) {
94
+ reject();
95
+ clearInterval(intervalTimer);
96
+ return;
97
+ }
98
+ // this block is checking use has selected any tag or not
99
+ if (Object.keys(savedCallback.current || {}).length > 0) {
100
+ resolveP(savedCallback.current);
101
+ setSelectedTag({});
102
+ clearInterval(intervalTimer);
103
+ }
104
+ }, 2000);
105
+ });
106
+ // once prmise will resolve , pass the resolve data to handler to show tags in bee edior
107
+ const result = await promise;
108
+ resolve(result);
109
+ },
110
+ },
111
+ saveRow: {
112
+ handler: async (resolve, reject) => {
113
+ await setRowMetaModal(true);
114
+ const promise = new Promise((resolveP) => {
115
+ intervalTimer = setInterval(() => {
116
+ if ((savedCallback.current || {}).close === true) {
117
+ reject();
118
+ clearInterval(intervalTimer);
119
+ setRowMetaInfo({});
120
+ setRowName('');
121
+ setRowCategory('');
122
+ return;
123
+ }
124
+ if (Object.keys(savedCallback.current || {}).length > 0) {
125
+ resolveP(savedCallback.current);
126
+ }
127
+ }, 2000);
128
+ });
129
+ const result = await promise;
130
+ resolve(result); // "done!"
131
+ setRowMetaInfo({});
132
+ setRowName('');
133
+ setRowCategory('');
134
+ clearInterval(intervalTimer);
135
+ },
136
+ },
137
+ },
138
+ onSave: (jsonFile, htmlFile) => {
139
+ saveBeeData(jsonFile, htmlFile);
140
+ },
141
+ // will use this function on save row feature
142
+ onSaveRow: (rowJSON) => {
143
+ console.log('bee-plugin-container onSaveRows', rowJSON);
144
+ },
145
+ };
146
+ window.BeePlugin.create(tokenData, beeConfig, (instance) => {
147
+ beePluginInstance = instance;
148
+ const parseJson = JSON.parse(beeJson);
149
+ beePluginInstance.start(parseJson);
150
+ saveBeeInstance(beePluginInstance);
151
+ });
152
+ return () => clearInterval(intervalTimer);
153
+ }, []);
154
+
155
+ const onTagSelect = (result) => {
156
+ const msg = {
157
+ name: result,
158
+ value: `{{${result}}}`,
159
+ };
160
+ setSelectedTag(msg);
161
+ setVisibleTaglist(false);
162
+ };
163
+
164
+ const onCancelTagList = () => {
165
+ setVisibleTaglist(false);
166
+ setSelectedTag({close: true});
167
+ };
168
+
169
+ const handleCancel = () => {
170
+ setRowMetaModal(false);
171
+ setRowMetaInfo({close: true});
172
+ };
173
+
174
+ const handleOk = () => {
175
+ const rowInfo = {};
176
+ if (rowCategory !== '') {
177
+ rowInfo.category = rowCategory;
178
+ }
179
+ setRowMetaInfo({
180
+ name: rowName,
181
+ ...rowInfo,
182
+ });
183
+ setRowMetaModal(false);
184
+ };
185
+ const isDisableSave = () => rowName === '';
186
+
187
+ const onRowChange = useCallback((e) => {
188
+ setRowName(e.target.value);
189
+ });
190
+ const onChangeCategoy = (e) => {
191
+ setRowCategory(e);
192
+ };
193
+ const contentSection = <>
194
+ <CapInput
195
+ label={<FormattedMessage {...messages.rowName} />}
196
+ placeholder={formatMessage(messages.rowPlaceHolder)}
197
+ onChange={onRowChange}
198
+ value={rowName}
199
+ maxLength={50}
200
+ style={{ width: '324px', paddingBottom: '16px' }}
201
+ />
202
+ <CapSelect
203
+ label="Category"
204
+ style={{ width: 250, paddingBottom: '16px'}}
205
+ options={categoryOptions}
206
+ selectPlaceholder={formatMessage(messages.select)}
207
+ placeholder={
208
+ <FormattedMessage {...messages.selectCategoyPlaceholder} />
209
+ }
210
+ onChange={onChangeCategoy}
211
+ />
212
+
213
+ </>;
214
+ return (
215
+ <>
216
+ <div id="bee-plugin-container" style={{ height: '500px'}}>
217
+ </div>
218
+ <TagList
219
+ moduleFilterEnabled={moduleFilterEnabled}
220
+ label={label}
221
+ onTagSelect={onTagSelect}
222
+ location={location}
223
+ tags={filteredTags}
224
+ injectedTags={injectedTags}
225
+ className={className}
226
+ id={id}
227
+ userLocale={userLocale}
228
+ selectedOfferDetails={selectedOfferDetails}
229
+ visibleTaglist={visibleTaglist}
230
+ hidePopover
231
+ modalProps={{
232
+ onCancel: onCancelTagList,
233
+ style: { left: 135, top: 250 },
234
+ className: "bee-editor-tag-list",
235
+ }}
236
+ onContextChange={onContextChange}
237
+ />
238
+ <CapModal
239
+ visible={showRowMetaModal}
240
+ onCancel={handleCancel}
241
+ title={formatMessage(messages.customRows)}
242
+ footer={[
243
+ <CapButton key="back" onClick={handleCancel}>{formatMessage(messages.cancel)}</CapButton>,
244
+ <CapButton key="submit" type="primary" id="delete-version" onClick={handleOk} disabled={isDisableSave()}>
245
+ {formatMessage(messages.save)}
246
+ </CapButton>,
247
+ ]}
248
+ >
249
+ {contentSection}
250
+ </CapModal>
251
+ </>
252
+ );
253
+ }
254
+
255
+ BeeEditor.propTypes = {
256
+ beeJson: PropTypes.object.isRequired,
257
+ tokenData: PropTypes.object.isRequired,
258
+ uid: PropTypes.string.isRequired,
259
+ showTagsPopover: PropTypes.func.isRequired,
260
+ intl: intlShape.isRequired,
261
+ };
262
+
263
+ export default injectIntl(BeeEditor);
@@ -0,0 +1,11 @@
1
+ .cap-modal-v2.bee-editor-tag-list {
2
+ .ant-modal-content {
3
+ .ant-modal-body {
4
+ padding-top: 20px;
5
+ padding-bottom: 10px;
6
+ }
7
+ .ant-modal-footer {
8
+ display: none;
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,71 @@
1
+ /*
2
+ * BeeEditor Messages
3
+ *
4
+ * This contains all the text for the BeeEditor component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ const prefix = 'creatives.componentsV2.BeeEditor';
9
+
10
+ export default defineMessages({
11
+ cancel: {
12
+ id: `${prefix}.cancel`,
13
+ defaultMessage: 'Cancel',
14
+ },
15
+ save: {
16
+ id: `${prefix}.save`,
17
+ defaultMessage: 'Save',
18
+ },
19
+ rowPlaceHolder: {
20
+ id: `${prefix}.rowPlaceHolder`,
21
+ defaultMessage: 'Enter Row name',
22
+ },
23
+ rowName: {
24
+ id: `${prefix}.rowName`,
25
+ defaultMessage: 'Row name',
26
+ },
27
+ select: {
28
+ id: `${prefix}.select`,
29
+ defaultMessage: 'Select',
30
+ },
31
+ customRows: {
32
+ id: `${prefix}.customRows`,
33
+ defaultMessage: 'Custom rows',
34
+ },
35
+ selectCategoyPlaceholder: {
36
+ id: `${prefix}.selectCategoyPlaceholder`,
37
+ defaultMessage: 'Select category',
38
+ },
39
+ tags: {
40
+ id: `${prefix}.tags`,
41
+ defaultMessage: 'Tags (optional)',
42
+ },
43
+ tagPlaceHolder: {
44
+ id: `${prefix}.tagPlaceHolder`,
45
+ defaultMessage: 'Enter tags',
46
+ },
47
+ addLabel: {
48
+ id: `${prefix}.addLabel`,
49
+ defaultMessage: 'Add label',
50
+ },
51
+ cta: {
52
+ id: `${prefix}.cta`,
53
+ defaultMessage: 'CTA',
54
+ },
55
+ header: {
56
+ id: `${prefix}.header`,
57
+ defaultMessage: 'Header',
58
+ },
59
+ footer: {
60
+ id: `${prefix}.footer`,
61
+ defaultMessage: 'Footer',
62
+ },
63
+ others: {
64
+ id: `${prefix}.others`,
65
+ defaultMessage: 'Others',
66
+ },
67
+ socialPlatform: {
68
+ id: `${prefix}.socialPlatform`,
69
+ defaultMessage: 'Social platform',
70
+ },
71
+ });
@@ -0,0 +1,10 @@
1
+ // import React from 'react';
2
+ // import { shallow } from 'enzyme';
3
+
4
+ // import Beeeditor from '../index';
5
+
6
+ describe('<Beeeditor />', () => {
7
+ it('Expect to have unit tests specified', () => {
8
+ expect(true).toEqual(false);
9
+ });
10
+ });
@@ -1,152 +1,152 @@
1
- @import '~@capillarytech/cap-ui-library/styles/_variables.scss';
2
-
3
- .shell-lock-screen-android .main-screen-preview .wechatMsgContainer{
4
- position: absolute;
5
- left: 53.5%;
6
- top:28%;
7
- background: white;
8
- width: 19.5%;
9
- text-align: left;
10
- height: fit-content;
11
- border-radius: 0.285rem;
12
- }
13
-
14
- .shell-lock-screen-android .lock-screen-preview{
15
- .wechat-android-sender-id{
16
- position: absolute;
17
- top: 46%;
18
- font-size: 10px;
19
- left: 28%;
20
- }
21
- .wechat-android-title{
22
- position: absolute;
23
- top: 49%;
24
- font-size: 10px;
25
- left: 28%;
26
- color: #5e6c84;
27
- }
28
- .wechat-android-action-buttons{
29
- position: absolute;
30
- left: 28%;
31
- top: 53%;
32
- font-size: 10px;
33
- color: #3861ca;
34
- font-weight: 500;
35
- }
36
- .wechat-ios-sender-id{
37
- position: absolute;
38
- top: 44%;
39
- font-size: 10px;
40
- left: 28.5%;
41
- }
42
- .wechat-ios-title{
43
- position: absolute;
44
- top: 47%;
45
- font-size: 10px;
46
- left: 28.5%;
47
- color: #5e6c84;
48
- }
49
- .wechat-ios-action-reply{
50
- position: absolute;
51
- left: 35%;
52
- top: 59%;
53
- font-size: 12px;
54
- color: #3861ca;
55
- font-weight: 500;
56
- }
57
- .wechat-ios-action-cancel{
58
- position: absolute;
59
- left: 34.5%;
60
- top: 66%;
61
- font-size: 12px;
62
- color: #3861ca;
63
- font-weight: 500;
64
- }
65
- }
66
-
67
- .wechatMsgContainer{
68
- position: absolute;
69
- left: 30%;
70
- top: 20%;
71
- background: white;
72
- width: 40%;
73
- text-align: left;
74
- height: fit-content;
75
- border-radius: $CAP_SPACE_04;
76
- .richmedia-template {
77
- .richmedia-image-container {
78
- width: 100%;
79
- height: 102px;
80
- position: relative;
81
- img {
82
- border-top-left-radius: 4px;
83
- border-top-right-radius: 4px;
84
- }
85
- }
86
- .name-container-with-abstract {
87
- padding: $CAP_SPACE_12;
88
- height: 68px;
89
- }
90
- .name-container {
91
- position: absolute;
92
- bottom: 0px;
93
- height: 44px;
94
- padding-top: 16px;
95
- padding-left: 12px;
96
- color: $CAP_WHITE;
97
- opacity: 0.7;
98
- width: 100%;
99
- background-image: linear-gradient(to top,black 0% ,transparent 100%);
100
- }
101
- .additional-richmedia-container {
102
- display: flex;
103
- justify-content: space-between;
104
- margin: 8px;
105
- padding-bottom: 8px;
106
- img {
107
- border-radius: 4px;
108
- }
109
- }
110
- .additional-richmedia-container:not(:last-child) {
111
- border-bottom: 1px solid #dfe2e7;
112
- }
113
- div {
114
- text-overflow: ellipsis;
115
- overflow: hidden;
116
- white-space: nowrap;
117
- }
118
- }
119
- }
120
- .wechatMsgContainerOutbound{
121
- position: absolute;
122
- left: 35%;
123
- top: 20%;
124
- background: white;
125
- width: 30%;
126
- text-align: left;
127
- }
128
- .wechatMsgContainerCardLayout {
129
- position: absolute;
130
- left: 20%;
131
- top: 20%;
132
- background: white;
133
- width: 60%;
134
- text-align: left;
135
- }
136
- .overflow-handle-preview {
137
- overflow-y: auto;
138
- }
139
- .overflow-handle-preview-outbound {
140
- height: 330px;
141
- overflow-y: auto;
142
- }
143
- .preview-overflow-wrap-fields {
144
- text-overflow: ellipsis;
145
- overflow: hidden;
146
- overflow-wrap: break-word;
147
- display: -webkit-box !important;
148
- -webkit-box-orient: vertical;
149
- -webkit-line-clamp: 2;
150
- text-align: left;
151
- width: 200px;
1
+ @import '~@capillarytech/cap-ui-library/styles/_variables.scss';
2
+
3
+ .shell-lock-screen-android .main-screen-preview .wechatMsgContainer{
4
+ position: absolute;
5
+ left: 53.5%;
6
+ top:28%;
7
+ background: white;
8
+ width: 19.5%;
9
+ text-align: left;
10
+ height: fit-content;
11
+ border-radius: 0.285rem;
12
+ }
13
+
14
+ .shell-lock-screen-android .lock-screen-preview{
15
+ .wechat-android-sender-id{
16
+ position: absolute;
17
+ top: 46%;
18
+ font-size: 10px;
19
+ left: 28%;
20
+ }
21
+ .wechat-android-title{
22
+ position: absolute;
23
+ top: 49%;
24
+ font-size: 10px;
25
+ left: 28%;
26
+ color: #5e6c84;
27
+ }
28
+ .wechat-android-action-buttons{
29
+ position: absolute;
30
+ left: 28%;
31
+ top: 53%;
32
+ font-size: 10px;
33
+ color: #3861ca;
34
+ font-weight: 500;
35
+ }
36
+ .wechat-ios-sender-id{
37
+ position: absolute;
38
+ top: 44%;
39
+ font-size: 10px;
40
+ left: 28.5%;
41
+ }
42
+ .wechat-ios-title{
43
+ position: absolute;
44
+ top: 47%;
45
+ font-size: 10px;
46
+ left: 28.5%;
47
+ color: #5e6c84;
48
+ }
49
+ .wechat-ios-action-reply{
50
+ position: absolute;
51
+ left: 35%;
52
+ top: 59%;
53
+ font-size: 12px;
54
+ color: #3861ca;
55
+ font-weight: 500;
56
+ }
57
+ .wechat-ios-action-cancel{
58
+ position: absolute;
59
+ left: 34.5%;
60
+ top: 66%;
61
+ font-size: 12px;
62
+ color: #3861ca;
63
+ font-weight: 500;
64
+ }
65
+ }
66
+
67
+ .wechatMsgContainer{
68
+ position: absolute;
69
+ left: 30%;
70
+ top: 20%;
71
+ background: white;
72
+ width: 40%;
73
+ text-align: left;
74
+ height: fit-content;
75
+ border-radius: $CAP_SPACE_04;
76
+ .richmedia-template {
77
+ .richmedia-image-container {
78
+ width: 100%;
79
+ height: 102px;
80
+ position: relative;
81
+ img {
82
+ border-top-left-radius: 4px;
83
+ border-top-right-radius: 4px;
84
+ }
85
+ }
86
+ .name-container-with-abstract {
87
+ padding: $CAP_SPACE_12;
88
+ height: 68px;
89
+ }
90
+ .name-container {
91
+ position: absolute;
92
+ bottom: 0px;
93
+ height: 44px;
94
+ padding-top: 16px;
95
+ padding-left: 12px;
96
+ color: $CAP_WHITE;
97
+ opacity: 0.7;
98
+ width: 100%;
99
+ background-image: linear-gradient(to top,black 0% ,transparent 100%);
100
+ }
101
+ .additional-richmedia-container {
102
+ display: flex;
103
+ justify-content: space-between;
104
+ margin: 8px;
105
+ padding-bottom: 8px;
106
+ img {
107
+ border-radius: 4px;
108
+ }
109
+ }
110
+ .additional-richmedia-container:not(:last-child) {
111
+ border-bottom: 1px solid #dfe2e7;
112
+ }
113
+ div {
114
+ text-overflow: ellipsis;
115
+ overflow: hidden;
116
+ white-space: nowrap;
117
+ }
118
+ }
119
+ }
120
+ .wechatMsgContainerOutbound{
121
+ position: absolute;
122
+ left: 35%;
123
+ top: 20%;
124
+ background: white;
125
+ width: 30%;
126
+ text-align: left;
127
+ }
128
+ .wechatMsgContainerCardLayout {
129
+ position: absolute;
130
+ left: 20%;
131
+ top: 20%;
132
+ background: white;
133
+ width: 60%;
134
+ text-align: left;
135
+ }
136
+ .overflow-handle-preview {
137
+ overflow-y: auto;
138
+ }
139
+ .overflow-handle-preview-outbound {
140
+ height: 330px;
141
+ overflow-y: auto;
142
+ }
143
+ .preview-overflow-wrap-fields {
144
+ text-overflow: ellipsis;
145
+ overflow: hidden;
146
+ overflow-wrap: break-word;
147
+ display: -webkit-box !important;
148
+ -webkit-box-orient: vertical;
149
+ -webkit-line-clamp: 2;
150
+ text-align: left;
151
+ width: 200px;
152
152
  }