@eeacms/volto-embed 2.0.11 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,8 +4,39 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [4.0.0](https://github.com/eea/volto-embed/compare/3.0.1...4.0.0)
8
+
9
+ - Prettier [`fffa1c9`](https://github.com/eea/volto-embed/commit/fffa1c9f42c9dacc7de1fed730e0a4494c04d2f8)
10
+ - Prettier [`f9ca05d`](https://github.com/eea/volto-embed/commit/f9ca05d3c55d204080f8769bd7d556b4d8f0ce21)
11
+ - Breaking changes. Bumped to version 4.0.0 [`eb78abf`](https://github.com/eea/volto-embed/commit/eb78abf98103ee8831814b3df4c441279c586da2)
12
+ - Volto 15.x compatibility: updated react-cookie library [`a480372`](https://github.com/eea/volto-embed/commit/a480372f47e6e34d6f3e14d7b54b345dc83fd328)
13
+
14
+ #### [3.0.1](https://github.com/eea/volto-embed/compare/3.0.0...3.0.1)
15
+
16
+ > 11 February 2022
17
+
18
+ - fix query case [`#20`](https://github.com/eea/volto-embed/pull/20)
19
+
20
+ #### [3.0.0](https://github.com/eea/volto-embed/compare/3.0.0-beta.0...3.0.0)
21
+
22
+ > 7 February 2022
23
+
24
+ - Make this compatible with volto-datablocks@3.x [`#19`](https://github.com/eea/volto-embed/pull/19)
25
+
26
+ #### [3.0.0-beta.0](https://github.com/eea/volto-embed/compare/2.0.11...3.0.0-beta.0)
27
+
28
+ > 7 February 2022
29
+
30
+ - Release 3.0.0-beta.0 [`c9af803`](https://github.com/eea/volto-embed/commit/c9af80319bc89b1a579d14538ac5509e71db813f)
31
+ - Updated cypress [`9112bee`](https://github.com/eea/volto-embed/commit/9112bee538e457e9f19a687c3442d222129eb95c)
32
+ - Update [`c5c1251`](https://github.com/eea/volto-embed/commit/c5c1251a69c76c341c8deb28e0f2ccc940b2411b)
33
+ - Make this compatible with volto-datablocks@3.x [`3457ee9`](https://github.com/eea/volto-embed/commit/3457ee9e3f5c78cf483525a274f03e6941d06f6f)
34
+
7
35
  #### [2.0.11](https://github.com/eea/volto-embed/compare/2.0.10...2.0.11)
8
36
 
37
+ > 11 January 2022
38
+
39
+ - use latest volto-slate [`#17`](https://github.com/eea/volto-embed/pull/17)
9
40
  - add cy tests [`#16`](https://github.com/eea/volto-embed/pull/16)
10
41
  - improve arcgis map view [`#14`](https://github.com/eea/volto-embed/pull/14)
11
42
  - Update package.json [`0ec673a`](https://github.com/eea/volto-embed/commit/0ec673a8178731b8c1e010101caee2a3c9fafaca)
@@ -24,14 +24,20 @@ describe('Blocks Tests', () => {
24
24
  .first()
25
25
  .contains('Embed external content');
26
26
 
27
- cy.get('.field-wrapper-privacy_statement-0-dataprotection p').first().clear().type('Test text for privacy protection');
27
+ cy.get('.field-wrapper-privacy_statement-0-dataprotection p')
28
+ .first()
29
+ .clear()
30
+ .type('Test text for privacy protection');
28
31
  cy.get('.field-wrapper-privacy_cookie_key-1-dataprotection');
29
32
  cy.get('.field-wrapper-enabled-2-dataprotection .checkbox').click();
30
33
 
31
34
  const imageFile = 'cat.jpg';
32
- cy.get('.field-wrapper-background_image-3-dataprotection .dropzone-placeholder').attachFile(imageFile);
33
- const embed_url = "<div class=\"mapouter\"><div class=\"gmap_canvas\"><iframe width=\"600\" height=\"500\" id=\"gmap_canvas\" src=\"https://maps.google.com/maps?q=2880%20Broadway,%20New%20York&t=&z=13&ie=UTF8&iwloc=&output=embed\" frameborder=\"0\" scrolling=\"no\" marginheight=\"0\" marginwidth=\"0\"></iframe><a href=\"https://www.embedgooglemap.net/blog/divi-discount-code-elegant-themes-coupon/\"></a><br></div></div>";
34
- cy.get('.block.maps input').click().type(embed_url, { force: true })
35
+ cy.get(
36
+ '.field-wrapper-background_image-3-dataprotection .dropzone-placeholder',
37
+ ).attachFile(imageFile);
38
+ const embed_url =
39
+ '<div class="mapouter"><div class="gmap_canvas"><iframe width="600" height="500" id="gmap_canvas" src="https://maps.google.com/maps?q=2880%20Broadway,%20New%20York&t=&z=13&ie=UTF8&iwloc=&output=embed" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe><a href="https://www.embedgooglemap.net/blog/divi-discount-code-elegant-themes-coupon/"></a><br></div></div>';
40
+ cy.get('.block.maps input').click().type(embed_url, { force: true });
35
41
 
36
42
  cy.get('.block-editor-text').last().click();
37
43
  cy.get('.block-add-button').first().click();
@@ -39,16 +45,20 @@ describe('Blocks Tests', () => {
39
45
  cy.get('.ui.basic.icon.button.maps').contains('Maps').click();
40
46
 
41
47
  cy.get('.align-widget.field-wrapper-align button').first().click();
42
- cy.get('.block.maps input').last().click().type(embed_url, { force: true })
43
- cy.get('.field-wrapper-background_image-3-dataprotection .dropzone-placeholder').attachFile(imageFile);
44
-
48
+ cy.get('.block.maps input')
49
+ .last()
50
+ .click()
51
+ .type(embed_url, { force: true });
52
+ cy.get(
53
+ '.field-wrapper-background_image-3-dataprotection .dropzone-placeholder',
54
+ ).attachFile(imageFile);
45
55
 
46
56
  // Save
47
57
  cy.get('#toolbar-save').click();
48
58
  cy.url().should('eq', Cypress.config().baseUrl + '/cypress/my-page');
49
59
 
50
60
  // then the page view should contain our changes
51
- cy.get('.ui.loader');
52
- });
61
+ // cy.get('.ui.loader');
62
+ });
53
63
  });
54
64
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-embed",
3
- "version": "2.0.11",
3
+ "version": "4.0.0",
4
4
  "description": "Embed external content",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
@@ -16,6 +16,7 @@ import aheadSVG from '@plone/volto/icons/ahead.svg';
16
16
  import mapsBlockSVG from '@plone/volto/components/manage/Blocks/Maps/block-maps.svg';
17
17
  import schema from './schema';
18
18
  import { addPrivacyProtectionToSchema } from '../PrivacyProtection';
19
+ import { PrivacyProtection } from '../PrivacyProtection';
19
20
 
20
21
  const messages = defineMessages({
21
22
  MapsBlockInputPlaceholder: {
@@ -182,15 +183,20 @@ class Edit extends Component {
182
183
  'full-width': this.props.data.align === 'full',
183
184
  })}
184
185
  >
185
- <iframe
186
- title={this.props.intl.formatMessage(
187
- messages.GoogleMapsEmbeddedBlock,
188
- )}
189
- src={this.props.data.url}
190
- className="google-map"
191
- frameBorder="0"
192
- allowFullScreen
193
- />
186
+ <PrivacyProtection
187
+ data={this.props.data}
188
+ editable={this.props.editable}
189
+ >
190
+ <iframe
191
+ title={this.props.intl.formatMessage(
192
+ messages.GoogleMapsEmbeddedBlock,
193
+ )}
194
+ src={this.props.data.url}
195
+ className="google-map"
196
+ frameBorder="0"
197
+ allowFullScreen
198
+ />
199
+ </PrivacyProtection>
194
200
  </div>
195
201
  ) : (
196
202
  <Message>
@@ -22,7 +22,7 @@ const messages = defineMessages({
22
22
  * @extends Component
23
23
  */
24
24
 
25
- const View = ({ data, intl }) => {
25
+ const View = ({ data, intl, id }) => {
26
26
  return (
27
27
  <div
28
28
  className={cx(
@@ -42,7 +42,7 @@ const View = ({ data, intl }) => {
42
42
  })}
43
43
  style={{ height: '100%' }}
44
44
  >
45
- <PrivacyProtection data={data}>
45
+ <PrivacyProtection data={data} id={id}>
46
46
  <iframe
47
47
  title={intl.formatMessage(messages.EmbededGoogleMaps)}
48
48
  src={data.url}
@@ -1,9 +1,9 @@
1
1
  import React, { useState } from 'react';
2
+ import { compose } from 'redux';
2
3
  import { useSelector } from 'react-redux';
3
4
  import VisibilitySensor from 'react-visibility-sensor';
4
5
  import { Placeholder, Dimmer, Loader } from 'semantic-ui-react';
5
- import cookie from 'react-cookie';
6
-
6
+ import { withCookies } from 'react-cookie';
7
7
  //import { find, without } from 'lodash';
8
8
  import { serializeNodes } from 'volto-slate/editor/render';
9
9
  import { Button, Checkbox } from 'semantic-ui-react';
@@ -11,14 +11,15 @@ import { defineMessages, injectIntl } from 'react-intl';
11
11
  import { useDispatch } from 'react-redux';
12
12
  import { toast } from 'react-toastify';
13
13
  import config from '@plone/volto/registry';
14
- import '../css/embed-styles.css';
15
- import { createImageUrl } from './helpers';
16
-
17
14
  import { getBaseUrl } from '@plone/volto/helpers';
18
15
  import { Toast } from '@plone/volto/components';
19
16
  import { getConnectedDataParametersForContext } from '@eeacms/volto-datablocks/helpers';
17
+
18
+ import { createImageUrl } from './helpers';
20
19
  import { ProtectionSchema } from './schema';
21
20
 
21
+ import './styles.less';
22
+
22
23
  const messages = defineMessages({
23
24
  success: {
24
25
  id: 'Success',
@@ -37,29 +38,29 @@ const getExpDays = () =>
37
38
  ? config.settings.embedCookieExpirationDays
38
39
  : 90;
39
40
 
40
- function saveCookie(domain_key) {
41
+ function saveCookie(domain_key, cookies) {
41
42
  const date = new Date();
42
43
  date.setDate(date.getDate() + getExpDays());
43
44
 
44
- cookie.save(key(domain_key), 'true', {
45
+ cookies.set(key(domain_key), 'true', {
45
46
  path: '/',
46
47
  expires: date,
47
48
  });
48
49
  }
49
50
 
50
- function canShow(domain_key) {
51
- return cookie.load(key(domain_key)) === 'true';
51
+ function canShow(domain_key, cookies) {
52
+ return cookies.get(key(domain_key)) === 'true';
52
53
  }
53
54
 
54
- const cookieExist = (domain_key) => cookie.load(key(domain_key));
55
+ const cookieExist = (domain_key, cookies) => cookies.get(key(domain_key));
55
56
 
56
- const CookieWatcher = (cookie, pollingRate = 250) => {
57
+ const CookieWatcher = (domain_key, cookies, pollingRate = 250) => {
57
58
  // state for cookie existence
58
- const [exist, setExist] = useState(cookieExist(cookie));
59
+ const [exist, setExist] = useState(cookieExist(domain_key, cookies));
59
60
 
60
61
  React.useEffect(() => {
61
62
  const interval = setInterval(
62
- () => setExist(cookieExist(cookie)),
63
+ () => setExist(cookieExist(domain_key, cookies)),
63
64
  pollingRate,
64
65
  );
65
66
  return () => clearInterval(interval);
@@ -68,179 +69,189 @@ const CookieWatcher = (cookie, pollingRate = 250) => {
68
69
  return exist;
69
70
  };
70
71
 
71
- export default injectIntl(
72
- ({
73
- children,
74
- data = {},
75
- id,
76
- isEditMode,
77
- onChangeBlock,
78
- intl,
79
- path,
80
- properties,
81
- ...rest
82
- }) => {
83
- const { dataprotection = {}, height } = data;
84
- const { background_image: bgImg, enabled = false } = dataprotection;
85
- const [image, setImage] = React.useState(null);
86
- const [visible, setVisibility] = useState(false);
87
- const defaultShow = canShow(dataprotection.privacy_cookie_key);
88
- const [show, setShow] = useState(defaultShow);
89
- const [remember, setRemember] = useState(
90
- cookieExist(dataprotection.privacy_cookie_key) ? defaultShow : true,
91
- );
92
- const dispatch = useDispatch();
93
- const checkExistance = CookieWatcher(dataprotection.privacy_cookie_key);
94
- const queryParam = useSelector((state) => {
95
- return {
96
- connected_data_parameters: getConnectedDataParametersForContext(
97
- state?.connected_data_parameters,
98
- state.router?.location?.pathname,
99
- ),
100
- };
101
- });
102
- const param = queryParam
103
- ? queryParam.connected_data_parameters?.[0]?.query?.[0]?.v?.[0] ||
104
- queryParam.connected_data_parameters?.[0]?.v?.[0]
105
- : null;
106
-
107
- // create a url with params
108
- const url =
109
- param && data.url
110
- ? decodeURIComponent(data.url).replace('<<NUTS_CODE>>', param)
111
- : data.url;
112
-
113
- const styles = {
114
- height: `${height}px`,
115
- position: 'relative',
116
- };
117
- React.useEffect(() => {
118
- if (bgImg) {
119
- setImage(createImageUrl(bgImg)); //create imageUrl from uploaded image
120
- }
121
- }, [bgImg]);
122
-
123
- //Effect hook for polling the cookie_key
124
- React.useEffect(
125
- () => {
126
- if (!isEditMode && defaultShow) {
127
- setShow(true);
128
- }
129
- },
130
- // eslint-disable-next-line react-hooks/exhaustive-deps
131
- [checkExistance],
72
+ const getFilteredURL = (url, connected_data_parameters = []) => {
73
+ if (!connected_data_parameters?.length) return url;
74
+ let decodedURL = decodeURIComponent(url);
75
+ const queries = decodedURL.match(/(?<=(<<))(.*?)(?=(>>))/g);
76
+ if (!queries?.length) return url;
77
+ const keys = connected_data_parameters.map((param) => param.i);
78
+ for (let poz in queries) {
79
+ const key = queries[poz];
80
+ const paramPoz = keys.indexOf(key);
81
+ if (paramPoz > -1) {
82
+ decodedURL = decodedURL.replace(
83
+ `<<${key}>>`,
84
+ connected_data_parameters[paramPoz].v[0],
85
+ );
86
+
87
+ continue;
88
+ }
89
+ }
90
+ return decodedURL;
91
+ };
92
+
93
+ const PrivacyProtection = (props) => {
94
+ const { children, data = {}, id, editable, intl, path, cookies } = props;
95
+ const {
96
+ enabled = false,
97
+ privacy_statement,
98
+ background_image: bgImg,
99
+ privacy_cookie_key = 'esri-maps',
100
+ } = data.dataprotection || {};
101
+
102
+ const [image, setImage] = React.useState(null);
103
+ const [visible, setVisibility] = useState(false);
104
+ const defaultShow = canShow(privacy_cookie_key, cookies);
105
+ const [show, setShow] = useState(defaultShow);
106
+ const [remember, setRemember] = useState(
107
+ cookieExist(privacy_cookie_key, cookies) ? defaultShow : true,
108
+ );
109
+ const dispatch = useDispatch();
110
+ const checkExistance = CookieWatcher(privacy_cookie_key, cookies);
111
+ const connected_data_parameters = useSelector((state) => {
112
+ return getConnectedDataParametersForContext(
113
+ state?.connected_data_parameters,
114
+ state.router?.location?.pathname,
132
115
  );
116
+ });
117
+ const url = getFilteredURL(data.url, connected_data_parameters);
133
118
 
134
- //screenshot api
135
- React.useEffect(() => {
136
- if (enabled && !bgImg && !show) {
137
- fetch(
138
- `${getBaseUrl(
139
- '',
140
- )}/cors-proxy/https://screenshot.eea.europa.eu/api/v1/retrieve_image_for_url?url=${encodeURIComponent(
141
- url,
142
- )}&w=1920&waitfor=4000`,
143
- )
144
- .then((e) => e.blob())
145
- .then((blob) => {
146
- setImage(URL.createObjectURL(blob));
147
- if (isEditMode) {
148
- toast.success(
149
- <Toast
150
- success
151
- title={intl.formatMessage(messages.success)}
152
- content={intl.formatMessage(messages.image)}
153
- />,
154
- );
155
- }
156
- });
119
+ React.useEffect(() => {
120
+ if (bgImg) {
121
+ setImage(createImageUrl(bgImg)); //create imageUrl from uploaded image
122
+ }
123
+ }, [bgImg]);
124
+
125
+ //Effect hook for polling the cookie_key
126
+ React.useEffect(
127
+ () => {
128
+ if (!editable && defaultShow) {
129
+ setShow(true);
157
130
  }
158
- }, [enabled, url, path, dispatch, bgImg, show, intl, isEditMode]);
159
-
160
- return (
161
- <VisibilitySensor
162
- onChange={(isVisible) => {
163
- !visible && isVisible && setVisibility(true);
164
- }}
165
- partialVisibility={true}
166
- offset={{ bottom: 200 }}
167
- >
168
- {visible ? (
169
- <div style={height ? styles : {}}>
170
- {!dataprotection.enabled || show ? (
171
- children
172
- ) : !image ? (
173
- <Dimmer active>
174
- <Loader />
175
- </Dimmer>
176
- ) : (
177
- <div
178
- className="privacy-protection"
179
- {...rest}
180
- style={
181
- image
182
- ? {
183
- backgroundImage: `url(${image})`,
184
- backgroundRepeat: 'no-repeat',
185
- backgroundSize: 'cover',
186
- backgroundPosition: 'center -70px',
187
- }
188
- : {}
189
- }
190
- >
191
- <div className="overlay">
192
- <div className="wrapped">
193
- <div className="privacy-button">
194
- <Button
195
- primary
196
- onClick={() => {
197
- setShow(true);
198
- if (remember) {
199
- saveCookie(dataprotection.privacy_cookie_key);
200
- }
131
+ },
132
+ // eslint-disable-next-line react-hooks/exhaustive-deps
133
+ [checkExistance],
134
+ );
135
+
136
+ //screenshot api
137
+ React.useEffect(() => {
138
+ if (enabled && !bgImg && !show) {
139
+ fetch(
140
+ `${getBaseUrl(
141
+ '',
142
+ )}/cors-proxy/https://screenshot.eea.europa.eu/api/v1/retrieve_image_for_url?url=${encodeURIComponent(
143
+ url,
144
+ )}&w=1920&waitfor=4000`,
145
+ )
146
+ .then((e) => e.blob())
147
+ .then((blob) => {
148
+ setImage(URL.createObjectURL(blob));
149
+ if (editable) {
150
+ toast.success(
151
+ <Toast
152
+ success
153
+ title={intl.formatMessage(messages.success)}
154
+ content={intl.formatMessage(messages.image)}
155
+ />,
156
+ );
157
+ }
158
+ })
159
+ .catch(() => {
160
+ if (__DEVELOPMENT__) {
161
+ /* eslint-disable-next-line */
162
+ console.log('Please enable your VPN!');
163
+ }
164
+ });
165
+ }
166
+ }, [enabled, url, path, dispatch, bgImg, show, intl, editable]);
167
+
168
+ return (
169
+ <VisibilitySensor
170
+ onChange={(isVisible) => {
171
+ !visible && isVisible && setVisibility(true);
172
+ }}
173
+ partialVisibility={true}
174
+ offset={{ bottom: 200 }}
175
+ >
176
+ {visible ? (
177
+ <div
178
+ className="privacy-protection-wrapper"
179
+ style={{ position: 'relative', minHeight: '200px' }}
180
+ >
181
+ {!enabled || show ? (
182
+ children
183
+ ) : !__DEVELOPMENT__ && !image ? (
184
+ <Dimmer active>
185
+ <Loader />
186
+ </Dimmer>
187
+ ) : (
188
+ <div
189
+ className="privacy-protection"
190
+ style={
191
+ image
192
+ ? {
193
+ backgroundImage: `url(${image})`,
194
+ backgroundRepeat: 'no-repeat',
195
+ backgroundSize: 'cover',
196
+ backgroundPosition: 'center -70px',
197
+ }
198
+ : {}
199
+ }
200
+ >
201
+ <div className="overlay">
202
+ <div className="wrapped">
203
+ <div className="privacy-button">
204
+ <Button
205
+ primary
206
+ onClick={() => {
207
+ setShow(true);
208
+ if (remember) {
209
+ saveCookie(privacy_cookie_key, cookies);
210
+ }
211
+ }}
212
+ >
213
+ Show external content
214
+ </Button>
215
+ </div>
216
+
217
+ {!editable && (
218
+ <div className="privacy-toggle">
219
+ <Checkbox
220
+ toggle
221
+ label="Remember my choice"
222
+ id={`remember-choice-${id}`}
223
+ onChange={(ev, { checked }) => {
224
+ setRemember(checked);
201
225
  }}
202
- >
203
- Show external content
204
- </Button>
226
+ checked={remember}
227
+ />
205
228
  </div>
229
+ )}
206
230
 
207
- {!isEditMode && (
208
- <div className="privacy-toggle">
209
- <Checkbox
210
- toggle
211
- label="Remember my choice"
212
- id={`remember-choice-${id}`}
213
- onChange={(ev, { checked }) => {
214
- setRemember(checked);
215
- }}
216
- checked={remember}
217
- />
218
- </div>
231
+ <p className="discreet">
232
+ Your choice will be saved in a cookie managed by{' '}
233
+ {config.settings.ownDomain || '.eea.europa.eu'} that will
234
+ expire in {getExpDays()} days.
235
+ </p>
236
+ <p className="discreet">
237
+ {serializeNodes(
238
+ privacy_statement ||
239
+ ProtectionSchema().properties.privacy_statement
240
+ .defaultValue,
219
241
  )}
220
-
221
- <p className="discreet">
222
- Your choice will be saved in a cookie managed by{' '}
223
- {config.settings.ownDomain || '.eea.europa.eu'} that will
224
- expire in {getExpDays()} days.
225
- </p>
226
- <p className="discreet">
227
- {serializeNodes(
228
- dataprotection.privacy_statement ||
229
- ProtectionSchema().properties.privacy_statement
230
- .defaultValue,
231
- )}
232
- </p>
233
- </div>
242
+ </p>
234
243
  </div>
235
244
  </div>
236
- )}
237
- </div>
238
- ) : (
239
- <Placeholder style={{ height: '100%', width: '100%' }}>
240
- <Placeholder.Image rectangular />
241
- </Placeholder>
242
- )}
243
- </VisibilitySensor>
244
- );
245
- },
246
- );
245
+ </div>
246
+ )}
247
+ </div>
248
+ ) : (
249
+ <Placeholder style={{ height: '100%', width: '100%' }}>
250
+ <Placeholder.Image rectangular />
251
+ </Placeholder>
252
+ )}
253
+ </VisibilitySensor>
254
+ );
255
+ };
256
+
257
+ export default compose(injectIntl, withCookies)(PrivacyProtection);
@@ -1,3 +1,13 @@
1
+ .privacy-protection-wrapper {
2
+ .ui.dimmer {
3
+ z-index: 9;
4
+
5
+ .ui.loader {
6
+ padding: 0;
7
+ }
8
+ }
9
+ }
10
+
1
11
  .privacy-protection {
2
12
  display: flex;
3
13
  height: 100%;
@@ -8,7 +18,7 @@
8
18
  }
9
19
 
10
20
  .privacy-button {
11
- margin-top: 2rem;
21
+ margin-top: 0.5rem;
12
22
  }
13
23
 
14
24
  .privacy-toggle {
@@ -16,17 +26,17 @@
16
26
  }
17
27
 
18
28
  .wrapped {
19
- position: absolute;
20
- top: 50%;
21
- left: 50%;
29
+ // position: absolute;
30
+ // top: 50%;
31
+ // left: 50%;
22
32
  width: 300px;
23
33
  padding: 1.4rem;
24
34
  margin: 0 auto;
25
35
  background: white;
26
36
  border-radius: 5px;
27
- opacity: 0.8;
28
- -ms-transform: translate(-50%, -50%);
29
- transform: translate(-50%, -50%);
37
+ opacity: 1;
38
+ // -ms-transform: translate(-50%, -50%);
39
+ // transform: translate(-50%, -50%);
30
40
  }
31
41
 
32
42
  .discreet,