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

Behaviors UI #49972

Merged
merged 61 commits into from
May 24, 2023
Merged

Behaviors UI #49972

merged 61 commits into from
May 24, 2023

Conversation

michalczaplinski
Copy link
Contributor

@michalczaplinski michalczaplinski commented Apr 21, 2023

What?

Adds a simple UI element to add specific behaviors to a block and support for them to theme.json & block.json. It is only concerned with the built-in "LIGHTBOX" behavior that is worked on in #49621.

The behavior can be defined in the following way:

// theme.json

{  
  // We can toggle the Behaviors UI on/off for specific blocks. 
  // Currently it will only be available for the core/image block.
  "settings": {
    "blocks": {
      "core/image": {
        "behaviorsUIEnabled": true
      }
    }
  },
  // Here we can define the actual behaviors that are available in the theme.
  "behaviors": {
    "lightbox": true,
   }
}

Why?

We need a way for users to add specific Behaviors to their blocks. We also need them to be able to opt into them in the theme.json file.

How?

  • Using the editor.BlockEdit filter to add the relevant UI like:

https://github.com/WordPress/gutenberg/blob/77288e42e762c30f3599751c1810339e8aca7f69/packages/block-editor/src/hooks/behaviors.js#L83-L88

  • Updating the core theme.json file so that the core Image block uses the LIGHTBOX behavior by default.

Testing Instructions

  1. Insert an Image block in a post
  2. Go to the "Advanced" tab in the Inspector
  3. You can select the LIGHTBOX behavior or choose "None" in the dropdown

Screenshots

Screen.Recording.2023-05-09.at.20.52.10.mov

@michalczaplinski michalczaplinski marked this pull request as draft April 21, 2023 02:21
@gziolo gziolo added the [Feature] Interactivity API API to add frontend interactivity to blocks. label Apr 21, 2023
schemas/json/theme.json Outdated Show resolved Hide resolved
@gziolo gziolo added [Type] Feature New feature to highlight in changelogs. [Type] New API New API to be used by plugin developers or package users. [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. [Status] In Progress Tracking issues with work in progress and removed [Type] Feature New feature to highlight in changelogs. labels Apr 21, 2023
schemas/json/theme.json Outdated Show resolved Hide resolved
@github-actions
Copy link

github-actions bot commented May 4, 2023

Size Change: +1.46 kB (0%)

Total Size: 1.41 MB

Filename Size Change
build/block-editor/content-rtl.css 4.23 kB +15 B (0%)
build/block-editor/content.css 4.23 kB +16 B (0%)
build/block-editor/index.min.js 200 kB +1.23 kB (+1%)
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB +142 B (+6%) 🔍
build/block-library/blocks/freeform/editor.css 2.58 kB +141 B (+6%) 🔍
build/block-library/blocks/freeform/style-rtl.css 0 B -246 B (removed) 🏆
build/block-library/blocks/freeform/style.css 0 B -246 B (removed) 🏆
build/block-library/blocks/navigation/interactivity.min.js 896 B +31 B (+4%)
build/block-library/editor-rtl.css 12.1 kB +111 B (+1%)
build/block-library/editor.css 12.1 kB +106 B (+1%)
build/block-library/index.min.js 205 kB +156 B (0%)
build/block-library/interactivity/runtime.min.js 2.41 kB +180 B (+8%) 🔍
build/block-library/interactivity/vendors.min.js 8.19 kB +43 B (+1%)
build/block-library/style-rtl.css 12.8 kB -119 B (-1%)
build/block-library/style.css 12.8 kB -120 B (-1%)
build/components/index.min.js 232 kB -5 B (0%)
build/components/style-rtl.css 11.7 kB +6 B (0%)
build/components/style.css 11.7 kB +4 B (0%)
build/data/index.min.js 8.68 kB -1 B (0%)
build/edit-site/index.min.js 63.9 kB -11 B (0%)
build/edit-site/style-rtl.css 10.5 kB +4 B (0%)
build/edit-site/style.css 10.5 kB +7 B (0%)
build/editor/index.min.js 45.8 kB +8 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.33 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 472 B
build/block-directory/index.min.js 7.18 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 15.1 kB
build/block-editor/style.css 15.1 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 159 B
build/block-library/blocks/details/style.css 159 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/interactivity.min.js 395 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 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 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 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 507 B
build/block-library/blocks/media-text/style.css 505 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 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.33 kB
build/block-library/blocks/navigation/editor.css 2.33 kB
build/block-library/blocks/navigation/style-rtl.css 2.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 443 B
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 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 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 281 B
build/block-library/blocks/post-template/style.css 281 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 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 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 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 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 50.9 kB
build/commands/index.min.js 15 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/compose/index.min.js 12.4 kB
build/core-commands/index.min.js 1.8 kB
build/core-data/index.min.js 16.5 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 708 B
build/date/index.min.js 40.5 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.2 kB
build/edit-post/style-rtl.css 7.76 kB
build/edit-post/style.css 7.75 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.89 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.77 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.73 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.91 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.97 kB
build/notices/index.min.js 963 B
build/plugins/index.min.js 1.85 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.33 kB
build/primitives/index.min.js 944 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 939 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.74 kB
build/reusable-blocks/index.min.js 2.25 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 2.08 kB
build/shortcode/index.min.js 1.42 kB
build/style-engine/index.min.js 1.52 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.65 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.28 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@michalczaplinski
Copy link
Contributor Author

I've created a UI to enable the Behaviors in the "Advanced" panel of the block InspectorControls. It's still still WIP and completely broken at the moment, but it's a skeleton to build off.

I'm using the editor.BlockEdit filter to add the relevant UI like:

addFilter(
'editor.BlockEdit',
'core/behaviors/with-inspector-control',
withBehaviors
);

Just using .getSettings() seems enough to make the system use the value from the theme's theme.json and fall back on the core theme.json file if not present in the theme's file. The next step should be to ensure that the block.json's setting for behaviors is respected.

@github-actions
Copy link

github-actions bot commented May 9, 2023

Flaky tests detected in 9124b58.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/5072350404
📝 Reported issues:

@cbravobernal
Copy link
Contributor

I've created a UI to enable the Behaviors in the "Advanced" panel of the block InspectorControls. It's still still WIP and completely broken at the moment, but it's a skeleton to build off.

I'm using the editor.BlockEdit filter to add the relevant UI like:

addFilter(
'editor.BlockEdit',
'core/behaviors/with-inspector-control',
withBehaviors
);

Just using .getSettings() seems enough to make the system use the value from the theme's theme.json and fall back on the core theme.json file if not present in the theme's file. The next step should be to ensure that the block.json's setting for behaviors is respected.

Should we use the behaviors inside block supports? Imagine the block.json file of image.

"supports": {
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"width": true,
			"__experimentalSkipSerialization": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"width": true
			}
		},
		"__experimentalBehaviors": {
			"lightbox": false
		}
	},

