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 featured transforms in Link Control for Navigation Link items. #35857

Merged
merged 8 commits into from
Oct 27, 2021

Conversation

tellthemachines
Copy link
Contributor

@tellthemachines tellthemachines commented Oct 22, 2021

Description

Partially addresses #34041

Adds three transform buttons inside the link control for Navigation Links. The blocks to transform to are hardcoded; they're a selection of the options that might be most useful when expanding the Navigation to include more than just links: Search, Site Logo and Social Icons.

Adds a renderControlBottom render prop to LinkControl that allows adding extra controls to the bottom of the link popover.

How has this been tested?

In the Navigation block, add a new link. Check that block transforms are showing in the link popover.
Open the link popover for an existing navigation link that has a URL set. Transforms should not display.
Link popover should be unchanged for regular links in paragraphs etc..

Screenshots

Types of changes

New feature (non-breaking change which adds functionality)

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 (please manually search all *.native.js files for terms that need renaming or removal).

@github-actions
Copy link

github-actions bot commented Oct 22, 2021

Size Change: +782 B (0%)

Total Size: 1.08 MB

Filename Size Change
build/block-editor/index.min.js 135 kB +28 B (0%)
build/block-library/blocks/navigation-link/editor-rtl.css 642 B +154 B (+32%) 🚨
build/block-library/blocks/navigation-link/editor.css 642 B +153 B (+31%) 🚨
build/block-library/editor-rtl.css 9.74 kB +69 B (+1%)
build/block-library/editor.css 9.74 kB +69 B (+1%)
build/block-library/index.min.js 152 kB +309 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 14 kB
build/block-editor/style.css 14 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 549 B
build/block-library/blocks/button/style.css 549 B
build/block-library/blocks/buttons/editor-rtl.css 309 B
build/block-library/blocks/buttons/editor.css 309 B
build/block-library/blocks/buttons/style-rtl.css 317 B
build/block-library/blocks/buttons/style.css 317 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 502 B
build/block-library/blocks/image/style.css 505 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.78 kB
build/block-library/blocks/navigation/editor.css 1.78 kB
build/block-library/blocks/navigation/style-rtl.css 1.71 kB
build/block-library/blocks/navigation/style.css 1.7 kB
build/block-library/blocks/navigation/view.min.js 2.74 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 198 B
build/block-library/blocks/page-list/style.css 198 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 347 B
build/block-library/blocks/post-comments-form/style.css 347 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 B
build/block-library/blocks/post-content/style-rtl.css 57 B
build/block-library/blocks/post-content/style.css 57 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 156 B
build/block-library/blocks/post-featured-image/style.css 156 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 770 B
build/block-library/blocks/site-logo/editor.css 770 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 824 B
build/block-library/blocks/social-links/editor.css 823 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 815 B
build/block-library/common.css 812 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.5 kB
build/block-library/style.css 10.5 kB
build/block-library/theme-rtl.css 668 B
build/block-library/theme.css 673 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46 kB
build/components/index.min.js 212 kB
build/components/style-rtl.css 15.4 kB
build/components/style.css 15.4 kB
build/compose/index.min.js 10.4 kB
build/core-data/index.min.js 12.4 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.44 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.4 kB
build/edit-post/style-rtl.css 7.12 kB
build/edit-post/style.css 7.12 kB
build/edit-site/index.min.js 30.7 kB
build/edit-site/style-rtl.css 5.78 kB
build/edit-site/style.css 5.78 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 37.7 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.21 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.34 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@tellthemachines tellthemachines added the [Block] Navigation Link Affects the Navigation Link Block label Oct 22, 2021
@jasmussen
Copy link
Contributor

Took it for a quick spin, and seeing these nice waiting-to-be-styled buttons in the transform dialog:
transforms

Honestly with some nice styles here, I imagine this could be pretty decent! If you feel happy about the code here, and @getdave is okay with it as well, I'd be happy to push some CSS tweaks to shine this one up! (Though I'd appreciate help adding the right icons and labels to the buttons!)

@@ -292,6 +293,7 @@ function LinkControl( {
) }
</div>
) }
{ children }
Copy link
Contributor

Choose a reason for hiding this comment

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

My concern is, whilst this is expedient, it does lock us into a particular location for children.

I wonder whether instead we have dedicated locations for rendering additional UI inside LinkControl.

So in this case we want to add content to the bottom of the control so a property for this would be called renderControlBottom (or something). We could treat as a render prop and that would allow you to optionally pass content to be rendered there. Treating as a render prop would also give you the ability to pass some of the internal state of link control to the inserted component.

If later on we decide we need to insert content into another location we can add renderControlTop or whatever.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Changed this to use render prop! I hate naming things so conveniently used your suggestion 😄

@tellthemachines
Copy link
Contributor Author

