@wordpress/block-editor 15.13.2-next.v.202602241322.0 → 15.14.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -0
  3. package/build/components/block-quick-navigation/index.cjs +6 -1
  4. package/build/components/block-quick-navigation/index.cjs.map +3 -3
  5. package/build/components/block-settings-menu/block-settings-dropdown.cjs +47 -4
  6. package/build/components/block-settings-menu/block-settings-dropdown.cjs.map +2 -2
  7. package/build/components/block-settings-menu-controls/index.cjs +1 -0
  8. package/build/components/block-settings-menu-controls/index.cjs.map +2 -2
  9. package/build/components/block-styles/index.cjs +68 -57
  10. package/build/components/block-styles/index.cjs.map +3 -3
  11. package/build/components/block-styles/menu-items.cjs +10 -16
  12. package/build/components/block-styles/menu-items.cjs.map +3 -3
  13. package/build/components/block-switcher/block-styles-menu.cjs +50 -2
  14. package/build/components/block-switcher/block-styles-menu.cjs.map +3 -3
  15. package/build/components/block-switcher/block-transformations-menu.cjs +2 -0
  16. package/build/components/block-switcher/block-transformations-menu.cjs.map +2 -2
  17. package/build/components/block-switcher/block-variation-transformations.cjs +2 -0
  18. package/build/components/block-switcher/block-variation-transformations.cjs.map +2 -2
  19. package/build/components/block-switcher/preview-block-popover.cjs +10 -8
  20. package/build/components/block-switcher/preview-block-popover.cjs.map +2 -2
  21. package/build/components/block-toolbar/block-toolbar-icon.cjs +1 -1
  22. package/build/components/block-toolbar/block-toolbar-icon.cjs.map +2 -2
  23. package/build/components/block-toolbar/index.cjs +8 -4
  24. package/build/components/block-toolbar/index.cjs.map +2 -2
  25. package/build/components/block-visibility/modal.cjs +2 -2
  26. package/build/components/block-visibility/modal.cjs.map +2 -2
  27. package/build/components/dimension-control/index.cjs +4 -2
  28. package/build/components/dimension-control/index.cjs.map +2 -2
  29. package/build/components/global-styles/dimensions-panel.cjs +6 -3
  30. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  31. package/build/components/grid/grid-visualizer.cjs +3 -0
  32. package/build/components/grid/grid-visualizer.cjs.map +2 -2
  33. package/build/components/list-view/block.cjs +2 -1
  34. package/build/components/list-view/block.cjs.map +2 -2
  35. package/build/hooks/auto-inspector-controls.cjs +26 -2
  36. package/build/hooks/auto-inspector-controls.cjs.map +3 -3
  37. package/build/index.cjs +2 -0
  38. package/build/index.cjs.map +2 -2
  39. package/build/store/reducer.cjs +13 -15
  40. package/build/store/reducer.cjs.map +2 -2
  41. package/build-module/components/block-quick-navigation/index.mjs +6 -1
  42. package/build-module/components/block-quick-navigation/index.mjs.map +2 -2
  43. package/build-module/components/block-settings-menu/block-settings-dropdown.mjs +48 -5
  44. package/build-module/components/block-settings-menu/block-settings-dropdown.mjs.map +2 -2
  45. package/build-module/components/block-settings-menu-controls/index.mjs +1 -0
  46. package/build-module/components/block-settings-menu-controls/index.mjs.map +2 -2
  47. package/build-module/components/block-styles/index.mjs +71 -61
  48. package/build-module/components/block-styles/index.mjs.map +2 -2
  49. package/build-module/components/block-styles/menu-items.mjs +10 -6
  50. package/build-module/components/block-styles/menu-items.mjs.map +2 -2
  51. package/build-module/components/block-switcher/block-styles-menu.mjs +51 -3
  52. package/build-module/components/block-switcher/block-styles-menu.mjs.map +2 -2
  53. package/build-module/components/block-switcher/block-transformations-menu.mjs +2 -0
  54. package/build-module/components/block-switcher/block-transformations-menu.mjs.map +2 -2
  55. package/build-module/components/block-switcher/block-variation-transformations.mjs +2 -0
  56. package/build-module/components/block-switcher/block-variation-transformations.mjs.map +2 -2
  57. package/build-module/components/block-switcher/preview-block-popover.mjs +11 -9
  58. package/build-module/components/block-switcher/preview-block-popover.mjs.map +2 -2
  59. package/build-module/components/block-toolbar/block-toolbar-icon.mjs +1 -1
  60. package/build-module/components/block-toolbar/block-toolbar-icon.mjs.map +2 -2
  61. package/build-module/components/block-toolbar/index.mjs +8 -4
  62. package/build-module/components/block-toolbar/index.mjs.map +2 -2
  63. package/build-module/components/block-visibility/modal.mjs +2 -2
  64. package/build-module/components/block-visibility/modal.mjs.map +2 -2
  65. package/build-module/components/dimension-control/index.mjs +4 -2
  66. package/build-module/components/dimension-control/index.mjs.map +2 -2
  67. package/build-module/components/global-styles/dimensions-panel.mjs +6 -3
  68. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  69. package/build-module/components/grid/grid-visualizer.mjs +3 -0
  70. package/build-module/components/grid/grid-visualizer.mjs.map +2 -2
  71. package/build-module/components/list-view/block.mjs +2 -1
  72. package/build-module/components/list-view/block.mjs.map +2 -2
  73. package/build-module/hooks/auto-inspector-controls.mjs +28 -4
  74. package/build-module/hooks/auto-inspector-controls.mjs.map +2 -2
  75. package/build-module/index.mjs +2 -0
  76. package/build-module/index.mjs.map +3 -3
  77. package/build-module/store/reducer.mjs +13 -15
  78. package/build-module/store/reducer.mjs.map +2 -2
  79. package/build-style/content-rtl.css +12 -7
  80. package/build-style/content.css +13 -7
  81. package/build-style/style-rtl.css +0 -13
  82. package/build-style/style.css +0 -13
  83. package/package.json +39 -39
  84. package/src/components/block-list/content.scss +4 -0
  85. package/src/components/block-quick-navigation/index.js +6 -1
  86. package/src/components/block-settings-menu/block-settings-dropdown.js +46 -2
  87. package/src/components/block-settings-menu-controls/index.js +1 -0
  88. package/src/components/block-styles/index.js +35 -24
  89. package/src/components/block-styles/menu-items.js +10 -11
  90. package/src/components/block-styles/style.scss +0 -7
  91. package/src/components/block-switcher/block-styles-menu.js +47 -1
  92. package/src/components/block-switcher/block-transformations-menu.js +2 -0
  93. package/src/components/block-switcher/block-variation-transformations.js +2 -0
  94. package/src/components/block-switcher/preview-block-popover.js +9 -7
  95. package/src/components/block-switcher/style.scss +0 -8
  96. package/src/components/block-toolbar/block-toolbar-icon.js +6 -1
  97. package/src/components/block-toolbar/index.js +7 -2
  98. package/src/components/block-tools/style.scss +1 -14
  99. package/src/components/default-block-appender/content.scss +3 -25
  100. package/src/components/dimension-control/index.js +7 -4
  101. package/src/components/global-styles/dimensions-panel.js +3 -0
  102. package/src/components/grid/grid-visualizer.js +3 -0
  103. package/src/components/list-view/block.js +5 -0
  104. package/src/hooks/auto-inspector-controls.js +31 -4
  105. package/src/hooks/test/dimensions.js +16 -0
  106. package/src/index.js +1 -0
  107. package/src/store/reducer.js +23 -20
  108. package/src/store/test/reducer.js +109 -0
  109. package/build/components/block-styles/preview-panel.cjs +0 -61
  110. package/build/components/block-styles/preview-panel.cjs.map +0 -7
  111. package/build-module/components/block-styles/preview-panel.mjs +0 -30
  112. package/build-module/components/block-styles/preview-panel.mjs.map +0 -7
  113. package/src/components/block-styles/preview-panel.js +0 -35