That way we could conditionally check if the block supports the behaviors, which ones are supported and show the UI so the user can select which ones to apply. Something like this:

// Check if the block has behaviors.
const blockBehaviors = select( blocksStore ).getBlockSupport(
  props.name,
  '__experimentalBehaviors'
 );

@michalczaplinski
Copy link
Contributor Author

Should we use the behaviors inside block supports? Imagine the block.json file of image.

I haven't considered that, but it might make sense!

This way, individual blocks could enable/disable the Behaviors UI using the supports as you mentioned. Then the individual behaviors can be enabled/disabled in the block.json of a block.

I've added the outline of the technical details of the implementation (previously created by @SantosGuillamot), which briefly mentions the block supports in #50029 (comment) . Let's discuss this over there in the issue!

@cbravobernal
Copy link
Contributor

I added a couple e2e tests. Feel free to update them if needed!

@michalczaplinski
Copy link
Contributor Author

The tests look great but I have some trouble running them locally @c4rl0sbr4v0 !

  Error: The theme "behaviors" is not installed

I've tried changing that to gutenberg-test-themes/behaviors to match how it's defined in the style-variations.spec.js:

https://github.com/WordPress/gutenberg/blob/cddc3d4e62f15c9686358a69ba417e14a7f86eac/test/e2e/specs/site-editor/style-variations.spec.js#L14-L16

but that does not help either. Can you run them locally?

@michalczaplinski
Copy link
Contributor Author

michalczaplinski commented May 12, 2023

I've pushed some more changes and I believe the implementation is close to what we want. There are still a few things left:

@cbravobernal
Copy link
Contributor

I updated the branch with trunk and did

  • Fix the currently failing e2e tests

@artemiomorales
Copy link
Contributor

artemiomorales commented May 12, 2023

