+
) }
- { showPatternPanel && (
-
- ) }
);
}
diff --git a/packages/block-editor/src/components/inserter/style.scss b/packages/block-editor/src/components/inserter/style.scss
index 580e4ec0e21f2..87e9b04fddaf5 100644
--- a/packages/block-editor/src/components/inserter/style.scss
+++ b/packages/block-editor/src/components/inserter/style.scss
@@ -62,7 +62,7 @@ $block-inserter-tabs-height: 44px;
.block-editor-inserter__popover .block-editor-inserter__menu {
margin: -$grid-unit-15;
- .block-editor-inserter__tabs div[role="tablist"] {
+ .block-editor-inserter__tablist {
top: $grid-unit-10 + $grid-unit-20 + $grid-unit-60 - $grid-unit-15;
}
@@ -115,7 +115,7 @@ $block-inserter-tabs-height: 44px;
flex-direction: column;
overflow: hidden;
- div[role="tablist"] {
+ .block-editor-inserter__tablist {
border-bottom: $border-width solid $gray-300;
button[role="tab"] {
@@ -130,7 +130,7 @@ $block-inserter-tabs-height: 44px;
}
}
- div[role="tabpanel"] {
+ .block-editor-inserter__tabpanel {
display: flex;
flex-grow: 1;
flex-direction: column;
@@ -242,60 +242,79 @@ $block-inserter-tabs-height: 44px;
.block-editor-inserter__patterns-explore-button.components-button {
padding: $grid-unit-20;
justify-content: center;
- margin-top: $grid-unit-20;
width: 100%;
}
-.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category {
- color: var(--wp-admin-theme-color);
- position: relative;
-
- .components-flex-item {
- filter: brightness(0.95);
- }
-
- svg {
- fill: var(--wp-admin-theme-color);
- }
-
- &::after {
- content: "";
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- border-radius: $radius-block-ui;
- opacity: 0.04;
- background: var(--wp-admin-theme-color);
- }
-}
-
.block-editor-inserter__block-patterns-tabs-container {
- height: 100%;
- nav {
- height: 100%;
- }
+ padding: $grid-unit-20;
}
-.block-editor-inserter__block-patterns-tabs {
+.block-editor-inserter__block-patterns-tablist {
display: flex;
flex-direction: column;
- padding: $grid-unit-20;
- overflow-y: auto;
- height: 100%;
+ border: none;
+ margin-bottom: $grid-unit-10;
// Push the listitem wrapping the "explore" button to the bottom of the panel.
div[role="listitem"]:last-child {
margin-top: auto;
}
- .block-editor-inserter__patterns-category {
+ .block-editor-inserter__patterns-tab {
// Account for the icon on the right so that it's visually balanced.
- padding-right: $grid-unit-05;
+ padding: $grid-unit-10 $grid-unit-05 $grid-unit-10 $grid-unit-15;
+ text-align: left;
+ font-weight: inherit;
+ display: block;
+ position: relative;
+ height: auto;
+
+ &[aria-selected="true"] {
+ color: var(--wp-admin-theme-color);
+
+ .components-flex-item {
+ filter: brightness(0.95);
+ }
+
+ svg {
+ fill: var(--wp-admin-theme-color);
+ }
+
+ &::after {
+ content: "";
+ display: block;
+ outline: none;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ border-radius: $radius-block-ui;
+ opacity: 0.04;
+ background: var(--wp-admin-theme-color);
+ height: 100%;
+ }
+ }
+
+ &:focus-visible,
+ &:focus:not(:disabled) {
+ border-radius: 2px;
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
+ // Windows high contrast mode.
+ outline: 2px solid transparent;
+ outline-offset: 0;
+ }
+
+ &::before {
+ display: none;
+ }
+
+ &::after {
+ display: none;
+ }
}
}
-.block-editor-inserter__patterns-category-dialog {
+.block-editor-inserter__patterns-category-panel {
background: $gray-100;
border-left: $border-width solid $gray-200;
border-right: $border-width solid $gray-200;
@@ -304,35 +323,29 @@ $block-inserter-tabs-height: 44px;
left: 0;
height: 100%;
width: 100%;
-
- @include break-medium {
- left: 100%;
- display: block;
- width: 300px;
- }
-
- .block-editor-block-patterns-list {
- overflow-y: auto;
- flex-grow: 1;
- height: 100%;
- padding: $grid-unit-20 $grid-unit-30;
- }
-}
-
-.block-editor-inserter__patterns-category-panel {
padding: 0 $grid-unit-20;
display: flex;
flex-direction: column;
- height: 100%;
+
@include break-medium {
padding: 0;
+ left: 100%;
+ width: 300px;
}
+
.block-editor-inserter__patterns-category-panel-header {
padding: 16px $grid-unit-30;
}
.block-editor-inserter__patterns-category-no-results {
margin-top: $grid-unit-30;
}
+
+ .block-editor-block-patterns-list {
+ overflow-y: auto;
+ flex-grow: 1;
+ height: 100%;
+ padding: $grid-unit-20 $grid-unit-30;
+ }
}
.block-editor-inserter__preview-content {
@@ -758,13 +771,24 @@ $block-inserter-tabs-height: 44px;
}
}
+// Only relevant in zoom-out-mode
+.block-editor-inserter__pattern-panel-placeholder {
+ display: none;
+}
+
.is-zoom-out {
.block-editor-inserter__menu {
display: flex;
}
- .block-editor-inserter__patterns-category-dialog {
- position: static;
+ .show-panel::after {
+ // Makes space for the inserter flyout panel
+ @include break-medium {
+ content: "";
+ display: block;
+ width: 300px;
+ height: 100%;
+ }
}
.block-editor-inserter__media-dialog {
diff --git a/packages/block-editor/src/components/inserter/tabs.js b/packages/block-editor/src/components/inserter/tabs.js
index 4795c3ce4fdc2..ad9cd4888bd94 100644
--- a/packages/block-editor/src/components/inserter/tabs.js
+++ b/packages/block-editor/src/components/inserter/tabs.js
@@ -43,9 +43,13 @@ function InserterTabs( {
return (
-
+
{ tabs.map( ( tab ) => (
-
+
{ tab.title }
) ) }
@@ -55,6 +59,7 @@ function InserterTabs( {
key={ tab.name }
tabId={ tab.name }
focusable={ false }
+ className="block-editor-inserter__tabpanel"
>
{ tabsContents[ tab.name ] }
diff --git a/packages/block-editor/src/hooks/use-zoom-out.js b/packages/block-editor/src/hooks/use-zoom-out.js
index 84603c0161dd4..ce20cb5bd7a17 100644
--- a/packages/block-editor/src/hooks/use-zoom-out.js
+++ b/packages/block-editor/src/hooks/use-zoom-out.js
@@ -2,7 +2,7 @@
* WordPress dependencies
*/
import { useSelect, useDispatch } from '@wordpress/data';
-import { useEffect } from '@wordpress/element';
+import { useEffect, useRef } from '@wordpress/element';
/**
* Internal dependencies
@@ -11,26 +11,36 @@ import { store as blockEditorStore } from '../store';
/**
* A hook used to set the editor mode to zoomed out mode, invoking the hook sets the mode.
+ *
+ * @param {boolean} zoomOut If we should enter into zoomOut mode or not
*/
-export function useZoomOut() {
+export function useZoomOut( zoomOut = true ) {
const { __unstableSetEditorMode } = useDispatch( blockEditorStore );
- const { mode } = useSelect( ( select ) => {
- return {
- mode: select( blockEditorStore ).__unstableGetEditorMode(),
+ const { __unstableGetEditorMode } = useSelect( blockEditorStore );
+
+ const originalEditingMode = useRef( null );
+ const mode = __unstableGetEditorMode();
+
+ useEffect( () => {
+ // Only set this on mount so we know what to return to when we unmount.
+ if ( ! originalEditingMode.current ) {
+ originalEditingMode.current = mode;
+ }
+
+ return () => {
+ // We need to use __unstableGetEditorMode() here and not `mode`, as mode may not update on unmount
+ if ( __unstableGetEditorMode() !== originalEditingMode.current ) {
+ __unstableSetEditorMode( originalEditingMode.current );
+ }
};
}, [] );
- // Intentionality left without any dependency.
- // This effect should only run when the component is rendered and unmounted.
- // The effect opens the zoom-out view if it is not open before when applying a style variation.
+ // The effect opens the zoom-out view if we want it open and it's not currently in zoom-out mode.
useEffect( () => {
- if ( mode !== 'zoom-out' ) {
+ if ( zoomOut && mode !== 'zoom-out' ) {
__unstableSetEditorMode( 'zoom-out' );
- return () => {
- // Revert to original mode
- __unstableSetEditorMode( mode );
- };
+ } else if ( ! zoomOut && originalEditingMode.current !== mode ) {
+ __unstableSetEditorMode( originalEditingMode.current );
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [] );
+ }, [ __unstableSetEditorMode, zoomOut, mode ] );
}
diff --git a/test/e2e/specs/editor/plugins/pattern-recursion.spec.js b/test/e2e/specs/editor/plugins/pattern-recursion.spec.js
index 069f33d671d68..9a8292271be8e 100644
--- a/test/e2e/specs/editor/plugins/pattern-recursion.spec.js
+++ b/test/e2e/specs/editor/plugins/pattern-recursion.spec.js
@@ -66,7 +66,7 @@ test.describe( 'Preventing Pattern Recursion (server)', () => {
// Click the Patterns tab
await page.getByRole( 'tab', { name: 'Patterns' } ).click();
// Click the Uncategorized tab
- await page.getByRole( 'button', { name: 'Uncategorized' } ).click();
+ await page.getByRole( 'tab', { name: 'Uncategorized' } ).click();
// Click the Evil recursive pattern
await page.getByRole( 'option', { name: 'Evil recursive' } ).click();
// By simply checking the editor content, we know that the pattern
diff --git a/test/e2e/specs/editor/various/patterns.spec.js b/test/e2e/specs/editor/various/patterns.spec.js
index 1d0807264413b..4c12847f93372 100644
--- a/test/e2e/specs/editor/various/patterns.spec.js
+++ b/test/e2e/specs/editor/various/patterns.spec.js
@@ -70,7 +70,7 @@ test.describe( 'Unsynced pattern', () => {
} )
.click();
await page
- .getByRole( 'button', {
+ .getByRole( 'tab', {
name: newCategory,
} )
.click();
@@ -185,7 +185,7 @@ test.describe( 'Synced pattern', () => {
} )
.click();
await page
- .getByRole( 'button', {
+ .getByRole( 'tab', {
name: newCategory,
} )
.click();
diff --git a/test/performance/specs/post-editor.spec.js b/test/performance/specs/post-editor.spec.js
index e720396afe5da..c8010c79b1550 100644
--- a/test/performance/specs/post-editor.spec.js
+++ b/test/performance/specs/post-editor.spec.js
@@ -657,7 +657,7 @@ test.describe( 'Post Editor Performance', () => {
const startTime = performance.now();
- await page.getByRole( 'button', { name: 'Test' } ).click();
+ await page.getByText( 'Test' ).click();
await Promise.all(
testPatterns.map( async ( pattern ) => {