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

Experiment with allowing Theme JSON to control Navigation block within the Navigation Editor screen #34784

Closed
wants to merge 9 commits into from

Conversation

getdave
Copy link
Contributor

@getdave getdave commented Sep 13, 2021

Description

As part of #30007 (comment) I proposed we could control some of the features of the Navigation block via Theme JSON. This would:

  • Make the block more configurable for Themers - this is very important. Many themes will want to allow only very simple Navigations to be created.
  • Allow us to filter the settings when the Nav block is utilised in the Nav Editor to create a "paired down" version of the block.

This is a PoC PR which experiments with this approach for x3 Nav block settings for which were currently rely on controlling via props and modifying (for the Nav Editor) using the editor.BlockEdit filter.

To do this I have

  • Allowed blocks to define their own settings (in addition to the default top-level settings) for Theme JSON under the settings.blocks key. These would likely be custom to the block and allows any block to define its own extension point.
  • Added a new filter hook to allow developers to filter the Theme JSON config at a Theme level - this ensures they cannot override user-level settings provided via Theme JSON thus keeping the feature limited in scope).
  • Used the new filter hook to modifying the Theme JSON config for the Navigation block to set the x3 new settings to false.
  • Updated the Navigation block's edit implementation to use useSetting() to get the block's behaviour configuration data (settings) from Theme JSON rather than from props.

The result should be exactly the same as what we have in trunk right now. The difference is we're controlling via Theme JSON and a filter.

Closes #34775

How has this been tested?

  • Firstly check that the Nav block still shows the UI for x3 settings when used outside the Nav Editor.
  • Then check that the Nav block does not show the UI for x3 settings when used within the Nav Editor.
  • Edit the gutenberg_navigation_editor_filter_navigation_block_settings function inside lib/navigation-page.php and try turning the features on and off. They should reflect in the Nav Editor only.
  • Try removing the filter entirely. The block should default to all the settings being true - this mirrors the original default settings for the prop versions of the settings.
  • Bonus: try using a theme.json file to configure the Nav block outside of the Nav editor.

Screenshots

Types of changes

Breaking change (fix or feature that would cause existing functionality to not work as expected)

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).

@getdave getdave self-assigned this Sep 13, 2021
@getdave getdave added the Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json label Sep 13, 2021
@getdave getdave marked this pull request as ready for review September 13, 2021 14:05
@github-actions
Copy link

Size Change: +6 B (0%)

Total Size: 1.05 MB

Filename Size Change
build/block-library/index.min.js 153 kB +46 B (0%)
build/edit-navigation/index.min.js 15.4 kB -40 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.19 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/index.min.js 120 kB
build/block-editor/style-rtl.css 13.8 kB
build/block-editor/style.css 13.8 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 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 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 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 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 983 B
build/block-library/blocks/gallery/editor.css 988 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 70 B
build/block-library/blocks/group/theme.css 70 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 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 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 488 B
build/block-library/blocks/media-text/style.css 485 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/editor-rtl.css 489 B
build/block-library/blocks/navigation-link/editor.css 488 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 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 298 B
build/block-library/blocks/navigation-submenu/style.css 298 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/style-rtl.css 1.44 kB
build/block-library/blocks/navigation/style.css 1.44 kB
build/block-library/blocks/navigation/view.min.js 2.52 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 310 B
build/block-library/blocks/page-list/editor.css 310 B
build/block-library/blocks/page-list/style-rtl.css 241 B
build/block-library/blocks/page-list/style.css 241 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/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 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 398 B
build/block-library/blocks/post-featured-image/editor.css 398 B
build/block-library/blocks/post-featured-image/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 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 378 B
build/block-library/blocks/post-template/style.css 379 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 301 B
build/block-library/blocks/query-pagination/editor.css 292 B
build/block-library/blocks/query-pagination/style-rtl.css 259 B
build/block-library/blocks/query-pagination/style.css 257 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 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 220 B
build/block-library/blocks/quote/theme.css 222 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 374 B
build/block-library/blocks/search/style.css 375 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 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 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 636 B
build/block-library/blocks/template-part/editor.css 635 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/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 853 B
build/block-library/common.css 849 B
build/block-library/editor-rtl.css 9.69 kB
build/block-library/editor.css 9.68 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/style-rtl.css 10.3 kB
build/block-library/style.css 10.3 kB
build/block-library/theme-rtl.css 658 B
build/block-library/theme.css 663 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.9 kB
build/components/index.min.js 209 kB
build/components/style-rtl.css 15.8 kB
build/components/style.css 15.8 kB
build/compose/index.min.js 10.2 kB
build/core-data/index.min.js 12.3 kB
build/customize-widgets/index.min.js 11.1 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.45 kB
build/edit-navigation/style-rtl.css 3.41 kB
build/edit-navigation/style.css 3.41 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29 kB
build/edit-post/style-rtl.css 7.2 kB
build/edit-post/style.css 7.2 kB
build/edit-site/index.min.js 26.6 kB
build/edit-site/style-rtl.css 5.07 kB
build/edit-site/style.css 5.07 kB
build/edit-widgets/index.min.js 16.1 kB
build/edit-widgets/style-rtl.css 4.06 kB
build/edit-widgets/style.css 4.06 kB
build/editor/index.min.js 37.7 kB
build/editor/style-rtl.css 3.74 kB
build/editor/style.css 3.73 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.34 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 670 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.88 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.28 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.32 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.27 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

foreach ( $valid_block_names as $block ) {
$schema_settings_blocks[ $block ] = self::VALID_SETTINGS;
$schema_settings_blocks[ $block ] = self::VALID_SETTINGS[ $block ] ? array_merge( self::VALID_SETTINGS, self::VALID_SETTINGS[ $block ] ) : self::VALID_SETTINGS;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Here if we have block level settings we merge with the top level settings to preserve backwards compat but allow extension at a block level.

) {
return $result;
}

$theme_support_data = WP_Theme_JSON_Gutenberg::get_from_editor_settings( $settings );
$result->merge( self::get_theme_data( $theme_support_data ) );

$filter_data = new WP_Theme_JSON_Gutenberg( apply_filters( 'theme_json_resolver_merged_data', $result->get_raw_data() ) );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

$result is an instance of WP_Theme_JSON_Gutenberg so I'm passing in the raw data from the current instance and allowing it to be filtered and then creating a new instance of WP_Theme_JSON_Gutenberg. Then I can call merge on it to merge in the data coming from the filter.

Copy link
Member

Choose a reason for hiding this comment

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

I'd avoid adding filters as of now, as per https://github.com/WordPress/gutenberg/pull/34784/files#r709896696 but also this and this may be good context.

#34843 is promising. If we decide to go for something like that, I see the filters belonging to those functions instead of this inner classes.

Comment on lines +95 to +97
'hasSubmenuIndicatorSetting' => false,
'hasItemJustificationControls' => false,
'hasColorSettings' => false,
Copy link
Contributor Author

@getdave getdave Sep 13, 2021

Choose a reason for hiding this comment

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

These x3 settings were originally props on the Navigation block. We had to use filters to override them.

The new approach allow us to toggle these via Theme JSON.

@@ -115,6 +113,13 @@ function Navigation( {
const [ isResponsiveMenuOpen, setResponsiveMenuVisibility ] = useState(
false
);
const hasSubmenuIndicatorSetting =
useSetting( 'hasSubmenuIndicatorSetting' ) ?? true; // retain original prop default of "true" if there is no setting defined.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

The benefit of this approach is that useSetting is much more declarative. If the a setting is add/removed/changed then it's much easier for the Nav Editor to declare support (or not!).

Also it's much harder for developers working on the Nav block to accidentally break the Nav Editor because making a change to a setting is a larger undertaking.

hasColorSettings={ false }
/>
);
return <BlockEdit { ...props } />;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Look ma, no props! 🥳

Copy link
Contributor

Choose a reason for hiding this comment

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

Nice! It should be possible to delete the whole file and remove the lines where removeNavigationBlockEditUnsupportedFeatures is imported and called.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

🤞

@@ -78,13 +78,18 @@ class WP_Theme_JSON_Gutenberg {
);

const VALID_SETTINGS = array(
'border' => array(
'core/navigation' => array(
Copy link
Contributor

Choose a reason for hiding this comment

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

I worry that if all blocks can add things here:

  • we'll get a huge array in the end, these valid bits should be only for general settings/styles IMO
  • how will 3rd part blocks use this possibility?
    Can't the block register its own settings?

Copy link
Contributor Author

@getdave getdave Sep 13, 2021

Choose a reason for hiding this comment

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

Thanks for taking a look.

these valid bits should be only for general settings/styles IMO

Anything that isn't "valid" isn't allowed in the Theme JSON config. Therefore if we don't allow blocks to add to this we can't control them via Theme JSON at this level of granularity.

If the consensus is that Theme JSON should only allow for configuration that applies to all blocks, then the feature has limited somewhat reduced utility for the configuration of (more specialised) blocks as it's a fact that many (almost all) block features won't apply generally across the board.

The objectives that this exploration seeks to explore are:

  • we should be able to easily and reliably re-configure the Nav block to be simpler for use in the Nav Editor screen in such a way as it will be resilient to change.
  • Themers should be able to easily configure the Nav block to support feature X or Y (outside of the context of the Nav Editor).

As a result, I think we should at least consider opening up Theme JSON schema for extension by developers (Core or otherwise).

By doing so we will afford great flexibility and power to block builders to allow Themers (or even users!) to configure their blocks without needing to understanding complex hook/filters.

Key point: if we don't agree that Theme JSON should be extensible, then it would seem that we will need to declare it as not suitable for configuring blocks at a granular level. It will be purely for configuring common things such as spacing, colors...etc, but not for individual features.

The knock on effect for this on the Nav Editor project will be that we must move Theme JSON alongside Block Supports API as defunct for the purposes of configuring the Nav block inside the Nav Editor. This will leave us back where we are today - a plethora of brittle hooks and filters and overrides.

I've had little/limited involvement in the Theme JSON project and so I'd like to ask the opinion of @oandregal (and others) what they think. If this experiment is going against core principles of Theme JSON and Global Styles then please do let us know.

we'll get a huge array in the end

This is also a concern of mine.

how will 3rd part blocks use this possibility

Good question. They can't at the moment. However, we could (in theory) expose APIs to allow blocks to register their own Theme JSON settings.

Can't the block register its own settings?

It can't right now because this is a PoC 😄 But in the future we could enable this.

Copy link
Member

Choose a reason for hiding this comment

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

Could we use the block definition (block.json) to register block-specific settings? Perhaps a new supports.custom settings section? Or perhaps we allow providing data for any registered attribute of the block?

My overall thinking is that if we want to do this, the first step is to figure out a way that works for any block, whether it's a core block or a 3rd party block. As a general approach, I'd explore a path that doesn't involve letting others filter the theme.json tree directly, otherwise if/when we want to change the theme.json shape we won't be able to do it without breaking the users of those filters. If we use a declarative approach (like pulling data from block.json to the proper places) we are in a better spot to modify the theme.json tree in the future.

Copy link
Member

Choose a reason for hiding this comment

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

we should be able to easily and reliably re-configure the Nav block to be simpler for use in the Nav Editor screen in such a way as it will be resilient to change.

I'm largely unfamiliar with the inner workings of the navigation block, so I may have misunderstood things or lack the proper context. But just wanted to re-share that both block-supports and theme.json are editor-agnostic so far: they aren't meant to configure things per editor.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

they aren't meant to configure things per editor

Thanks for reiterating this. We're aware the approach would be...unusual.

What we're trying to do is explore all avenues so as to be sure we've ruled out all options before we decide on a preferred direction.

Copy link
Member

Choose a reason for hiding this comment

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

The topic of allowing settings per-block is something that we've discussed in a few PRs and issues. I figured it'd be good to have a single place to share our thoughts on it, so I created #35114

'core/navigation' => array(
'hasSubmenuIndicatorSetting' => null,
'hasItemJustificationControls' => null,
'hasColorSettings' => null,
Copy link
Contributor

Choose a reason for hiding this comment

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

There is a color array just below, I was wondering if it should be possible to override the color settings using that instead of a new setting?

Copy link
Contributor

Choose a reason for hiding this comment

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

This makes me wonder if the hasColorSettings prop was wrong all along, and maybe the navigation block should instead use useSetting to determine whether the color settings panel is rendered.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It's probably ok for us to use useSetting for that one in this case as it's a general UI config item which has now been made part of Global Styles.

Copy link
Member

Choose a reason for hiding this comment

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

In addition to what Dan mentioned about hasColorSettings I wonder whether hasItemJustificationControls can be done the same way, see discussion about that at #34317 (the issue is unowned, feel free to take it).

Copy link
Member

Choose a reason for hiding this comment

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

I've just run into another block that also uses the justification and I think this can be converted to a block supports: #34872

@getdave getdave mentioned this pull request Sep 15, 2021
62 tasks
@getdave
Copy link
Contributor Author

getdave commented Sep 15, 2021

Questions requiring answers

This PR was shared in Core Editor chat. @jorgefilipecosta responded with his thoughts on whether it is a good route to continue to explore.

Key points from Jorge

  • Regarding theme.json being extensible I think yes it will endeup being extensible.
  • But I imagine the extension is allowing a plugin to dynamically change values on the theme.json shape. But the shape is static e.g: one can not add new properties to it as we are doing in [this PR].
  • If the shape can be changed as what happens is that we end up having themes using a theme.json that requires a specific plugin to use that shape. As soon as a plugin is uninstalled the theme.json being used stops working etc
  • I think theme.json is for general things across blocks (as opposed to specific features).
  • I’m not sure if theme.json is the right place for block specific settings
  • [One alternative might be..] the block may define a set of defaults on block.json. And then a plugin may hook into block.json and change the defaults.
  • I agree that there is a need for block specific settings I’m just not sure yet if theme.json is the right place for that

Questions requiring answers

I will try to answer the following questions within this PR or in an associated Issue:

  • Explore how we envisage 3rd party blocks extending Theme JSON? An API that allows them to register new settings but not amend/edit existing ones sounds like a good plan.
  • Explore what happens when a Plugin/block is deactivated. What is left behind in Theme JSON (if anything)? What are the downsides?
  • What are the wider benefits of being able to control facets of blocks via Theme JSON as opposed to filters/hooks?
  • What alternatives have been considered?

@oandregal
Copy link
Member

👋 I've left a few practical comments about this: how to make this work for any block?, have we considered using the existing settings and/or expand them to do this?, and that I don't think we should add this filter.

Some high-level thoughts:

  • I don't think we should allow extending styles before we ship the global styles interface for users and gather feedback for a while. The idea of having standard style properties across blocks is fundamental to make this work well for users.

  • The idea of extending settings to any setting/attribute that the block supports may be valuable. It also has drawbacks. In this particular PR, I see two things that smell like could be part of the existing block supports but they aren't. It sounds like we want to do this to circumvent issues with the existing block supports? If so, perhaps we should look at this from the angle of making the block supports work for this block?

@talldan
Copy link
Contributor

talldan commented Sep 20, 2021

It sounds like we want to do this to circumvent issues with the existing block supports? If so, perhaps we should look at this from the angle of making the block supports work for this block?

I agree, I think ideally those two things use block supports. That would be a really nice improvement generally for the block.

@getdave
Copy link
Contributor Author

getdave commented Sep 20, 2021

Thank you for all the input here. I do appreciate it 🙇

In general I'd like to refer folks back to the previous exploration we did on using Block Supports API to "configure" the Nav block.

One of the takeaways was

we've learnt the Block Supports API is not an API to enable/disable things, it is an API to share composable behaviours across blocks without replicating the same logic over and over in different blocks.

Given this, I'm curious....how would moving some of the block's "settings" (ie: colour) over to Block Supports help the Nav block to be configured differently in the Nav editor?

@talldan
Copy link
Contributor

talldan commented Sep 20, 2021

Given this, I'm curious....how would moving some of the block's "settings" (ie: colour) over to Block Supports help the Nav block to be configured differently in the Nav editor?

@getdave Oh, looking at the block.json there's more to this than I originally thought. The navigation block previously used the color block supports option, but it looks like it was removed (here: https://github.com/WordPress/gutenberg/pull/31149/files#diff-554049ef85f1660a9ba54b7ee492d7d347a5244a9aa4a7d3fb75ab24015c2f29L71).

I didn't realise that had happened, so in my comments I wasn't really considering this as a move to block supports, more as a tidy-up.

@talldan
Copy link
Contributor

talldan commented Sep 20, 2021

@oandregal What I discovered in my previous comment might mean that the theme.json color options for the nav block no longer work. Might be worth checking this!

@oandregal
Copy link
Member

What I discovered in my previous comment might mean that the theme.json color options for the nav block no longer work. Might be worth checking this!

Yeah, blocks that do not use the block supports aren't supposed to work via theme.json. They also won't be listed in the global styles sidebar either. Originally, only the styles declared via block supports were allowed in theme.json but that was changed at #29941 so it's now up to the theme to check that the styles work properly.

@oandregal
Copy link
Member

Given this, I'm curious....how would moving some of the block's "settings" (ie: colour) over to Block Supports help the Nav block to be configured differently in the Nav editor?

As I see it, this PR is trying to add code so the theme.json can target custom settings of the block. My point is that, if those settings are converted to block supports, we can already target them via theme.json without any change.

@draganescu
Copy link
Contributor

I just want to chime in to say that what we're after is something like "runtime custom block configurability", that is the ability for blocks to declare arbitrary configuration that can be set up when the block is programmatically used.

So far all exploration hit the fact that all block configuration is not custom to the block, but generic configuration we want all blocks to have access to.

But take the "show submenus arrow" navigation block setting. We want to have a way in which the navigation block when used in the navigation editor has this setting unavailable (not set to false, unavailable). Also a theme might want the same thing, because the theme for menu M may recommend depth 1 menus for whatever reason.

Nevertheless, if we don't want any support for such block configuration then the only path forward that makes sense for the editor is to support a "classic menu block" instead of constantly overriding the navigation block. At the same time, in my mind, the ability to programmatically alter block behavior is highly valuable and needed by themes and plugins.

@getdave
Copy link
Contributor Author

getdave commented Sep 21, 2021

Thanks for clarifying this Andrei 👍

I came to much the same conclusion on the canonical Issue for which this Theme JSON PR was an exploration.

Closing this out as it's unlikely we're going to be pursuing it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Navigation Affects the Navigation Block Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Ascertain whether it's possible to hook into and override theme.json settings in a particular editor context
4 participants