Hey @michalczaplinski, it's great to see this coming along!

I looked at your video on the Outline for Block Behavior issue explaining your ideas on the UX and have two questions:

  1. Do you think we should add the toggle into the UI right now?

  2. How do you feel about adding the ability to enable or disable the lightboxes by default?

I'm wondering what would be the best way to ship this out to users. What we have right now will make the lightbox available to folks, but if our intent is to generate ideas and discussion around behaviors, maybe we can consider adding these two points.

@cbravobernal
Copy link
Contributor

The tests look great but I have some trouble running them locally @c4rl0sbr4v0 !

  Error: The theme "behaviors" is not installed

I've tried changing that to gutenberg-test-themes/behaviors to match how it's defined in the style-variations.spec.js:

https://github.com/WordPress/gutenberg/blob/cddc3d4e62f15c9686358a69ba417e14a7f86eac/test/e2e/specs/site-editor/style-variations.spec.js#L14-L16

but that does not help either. Can you run them locally?

Yes! I run
npm run test:e2e:playwright test/e2e/specs/editor/various/behaviors.spec.js and I get:

Screenshot 2023-05-12 at 14 16 22

I've created the theme like the style-variations you mention. Let's see if it also fails in CI.

Object.entries( settings ).every( ( [ , value ] ) => ! value )
) {
return <BlockEdit { ...props } />;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

There's a subtile issue that may or may not result in a bug. The fact that we conditionally render BlockEdit can result in a "remount" of the whole component if the condition above changes from "true" to "false" or the opposite.

The remount often create focus loss and issues like that. While this might not always be a problem, it is a problem in general if the condition "can" change when the component is mounted (I'm not sure it's the case here)

Copy link
Contributor

Choose a reason for hiding this comment

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

That conditional is reading a theme.json value. I don't think that condition can change without a page reload 🤔

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, probably fine for now, just something to know as sometimes we used to switch over attribute values (easy to add a check there). Also, maybe at some point in the future, that setting could be editable in the global styles UI in the site editor.

Copy link
Contributor

Choose a reason for hiding this comment

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

that setting could be editable in the global styles UI in the site editor

That is the next step after merging this PR, so we should then take a look at this issue.

Copy link
Contributor

@cbravobernal cbravobernal left a comment

Choose a reason for hiding this comment

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

Looks good to me. I won't enable auto-merge as we need to update another PR as requested in a comment.

Copy link
Contributor

@SantosGuillamot SantosGuillamot left a comment

Choose a reason for hiding this comment

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

I've been testing the UX and it looks great 👏 Some comments:

Testing

I used:

  • settings.blocks.core/image.behaviors.lightbox: To enable/disable the Editor UI to select behaviors per block.
  • behaviors.blocks.core/image.lightbox: To define a default value and activate/deactivate the lightbox in the images.

What I tested:

  1. In the theme theme.json: NO settings.blocks.core/image.behaviors.lightbox and NO behaviors.blocks.core/image.lightbox

It gets the default values from Gutenberg and it shows the UI to select the behaviors and the default value is "No behaviors".

  1. In the theme theme.json: Add settings.blocks.core/image.behaviors.lightbox = false

The UI to select the behaviors doesn't appear anymore.

  1. In the theme theme.json: Add behaviors.blocks.core/image.lightbox = true and remove the settings.blocks.core/image.behaviors.lightbox

The UI appears and the default value is "Lightbox". It works in the frontend.

  1. In the theme theme.json: Add settings.blocks.core/image.behaviors.lightbox = false and behaviors.blocks.core/image.lightbox = true

The UI to select the behaviors doesn't appear in the Block Editor BUT the lightbox is still working in the frontend.

  1. Overwrite the value for each block.

If I select a behavior from the block, it overwrites the default value defined by the theme or Gutenberg.

Potential improvements

I just have a few aspects to consider:

  • I think we might need a "Reset" button to remove the lightbox from the block attributes and listen to the default value from the theme/Gutenberg. At this moment, if I select "Lightbox" from the Editor UI, there is no way to go back to the default value. I can change the attribute to "No behaviors", but it is not the same as listening to the default. This is something many styles are using for example.
  • We might need to add the behaviors property to the schemas.
  • I didn't test it, but I guess that, in the future when there are more behaviors, if settings.blocks.core/image.behaviors.lightbox is false, it shouldn't appear in the dropdown list but it shouldn't remove the whole list of behaviors.

@cbravobernal cbravobernal enabled auto-merge (squash) May 24, 2023 12:33
Comment on lines +12 to +19
const filename = '1024x768_e2e_test_image_size.jpeg';
const filepath = path.join( './test/e2e/assets', filename );

const createMedia = async ( { admin, requestUtils } ) => {
await admin.createNewPost();
const media = await requestUtils.uploadMedia( filepath );
return media;
};
Copy link
Member

Choose a reason for hiding this comment

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

It's a convention to use the POM-style class as shown in other test file to create file-specific utilities. See the image.spec.js test for an example. It's not strictly required though, it's just a suggestion :)!

},
} );

