@plone/volto 17.0.0-alpha.0 → 17.0.0-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.
package/.changelog.draft CHANGED
@@ -1,22 +1,28 @@
1
- ## 17.0.0-alpha.0 (2023-03-04)
1
+ ## 17.0.0-alpha.1 (2023-03-09)
2
2
 
3
- ### Breaking
3
+ ### Feature
4
4
 
5
- - Volto 17 drops support for NodeJS 14, and adds support for NodeJS 18.
6
- Please see the [upgrade guide](https://6.docs.plone.org/volto/upgrade-guide/index.html)
7
- for more information.
5
+ - - Add directive to cache stable resources in browser or intermediate server for 365 days by default directly in the SSR Express server, static resource that could change after a new deployment for 1 minute. @mamico [#2216](https://github.com/plone/volto/issues/2216)
6
+ - Use popperjs in BlockChooser, move the markup to the bottom of the body tag. @sneridagh [#4141](https://github.com/plone/volto/issues/4141)
7
+ - Improvements to the dev API proxy:
8
+ - Prefer RAZZLE_INTERNAL_API_PATH over RAZZLE_API_PATH as the target of the proxy.
9
+ The target of the API proxy is now always logged on startup, even in production mode.
10
+ - Support proxying to a backend served over https. For this configuration it
11
+ might be necessary to set RAZZLE_DEV_PROXY_INSECURE=1 if the backend
12
+ certificate can't be verified.
8
13
 
9
- Volto 17 now uses Webpack 5. [#4086](https://github.com/plone/volto/issues/4086)
14
+ [davisagli] [#4434](https://github.com/plone/volto/issues/4434)
10
15
 
11
- ### Internal
16
+ ### Bugfix
12
17
 
13
- - Add HI-ERN website to "Volto in Production" section in README @steffenri [#4172](https://github.com/plone/volto/issues/4172)
18
+ - fix: newsitem and event views wrapper classNames @nzambello [#4443](https://github.com/plone/volto/issues/4443)
19
+ - Fix weird GHA failure on config option not supported @sneridagh [#4466](https://github.com/plone/volto/issues/4466)
20
+ - Fix history view dropdown for first entry, showing 'Revert to this version option' always @sneridagh [#4471](https://github.com/plone/volto/issues/4471)
21
+ - Fix order of row of long table in edit and view mode @iFlameing [#4473](https://github.com/plone/volto/issues/4473)
22
+ - Improve flaky test in autofocus Cypress tests @sneridagh [#4475](https://github.com/plone/volto/issues/4475)
14
23
 
15
24
  ### Documentation
16
25
 
17
- - Add a new Volto site to the README @erral [#4158](https://github.com/plone/volto/issues/4158), [#4170](https://github.com/plone/volto/issues/4170)
18
- - Add new websites Lanku and UEU
19
- [erral] [#4310](https://github.com/plone/volto/issues/4310)
20
- - Fix English and MyST grammar and syntax from PR #4285 @stevepiercy [#4331](https://github.com/plone/volto/issues/4331)
21
- - Use a universal static path for both documentation and volto repos. @stevepiercy [#4376](https://github.com/plone/volto/issues/4376)
26
+ - Complete teaser docs, add new section in `Blocks`: `Core Blocks developers notes` @sneridagh [#4461](https://github.com/plone/volto/issues/4461)
27
+ - Change from links to inline literals in `CHANGELOG.md` to fix linkcheckbroken. @stevepiercy [#4470](https://github.com/plone/volto/issues/4470)
22
28
 
Binary file
package/CHANGELOG.md CHANGED
@@ -8,6 +8,35 @@
8
8
 
9
9
  <!-- towncrier release notes start -->
10
10
 
11
+ ## 17.0.0-alpha.1 (2023-03-09)
12
+
13
+ ### Feature
14
+
15
+ - - Add directive to cache stable resources in browser or intermediate server for 365 days by default directly in the SSR Express server, static resource that could change after a new deployment for 1 minute. @mamico [#2216](https://github.com/plone/volto/issues/2216)
16
+ - Use popperjs in BlockChooser, move the markup to the bottom of the body tag. @sneridagh [#4141](https://github.com/plone/volto/issues/4141)
17
+ - Improvements to the dev API proxy:
18
+ - Prefer RAZZLE_INTERNAL_API_PATH over RAZZLE_API_PATH as the target of the proxy.
19
+ The target of the API proxy is now always logged on startup, even in production mode.
20
+ - Support proxying to a backend served over https. For this configuration it
21
+ might be necessary to set RAZZLE_DEV_PROXY_INSECURE=1 if the backend
22
+ certificate can't be verified.
23
+
24
+ [davisagli] [#4434](https://github.com/plone/volto/issues/4434)
25
+
26
+ ### Bugfix
27
+
28
+ - fix: newsitem and event views wrapper classNames @nzambello [#4443](https://github.com/plone/volto/issues/4443)
29
+ - Fix weird GHA failure on config option not supported @sneridagh [#4466](https://github.com/plone/volto/issues/4466)
30
+ - Fix history view dropdown for first entry, showing 'Revert to this version option' always @sneridagh [#4471](https://github.com/plone/volto/issues/4471)
31
+ - Fix order of row of long table in edit and view mode @iFlameing [#4473](https://github.com/plone/volto/issues/4473)
32
+ - Improve flaky test in autofocus Cypress tests @sneridagh [#4475](https://github.com/plone/volto/issues/4475)
33
+
34
+ ### Documentation
35
+
36
+ - Complete teaser docs, add new section in `Blocks`: `Core Blocks developers notes` @sneridagh [#4461](https://github.com/plone/volto/issues/4461)
37
+ - Change from links to inline literals in `CHANGELOG.md` to fix linkcheckbroken. @stevepiercy [#4470](https://github.com/plone/volto/issues/4470)
38
+
39
+
11
40
  ## 17.0.0-alpha.0 (2023-03-04)
12
41
 
13
42
  ### Breaking
@@ -31,6 +60,31 @@
31
60
  - Use a universal static path for both documentation and volto repos. @stevepiercy [#4376](https://github.com/plone/volto/issues/4376)
32
61
 
33
62
 
63
+ ## 16.15.0 (2023-03-08)
64
+
65
+ ### Feature
66
+
67
+ - Improvements to the dev API proxy:
68
+ - Prefer RAZZLE_INTERNAL_API_PATH over RAZZLE_API_PATH as the target of the proxy.
69
+ The target of the API proxy is now always logged on startup, even in production mode.
70
+ - Support proxying to a backend served over https. For this configuration it
71
+ might be necessary to set RAZZLE_DEV_PROXY_INSECURE=1 if the backend
72
+ certificate can't be verified.
73
+
74
+ [davisagli] [#4434](https://github.com/plone/volto/issues/4434)
75
+
76
+ ### Bugfix
77
+
78
+ - fix: newsitem and event views wrapper classNames @nzambello [#4443](https://github.com/plone/volto/issues/4443)
79
+ - Fix weird GHA failure on config option not supported @sneridagh [#4466](https://github.com/plone/volto/issues/4466)
80
+ - Fix history view dropdown for first entry, showing 'Revert to this version option' always @sneridagh [#4471](https://github.com/plone/volto/issues/4471)
81
+ - Fix order of row of long table in edit and view mode @iFlameing [#4473](https://github.com/plone/volto/issues/4473)
82
+
83
+ ### Documentation
84
+
85
+ - Complete teaser docs, add new section in `Blocks`: `Core Blocks developers notes` @sneridagh [#4461](https://github.com/plone/volto/issues/4461)
86
+
87
+
34
88
  ## 16.14.0 (2023-03-03)
35
89
 
36
90
  ### Feature
@@ -72,11 +126,11 @@
72
126
  - Add the intl string 'Uploading image' to the image block @bipoza [#4180](https://github.com/plone/volto/issues/4180)
73
127
  - Fix link integrity overlay is too narrowed @iFlameing [#4399](https://github.com/plone/volto/issues/4399)
74
128
  - Fix External link Icon shows up in Grid-text block @iRohitSingh [#4400](https://github.com/plone/volto/issues/4400)
75
- - Fix broken links: babeljs.io/… @ksuess [#4414](https://github.com/plone/volto/issues/4414)
129
+ - Fix broken links: `babeljs.io/…` @ksuess [#4414](https://github.com/plone/volto/issues/4414)
76
130
 
77
131
  ### Documentation
78
132
 
79
- - Remove inclusion of CHANGELOG.md for volto repo only. Fixes https://github.com/plone/documentation/issues/1431. @stevepiercy [#4404](https://github.com/plone/volto/issues/4404)
133
+ - Remove inclusion of `CHANGELOG.md` for volto repo only. Fixes https://github.com/plone/documentation/issues/1431. @stevepiercy [#4404](https://github.com/plone/volto/issues/4404)
80
134
 
81
135
 
82
136
  ## 16.11.0 (2023-02-13)
@@ -1088,8 +1142,6 @@ See https://6.dev-docs.plone.org/volto/upgrade-guide/index.html for more informa
1088
1142
 
1089
1143
  ## 16.0.0-alpha.34 (2022-09-17)
1090
1144
 
1091
- ### Breaking
1092
-
1093
1145
  ### Feature
1094
1146
 
1095
1147
  - Added new components `Aliases` for aliases control in Volto. Alias management in both controlpanel and object view. @andreiggr @avoinea
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  }
10
10
  ],
11
11
  "license": "MIT",
12
- "version": "17.0.0-alpha.0",
12
+ "version": "17.0.0-alpha.1",
13
13
  "repository": {
14
14
  "type": "git",
15
15
  "url": "git@github.com:plone/volto.git"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plone/volto-slate",
3
- "version": "17.0.0-alpha.0",
3
+ "version": "17.0.0-alpha.1",
4
4
  "description": "Slate.js integration with Volto",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
@@ -33,13 +33,13 @@ const View = ({ data }) => {
33
33
  }, [data.table.rows]);
34
34
 
35
35
  const rows = useMemo(() => {
36
- const items = {};
37
- if (!data.table.rows) return {};
36
+ const items = [];
37
+ if (!data.table.rows) return [];
38
38
  data.table.rows.forEach((row, index) => {
39
39
  if (index > 0) {
40
- items[row.key] = [];
40
+ items[index] = [];
41
41
  row.cells.forEach((cell, cellIndex) => {
42
- items[row.key][cellIndex] = {
42
+ items[index][cellIndex] = {
43
43
  ...cell,
44
44
  value:
45
45
  cell.value && Node.string({ children: cell.value }).length > 0
@@ -4,8 +4,10 @@ import addSVG from '@plone/volto/icons/circle-plus.svg';
4
4
  import { blockHasValue } from '@plone/volto/helpers';
5
5
  import { Icon, BlockChooser } from '@plone/volto/components';
6
6
  import config from '@plone/volto/registry';
7
- import { Button } from 'semantic-ui-react';
7
+ import { Button, Ref } from 'semantic-ui-react';
8
8
  import { defineMessages, useIntl } from 'react-intl';
9
+ import { usePopper } from 'react-popper';
10
+ import { Portal } from 'react-portal';
9
11
 
10
12
  const messages = defineMessages({
11
13
  addBlock: {
@@ -76,41 +78,73 @@ const BlockChooserButton = (props) => {
76
78
  };
77
79
  }, [handleClickOutside]);
78
80
 
81
+ const [referenceElement, setReferenceElement] = React.useState(null);
82
+ const [popperElement, setPopperElement] = React.useState(null);
83
+ const { styles, attributes } = usePopper(referenceElement, popperElement, {
84
+ placement: config.experimental.addBlockButton.enabled
85
+ ? 'bottom'
86
+ : 'right-start',
87
+ modifiers: [
88
+ {
89
+ name: 'offset',
90
+ options: {
91
+ offset: [-10, 5],
92
+ },
93
+ },
94
+ {
95
+ name: 'flip',
96
+ options: {
97
+ fallbackPlacements: ['right-end', 'top-start'],
98
+ },
99
+ },
100
+ ],
101
+ });
102
+
79
103
  return (
80
104
  <>
81
105
  {!disableNewBlocks &&
82
106
  (config.experimental.addBlockButton.enabled ||
83
107
  !blockHasValue(data)) && (
84
- <Component
85
- {...props}
86
- onShowBlockChooser={() => setAddNewBlockOpened(true)}
87
- />
108
+ <Ref innerRef={setReferenceElement}>
109
+ <Component
110
+ {...props}
111
+ onShowBlockChooser={() => setAddNewBlockOpened(true)}
112
+ />
113
+ </Ref>
88
114
  )}
89
115
  {addNewBlockOpened && (
90
- <BlockChooser
91
- onMutateBlock={
92
- onMutateBlock
93
- ? (id, value) => {
94
- setAddNewBlockOpened(false);
95
- onMutateBlock(id, value);
96
- }
97
- : null
98
- }
99
- onInsertBlock={
100
- onInsertBlock
101
- ? (id, value) => {
102
- setAddNewBlockOpened(false);
103
- onInsertBlock(id, value);
104
- }
105
- : null
106
- }
107
- currentBlock={block}
108
- allowedBlocks={allowedBlocks}
109
- blocksConfig={blocksConfig}
110
- properties={properties}
111
- showRestricted={showRestricted}
112
- ref={blockChooserRef}
113
- />
116
+ <Portal node={document.getElementById('body')}>
117
+ <div
118
+ ref={setPopperElement}
119
+ style={styles.popper}
120
+ {...attributes.popper}
121
+ >
122
+ <BlockChooser
123
+ onMutateBlock={
124
+ onMutateBlock
125
+ ? (id, value) => {
126
+ setAddNewBlockOpened(false);
127
+ onMutateBlock(id, value);
128
+ }
129
+ : null
130
+ }
131
+ onInsertBlock={
132
+ onInsertBlock
133
+ ? (id, value) => {
134
+ setAddNewBlockOpened(false);
135
+ onInsertBlock(id, value);
136
+ }
137
+ : null
138
+ }
139
+ currentBlock={block}
140
+ allowedBlocks={allowedBlocks}
141
+ blocksConfig={blocksConfig}
142
+ properties={properties}
143
+ showRestricted={showRestricted}
144
+ ref={blockChooserRef}
145
+ />
146
+ </div>
147
+ </Portal>
114
148
  )}
115
149
  </>
116
150
  );
@@ -31,7 +31,6 @@ const BlockChooserSearch = ({ onChange, searchValue }) => {
31
31
  autoComplete="off"
32
32
  placeholder={intl.formatMessage(messages.search)}
33
33
  title={intl.formatMessage(messages.search)}
34
- autoFocus
35
34
  ref={searchInput}
36
35
  />
37
36
  {searchValue && (
@@ -116,22 +116,37 @@ class History extends Component {
116
116
  this.props.revertHistory(getBaseUrl(this.props.pathname), value);
117
117
  }
118
118
 
119
- /**
120
- * Render method.
121
- * @method render
122
- * @returns {string} Markup for the component.
123
- */
124
- render() {
119
+ processHistoryEntries = () => {
120
+ // Getting the history entries from the props
121
+ // No clue why the reverse(concat()) is necessary
125
122
  const entries = reverse(concat(this.props.entries));
126
123
  let title = entries.length > 0 ? entries[0].state_title : '';
127
124
  for (let x = 1; x < entries.length; x += 1) {
128
125
  entries[x].prev_state_title = title;
129
126
  title = entries[x].state_title || title;
130
127
  }
128
+ // We reverse them again
131
129
  reverse(entries);
130
+
131
+ // We identify the latest 'versioning' entry and mark it
132
+ const current_version = find(entries, (item) => item.type === 'versioning');
133
+ if (current_version) {
134
+ current_version.is_current = true;
135
+ }
136
+ return entries;
137
+ };
138
+
139
+ /**
140
+ * Render method.
141
+ * @method render
142
+ * @returns {string} Markup for the component.
143
+ */
144
+ render() {
132
145
  const historyAction = find(this.props.objectActions, {
133
146
  id: 'history',
134
147
  });
148
+ const entries = this.processHistoryEntries();
149
+
135
150
  return !historyAction ? (
136
151
  <>
137
152
  {this.props.token ? (
@@ -266,18 +281,20 @@ class History extends Component {
266
281
  />
267
282
  </Link>
268
283
  )}
269
- {'version' in entry && (
270
- <Dropdown.Item
271
- value={entry.version}
272
- onClick={this.onRevert}
273
- >
274
- <Icon name="undo" />{' '}
275
- <FormattedMessage
276
- id="Revert to this revision"
277
- defaultMessage="Revert to this revision"
278
- />
279
- </Dropdown.Item>
280
- )}
284
+ {'version' in entry &&
285
+ entry.may_revert &&
286
+ !entry.is_current && (
287
+ <Dropdown.Item
288
+ value={entry.version}
289
+ onClick={this.onRevert}
290
+ >
291
+ <Icon name="undo" />{' '}
292
+ <FormattedMessage
293
+ id="Revert to this revision"
294
+ defaultMessage="Revert to this revision"
295
+ />
296
+ </Dropdown.Item>
297
+ )}
281
298
  </Dropdown.Menu>
282
299
  </Dropdown>
283
300
  )}
@@ -43,7 +43,7 @@ const EventView = (props) => {
43
43
  const { content } = props;
44
44
 
45
45
  return (
46
- <div id="page-document" className="ui container viewwrapper event-view">
46
+ <div id="page-document" className="ui container view-wrapper event-view">
47
47
  <Grid>
48
48
  <Grid.Column width={7} className="mobile hidden">
49
49
  {hasBlocksData(content) ? (
@@ -21,7 +21,7 @@ import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
21
21
  */
22
22
  const NewsItemView = ({ content }) =>
23
23
  hasBlocksData(content) ? (
24
- <div id="page-document" className="ui container viewwrapper event-view">
24
+ <div id="page-document" className="ui container view-wrapper newsitem-view">
25
25
  <RenderBlocks content={content} />
26
26
  </div>
27
27
  ) : (
@@ -89,6 +89,7 @@ let config = {
89
89
  // https://6.docs.plone.org/volto/deploying/seamless-mode.html
90
90
  devProxyToApiPath:
91
91
  process.env.RAZZLE_DEV_PROXY_API_PATH ||
92
+ process.env.RAZZLE_INTERNAL_API_PATH ||
92
93
  process.env.RAZZLE_API_PATH ||
93
94
  'http://localhost:8080/Plone', // Set it to '' for disabling the proxy
94
95
  // proxyRewriteTarget Set it for set a custom target for the proxy or overide the internal VHM rewrite
@@ -2,6 +2,7 @@ import imagesMiddleware from '@plone/volto/express-middleware/images';
2
2
  import filesMiddleware from '@plone/volto/express-middleware/files';
3
3
  import robotstxtMiddleware from '@plone/volto/express-middleware/robotstxt';
4
4
  import sitemapMiddleware from '@plone/volto/express-middleware/sitemap';
5
+ import staticsMiddleware from '@plone/volto/express-middleware/static';
5
6
  import devProxyMiddleware from '@plone/volto/express-middleware/devproxy';
6
7
 
7
8
  const settings = {
@@ -11,10 +12,28 @@ const settings = {
11
12
  imagesMiddleware(),
12
13
  robotstxtMiddleware(),
13
14
  sitemapMiddleware(),
15
+ staticsMiddleware(),
14
16
  ],
15
17
  criticalCssPath: 'public/critical.css',
16
18
  readCriticalCss: null, // so it will be defaultReadCriticalCss
17
19
  extractScripts: { errorPages: false },
20
+ staticFiles: [
21
+ {
22
+ id: 'root_static',
23
+ match: /^\/static\/.*/,
24
+ headers: {
25
+ // stable resources never change. 31536000 seconds == 365 days
26
+ 'Cache-Control': 'public, max-age=31536000',
27
+ },
28
+ },
29
+ {
30
+ id: 'all',
31
+ match: /.*/,
32
+ headers: {
33
+ 'Cache-Control': 'public, max-age=60',
34
+ },
35
+ },
36
+ ],
18
37
  };
19
38
 
20
39
  export default settings;
@@ -75,12 +75,14 @@ export default function () {
75
75
  const { apiPathURL, instancePath } = getEnv();
76
76
  const target =
77
77
  config.settings.proxyRewriteTarget ||
78
- `/VirtualHostBase/http/${apiPathURL.hostname}:${apiPathURL.port}${instancePath}/++api++/VirtualHostRoot`;
78
+ `/VirtualHostBase/${apiPathURL.protocol.slice(0, -1)}/${
79
+ apiPathURL.hostname
80
+ }:${apiPathURL.port}${instancePath}/++api++/VirtualHostRoot`;
79
81
 
80
82
  return `${target}${path.replace('/++api++', '')}`;
81
83
  },
82
84
  logLevel: process.env.DEBUG_HPM ? 'debug' : 'silent',
83
- ...(config.settings?.proxyRewriteTarget?.startsWith('https') && {
85
+ ...(process.env.RAZZLE_DEV_PROXY_INSECURE && {
84
86
  changeOrigin: true,
85
87
  secure: false,
86
88
  }),
@@ -0,0 +1,32 @@
1
+ import express from 'express';
2
+ import path from 'path';
3
+ import config from '@plone/volto/registry';
4
+
5
+ const staticMiddleware = express.static(
6
+ process.env.BUILD_DIR
7
+ ? path.join(process.env.BUILD_DIR, 'public')
8
+ : process.env.RAZZLE_PUBLIC_DIR,
9
+ {
10
+ setHeaders: function (res, path) {
11
+ const pathLib = require('path');
12
+ const base = pathLib.resolve(process.env.RAZZLE_PUBLIC_DIR);
13
+ const relpath = path.substr(base.length);
14
+ config.settings.serverConfig.staticFiles.some((elem) => {
15
+ if (relpath.match(elem.match)) {
16
+ for (const name in elem.headers) {
17
+ res.setHeader(name, elem.headers[name] || 'undefined');
18
+ }
19
+ return true;
20
+ }
21
+ return false;
22
+ });
23
+ },
24
+ },
25
+ );
26
+
27
+ export default function () {
28
+ const middleware = express.Router();
29
+ middleware.all('*', staticMiddleware);
30
+ middleware.id = 'staticResourcesProcessor';
31
+ return middleware;
32
+ }
package/src/server.jsx CHANGED
@@ -59,13 +59,6 @@ const supported = new locale.Locales(keys(languages), 'en');
59
59
 
60
60
  const server = express()
61
61
  .disable('x-powered-by')
62
- .use(
63
- express.static(
64
- process.env.BUILD_DIR
65
- ? path.join(process.env.BUILD_DIR, 'public')
66
- : process.env.RAZZLE_PUBLIC_DIR,
67
- ),
68
- )
69
62
  .head('/*', function (req, res) {
70
63
  // Support for HEAD requests. Required by start-test utility in CI.
71
64
  res.send('');
@@ -329,6 +322,7 @@ export const defaultReadCriticalCss = () => {
329
322
  // Exposed for the console bootstrap info messages
330
323
  server.apiPath = config.settings.apiPath;
331
324
  server.devProxyToApiPath = config.settings.devProxyToApiPath;
325
+ server.proxyRewriteTarget = config.settings.proxyRewriteTarget;
332
326
  server.publicURL = config.settings.publicURL;
333
327
 
334
328
  export default server;
@@ -19,9 +19,11 @@ export default () => {
19
19
  } else {
20
20
  console.log(`API server (API_PATH) is set to: ${app.apiPath}`);
21
21
  }
22
- if (__DEVELOPMENT__ && app.devProxyToApiPath)
22
+ if (app.devProxyToApiPath)
23
23
  console.log(
24
- `Using internal proxy: ${app.publicURL} -> ${app.devProxyToApiPath}`,
24
+ `Proxying API requests from ${app.publicURL}/++api++ to ${
25
+ app.devProxyToApiPath
26
+ }${app.proxyRewriteTarget || ''}`,
25
27
  );
26
28
  console.log(`🎭 Volto started at ${bind_address}:${port} 🚀`);
27
29
 
@@ -482,7 +482,6 @@ body.has-toolbar.has-sidebar-collapsed .ui.wrapper > .ui.inner.block.full {
482
482
  border: none !important;
483
483
  background: white !important;
484
484
  border-radius: 50% !important;
485
- transform: translateX(-50%);
486
485
  }
487
486
 
488
487
  &:not(.new-add-block) {
@@ -712,20 +711,12 @@ body.has-toolbar.has-sidebar-collapsed .ui.wrapper > .ui.inner.block.full {
712
711
  }
713
712
 
714
713
  .blocks-chooser {
715
- position: absolute;
716
- z-index: 10;
717
- top: 100%;
718
- left: 50%;
719
714
  width: 310px;
720
715
  padding: 4px;
721
716
  background-color: rgba(255, 255, 255, 0.975);
722
717
  border-radius: 2px;
723
718
  box-shadow: 0 0 8px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.05);
724
719
 
725
- &.new-add-block {
726
- transform: translate(-50%, 22px);
727
- }
728
-
729
720
  &:not(.new-add-block) {
730
721
  top: -12px;
731
722
  left: -9px;