Updated to add the block icon and proper title, as well as use the Button component which gives us at least a reset of user agent button styles. If we want these buttons to look like the inserter ones, I think we only need to move the icon on top of the text and add a bit of padding.

I'm thinking we also need a title for this section. Shall we go with "Or transform to block" as @jasmussen's design shows?

A few questions to consider:

Currently the three items on display are hardcoded. Will we ever want to have different blocks appearing?

I asked this already on the issue, but adding it here again for visibility: do we want these transforms to always display in the link control for nav links, or do we want to hide them when different block types are already available from the quick inserter?

Also, do we want to hide these when a link is already set in the block? E.g.
Screen Shot 2021-10-25 at 5 35 00 pm

@jasmussen
Copy link
Contributor

This is looking good!

Screenshot 2021-10-25 at 08 52 03

I'd like to add a separator, tweak the padding a little bit, and tinker with whether stacked buttons are better or not, like this:

Screenshot 2021-10-25 at 08 53 06

Mind if I push to the branch?

Speaking of, should we change the button defaults to logo, title, search? Depends a bit on whether we can land #35688 soon, if we can then Search might be a better experience than Social Links 🤔

Also, do we want to hide these when a link is already set in the block?

Screenshot 2021-10-25 at 08 52 13

My instinct would be to hide these, yes.

@jasmussen
Copy link
Contributor

Actually I held off on pushing my changes because it felt like I was adding a tone of bespoke CSS in arbitrary places. So I'll hold off for now, and let me know if/how/where this would be appropriate. I managed to get it to look like this:
Screenshot 2021-10-25 at 09 14 29

That moves the "Open in new tab" to a toggle you can flip after the fact, not at the initial step.

It assumes this markup snippet:

								renderControlBottom={ () => (
									<div className="link-control-transform">
										<h3 className="link-control-transform__subheading">
											{ __( 'Transform' ) }
										</h3>
										<div className="link-control-transform__items">
											<LinkControlTransforms
												block={ thisBlock }
												transforms={
													featuredTransforms
												}
											/>
										</div>
									</div>
								) }

I then added these pieces of CSS. Buttons:

.components-button.link-control-transform__item {
	flex-direction: column;
	gap: $grid-unit-10;
	height: auto;
	flex-basis: 33%;
}

Button container — I guess we might have a counterpart among the new components?

.link-control-transform__items {
	display: flex;
	justify-content: space-between;
}

Subheading, basically the same as this one, so it should probably be reused:

.link-control-transform__subheading {
    font-size: 11px;
    text-transform: uppercase;
    font-weight: 500;
    color: $gray-900;
    margin-bottom: 1.5em;
}

General container:

.link-control-transform {
	border-top: $border-width solid $gray-400;
	padding: 0 $grid-unit-20 $grid-unit10 $grid-unit-20;
}

As we look to the new components to absorb much of this bespoke CSS, it just feels wrong to add it. At the same time, it might be the most direct path to a solution. What do you think?

@tellthemachines
Copy link
Contributor Author

Thanks for sharing those styles @jasmussen ! I incorporated them in the lastest changeset and it should be looking more or less as expected now.

Subheading, basically the same as this one, so it should probably be reused:

We're already using font-size: 11px; text-transform: uppercase; font-weight: 500; in a number of different places, though the color is usually $gray-700. Perhaps at some point we should extract these styles to somewhere common, but right now we only have a bunch of instances in super specific places, none of which really makes sense to reuse here.

That moves the "Open in new tab" to a toggle you can flip after the fact, not at the initial step.

There's no ready-made way to do this. "Open in new tab" is a default setting in LinkControl, and currently there's no way of setting it conditionally in that component. Ideally we'd be able to pass a prop to LinkControl to configure when to render "Open in new tab", but as that involves changing the LinkControl API, we should do it as a separate task. Cc. @getdave

@tellthemachines tellthemachines marked this pull request as ready for review October 26, 2021 02:53
Copy link
Contributor

@talldan talldan left a comment

Choose a reason for hiding this comment

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

Works really well. A few little adjustments and it should be good to ship. I noticed in testing the styling doesn't seem quite right:
Screenshot 2021-10-26 at 4 01 21 pm

Maybe a missing flex direction.

Comment on lines 363 to 385
inserterItems: getInserterItems(
getBlockRootClientId( clientId )
),
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm wondering if it should use a selector like getBlockTransformItems.

* Add transforms to Link Control
*/