@@ -432,6 +432,7 @@ _::-webkit-full-page-media, _:future, :root [data-has-multi-selection=true] .blo
432
432
  font-family: Menlo, Consolas, monaco, monospace;
433
433
  font-size: 15px;
434
434
  line-height: 1.5;
435
+ direction: ltr;
435
436
  }
436
437
  @media not (prefers-reduced-motion) {
437
438
  .block-editor-block-list__block .block-editor-block-list__block-html-textarea {
@@ -735,21 +736,25 @@ _::-webkit-full-page-media, _:future, :root [data-has-multi-selection=true] .blo
735
736
  }
736
737
  .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,
737
738
  .block-editor-block-list__block .block-list-appender .block-list-appender__toggle {
738
- flex-direction: row;
739
- box-shadow: none;
740
- height: 24px;
741
- width: 24px;
742
- min-width: 24px;
743
- display: none;
744
- padding: 0 !important;
745
739
  background: #1e1e1e;
746
740
  color: #fff;
741
+ padding: 0;
742
+ min-width: 24px;
743
+ height: 24px;
747
744
  }
748
745
  .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,
749
746
  .block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover {
750
747
  color: #fff;
751
748
  background: var(--wp-admin-theme-color);
752
749
  }
750
+ .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,
751
+ .block-editor-block-list__block .block-list-appender .block-list-appender__toggle {
752
+ flex-direction: row;
753
+ box-shadow: none;
754
+ width: 24px;
755
+ display: none;
756
+ padding: 0 !important;
757
+ }
753
758
  .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content {
754
759
  display: none;
755
760
  }
@@ -432,6 +432,8 @@ _::-webkit-full-page-media, _:future, :root [data-has-multi-selection=true] .blo
432
432
  font-family: Menlo, Consolas, monaco, monospace;
433
433
  font-size: 15px;
434
434
  line-height: 1.5;
435
+ /*rtl:ignore*/
436
+ direction: ltr;
435
437
  }
