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

ResponsiveWrapper: use aspect-ratio CSS prop and support SVG elements #48573

Merged
merged 6 commits into from
Mar 7, 2023

Conversation

ciampo
Copy link
Contributor

@ciampo ciampo commented Feb 28, 2023

What?

Alternative approach to #48307
Fixes #48184, #5477

For more context: #20892

Instead of using useResizeObserver, use the CSS aspect-ratio prop and the width and max-width properties to style the child element of the ResponsiveWrapper component

Why?

This approach has a few advantages over the current approach in trunk:

  • it supports sizing SVG elements, even when naturalWidth and naturalHeight props are not passed
  • it fixes a bug where an img tag would grow without respecting its aspect ratio when the browser's viewport would be greater than the image width
  • it's more performant, since it relies on the native browser calculations instead of the useResizeObserver hook

How?

Testing Instructions

Testing Instructions for Keyboard

Screenshots or screencast

@ciampo
Copy link
Contributor Author

ciampo commented Feb 28, 2023

@aaronrobertshaw and @tomdevisser , can you have a quick look at this PR and let me know if this approach looks promising to you, as an alternative to #48307 ?

If it looks promising, I can refine the PR and mark it ready for review.

Thank you!

@github-actions
Copy link

github-actions bot commented Feb 28, 2023

Size Change: -25 B (0%)

Total Size: 1.34 MB

Filename Size Change
build/components/index.min.js 208 kB -1 B (0%)
build/components/style-rtl.css 11.6 kB -12 B (0%)
build/components/style.css 11.7 kB -12 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 197 kB
build/block-editor/style-rtl.css 14.4 kB
build/block-editor/style.css 14.4 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 138 B
build/block-library/blocks/audio/theme.css 138 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 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 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 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 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 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 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 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 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 265 B
build/block-library/blocks/file/style.css 265 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 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 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 830 B
build/block-library/blocks/image/editor.css 829 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 137 B
build/block-library/blocks/image/theme.css 137 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 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/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 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 447 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 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 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 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 282 B
build/block-library/blocks/post-template/style.css 282 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-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 326 B
build/block-library/blocks/pullquote/style.css 325 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 463 B
build/block-library/blocks/query/editor.css 463 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 409 B
build/block-library/blocks/search/style.css 406 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 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 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 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 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 404 B
build/block-library/blocks/template-part/editor.css 404 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 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.6 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 201 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.7 kB
build/block-library/style.css 12.7 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.2 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.58 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.8 kB
build/edit-post/style-rtl.css 7.53 kB
build/edit-post/style.css 7.52 kB
build/edit-site/index.min.js 64.2 kB
build/edit-site/style-rtl.css 10.1 kB
build/edit-site/style.css 10.1 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.55 kB
build/edit-widgets/style.css 4.55 kB
build/editor/index.min.js 45.7 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 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.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 937 B
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 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.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Thanks for putting together this alternate approach @ciampo 👍

I like the removal of the resize observer and the overall simplification of the component. Nice work!

For the SVG to scale and be contained within the wrapper it needs the viewbox and preserveAspectRatio attributes. Would there be any benefit in noting that in the component's readme? It's not really the wrapper's responsibility but I'm not sure where else we might be able to flag that.

Given this PR's approach covers the vast majority of use cases and provides a performance bump, I think we should move forward with it.

@tomdevisser
Copy link
Member

@ciampo This looks great, I really disliked the padding-bottom solution, but am too new to this project to just remove it cause I thought it might break with certain use cases or give backwards compat issues. But I'm all for this approach.

@ciampo
Copy link
Contributor Author

ciampo commented Feb 28, 2023

to just remove it cause I thought it might break with certain use cases or give backwards compat issues

This is still very much a possibility at this point, we should make sure we give this PR a good round of testing!

The aspect-ratio CSS property should be supported by evergreen browsers, but we should make sure that there aren't any quirks across browsers nonetheless.

@ciampo ciampo self-assigned this Feb 28, 2023
@ciampo ciampo added [Package] Components /packages/components [Type] Bug An existing feature does not function as intended labels Feb 28, 2023
@ciampo ciampo requested a review from Mamaduka February 28, 2023 08:49
@ciampo ciampo force-pushed the feat/responsive-wrapper-SVG branch from d388cbe to 5382c98 Compare February 28, 2023 08:56
@ciampo ciampo marked this pull request as ready for review February 28, 2023 08:57
@ciampo ciampo requested a review from ajitbohra as a code owner February 28, 2023 08:57
@tomdevisser
Copy link
Member

tomdevisser commented Feb 28, 2023

Screenshot 2023-02-28 at 10 03 49 AM

@ciampo It looks like it is breaking at this moment when using my SVG. I'll attach the SVG here so you can use it for testing as well. It is one exported by Adobe Illustrator, so a format that'll be used a lot.

STRL-illustratie-home

Here's the SVG code
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 900 900" style="enable-background:new 0 0 900 900;" xml:space="preserve">
<style type="text/css">
	.st0{fill:none;stroke:#48B3C3;stroke-width:2;stroke-miterlimit:10;}
	.st1{fill:#233463;}
	.st2{fill:none;stroke:#47B3C2;stroke-width:2;stroke-miterlimit:10;}
	.st3{fill:#233463;stroke:#233463;stroke-miterlimit:10;stroke-dasharray:3,3;}
	.st4{fill:none;stroke:#3DDE96;stroke-width:20;stroke-miterlimit:10;}
	.st5{fill:none;stroke:#3DDE96;stroke-width:10;stroke-miterlimit:10;}
	.st6{fill:none;stroke:#47B3C2;stroke-width:20;stroke-miterlimit:10;}
	.st7{fill:#5547C2;stroke:#5547C2;stroke-width:20;stroke-miterlimit:10;}
	.st8{fill:#5547C2;}
	.st9{fill:#48B3C3;}
	.st10{fill:#EADCB7;}
	.st11{fill:#48B3C3;stroke:#47B3C2;stroke-width:2;stroke-miterlimit:10;}
	.st12{fill:none;stroke:#47B3C2;stroke-width:10;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;}
	.st13{fill:#5547C2;stroke:#5547C2;stroke-width:2;stroke-miterlimit:10;}
	.st14{fill:#FFFFFF;}
</style>
<g id="telefoon_00000066511502816463074380000008132361456483293328_">
	<polygon id="vleugel-rechts" class="st0" points="611.4,543.8 511.6,543.8 511.6,444 	"/>
	<polygon id="vleugel-links" class="st0" points="64.8,543.8 164.6,543.8 164.6,444 	"/>
	<line id="lijn1" class="st0" x1="292.5" y1="732" x2="292.5" y2="790.9"/>
	<line id="lijn2" class="st0" x1="336.5" y1="761.5" x2="336.5" y2="861.8"/>
	<line id="lijn3" class="st0" x1="379.7" y1="732" x2="379.7" y2="816.4"/>
	<g id="telefoon">
		<path class="st1" d="M214.6,103.8h247c27.6,0,50,22.4,50,50v494c0,27.6-22.4,50-50,50h-247c-27.6,0-50-22.4-50-50v-494
			C164.6,126.2,187,103.8,214.6,103.8z"/>
		<path class="st2" d="M214.6,103.8h247c27.6,0,50,22.4,50,50v494c0,27.6-22.4,50-50,50h-247c-27.6,0-50-22.4-50-50v-494
			C164.6,126.2,187,103.8,214.6,103.8z"/>
	</g>
</g>
<g id="check_00000073696027167775002740000001036711625665836726_">
	<g id="check">
		<circle class="st3" cx="164.4" cy="697.8" r="56.9"/>
		<path class="st4" d="M164.4,754.7c-31.4,0-56.9-25.5-56.9-56.9s25.5-56.9,56.9-56.9"/>
		<path class="st4" d="M164.6,640.9c31.4,0,56.9,25.5,56.9,56.9c0,31.4-25.5,56.9-56.9,56.9"/>
		<polyline class="st5" points="142.6,694.1 158.4,709.9 184.6,683.7 		"/>
	</g>
</g>
<g id="grafiek">
	<g id="grafiek1">
		<line id="Line_37_79_" class="st6" x1="654.2" y1="305.5" x2="654.2" y2="445.6"/>
	</g>
	<g id="grafiek2">
		<line id="Line_37_78_" class="st7" x1="717.4" y1="218.8" x2="717.4" y2="445.6"/>
	</g>
	<g id="grafiek3">
		<line id="Line_37_77_" class="st6" x1="780.6" y1="347.7" x2="780.6" y2="445.6"/>
	</g>
</g>
<g id="content">
	<g id="foto_kader">
		<path class="st8" d="M338.1,421.8L338.1,421.8c-61,0-110.5-49.5-110.5-110.5v0c0-61,49.5-110.5,110.5-110.5h0
			c61,0,110.5,49.5,110.5,110.5v0C448.6,372.3,399.1,421.8,338.1,421.8z"/>
		<path class="st8" d="M448.2,421.4"/>
		<path class="st8" d="M227.2,200.4"/>
		<path class="st8" d="M227.2,421.4"/>
		<path class="st8" d="M448.2,200.4"/>
	</g>
	<path id="lichaam" class="st9" d="M337.7,328.7c-37.1,0-70,18.3-90,46.4c20,28.1,52.9,46.4,90,46.4l0,0c37.1,0,70-18.3,90-46.4
		C407.7,347,374.8,328.7,337.7,328.7L337.7,328.7z"/>
	<g id="gezicht">
		<ellipse id="Ellipse_60_18_" class="st10" cx="337.6" cy="301" rx="46.7" ry="46.7"/>
		<path id="Ellipse_60_17_" class="st1" d="M348.5,328.3c0,5.9-4.8,10.8-10.8,10.8c-5.9,0-10.8-4.8-10.8-10.8H348.5z"/>
		<path class="st1" d="M380.7,282.8c-7.1-16.8-23.7-28.5-43-28.5c-19.4,0-36,11.8-43,28.5H380.7z"/>
	</g>
	<ellipse id="home" class="st11" cx="337.7" cy="650" rx="20.1" ry="20.1"/>
	<line id="tekstregel_1" class="st12" x1="287.6" y1="454.8" x2="388.6" y2="454.8"/>
	<line id="tekstregel_2" class="st12" x1="315.6" y1="488.8" x2="359.6" y2="488.8"/>
	<g id="button">
		<g>
			<rect x="287.6" y="520.8" class="st13" width="101" height="35"/>
			<path class="st2" d="M388.6,555.7"/>
			<path class="st2" d="M287.7,520.4"/>
			<path class="st2" d="M287.7,555.7"/>
			<path class="st2" d="M388.6,520.4"/>
		</g>
		<g>
			<path class="st14" d="M308.6,543.5c-0.6,0-1.1,0-1.7-0.1c-0.6,0-1.2-0.1-1.8-0.2V533c0.5-0.1,1-0.2,1.6-0.2
				c0.6,0,1.1-0.1,1.6-0.1c0.7,0,1.3,0,1.8,0.1c0.6,0.1,1,0.3,1.4,0.5c0.4,0.2,0.7,0.5,0.9,0.9c0.2,0.4,0.3,0.8,0.3,1.4
				c0,0.8-0.4,1.5-1.2,2c0.7,0.3,1.1,0.6,1.4,1c0.2,0.4,0.4,0.9,0.4,1.5c0,1.1-0.4,1.9-1.2,2.5C311.4,543.2,310.2,543.5,308.6,543.5
				z M307.1,536.8h1.2c0.7,0,1.2-0.1,1.6-0.3c0.3-0.2,0.5-0.5,0.5-0.9c0-0.4-0.2-0.7-0.5-0.9c-0.3-0.2-0.8-0.3-1.4-0.3
				c-0.2,0-0.4,0-0.7,0c-0.2,0-0.4,0-0.6,0V536.8z M307.1,538.8v2.7c0.2,0,0.4,0,0.6,0c0.2,0,0.4,0,0.7,0c0.7,0,1.3-0.1,1.7-0.3
				c0.4-0.2,0.7-0.6,0.7-1.1c0-0.5-0.2-0.8-0.5-1c-0.4-0.2-0.9-0.3-1.6-0.3H307.1z"/>
			<path class="st14" d="M320.6,543.5c-0.8,0-1.4-0.1-2-0.3c-0.6-0.2-1-0.5-1.4-0.9c-0.4-0.4-0.6-0.8-0.8-1.3
				c-0.2-0.5-0.3-1.1-0.3-1.7v-6.5h3v6.3c0,0.4,0,0.8,0.1,1.1c0.1,0.3,0.2,0.5,0.4,0.7c0.2,0.2,0.4,0.3,0.6,0.4
				c0.2,0.1,0.5,0.1,0.8,0.1c0.6,0,1.1-0.2,1.5-0.5c0.4-0.4,0.6-1,0.6-1.8v-6.3h2v6.5c0,0.6-0.1,1.2-0.3,1.7c-0.2,0.5-0.5,1-0.8,1.3
				c-0.4,0.4-0.8,0.7-1.4,0.9C322,543.4,321.4,543.5,320.6,543.5z"/>
			<path class="st14" d="M336.1,532.8v2h-3v8h-2v-8h-4v-2H336.1z"/>
			<path class="st14" d="M347.1,532.8v2h-4v8h-2v-8h-3v-2H347.1z"/>
			<path class="st14" d="M359.1,538.1c0,0.9-0.1,1.7-0.4,2.4c-0.3,0.7-0.6,1.3-1.1,1.7c-0.5,0.5-1,0.8-1.7,1s-1.3,0.3-2.1,0.3
				c-0.7,0-1.4-0.1-2-0.3c-0.6-0.2-1.2-0.6-1.7-1c-0.5-0.5-0.8-1-1.1-1.7c-0.3-0.7-0.4-1.5-0.4-2.4c0-0.9,0.1-1.7,0.4-2.4
				c0.3-0.7,0.7-1.3,1.1-1.7c0.5-0.5,1-0.8,1.7-1s1.3-0.3,2-0.3c0.7,0,1.4,0.1,2,0.3s1.2,0.6,1.7,1c0.5,0.5,0.8,1,1.1,1.7
				C358.9,536.4,359.1,537.2,359.1,538.1z M351.1,538.1c0,0.5,0.1,1,0.2,1.4c0.1,0.4,0.3,0.8,0.5,1.1c0.2,0.3,0.5,0.5,0.9,0.7
				c0.3,0.2,0.7,0.2,1.2,0.2c0.4,0,0.8-0.1,1.2-0.2s0.6-0.4,0.9-0.7c0.2-0.3,0.4-0.7,0.5-1.1c0.1-0.4,0.2-0.9,0.2-1.4
				c0-0.5-0.1-1-0.2-1.4c-0.1-0.4-0.3-0.8-0.5-1.1c-0.2-0.3-0.5-0.5-0.9-0.7c-0.3-0.2-0.7-0.2-1.2-0.2c-0.4,0-0.8,0.1-1.2,0.2
				c-0.3,0.2-0.6,0.4-0.9,0.7c-0.2,0.3-0.4,0.7-0.5,1.1C351.1,537.1,351.1,537.6,351.1,538.1z"/>
			<path class="st14" d="M369,543.8c-0.7-1.3-1.5-2.5-2.3-3.7c-0.8-1.2-1.7-2.4-2.6-3.5v7.2h-2v-11h2c0.3,0.3,0.7,0.8,1.2,1.3
				c0.4,0.5,0.9,1.1,1.3,1.6s0.9,1.2,1.3,1.8c0.4,0.6,0.8,1.2,1.2,1.8v-6.5h2v11H369z"/>
		</g>
	</g>
</g>
</svg>

@github-actions
Copy link

Flaky tests detected in 58c11f6.
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/4291191637
📝 Reported issues:

@ciampo
Copy link
Contributor Author

ciampo commented Mar 6, 2023

Hey @tomdevisser , I was trying to debug the issue that you're reporting, but I can't seem to be able to upload SVG images as the post's featured image.

Screenshot 2023-03-06 at 19 25 10

Screenshot 2023-03-06 at 19 27 05

How did you manage to upload it?

@tomdevisser
Copy link
Member

Hey @ciampo , I added a code snippet to the issue!

@ciampo
Copy link
Contributor Author

ciampo commented Mar 6, 2023

Hey @ciampo , I added a code snippet to the issue!

If you refer to the PHP snippet in #48307 (comment), could you please provide more detailed instructions? For example, to which file should a developer add that code snippet?

@tomdevisser
Copy link
Member

tomdevisser commented Mar 7, 2023

could you please provide more detailed instructions?

@ciampo Yes of course. Sorry, was replying on my phone, that's why I referred to the other ticket quickly instead of formatting it here. It is indeed this snippet.

	$t['svg'] = 'image/svg+xml';
	return $t;
}
add_filter( 'upload_mimes', 'toms_mime_types' );```

You can add it anywhere it executes, the easiest place is in your theme's functions.php or in a custom plugin file.

@aaronrobertshaw
Copy link
Contributor

@tomdevisser I can replicate the issue you highlighted above.

Using the sample SVG provided, if I add preserveAspectRatio, width, and height attributes to the <svg> tag, the SVG displays nicely within the featured image preview.

e.g. preserveAspectRatio="xMinYMin meet" width="900" height="900"

Before After
Screenshot 2023-03-07 at 11 14 30 am Screenshot 2023-03-07 at 11 26 30 am

On a separate note, I ran into some weird behaviour when dragging and dropping the SVG into the Media Library. The SVG wouldn't render correctly there. I'm assuming something funky was going on with my local env rather than the SVG itself. Just noting here in case someone else experiences the same while testing this.

Screenshot 2023-03-07 at 11 28 50 am

I wonder if given SVG support is deliberately omitted by default, due to security issues, that makes it a little more of a niche use case. If so, perhaps it is acceptable to require the SVG images used to have defined dimensions and preservation of aspect ratio. Further tweaking and refinement of the behaviour could be considered plugin territory.

While experimenting with various SVGs, I found it quite easy to create a valid SVG that wouldn't render as desired. I'm not sure we'll be able to cover all angles here.

@ciampo
Copy link
Contributor Author

ciampo commented Mar 7, 2023

Thank you @aaronrobertshaw , I actually have the same gut instinct here.

I'd be happy to go ahead and merge this PR specifically for the ResponsiveWrapper component, given that it doesn't introduce regressions with the existing behaviour, and that it adds some basic support for SVG (as far as it has preserveAspectRatio, width and height attributes).

But I'd be cautious in assuming SVG support throughout the editor — as Aaron points out, it could either be a deliberate choice or simply lack of support.

@ciampo ciampo force-pushed the feat/responsive-wrapper-SVG branch from 58c11f6 to 8ec8fa5 Compare March 7, 2023 09:56
@ciampo ciampo force-pushed the feat/responsive-wrapper-SVG branch from 8ec8fa5 to 182e178 Compare March 7, 2023 09:57
@tomdevisser
Copy link
Member

But I'd be cautious in assuming SVG support throughout the editor — as Aaron points out, it could either be a deliberate choice or simply lack of support.

I wonder which one, and the reason behind it, but that might be something for another more general issue. So many platforms can safely handle SVGs, feels like we fall short if we don't given it's often preferred over PNG in terms of scalability, size, etc.

But every step forward helps, so if this can get merged that would be great.

@ciampo ciampo merged commit 83020ae into trunk Mar 7, 2023
@ciampo ciampo deleted the feat/responsive-wrapper-SVG branch March 7, 2023 12:39
@github-actions github-actions bot added this to the Gutenberg 15.4 milestone Mar 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Using SVG as a featured image
3 participants