function LinkControlTransforms( { block, transforms } ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Could this one be un-nested? Or alternatively wrapped in useCallback?

In the past, I've seen a component defined within another component in this way cause unexpected behaviors in React. The reconciler can treat it as a new component on every render because the function reference changes each time.

I actually haven't noticed any issues in testing, but I still think it's a pattern worth avoiding.


function LinkControlTransforms( { block, transforms } ) {
return (
<div className="link-control-transform">
Copy link
Contributor

Choose a reason for hiding this comment

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

Not sure what the right class name would be. It should maybe use the wp-block-navigation-link class if its defined with the component. It could get quite wordy.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'm seeing this as a micro-component that happens to be used in navigation link, but could potentially be used in any other block that has LinkControl as its main feature.

Comment on lines 392 to 419
const featuredBlocks = [
'core/site-logo',
'core/social-links',
'core/search',
];
const featuredTransforms = inserterItems.filter( ( item ) => {
return featuredBlocks.includes( item.name );
} );
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe not needed for a first draft, but if these hard-coded blocks are unregistered by a site maintainer or plugin, it could be worth falling back to other available transforms.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Hmm, good point, what's the best way to check the blocks are registered?

@jasmussen
Copy link
Contributor

Incredible work, and it's coming together so fast, this looks very close to me:
Screenshot 2021-10-26 at 11 23 26

I also appreciate that you used the flex components to make this happen, rather than the bespoke CSS I suggested!
The only other piece I'd love for us to find a way to fix is making each item the same size:
Screenshot 2021-10-26 at 11 23 46

I solved that in the pseudo CSS by adding flex-basis: 33%;. But it appears the individual link transform items are meant to be flex, but are actually block:
Screenshot 2021-10-26 at 11 30 57

It appears partially intentional from the component side of things, there's even a faux "gap" type margin:
Screenshot 2021-10-26 at 11 28 21

Screenshot 2021-10-26 at 11 28 27

But the net result is that the combination of space-between, gap, and flex-basis: 33%; isn't really working to make the three items equally weighted. I could probably dive in and override some of the component CSS, but that also feels like the wrong approach. Any idea of a good fix?

@tellthemachines
Copy link
Contributor Author

I noticed in testing the styling doesn't seem quite right

Oh, that's weird, I can't reproduce it. It should just work, because it's using the Flex component. Though we might have to change that, because of:

The only other piece I'd love for us to find a way to fix is making each item the same size

The problem with the Flex component is that FlexItem wraps an element around our buttons, so instead of having

<Flex>
    <button />
    <button />
</Flex>

which would allow us to style the buttons as flex children, we end up with

<Flex>
    <div>
        <button />
    </div>
    <div>
        <button />
    </div>
</Flex>

and because Flex is set up to use CSS-in-JS, we can't just hook some extra CSS to its classnames. We can pass the styles inline to FlexItem, but at that point it's easier (and much less messy) to not use Flex at all, and attach the CSS directly to our LinkControlTransforms markup.

Flex is still marked as experimental and if it is to be useful at all as a component it needs a fair bit of improvement. Not forcing a wrapper around the FlexItems would be a good start, as well as allowing customisation of individual item styles. To be honest I'm not sold on the idea of a component with the sole function of adding three lines of CSS to a div: it doesn't seem to solve any meaningful problem, and it makes the DX horrible (code bloat, wrappers around wrappers, having to hunt through multiple files to find where a style is declared). But I'm probably missing some context around this 🤷

Tl,dr: I think our best bet is to avoid using Flex for now, and add the styles manually.

@tellthemachines tellthemachines force-pushed the try/transforms-in-link-control branch from 14a8530 to 9e23d7e Compare October 27, 2021 03:06
@talldan
Copy link
Contributor

talldan commented Oct 27, 2021

The problem with the Flex component is that FlexItem wraps an element around our buttons

Yeah, seems like FlexItem should have an as prop:

<FlexItem as={ Button }>

But it doesn't right now. It always renders as a View, which is a div.

Copy link
Contributor

@talldan talldan left a comment

Choose a reason for hiding this comment

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

Working really well. I feel like it could do with a tiny bit more padding at the bottom underneath the icons, but it could just be me:
Screenshot 2021-10-27 at 4 24 19 pm

@getdave getdave mentioned this pull request Oct 27, 2021
38 tasks
@tellthemachines
Copy link
Contributor Author

I feel like it could do with a tiny bit more padding at the bottom underneath the icons, but it could just be me

Hmm, adding margin or padding to the buttons or to their containers triggers a scrollbar on the popover 😕
I'll merge this as is and we can work it out later as an enhancement.

@tellthemachines tellthemachines merged commit 5551311 into trunk Oct 27, 2021
@tellthemachines tellthemachines deleted the try/transforms-in-link-control branch October 27, 2021 23:40
@github-actions github-actions bot added this to the Gutenberg 11.9 milestone Oct 27, 2021
@getdave
Copy link
Contributor

getdave commented Oct 28, 2021

Glad this worked out ❤️

@andrewserong andrewserong added the [Type] Enhancement A suggestion for improvement. label Nov 5, 2021
@andrewserong andrewserong changed the title Try adding featured transforms in Link Control for Navigation Link items. Add featured transforms in Link Control for Navigation Link items. Nov 5, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Navigation Link Affects the Navigation Link Block [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants