Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add customize widgets inserter #29549

Merged
merged 22 commits into from
Mar 26, 2021
Merged

Conversation

kevin940726
Copy link
Member

@kevin940726 kevin940726 commented Mar 4, 2021

Description

Close #29285.

Known issues

  • Clicking on the backdrop of the inserter won't close it (should it?) (it shouldn't)
  • Clicking "Browse all" in the quick inserter won't close the quick inserter
  • Weird positioning issue in the quick inserter between 2 blocks
  • Unable to add a new block (Fix adding blocks in the widgets customizer #30221)
  • Overflowing issue in Safari only
  • Should move the focus to the searchbox after opening the inserter.

How has this been tested?

  • Enable "Widgets in customizer" in the experiments.
  • Go to Appearance -> Customize -> Widgets.
  • Try opening the inserter.
  • Pressing esc should close the inserter.

Screenshots

Kapture.2021-03-23.at.01.58.14.mp4

Types of changes

New feature

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@kevin940726 kevin940726 added the [Feature] Widgets Customizer Ability to add and edit blocks in Customize → Widgets. label Mar 4, 2021
@github-actions
Copy link

github-actions bot commented Mar 4, 2021

Size Change: +2.18 kB (0%)

Total Size: 1.42 MB

Filename Size Change
build/annotations/index.js 3.78 kB +7 B (0%)
build/api-fetch/index.js 3.42 kB +10 B (0%)
build/autop/index.js 2.82 kB -2 B (0%)
build/block-directory/index.js 8.63 kB +1 B (0%)
build/block-editor/index.js 127 kB +17 B (0%)
build/block-library/index.js 151 kB +23 B (0%)
build/block-serialization-default-parser/index.js 1.87 kB -2 B (0%)
build/blocks/index.js 48.4 kB +14 B (0%)
build/components/index.js 286 kB +97 B (0%)
build/compose/index.js 11.2 kB -3 B (0%)
build/core-data/index.js 16.8 kB +6 B (0%)
build/customize-widgets/index.js 7.31 kB +1.28 kB (+21%) 🚨
build/customize-widgets/style-rtl.css 676 B +298 B (+79%) 🆘
build/customize-widgets/style.css 677 B +298 B (+79%) 🆘
build/data/index.js 8.88 kB +6 B (0%)
build/dom/index.js 4.99 kB +15 B (0%)
build/edit-navigation/index.js 17 kB +9 B (0%)
build/edit-post/index.js 307 kB +21 B (0%)
build/edit-site/index.js 27.5 kB +14 B (0%)
build/edit-widgets/index.js 15.6 kB +6 B (0%)
build/editor/index.js 42.7 kB +8 B (0%)
build/element/index.js 4.62 kB +7 B (0%)
build/format-library/index.js 6.76 kB +4 B (0%)
build/hooks/index.js 2.28 kB +1 B (0%)
build/i18n/index.js 4.01 kB +4 B (0%)
build/keyboard-shortcuts/index.js 2.53 kB +3 B (0%)
build/keycodes/index.js 1.96 kB +8 B (0%)
build/media-utils/index.js 5.38 kB +4 B (0%)
build/notices/index.js 1.85 kB +3 B (0%)
build/nux/index.js 3.42 kB +4 B (0%)
build/plugins/index.js 2.95 kB +2 B (0%)
build/primitives/index.js 1.42 kB +5 B (0%)
build/react-i18n/index.js 1.46 kB -2 B (0%)
build/reusable-blocks/index.js 3.79 kB +7 B (0%)
build/rich-text/index.js 13.5 kB +1 B (0%)
build/server-side-render/index.js 2.59 kB +4 B (0%)
build/token-list/index.js 1.27 kB -1 B (0%)
build/url/index.js 3.02 kB +4 B (0%)
build/viewport/index.js 1.86 kB -2 B (0%)
build/wordcount/index.js 1.22 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/style-rtl.css 1 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-editor/style-rtl.css 12.4 kB 0 B
build/block-editor/style.css 12.4 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 479 B 0 B
build/block-library/blocks/button/style.css 479 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 364 B 0 B
build/block-library/blocks/buttons/style.css 363 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 436 B 0 B
build/block-library/blocks/columns/style.css 435 B 0 B
build/block-library/blocks/cover/editor-rtl.css 605 B 0 B
build/block-library/blocks/cover/editor.css 605 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB 0 B
build/block-library/blocks/cover/style.css 1.23 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 175 B 0 B
build/block-library/blocks/file/editor.css 174 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB 0 B
build/block-library/blocks/freeform/editor.css 2.44 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.09 kB 0 B
build/block-library/blocks/gallery/style.css 1.09 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 398 B 0 B
build/block-library/blocks/legacy-widget/editor.css 399 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 634 B 0 B
build/block-library/blocks/navigation-link/editor.css 635 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 908 B 0 B
build/block-library/blocks/navigation-link/style.css 908 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.13 kB 0 B
build/block-library/blocks/navigation/editor.css 1.13 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 204 B 0 B
build/block-library/blocks/navigation/style.css 205 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 170 B 0 B
build/block-library/blocks/page-list/editor.css 170 B 0 B
build/block-library/blocks/page-list/style-rtl.css 167 B 0 B
build/block-library/blocks/page-list/style.css 167 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 795 B 0 B
build/block-library/blocks/query/editor.css 794 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 115 B 0 B
build/block-library/blocks/site-logo/style.css 115 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 776 B 0 B
build/block-library/blocks/social-links/editor.css 776 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 317 B 0 B
build/block-library/blocks/spacer/editor.css 317 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 402 B 0 B
build/block-library/blocks/table/style.css 402 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 552 B 0 B
build/block-library/blocks/template-part/editor.css 551 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 50 B 0 B
build/block-library/blocks/verse/editor.css 50 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 173 B 0 B
build/block-library/blocks/video/style.css 173 B 0 B
build/block-library/common-rtl.css 1.1 kB 0 B
build/block-library/common.css 1.1 kB 0 B
build/block-library/editor-rtl.css 9.54 kB 0 B
build/block-library/editor.css 9.53 kB 0 B
build/block-library/reset-rtl.css 383 B 0 B
build/block-library/reset.css 384 B 0 B
build/block-library/style-rtl.css 8.96 kB 0 B
build/block-library/style.css 8.96 kB 0 B
build/block-library/theme-rtl.css 694 B 0 B
build/block-library/theme.css 696 B 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/components/style-rtl.css 16.2 kB 0 B
build/components/style.css 16.2 kB 0 B
build/data-controls/index.js 838 B 0 B
build/date/index.js 31.9 kB 0 B
build/deprecated/index.js 787 B 0 B
build/dom-ready/index.js 577 B 0 B
build/edit-navigation/style-rtl.css 2.68 kB 0 B
build/edit-navigation/style.css 2.68 kB 0 B
build/edit-post/style-rtl.css 7.04 kB 0 B
build/edit-post/style.css 7.03 kB 0 B
build/edit-site/style-rtl.css 4.5 kB 0 B
build/edit-site/style.css 4.5 kB 0 B
build/edit-widgets/style-rtl.css 2.97 kB 0 B
build/edit-widgets/style.css 2.98 kB 0 B
build/editor/style-rtl.css 3.95 kB 0 B
build/editor/style.css 3.95 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/html-entities/index.js 622 B 0 B
build/is-shallow-equal/index.js 699 B 0 B
build/list-reusable-blocks/index.js 3.19 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/priority-queue/index.js 790 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/shortcode/index.js 1.7 kB 0 B
build/warning/index.js 1.14 kB 0 B

compressed-size-action

@kevin940726 kevin940726 added the Needs Design Feedback Needs general design feedback. label Mar 8, 2021
@kevin940726 kevin940726 marked this pull request as ready for review March 9, 2021 02:39
@kevin940726 kevin940726 force-pushed the add/customize-widgets-inserter branch from c02051e to 21fae3c Compare March 12, 2021 08:42
Copy link
Member

@noisysocks noisysocks left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really nice work here! It's looking fantastic.

I noticed three bugs while testing:

  1. In Firefox on macOS, the Quick Inserter appears underneath the Customizer's scroll bar.

    Screen Shot 2021-03-15 at 14 24 22
  2. When you open the Customizer's publish options, the inserter does not close.

    Kapture.2021-03-15.at.14.26.53.mp4
  3. When you navigate away from Widgets, the inserter does not close.

    Kapture.2021-03-15.at.14.29.37.mp4

I'd also like to explore if we can re-use the Customizer's outer-section-open instead of re-implementing our own slide out and fade animation.

packages/customize-widgets/src/style.scss Outdated Show resolved Hide resolved
packages/customize-widgets/src/components/header/index.js Outdated Show resolved Hide resolved
packages/customize-widgets/src/components/header/index.js Outdated Show resolved Hide resolved
packages/customize-widgets/src/components/header/index.js Outdated Show resolved Hide resolved
@noisysocks
Copy link
Member

Clicking on the backdrop of the inserter won't close it (should it?)

This is not the behaviour for the existing slide-out panel that the Customizer has, so I say no.

@noisysocks noisysocks mentioned this pull request Mar 15, 2021
11 tasks
@shaunandrews
Copy link
Contributor

I think we should try and match the behavior of the other panes that hide/appear when using the Customizer, like the publish options or the menu's inserter. Looking at the existing panes they...

  • ..."push" the preview content, rather than overlapping it.
  • ...don't allowing clicking the scrim (the dark, semi-transparent overlay) to close the pane.

My instinct tells me that we should allow for clicking the scrim to close the pane, but I don't think we should venture down that road unless we're willing to add/change the behavior everywhere else in the Customizer.

Similarly, I'd expect the color of the scrim and the transition timing function to match the existing Customizer panes.

--

One thing that stood out to me was that :focus is moved to the "Done" button in the new inserter pane. I actually expect it would move to the search input.

@noisysocks
Copy link
Member

noisysocks commented Mar 23, 2021

Amazing work! I'm honestly impressed at how smooth you've gotten this working. It all works really well when I run it locally.

Instead of having useInserter which uses effects to synchronise React state (isInserterOpened) with Backbone state (section.collapsed()), what do you think about moving all of that stateful logic up so that it's not in the React app at all?

So, instead of having a useInserter hook, you'd have SidebarControl::openInserter and SidebarControl::closeInserter. These methods would mutate the state of the world using the customize APIs as necessary. Then, SidebarControl::render would pass references to these methods as props to Header via SidebarBlockEditor.

class SidebarControl extends customize.Control {
	...
	render() {
		if ( this.expanded() ) {
			render(
				<SidebarBlockEditor
					sidebar={ new SidebarAdapter( this.setting, customize ) }
					openInserter={ this.openInserter.bind( this ) }
					closeInserter={ this.closeInserter.bind( this ) }
				/>,
				this.container[ 0 ]
			);
		} else {
			...
		}
	}
	openInserter() {
		// insert stateful Backbone & DOM stuff here
	}
	closeInserter() {
		// insert stateful Backbone & DOM stuff here
	}
}

I think this may be simpler to understand and might make it easier to merge these changes into Core. What do you think?

@kevin940726
Copy link
Member Author

@noisysocks That's a great suggestion! However, I think we would eventually need to access the state in React anyway. There's already header/index.js needed to access isInserterOpened to toggle isPressed state of the toolbar item. We still need to sync the states somehow, either by using the React state as the source of truth, or by using the backbone state as the source of truth. Hope that I'm understanding you correctly?

@noisysocks
Copy link
Member

Ah, right, isPressed...

I suppose you could pass down an object which has openInserter(), closeInserter(), isOpen(), subscribe() and unsubscribe(). This is similar to what we're already doing with SidebarAdapter because it's a similar problem.

We could even use an Observable for isOpen instead of having isOpen(), subscribe(), and unsubscribe().

I think that there's value in trying to keep these two different ways of building applications (Backbone / React) from mixing with each other and then, where it is necessary for them to mix, using explicit interfaces (like SidebarAdapter) to do so.

@kevin940726 kevin940726 force-pushed the add/customize-widgets-inserter branch from 4e0abae to 38a8fd1 Compare March 26, 2021 06:28
@kevin940726 kevin940726 merged commit 53d1ebb into trunk Mar 26, 2021
@kevin940726 kevin940726 deleted the add/customize-widgets-inserter branch March 26, 2021 07:22
@github-actions github-actions bot added this to the Gutenberg 10.4 milestone Mar 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Widgets Customizer Ability to add and edit blocks in Customize → Widgets. Needs Design Feedback Needs general design feedback.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Blocks in Customizer: Implement slide-out inserter
3 participants