436
438
  @media not (prefers-reduced-motion) {
437
439
  .block-editor-block-list__block .block-editor-block-list__block-html-textarea {
@@ -735,21 +737,25 @@ _::-webkit-full-page-media, _:future, :root [data-has-multi-selection=true] .blo
735
737
  }
736
738
  .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,
737
739
  .block-editor-block-list__block .block-list-appender .block-list-appender__toggle {
738
- flex-direction: row;
739
- box-shadow: none;
740
- height: 24px;
741
- width: 24px;
742
- min-width: 24px;
743
- display: none;
744
- padding: 0 !important;
745
740
  background: #1e1e1e;
746
741
  color: #fff;
742
+ padding: 0;
743
+ min-width: 24px;
744
+ height: 24px;
747
745
  }
748
746
  .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,
749
747
  .block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover {
750
748
  color: #fff;
751
749
  background: var(--wp-admin-theme-color);
752
750
  }
751
+ .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,
752
+ .block-editor-block-list__block .block-list-appender .block-list-appender__toggle {
753
+ flex-direction: row;
754
+ box-shadow: none;
755
+ width: 24px;
756
+ display: none;
757
+ padding: 0 !important;
758
+ }
753
759
  .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content {
754
760
  display: none;
755
761
  }
@@ -1198,11 +1198,6 @@ iframe[name=editor-canvas] {
1198
1198
  text-align-last: center;
1199
1199
  }
1200
1200
 
1201
- .block-editor-block-styles__block-preview-container,
1202
- .block-editor-block-styles__block-preview-container * {
1203
- box-sizing: border-box !important;
1204
- }
1205
-
1206
1201
  .components-popover.block-editor-block-switcher__popover .components-popover__content {
1207
1202
  min-width: 300px;
1208
1203
  }
@@ -1238,14 +1233,6 @@ iframe[name=editor-canvas] {
1238
1233
  overflow: unset;
1239
1234
  }
1240
1235
 
1241
- .block-editor-block-switcher__preview-title {
1242
- margin-bottom: 12px;
1243
- color: #757575;
1244
- text-transform: uppercase;
1245
- font-size: 11px;
1246
- font-weight: 499;
1247
- }
1248
-
1249
1236
  .block-editor-block-switcher__preview-patterns-container {
1250
1237
  padding-bottom: 16px;
1251
1238
  }
@@ -1198,11 +1198,6 @@ iframe[name=editor-canvas] {
1198
1198
  text-align-last: center;
1199
1199
  }
1200
1200
 
1201
- .block-editor-block-styles__block-preview-container,
1202
- .block-editor-block-styles__block-preview-container * {
1203
- box-sizing: border-box !important;
1204
- }
1205
-
1206
1201
  .components-popover.block-editor-block-switcher__popover .components-popover__content {
1207
1202
  min-width: 300px;
1208
1203
  }
@@ -1238,14 +1233,6 @@ iframe[name=editor-canvas] {
1238
1233
  overflow: unset;
1239
1234
  }
1240
1235
 
1241
- .block-editor-block-switcher__preview-title {
1242
- margin-bottom: 12px;
1243
- color: #757575;
1244
- text-transform: uppercase;
1245
- font-size: 11px;
1246
- font-weight: 499;
1247
- }
1248
-
1249
1236
  .block-editor-block-switcher__preview-patterns-container {
1250
1237
  padding-bottom: 16px;
1251
1238
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/block-editor",
3
- "version": "15.13.2-next.v.202602241322.0+bce7cff88",
3
+ "version": "15.14.0",
4
4
  "description": "Generic block editor.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -61,43 +61,43 @@
61
61
  ],
62
62
  "dependencies": {
63
63
  "@react-spring/web": "^9.4.5",
64
- "@wordpress/a11y": "^4.40.1-next.v.202602241322.0+bce7cff88",
65
- "@wordpress/api-fetch": "^7.40.1-next.v.202602241322.0+bce7cff88",
66
- "@wordpress/base-styles": "^6.16.1-next.v.202602241322.0+bce7cff88",
67
- "@wordpress/blob": "^4.40.1-next.v.202602241322.0+bce7cff88",
68
- "@wordpress/block-serialization-default-parser": "^5.40.1-next.v.202602241322.0+bce7cff88",
69
- "@wordpress/blocks": "^15.13.1-next.v.202602241322.0+bce7cff88",
70
- "@wordpress/commands": "^1.40.1-next.v.202602241322.0+bce7cff88",
71
- "@wordpress/components": "^32.3.1-next.v.202602241322.0+bce7cff88",
72
- "@wordpress/compose": "^7.40.1-next.v.202602241322.0+bce7cff88",
73
- "@wordpress/data": "^10.40.1-next.v.202602241322.0+bce7cff88",
74
- "@wordpress/dataviews": "^12.1.1-next.v.202602241322.0+bce7cff88",
75
- "@wordpress/date": "^5.40.1-next.v.202602241322.0+bce7cff88",
76
- "@wordpress/deprecated": "^4.40.1-next.v.202602241322.0+bce7cff88",
77
- "@wordpress/dom": "^4.40.1-next.v.202602241322.0+bce7cff88",
78
- "@wordpress/element": "^6.40.1-next.v.202602241322.0+bce7cff88",
79
- "@wordpress/escape-html": "^3.40.1-next.v.202602241322.0+bce7cff88",
80
- "@wordpress/global-styles-engine": "^1.7.1-next.v.202602241322.0+bce7cff88",
81
- "@wordpress/hooks": "^4.40.1-next.v.202602241322.0+bce7cff88",
82
- "@wordpress/html-entities": "^4.40.1-next.v.202602241322.0+bce7cff88",
83
- "@wordpress/i18n": "^6.13.1-next.v.202602241322.0+bce7cff88",
84
- "@wordpress/icons": "^11.7.1-next.v.202602241322.0+bce7cff88",
85
- "@wordpress/image-cropper": "^1.4.1-next.v.202602241322.0+bce7cff88",
86
- "@wordpress/interactivity": "^6.40.1-next.v.202602241322.0+bce7cff88",
87
- "@wordpress/is-shallow-equal": "^5.40.1-next.v.202602241322.0+bce7cff88",
88
- "@wordpress/keyboard-shortcuts": "^5.40.1-next.v.202602241322.0+bce7cff88",
89
- "@wordpress/keycodes": "^4.40.1-next.v.202602241322.0+bce7cff88",
90
- "@wordpress/notices": "^5.40.1-next.v.202602241322.0+bce7cff88",
91
- "@wordpress/preferences": "^4.40.1-next.v.202602241322.0+bce7cff88",
92
- "@wordpress/priority-queue": "^3.40.1-next.v.202602241322.0+bce7cff88",
93
- "@wordpress/private-apis": "^1.40.1-next.v.202602241322.0+bce7cff88",
94
- "@wordpress/rich-text": "^7.40.1-next.v.202602241322.0+bce7cff88",
95
- "@wordpress/style-engine": "^2.40.1-next.v.202602241322.0+bce7cff88",
96
- "@wordpress/token-list": "^3.40.1-next.v.202602241322.0+bce7cff88",
97
- "@wordpress/upload-media": "^0.25.2-next.v.202602241322.0+bce7cff88",
98
- "@wordpress/url": "^4.40.1-next.v.202602241322.0+bce7cff88",
99
- "@wordpress/warning": "^3.40.1-next.v.202602241322.0+bce7cff88",
100
- "@wordpress/wordcount": "^4.40.1-next.v.202602241322.0+bce7cff88",
64
+ "@wordpress/a11y": "^4.41.0",
65
+ "@wordpress/api-fetch": "^7.41.0",
66
+ "@wordpress/base-styles": "^6.17.0",
67
+ "@wordpress/blob": "^4.41.0",
68
+ "@wordpress/block-serialization-default-parser": "^5.41.0",
69
+ "@wordpress/blocks": "^15.14.0",
70
+ "@wordpress/commands": "^1.41.0",
71
+ "@wordpress/components": "^32.3.0",
72
+ "@wordpress/compose": "^7.41.0",
73
+ "@wordpress/data": "^10.41.0",
74
+ "@wordpress/dataviews": "^13.0.0",
75
+ "@wordpress/date": "^5.41.0",
76
+ "@wordpress/deprecated": "^4.41.0",
77
+ "@wordpress/dom": "^4.41.0",
78
+ "@wordpress/element": "^6.41.0",
79
+ "@wordpress/escape-html": "^3.41.0",
80
+ "@wordpress/global-styles-engine": "^1.8.0",
81
+ "@wordpress/hooks": "^4.41.0",
82
+ "@wordpress/html-entities": "^4.41.0",
83
+ "@wordpress/i18n": "^6.14.0",
84
+ "@wordpress/icons": "^11.8.0",
85
+ "@wordpress/image-cropper": "^1.5.0",
86
+ "@wordpress/interactivity": "^6.41.0",
87
+ "@wordpress/is-shallow-equal": "^5.41.0",
88
+ "@wordpress/keyboard-shortcuts": "^5.41.0",
89
+ "@wordpress/keycodes": "^4.41.0",
90
+ "@wordpress/notices": "^5.41.0",
91
+ "@wordpress/preferences": "^4.41.0",
92
+ "@wordpress/priority-queue": "^3.41.0",
93
+ "@wordpress/private-apis": "^1.41.0",
94
+ "@wordpress/rich-text": "^7.41.0",
95
+ "@wordpress/style-engine": "^2.41.0",
96
+ "@wordpress/token-list": "^3.41.0",
97
+ "@wordpress/upload-media": "^0.26.0",
98
+ "@wordpress/url": "^4.41.0",
99
+ "@wordpress/warning": "^3.41.0",
100
+ "@wordpress/wordcount": "^4.41.0",
101
101
  "change-case": "^4.1.2",
102
102
  "clsx": "^2.1.1",
103
103
  "colord": "^2.7.0",
@@ -124,5 +124,5 @@
124
124
  "publishConfig": {
125
125
  "access": "public"
126
126
  },
127
- "gitHead": "943dde7f0b600ce238726c36284bc9f70ce0ffa4"
127
+ "gitHead": "8bfc179b9aed74c0a6dd6e8edf7a49e40e4f87cc"
128
128
  }
@@ -390,6 +390,10 @@ _::-webkit-full-page-media, _:future, :root [data-has-multi-selection="true"] .b
390
390
  font-family: $editor-html-font;
391
391
  font-size: $text-editor-font-size;
392
392
  line-height: 1.5;
393
+ // HTML input is always LTR regardless of language.
394
+ /*rtl:ignore*/
395
+ direction: ltr;
396
+
393
397
  @media not ( prefers-reduced-motion ) {
394
398
  transition: padding 0.2s linear;
395
399
  }
@@ -19,6 +19,7 @@ import { Icon, chevronRight } from '@wordpress/icons';
19
19
  import { store as blockEditorStore } from '../../store';
20
20
  import BlockIcon from '../block-icon';
21
21
  import useBlockDisplayInformation from '../use-block-display-information';
22
+ import useBlockDisplayTitle from '../block-title/use-block-display-title';
22
23
 
23
24
  export default function BlockQuickNavigation( {
24
25
  clientIds,
@@ -78,7 +79,11 @@ function BlockQuickNavigationItem( {
78
79
  );
79
80
 
80
81
  const blockType = getBlockType( blockName );
81
- const blockTitle = blockType?.title || blockName;
82
+ const displayTitle = useBlockDisplayTitle( {
83
+ clientId,
84
+ context: 'list-view',
85
+ } );
86
+ const blockTitle = displayTitle || blockType?.title || blockName;
82
87
  const { selectBlock } = useDispatch( blockEditorStore );
83
88
 
84
89
  const hasChildren = childBlocks && childBlocks.length > 0;
@@ -8,7 +8,7 @@ import {
8
8
  } from '@wordpress/blocks';
9
9
  import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';
10
10
  import { useDispatch, useSelect } from '@wordpress/data';
11
- import { moreVertical } from '@wordpress/icons';
11
+ import { chevronDown, chevronUp, moreVertical } from '@wordpress/icons';
12
12
  import { Children, cloneElement } from '@wordpress/element';
13
13
  import { __ } from '@wordpress/i18n';
14
14
  import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';
@@ -74,6 +74,7 @@ export function BlockSettingsDropdown( {
74
74
  clientIds,
75
75
  children,
76
76
  __experimentalSelectBlock,
77
+ isContentOnlyListView,
77
78
  ...props
78
79
  } ) {
79
80
  // Get the client id of the current block for this menu, if one is set.
@@ -88,6 +89,9 @@ export function BlockSettingsDropdown( {
88
89
  isContentOnly,
89
90
  isZoomOut,
90
91
  canEdit,
92
+ canMove,
93
+ isFirst,
94
+ isLast,
91
95
  } = useSelect(
92
96
  ( select ) => {
93
97
  const {
@@ -99,6 +103,9 @@ export function BlockSettingsDropdown( {
99
103
  getBlockEditingMode,
100
104
  isZoomOut: _isZoomOut,
101
105
  canEditBlock,
106
+ canMoveBlocks,
107
+ getBlockIndex,
108
+ getBlockCount,
102
109
  } = unlock( select( blockEditorStore ) );
103
110
 
104
111
  const { getActiveBlockVariation } = select( blocksStore );
@@ -124,14 +131,21 @@ export function BlockSettingsDropdown( {
124
131
  getBlockEditingMode( firstBlockClientId ) === 'contentOnly',
125
132
  isZoomOut: _isZoomOut(),
126
133
  canEdit: canEditBlock( firstBlockClientId ),
134
+ canMove: canMoveBlocks( clientIds ),
135
+ isFirst: getBlockIndex( firstBlockClientId ) === 0,
136
+ isLast:
137
+ getBlockIndex( firstBlockClientId ) ===
138
+ getBlockCount( _firstParentClientId ) - 1,
127
139
  };
128
140
  },
129
- [ firstBlockClientId ]
141
+ [ firstBlockClientId, clientIds ]
130
142
  );
131
143
 
132
144
  const { getBlockOrder, getSelectedBlockClientIds } =
133
145
  useSelect( blockEditorStore );
134
146
 
147
+ const { moveBlocksDown, moveBlocksUp } = useDispatch( blockEditorStore );
148
+
135
149
  const shortcuts = useSelect( ( select ) => {
136
150
  const { getShortcutRepresentation } = select( keyboardShortcutsStore );
137
151
  return {
@@ -243,6 +257,36 @@ export function BlockSettingsDropdown( {
243
257
  parentBlockType={ parentBlockType }
244
258
  />
245
259
  ) }
260
+ { canMove && isContentOnlyListView && (
261
+ <>
262
+ <MenuItem
263
+ icon={ chevronUp }
264
+ disabled={ isFirst }
265
+ accessibleWhenDisabled
266
+ onClick={ pipe( onClose, () => {
267
+ moveBlocksUp(
268
+ clientIds,
269
+ firstParentClientId
270
+ );
271
+ } ) }
272
+ >
273
+ { __( 'Move up' ) }
274
+ </MenuItem>
275
+ <MenuItem
276
+ icon={ chevronDown }
277
+ disabled={ isLast }
278
+ accessibleWhenDisabled
279
+ onClick={ pipe( onClose, () => {
280
+ moveBlocksDown(
281
+ clientIds,
282
+ firstParentClientId
283
+ );
284
+ } ) }
285
+ >
286
+ { __( 'Move down' ) }
287
+ </MenuItem>
288
+ </>
289
+ ) }
246
290
  { canEdit && count === 1 && (
247
291
  <BlockHTMLConvertButton
248
292
  clientId={ firstBlockClientId }
@@ -79,6 +79,7 @@ const BlockSettingsMenuControlsSlot = ( { fillProps, clientIds = null } ) => {
79
79
  <Slot
80
80
  fillProps={ {
81
81
  ...fillProps,
82
+ canEdit,
82
83
  selectedBlocks,
83
84
  selectedClientIds,
84
85
  } }
@@ -6,12 +6,11 @@ import clsx from 'clsx';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { useState } from '@wordpress/element';
10
- import { debounce, useViewportMatch } from '@wordpress/compose';
9
+ import { useState, useMemo } from '@wordpress/element';
10
+ import { debounce } from '@wordpress/compose';
11
11
  import {
12
12
  Button,
13
13
  __experimentalTruncate as Truncate,
14
- Popover,
15
14
  __experimentalToolsPanel as ToolsPanel,
16
15
  __experimentalToolsPanelItem as ToolsPanelItem,
17
16
  } from '@wordpress/components';
@@ -20,10 +19,10 @@ import { __ } from '@wordpress/i18n';
20
19
  /**
21
20
  * Internal dependencies
22
21
  */
23
- import BlockStylesPreviewPanel from './preview-panel';
22
+ import PreviewBlockPopover from '../block-switcher/preview-block-popover';
24
23
  import useStylesForBlocks from './use-styles-for-block';
25
24
  import { useToolsPanelDropdownMenuProps } from '../global-styles/utils';
26
- import { getDefaultStyle } from './utils';
25
+ import { getDefaultStyle, replaceActiveStyle } from './utils';
27
26
 
28
27
  const noop = () => {};
29
28
 
@@ -34,15 +33,35 @@ function BlockStyles( { clientId, onSwitch = noop, onHoverClassName = noop } ) {
34
33
  stylesToRender,
35
34
  activeStyle,
36
35
  genericPreviewBlock,
37
- className: previewClassName,
36
+ className,
38
37
  } = useStylesForBlocks( {
39
38
  clientId,
40
39
  onSwitch,
41
40
  } );
42
41
  const [ hoveredStyle, setHoveredStyle ] = useState( null );
43
- const isMobileViewport = useViewportMatch( 'medium', '<' );
42
+ const [ blockStylesAnchor, setBlockStylesAnchor ] = useState( null );
44
43
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
45
44
 
45
+ const previewBlocks = useMemo( () => {
46
+ if ( ! hoveredStyle || ! genericPreviewBlock ) {
47
+ return null;
48
+ }
49
+ const previewClassName = replaceActiveStyle(
50
+ className,
51
+ activeStyle,
52
+ hoveredStyle
53
+ );
54
+ return [
55
+ {
56
+ ...genericPreviewBlock,
57
+ attributes: {
58
+ ...( genericPreviewBlock.attributes || {} ),
59
+ className: previewClassName,
60
+ },
61
+ },
62
+ ];
63
+ }, [ hoveredStyle, genericPreviewBlock, className, activeStyle ] );
64
+
46
65
  if ( ! stylesToRender || stylesToRender.length === 0 ) {
47
66
  return null;
48
67
  }
@@ -90,7 +109,10 @@ function BlockStyles( { clientId, onSwitch = noop, onHoverClassName = noop } ) {
90
109
  isShownByDefault
91
110
  panelId={ clientId }
92
111
  >
93
- <div className="block-editor-block-styles">
112
+ <div
113
+ ref={ setBlockStylesAnchor }
114
+ className="block-editor-block-styles"
115
+ >
94
116
  <div className="block-editor-block-styles__variants">
95
117
  { stylesToRender.map( ( style ) => {
96
118
  const buttonText = style.label || style.name;
@@ -133,24 +155,13 @@ function BlockStyles( { clientId, onSwitch = noop, onHoverClassName = noop } ) {
133
155
  );
134
156
  } ) }
135
157
  </div>
136
- { hoveredStyle && ! isMobileViewport && (
137
- <Popover
158
+ { previewBlocks && (
159
+ <PreviewBlockPopover
160
+ blocks={ previewBlocks }
138
161
  placement="left-start"
139
162
  offset={ 34 }
140
- focusOnMount={ false }
141
- >
142
- <div
143
- className="block-editor-block-styles__preview-panel"
144
- onMouseLeave={ () => styleItemHandler( null ) }
145
- >
146
- <BlockStylesPreviewPanel
147
- activeStyle={ activeStyle }
148
- className={ previewClassName }
149
- genericPreviewBlock={ genericPreviewBlock }
150
- style={ hoveredStyle }
151
- />
152
- </div>
153
- </Popover>
163
+ anchor={ blockStylesAnchor }
164
+ />
154
165
  ) }
155
166
  </div>
156
167
  </ToolsPanelItem>
@@ -4,19 +4,14 @@
4
4
  import { MenuItem, __experimentalText as Text } from '@wordpress/components';
5
5
  import { check } from '@wordpress/icons';
6
6
 
7
- /**
8
- * Internal dependencies
9
- */
10
- import useStylesForBlocks from './use-styles-for-block';
11
-
12
7
  const noop = () => {};
13
8
 
14
- export default function BlockStylesMenuItems( { clientId, onSwitch = noop } ) {
15
- const { onSelect, stylesToRender, activeStyle } = useStylesForBlocks( {
16
- clientId,
17
- onSwitch,
18
- } );
19
-
9
+ export default function BlockStylesMenuItems( {
10
+ stylesToRender,
11
+ activeStyle,
12
+ onSelect = noop,
13
+ onHoverStyle = noop,
14
+ } ) {
20
15
  if ( ! stylesToRender || stylesToRender.length === 0 ) {
21
16
  return null;
22
17
  }
@@ -29,6 +24,10 @@ export default function BlockStylesMenuItems( { clientId, onSwitch = noop } ) {
29
24
  key={ style.name }
30
25
  icon={ activeStyle.name === style.name ? check : null }
31
26
  onClick={ () => onSelect( style ) }
27
+ onFocus={ () => onHoverStyle( style ) }
28
+ onBlur={ () => onHoverStyle( null ) }
29
+ onMouseEnter={ () => onHoverStyle( style ) }
30
+ onMouseLeave={ () => onHoverStyle( null ) }
32
31
  >
33
32
  <Text
34
33
  as="span"
@@ -67,10 +67,3 @@
67
67
  }
68
68
  }
69
69
 
70
- // To prevent overflow in the preview container,
71
- // ensure that block contents' margin and padding
72
- // do not add to the block container's width.
73
- .block-editor-block-styles__block-preview-container,
74
- .block-editor-block-styles__block-preview-container * {
75
- box-sizing: border-box !important;
76
- }
@@ -3,21 +3,67 @@
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { MenuGroup } from '@wordpress/components';
6
+ import { useMemo, useState } from '@wordpress/element';
6
7
 
7
8
  /**
8
9
  * Internal dependencies
9
10
  */
10
11
  import BlockStylesMenuItems from '../block-styles/menu-items';
12
+ import useStylesForBlocks from '../block-styles/use-styles-for-block';
13
+ import { replaceActiveStyle } from '../block-styles/utils';
14
+ import PreviewBlockPopover from './preview-block-popover';
11
15
 
12
16
  export default function BlockStylesMenu( { hoveredBlock, onSwitch } ) {
13
17
  const { clientId } = hoveredBlock;
18
+ const [ hoveredStyle, setHoveredStyle ] = useState( null );
19
+ const {
20
+ onSelect,
21
+ stylesToRender,
22
+ activeStyle,
23
+ genericPreviewBlock,
24
+ className,
25
+ } = useStylesForBlocks( {
26
+ clientId,
27
+ onSwitch,
28
+ } );
29
+ const previewBlocks = useMemo( () => {
30
+ if ( ! hoveredStyle || ! genericPreviewBlock ) {
31
+ return null;
32
+ }
33
+ const previewClassName = replaceActiveStyle(
34
+ className,
35
+ activeStyle,
36
+ hoveredStyle
37
+ );
38
+ return [
39
+ {
40
+ ...genericPreviewBlock,
41
+ attributes: {
42
+ ...( genericPreviewBlock.attributes || {} ),
43
+ className: previewClassName,
44
+ },
45
+ },
46
+ ];
47
+ }, [ hoveredStyle, genericPreviewBlock, className, activeStyle ] );
48
+
49
+ if ( ! stylesToRender || stylesToRender.length === 0 ) {
50
+ return null;
51
+ }
14
52
 
15
53
  return (
16
54
  <MenuGroup
17
55
  label={ __( 'Styles' ) }
18
56
  className="block-editor-block-switcher__styles__menugroup"
19
57
  >
20
- <BlockStylesMenuItems clientId={ clientId } onSwitch={ onSwitch } />
58
+ { previewBlocks && (
59
+ <PreviewBlockPopover blocks={ previewBlocks } />
60
+ ) }
61
+ <BlockStylesMenuItems
62
+ stylesToRender={ stylesToRender }
63
+ activeStyle={ activeStyle }
64
+ onSelect={ onSelect }
65
+ onHoverStyle={ setHoveredStyle }
66
+ />
21
67
  </MenuGroup>
22
68
  );
23
69
  }
@@ -176,6 +176,8 @@ function BlockTransformationItem( {
176
176
  disabled={ isDisabled }
177
177
  onMouseLeave={ () => setHoveredTransformItemName( null ) }
178
178
  onMouseEnter={ () => setHoveredTransformItemName( name ) }
179
+ onFocus={ () => setHoveredTransformItemName( name ) }
180
+ onBlur={ () => setHoveredTransformItemName( null ) }
179
181
  >
180
182
  <BlockIcon icon={ icon } showColors />
181
183
  { title }
@@ -100,6 +100,8 @@ function BlockVariationTransformationItem( {
100
100
  } }
101
101
  onMouseLeave={ () => setHoveredTransformItemName( null ) }
102
102
  onMouseEnter={ () => setHoveredTransformItemName( name ) }
103
+ onFocus={ () => setHoveredTransformItemName( name ) }
104
+ onBlur={ () => setHoveredTransformItemName( null ) }
103
105
  >
104
106
  <BlockIcon icon={ icon } showColors />
105
107
  { title }
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { __ } from '@wordpress/i18n';
5
4
  import { Popover } from '@wordpress/components';
6
5
  import { useViewportMatch } from '@wordpress/compose';
7
6
 
@@ -10,7 +9,12 @@ import { useViewportMatch } from '@wordpress/compose';
10
9
  */
11
10
  import BlockPreview from '../block-preview';
12
11
 
13
- export default function PreviewBlockPopover( { blocks } ) {
12
+ export default function PreviewBlockPopover( {
13
+ blocks,
14
+ placement = 'right-start',
15
+ offset = 16,
16
+ anchor,
17
+ } ) {
14
18
  const isMobile = useViewportMatch( 'medium', '<' );
15
19
 
16
20
  if ( isMobile ) {
@@ -21,14 +25,12 @@ export default function PreviewBlockPopover( { blocks } ) {
21
25
  <div className="block-editor-block-switcher__popover-preview-container">
22
26
  <Popover
23
27
  className="block-editor-block-switcher__popover-preview"
24
- placement="right-start"
28
+ placement={ placement }
25
29
  focusOnMount={ false }
26
- offset={ 16 }
30
+ offset={ offset }
31
+ anchor={ anchor }
27
32
  >
28
33
  <div className="block-editor-block-switcher__preview">
29
- <div className="block-editor-block-switcher__preview-title">
30
- { __( 'Preview' ) }
31
- </div>
32
34
  { /* 600px is the value of $break-small in base-styles/_breakpoints.scss.
33
35
  We set the viewport width to 601px to make sure that the media-text
34
36
  block which uses this breakpoint has the correct padding. */ }