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

[WIP] Add block elements interactivity states #41383

Closed
wants to merge 10 commits into from

Conversation

getdave
Copy link
Contributor

@getdave getdave commented May 26, 2022

What?

Screen Shot 2022-05-26 at 21 02 06

Exploratory PR to add basic interactivity states to links via the block UI. Builds on great work from @draganescu in #41331 and long term it will look to close #27075 (or at least address some part of it) and ultimately also #38277.

Why?

We need to explore whether the proposed elements syntax of

"link:hover": {
	"color": {
		"text": "red"
	}
}

...is going to be the most appropriate. We also need to stress test the limitations of the current system to check how much work is involved in getting this feature to land.

How?

This is currently a lot of copy/paste to get

  • UI controls (i.e. a way to set the :hover state on a link using the UI).
  • Persisting of save props
  • Rendering of corresponding front end styles.

Currently it's very basic and we'd need to do some refactoring to make the code more generic and robust.

Testing Instructions

  • New Post
  • Add paragraph block and add a link inside it.
  • Use the paragraph block inspector controls to set link and link:hover colors via the UI.
  • Check that mouseover on the anchor produces the expected color on :hover.
  • Publish.
  • Check the same thing happens on the front of the site.

Screenshots or screencast

Screen.Capture.on.2022-05-26.at.20-54-58.mov

@getdave getdave self-assigned this May 26, 2022
@getdave getdave requested a review from draganescu May 26, 2022 19:55
@github-actions
Copy link

github-actions bot commented May 26, 2022

Size Change: +1.07 kB (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-editor/index.min.js 151 kB +476 B (0%)
build/block-editor/style-rtl.css 14.6 kB -14 B (0%)
build/block-editor/style.css 14.6 kB -13 B (0%)
build/block-library/blocks/cover/editor-rtl.css 676 B +130 B (+24%) 🚨
build/block-library/blocks/cover/editor.css 680 B +133 B (+24%) 🚨
build/block-library/blocks/file/style-rtl.css 252 B -3 B (-1%)
build/block-library/blocks/file/style.css 253 B -2 B (-1%)
build/block-library/blocks/search/style-rtl.css 402 B +5 B (+1%)
build/block-library/blocks/search/style.css 403 B +5 B (+1%)
build/block-library/editor-rtl.css 10.3 kB +81 B (+1%)
build/block-library/editor.css 10.3 kB +78 B (+1%)
build/block-library/index.min.js 181 kB +260 B (0%)
build/block-library/style-rtl.css 11.6 kB +4 B (0%)
build/block-library/style.css 11.6 kB +4 B (0%)
build/blocks/index.min.js 47.1 kB +12 B (0%)
build/components/index.min.js 227 kB -2 B (0%)
build/edit-site/index.min.js 48 kB +57 B (0%)
build/editor/index.min.js 38.4 kB -39 B (0%)
build/editor/style-rtl.css 3.66 kB -52 B (-1%)
build/editor/style.css 3.65 kB -54 B (-1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 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-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 150 B
build/block-library/blocks/audio/editor.css 150 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/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 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 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 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 103 B
build/block-library/blocks/code/style.css 103 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 406 B
build/block-library/blocks/columns/style.css 406 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 127 B
build/block-library/blocks/comment-template/style.css 127 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 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
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 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/view.min.js 353 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 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 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 333 B
build/block-library/blocks/group/editor.css 333 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 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 738 B
build/block-library/blocks/image/editor.css 737 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 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 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 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 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/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 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 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.95 kB
build/block-library/blocks/navigation/style.css 1.94 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 395 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 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 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 495 B
build/block-library/blocks/post-comments-form/style.css 495 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 628 B
build/block-library/blocks/post-comments/style.css 628 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 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/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 323 B
build/block-library/blocks/post-template/style.css 323 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 80 B
build/block-library/blocks/post-title/style.css 80 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 370 B
build/block-library/blocks/pullquote/style.css 370 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 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 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 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/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 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 233 B
build/block-library/blocks/separator/style.css 233 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 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 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 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 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 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 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 561 B
build/block-library/blocks/video/editor.css 563 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 993 B
build/block-library/common.css 990 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/style-rtl.css 13.9 kB
build/components/style.css 13.9 kB
build/compose/index.min.js 11.7 kB
build/core-data/index.min.js 14.6 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.4 kB
build/customize-widgets/style.css 1.4 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.98 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.3 kB
build/edit-post/style-rtl.css 7.08 kB
build/edit-post/style.css 7.08 kB
build/edit-site/style-rtl.css 7.73 kB
build/edit-site/style.css 7.71 kB
build/edit-widgets/index.min.js 16.4 kB
build/edit-widgets/style-rtl.css 4.4 kB
build/edit-widgets/style.css 4.4 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.07 kB
build/nux/style-rtl.css 744 B
build/nux/style.css 741 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 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.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.2 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@getdave getdave changed the title Try/block supports interactivity states [WIP] Add block elements interactivity states May 26, 2022
@ramonjd
Copy link
Member

ramonjd commented May 30, 2022

We need to explore whether the proposed elements syntax of ...is going to be the most appropriate.

Do folks have thoughts on how (or even if) we'd style elements and blocks using pseudo-classes in the future?

I'm mainly thinking of whether we'd want to open this up to more elements and properties under :hover and even :focus later.

"h1:hover": {
	"color": {
		"text": "red",
		"background": "blue",
	},
	"border": {
		"width": "1px",
		"color": "green",
	},
}

This could complicate the UI further, granted. Some of the design proposals over in the navigation issue appear instructive.

@draganescu
Copy link
Contributor

@ramonjd I think if the theme.json format allows for it, in code we could style any element. The duplication introduced in this PR is a basis to figure out the best way to abstract applying these states configurations to a select list of items (elements and blocks, but not all of them).

Similarly, in the UI we'll probably not offer all the options. It depends on how unintrusive the result will be. Some of the proposals from #38277 (comment) in #38277 are well suited for a big number or things supporting "states".

@getdave
Copy link
Contributor Author

getdave commented Jun 1, 2022

I'm mainly thinking of whether we'd want to open this up to more elements and properties under :hover and even :focus later.

@ramonjd Basically I agree we will want to support pseudo classes on more elements. I don't think we'll look at this on elements which by default are not focusable or interactive (e.g. h1) as I believe this creates a11y issues.

I did originally try to refactor this PR to support more elements and not just the link. But it was getting complex quickly so we decided duplication was preferable for a first pass. We should revisit this to extend the feature in future.

@draganescu draganescu force-pushed the try/block-supports-interactivity-states branch from 506476c to 9435626 Compare June 1, 2022 12:21
@ramonjd
Copy link
Member

ramonjd commented Jun 1, 2022

Thanks for the info @getdave

Basically I agree we will want to support pseudo classes on more elements. I don't think we'll look at this on elements which by default are not focusable or interactive (e.g. h1) as I believe this creates a11y issues.

Ah ya, good call. I just pulled h1 out of my hat, but buttons etc would be a nice addition.

I did originally try to refactor this PR to support more elements and not just the link. But it was getting complex quickly so we decided duplication was preferable for a first pass. We should revisit this to extend the feature in future.

Fair enough, my interest lies above all in the model, the "link:hover" : { ...props }, as it's something the style engine will have to support.

I think so long as the sub-properties don't deviate from our current style tree model things will be dandy.

By "sub-properties" I mean everything under "link:hover"

"link:hover": {
	"color": {
		"text": "red"
	}
}

@draganescu draganescu force-pushed the try/block-supports-interactivity-states branch from 9435626 to 0067052 Compare June 6, 2022 12:42
@ramonjd
Copy link
Member

ramonjd commented Jun 8, 2022

The duplication introduced in this PR is a basis to figure out the best way to abstract applying these states configurations to a select list of items (elements and blocks, but not all of them).

Thanks for the explanation.

The style engine will have to take care of dealing with the model, but I get the feeling that processing css for a single element at once will be preferable, rather than treating link and link:hover as separate "elements".

Especially if we ever want to consolidate styles rather than print n number of individual inline style tags.

To me having additional pseudo classes as top-level elements doesn't fit well with the concept of a "elements", rather they are states of elements.

So if we decide to support :disabled, :target or any other number of pseudo classes it might become tricky.

I did originally try to refactor this PR to support more elements and not just the link. But it was getting complex quickly so we decided duplication was preferable for a first pass. We should revisit this to extend the feature in future.

I feel you! 😄

My go-to model would be { link: { color: {}, background: {}, ':hover': { color: {} … } } but that will bring about a deeply-nested model so, not insurmountable, but yeah, it's a big challenge to get something that's readable and performant.

I suppose I'm just trying to imagine:

  1. An accessible way of categorizing these states
  2. What would life would be like if had more pseudo classes.

Sorry if I'm throwing sticks in the spokes. I agree it's very complex.

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Nice work progressing this forward @getdave and @draganescu! It'll be great to add in support for pseudo classes, and finding a minimal path forward is a really good idea, as the discussion can get complex quite quickly. I love the designs in #38277 (comment), but I agree in the shorter-term, coming up with a simpler UI / living with a bit of duplication, sounds like a pragmatic first step.

I think before getting there, though, while we can continue to iterate on the UI, it'd be good to come up with a data model that we feel will be unlikely to change, and will make it easier for us to extend and add support for both additional elements / blocks, and additional pseudo classes and other features. The goal would be to ensure that when we go to extend the feature, the data in block attributes is already in a friendly shape to extend (so we can avoid having to migrate block attributes when we go to make changes).

For example, rather than creating a new element of a:hover, what if we allowed additional levels of nesting for pseudo-classes or other selectors:

"link": {
  "color": {
    "text": "red"
  },
  "selectors": {
    ":hover": {
      "color": {
        "text": "blue"
      }
    }
  }
}

With the above, we'd then defer to the style engine to iterate over the selectors or pseudo classes, to then output the correctly concatenated rules.

Some of the things I think we'd be likely to want to explore in the future could include:

  • Adding a transition prop so that hover states can be faded / transitioned to — I think it might make more semantic sense for these sorts of related values to all be within the one "element" rather than treating the pseudo-class state as a separate element
  • Implementing other pseudo-classes, for example :disabled on form fields, or visited links, etc

One potential benefit of using a child selector key is that it could also be something generic that might help get us closer to supporting blocks with complex color requirements (e.g. it could potentially open up being able to target different elements of the Table block for individual color controls, but that's a little off topic to this PR 🙂)

What do you think?

@ramonjd
Copy link
Member

ramonjd commented Jun 8, 2022

rather than creating a new element of a:hover, what if we allowed additional levels of nesting for pseudo-classes or other selectors:

I'm attracted to this idea, platonically for now, but who knows.... 😄 It would inform us that there are additional sub-properties available without having to walk through the entire element object.

Nice!

@draganescu draganescu self-assigned this Jun 8, 2022
@draganescu
Copy link
Contributor

If we're going for nested syntax, I think we should be explicit and simple and let the system work it out. By that I mean the syntax would be more in line to:

"link": {
  "color": {
    "text": "red"
  },
  "states": {
    "hover": {
      "color": {
        "text": "blue"
      }
    }
  }
}

No colon, states instead of selectors.

@andrewserong
Copy link
Contributor

If we're going for nested syntax, I think we should be explicit and simple and let the system work it out.

That sounds like a good path forward to me, @draganescu! I quite like states as a key, and the idea of dropping the : is good, too, so that we can have a controlled list of states that we support instead of arbitrary selectors 👍

That nested approach also plays nicely with a long-term wishlist idea of a transition block support, so we might be able to style a button with a smooth transition to a gold background and inverted text color with an object like the following:

"button": {
  "color": {
    "text": "darkgoldenrod",
    "background": "white"
  },
  "transition": {
    "duration": "0.3s"
  },
  "states": {
    "hover": {
      "color": {
        "text": "white",
        "background": "darkgoldenrod"
      }
    }
  }
}

Happy to help review any follow-ups!

@ramonjd
Copy link
Member

ramonjd commented Jun 9, 2022

I've had rough stab at outputting the elements + states css model proposed above over at #41619

@getdave
Copy link
Contributor Author

getdave commented Jun 10, 2022

Catching up here after various AFK and other ongoing work distracting me.

I like the new data model. It's instructive to see how proposing a simple option upfront has allowed us to visualise the flaws with the approach and iterate towards the nested state model 👏

We can probably close out this branch at this point - what do you think @draganescu?

@getdave
Copy link
Contributor Author

getdave commented Jun 14, 2022

Closing in favour of #41708

@getdave getdave closed this Jun 14, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Consider a standardized way to modify hover/focus/active states for blocks
4 participants