await page.getByRole( 'button', { name: 'Advanced' } ).click();
Copy link
Member

Choose a reason for hiding this comment

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

Nit: We can scope it under the Editor settings sidebar to make it more readable. (It isn't clear which "Advanced" button we're clicking as it's a pretty generic name.)

Suggested change
await page.getByRole( 'button', { name: 'Advanced' } ).click();
await page
.getByRole( 'region', { name: 'Editor settings' } )
.getByRole( 'button', { name: 'Advanced' } )
.click();

} );

await page.getByRole( 'button', { name: 'Advanced' } ).click();
const select = page.getByLabel( 'Behavior' );
Copy link
Member

Choose a reason for hiding this comment

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

Try getByRole with parent locator here too?

Suggested change
const select = page.getByLabel( 'Behavior' );
const select = editorSettings.getByRole( 'combobox', { name: 'Behavior' } );

const select = page.getByLabel( 'Behavior' );

// By default, no behaviors should be selected.
await expect( select ).toHaveCount( 1 );
Copy link
Member

Choose a reason for hiding this comment

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

This isn't needed as a locator is strict by default.

await expect( select ).toHaveValue( '' );

// By default, you should be able to select the Lightbox behavior.
const options = select.locator( 'option' );
Copy link
Member

Choose a reason for hiding this comment

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

Ditto. Try getByRole instead?

Suggested change
const options = select.locator( 'option' );
const options = select.getByRole( 'option' );

await page.getByRole( 'button', { name: 'Advanced' } ).click();

// No behaviors dropdown should be present.
await expect( page.getByLabel( 'Behavior' ) ).toHaveCount( 0 );
Copy link
Member

Choose a reason for hiding this comment

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

A more readable and explicit assertion might be:

Suggested change
await expect( page.getByLabel( 'Behavior' ) ).toHaveCount( 0 );
await expect( locator ).toBeHidden();

@michalczaplinski
Copy link
Contributor Author

@SantosGuillamot Thank you for testing thorougly 🙏

  • I think we might need a "Reset" button to remove the lightbox from the block attributes and listen to the default value from the theme/Gutenberg. At this moment, if I select "Lightbox" from the Editor UI, there is no way to go back to the default value. I can change the attribute to "No behaviors", but it is not the same as listening to the default. This is something many styles are using for example.
  • We might need to add the behaviors property to the schemas.
  • I didn't test it, but I guess that, in the future when there are more behaviors, if settings.blocks.core/image.behaviors.lightbox is false, it shouldn't appear in the dropdown list but it shouldn't remove the whole list of behaviors.

Agreed on all 3 points. I ll work on this in a follow up PR.

@SantosGuillamot SantosGuillamot removed the request for review from tellthemachines May 24, 2023 17:35
@michalczaplinski michalczaplinski merged commit 03751d9 into trunk May 24, 2023
50 checks passed
@michalczaplinski michalczaplinski deleted the behaviors-ui branch May 24, 2023 21:02
@github-actions github-actions bot added this to the Gutenberg 15.9 milestone May 24, 2023
@cbravobernal cbravobernal removed the [Status] In Progress Tracking issues with work in progress label May 24, 2023
@michalczaplinski
Copy link
Contributor Author

@kevin940726 Thanks for your comments! @Mamaduka has implemented the improvements you suggested, and I've just merged them 🙂 .

@michalczaplinski
Copy link
Contributor Author

I've filed the backport for WP 6.3 here: WordPress/wordpress-develop#4526

@ramonjd ramonjd removed the Backport to WP Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label May 31, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Interactivity API API to add frontend interactivity to blocks. [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. [Type] New API New API to be used by plugin developers or package users.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet