Skip to content
This repository has been archived by the owner on Feb 23, 2024. It is now read-only.

Implement Fixed image and Repeated image media controls for the Featured Product #6344

Merged
merged 16 commits into from
May 18, 2022

Conversation

albarin
Copy link
Contributor

@albarin albarin commented Apr 28, 2022

This PR adds the Fixed image and Repeated image media controls for the Featured Product block.

Fixes part of #6235

Testing

How to test the changes in this Pull Request:

  1. Create a new page and add a Featured Product.
  2. On the block settings go to Media Settings and toggle Fixed image and Repeated image and save.
  3. Check the rendered product on the frontend is correct and matches the one on the edit page.
  4. Edit the block again, repeat the steps above with different combinations on Fixed image, Repeated image and any other configuration.

Changelog

Add the Fixed image and Repeated image media controls to the Featured Product block

@albarin albarin force-pushed the add/6235-bg-repeated-image branch from f126738 to 8498c27 Compare April 29, 2022 10:49
@github-actions
Copy link
Contributor

github-actions bot commented Apr 29, 2022

Size Change: +518 B (0%)

Total Size: 873 kB

Filename Size Change
build/all-products.js 33.4 kB -4 B (0%)
build/all-reviews.js 7.8 kB -1 B (0%)
build/attribute-filter.js 13.7 kB -7 B (0%)
build/cart.js 44.3 kB -7 B (0%)
build/checkout.js 45.6 kB -9 B (0%)
build/featured-category.js 13 kB +212 B (+2%)
build/featured-product.js 11.4 kB +190 B (+2%)
build/handpicked-products.js 7.32 kB -4 B (0%)
build/legacy-template.js 2.2 kB +2 B (0%)
build/mini-cart-contents.js 22.7 kB +2 B (0%)
build/price-filter.js 8.72 kB -2 B (0%)
build/product-best-sellers.js 7.42 kB -1 B (0%)
build/product-category.js 8.53 kB -3 B (0%)
build/product-image.js 1.07 kB -2 B (0%)
build/product-new.js 7.71 kB -4 B (0%)
build/product-on-sale.js 8.03 kB -3 B (0%)
build/product-price.js 1.5 kB +2 B (0%)
build/product-rating.js 732 B +1 B (0%)
build/product-sale-badge.js 679 B -1 B (0%)
build/product-search.js 2.18 kB -2 B (0%)
build/product-sku.js 381 B -1 B (0%)
build/product-stock-indicator.js 619 B -1 B (0%)
build/product-summary.js 919 B +1 B (0%)
build/product-tag-list.js 497 B +2 B (0%)
build/product-tag.js 7.84 kB -1 B (0%)
build/product-top-rated.js 7.95 kB -4 B (0%)
build/products-by-attribute.js 8.41 kB -3 B (0%)
build/reviews-by-category.js 11.2 kB -1 B (0%)
build/reviews-by-product.js 12.2 kB -3 B (0%)
build/single-product.js 10 kB +4 B (0%)
build/wc-blocks-style-rtl.css 22.2 kB +83 B (0%)
build/wc-blocks-style.css 22.2 kB +84 B (0%)
build/wc-blocks-vendors.js 71.4 kB -2 B (0%)
build/wc-blocks.js 2.63 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 6.59 kB
build/active-filters.js 7.41 kB
build/all-products-frontend.js 18.1 kB
build/attribute-filter-frontend.js 17.7 kB
build/blocks-checkout.js 17.4 kB
build/cart-blocks/cart-accepted-payment-methods-frontend.js 1.16 kB
build/cart-blocks/cart-express-payment-frontend.js 5.24 kB
build/cart-blocks/cart-items-frontend.js 299 B
build/cart-blocks/cart-line-items--mini-cart-contents-block/products-table-frontend.js 5.27 kB
build/cart-blocks/cart-line-items-frontend.js 433 B
build/cart-blocks/cart-order-summary-frontend.js 1.1 kB
build/cart-blocks/cart-totals-frontend.js 322 B
build/cart-blocks/empty-cart-frontend.js 346 B
build/cart-blocks/filled-cart-frontend.js 783 B
build/cart-blocks/order-summary-coupon-form-frontend.js 2.81 kB
build/cart-blocks/order-summary-discount-frontend.js 2.31 kB
build/cart-blocks/order-summary-fee-frontend.js 273 B
build/cart-blocks/order-summary-heading-frontend.js 454 B
build/cart-blocks/order-summary-shipping--checkout-blocks/order-summary-shipping-frontend.js 6.34 kB
build/cart-blocks/order-summary-shipping-frontend.js 428 B
build/cart-blocks/order-summary-subtotal-frontend.js 273 B
build/cart-blocks/order-summary-taxes-frontend.js 433 B
build/cart-blocks/proceed-to-checkout-frontend.js 1.15 kB
build/cart-frontend.js 45.5 kB
build/checkout-blocks/actions-frontend.js 1.41 kB
build/checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 4.12 kB
build/checkout-blocks/billing-address-frontend.js 889 B
build/checkout-blocks/contact-information-frontend.js 2.83 kB
build/checkout-blocks/express-payment-frontend.js 5.53 kB
build/checkout-blocks/fields-frontend.js 345 B
build/checkout-blocks/order-note-frontend.js 1.07 kB
build/checkout-blocks/order-summary-cart-items-frontend.js 3.67 kB
build/checkout-blocks/order-summary-coupon-form-frontend.js 2.96 kB
build/checkout-blocks/order-summary-discount-frontend.js 2.43 kB
build/checkout-blocks/order-summary-fee-frontend.js 275 B
build/checkout-blocks/order-summary-frontend.js 1.11 kB
build/checkout-blocks/order-summary-shipping-frontend.js 603 B
build/checkout-blocks/order-summary-subtotal-frontend.js 273 B
build/checkout-blocks/order-summary-taxes-frontend.js 432 B
build/checkout-blocks/payment-frontend.js 7.84 kB
build/checkout-blocks/shipping-address-frontend.js 995 B
build/checkout-blocks/shipping-methods-frontend.js 4.71 kB
build/checkout-blocks/terms-frontend.js 1.22 kB
build/checkout-blocks/totals-frontend.js 326 B
build/checkout-frontend.js 47.7 kB
build/mini-cart-component-frontend.js 16.6 kB
build/mini-cart-contents-block/empty-cart-frontend.js 364 B
build/mini-cart-contents-block/filled-cart-frontend.js 230 B
build/mini-cart-contents-block/footer--mini-cart-contents-block/products-table-frontend.js 4.69 kB
build/mini-cart-contents-block/footer-frontend.js 5.63 kB
build/mini-cart-contents-block/items-frontend.js 225 B
build/mini-cart-contents-block/products-table-frontend.js 289 B
build/mini-cart-contents-block/shopping-button-frontend.js 287 B
build/mini-cart-contents-block/title-frontend.js 366 B
build/mini-cart-frontend.js 1.72 kB
build/mini-cart.js 6.1 kB
build/price-filter-frontend.js 12.5 kB
build/price-format.js 1.19 kB
build/product-add-to-cart--product-button--product-category-list--product-image--product-price--product-r--a0326d00.js 223 B
build/product-add-to-cart--product-button--product-image--product-title.js 2.65 kB
build/product-add-to-cart--product-button.js 565 B
build/product-add-to-cart-frontend.js 6.96 kB
build/product-add-to-cart.js 6.64 kB
build/product-button--product-category-list--product-image--product-price--product-rating--product-sale-b--e17c7c01.js 500 B
build/product-button-frontend.js 1.84 kB
build/product-button.js 1.08 kB
build/product-categories.js 2.78 kB
build/product-category-list-frontend.js 924 B
build/product-category-list.js 501 B
build/product-image-frontend.js 1.84 kB
build/product-price-frontend.js 1.94 kB
build/product-rating-frontend.js 1.15 kB
build/product-sale-badge-frontend.js 1.09 kB
build/product-sku-frontend.js 380 B
build/product-stock-indicator-frontend.js 1.03 kB
build/product-summary-frontend.js 1.33 kB
build/product-tag-list-frontend.js 918 B
build/product-title-frontend.js 1.3 kB
build/product-title.js 909 B
build/reviews-frontend.js 7.02 kB
build/single-product-frontend.js 21.5 kB
build/stock-filter-frontend.js 6.87 kB
build/stock-filter.js 6.93 kB
build/vendors--cart-blocks/cart-line-items--cart-blocks/cart-order-summary--cart-blocks/order-summary-shi--c02aad66-frontend.js 5.26 kB
build/vendors--cart-blocks/cart-line-items--checkout-blocks/order-summary-cart-items--mini-cart-contents---233ab542-frontend.js 3.14 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/billing-address--checkout-blocks/order--5b8feb0b-frontend.js 4.75 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/billing-address--checkout-blocks/order--decc3dc6-frontend.js 20.5 kB
build/vendors--mini-cart-contents-block/footer-frontend.js 6.86 kB
build/vendors--product-add-to-cart-frontend.js 7.53 kB
build/wc-blocks-data.js 9.87 kB
build/wc-blocks-editor-style-rtl.css 4.95 kB
build/wc-blocks-editor-style.css 4.95 kB
build/wc-blocks-google-analytics.js 1.56 kB
build/wc-blocks-middleware.js 930 B
build/wc-blocks-registry.js 2.7 kB
build/wc-blocks-shared-context.js 1.52 kB
build/wc-blocks-shared-hocs.js 1.14 kB
build/wc-blocks-vendors-style-rtl.css 1.28 kB
build/wc-blocks-vendors-style.css 1.28 kB
build/wc-payment-method-bacs.js 816 B
build/wc-payment-method-cheque.js 811 B
build/wc-payment-method-cod.js 909 B
build/wc-payment-method-paypal.js 837 B
build/wc-settings.js 2.61 kB

compressed-size-action

@albarin albarin added type: enhancement The issue is a request for an enhancement. focus: components Work that introduces new or updates existing components. block: featured product Issues related to the Featured Product block. labels Apr 29, 2022
@albarin albarin changed the title Add/6235 bg repeated image Implement Fixed image and Repeated image media controls for the Featured Product Apr 29, 2022
@albarin albarin marked this pull request as ready for review April 29, 2022 13:50
@albarin albarin requested a review from sunyatasattva April 29, 2022 13:50
@albarin albarin force-pushed the add/6235-bg-repeated-image branch 2 times, most recently from 75dc0e4 to dd9338b Compare May 4, 2022 08:03
@sunyatasattva
Copy link
Contributor

While testing I have encountered this weird behavior:

I have an image that's relatively smaller than its container. I change the background to “Fixed” and the focal point is reset to the center. However, the image gets thrown to the top left corner.

Clicking around the focal point picker, allows me to restore the image location.

Screen.Recording.2022-05-05.at.17.58.45.mov

Another issue:

  1. Have a smaller image
  2. Set the image to fixed
  3. Set the image fit to “Cover”

I expect the image to be stretched so it covers the available container. However, it gets stretched much larger.

Copy link
Contributor

@sunyatasattva sunyatasattva left a comment

Choose a reason for hiding this comment

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

Commented above regarding my testing results

@albarin
Copy link
Contributor Author

albarin commented May 6, 2022

Thanks for the review @sunyatasattva

I have an image that's relatively smaller than its container. I change the background to “Fixed” and the focal point is reset to the center. However, the image gets thrown to the top left corner.
Clicking around the focal point picker, allows me to restore the image location.

I just pushed a commit that I think fixes this issue.

I expect the image to be stretched so it covers the available container. However, it gets stretched much larger.

Now that you mention it kind of makes sense, I followed the same behavior that the Cover block has when selecting Fixed image, not sure what's the correct one. 🤔

@albarin albarin requested a review from sunyatasattva May 11, 2022 07:46
Copy link
Contributor

@sunyatasattva sunyatasattva left a comment

Choose a reason for hiding this comment

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

I was testing more on this, and I noticed that neither Fixed nor Repeated options work with duoTone filters. I have no idea if there is a way to make them work, honestly. But we should do some research on that and then perhaps follow up with someone to see what to do about it. We can either:

  1. Not implement fixed/repeated options
  2. Find a workaround that's not too performance intensive
  3. Add a notice after the settings about duotone not working
  4. Disabling duotone entirely from the toolbar when either of those options are active

Now that you mention it kind of makes sense, I followed the same behavior that the Cover block has when selecting Fixed image, not sure what's the correct one. 🤔

Is there an easy way to try out stretching the image only until it covers the container? Otherwise, I'll leave the decision on this up to you. While testing several cases, this seemed really weird behavior for me, but I'm open to your opinion.

@albarin
Copy link
Contributor Author

albarin commented May 13, 2022

I was testing more on this, and I noticed that neither Fixed nor Repeated options work with duoTone filters.

Good catch! I just pushed a couple of commits to fix it. I've tested all the cases I could think of and everything seems to be working as before the fix 🤞

Is there an easy way to try out stretching the image only until it covers the container? Otherwise, I'll leave the decision on this up to you. While testing several cases, this seemed really weird behavior for me, but I'm open to your opinion.

I've been researching a bit about it and it seems there's an issue with background-size: cover and background-attachment: fixed, check: https://stackoverflow.com/questions/21786272/css-background-size-cover-background-attachment-fixed-clipping-background-im
I've tried some of the suggestions, but it does not seems to work quite like expected, I'm not very good at CSS though, maybe you'd have some better idea? 🤔

@albarin albarin requested a review from sunyatasattva May 13, 2022 13:25
@albarin albarin force-pushed the add/6235-bg-repeated-image branch from ab27159 to d071d8a Compare May 16, 2022 07:39
Copy link
Contributor

@sunyatasattva sunyatasattva left a comment

Choose a reason for hiding this comment

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

Duotone is fixed! Nice job! I'm approving, as I don't want to be an absolute pain on this issue, and everything works correctly.

However, the background issue is still bothering me a bit. Your link was an excellent find to explain what was happening.

I played around a bit, and I don't think it's worth adding JS to fix this issue as we can have a big impact on the performance of the page (we don't know how many of these blocks are people going to add in one page after all). What do you think?

While playing around I thought of a solution that could be viable, if you want to experiment a bit.

So, the issue in a nutshell is that when you tell a background to be fixed, its context will be calculated with the entire viewport: so the cover instruction essentially means to cover the entire viewport and not the wrapper container.

So, one way around it, would be to emulate the behavior of cover ourselves. So, instead of using background-size: cover, we calculate the dimensions of the container and hardcode that in the background-size (similarly to what we do with background-position).

Yes, this is a JS solution, but it's not a very expensive one, as we only need to do it as the user is editing the block, and then the front end should be able to render everything correctly via the PHP, causing no performance issues.

Oh, and last thing, again optional as I don't want to block this PR any longer: when choosing Fixed background option, the tag is transformed to a div, making the alt attribute useless. When I check Repeated background the alt option disappears from the sidebar, but it doesn't when I used the fixed one.

Both of these comments are optional, feel free to merge it if you are happy with the current state. None of it is a big deal.

@github-actions github-actions bot added this to the 7.7.0 milestone May 16, 2022
@albarin
Copy link
Contributor Author

albarin commented May 18, 2022

@sunyatasattva I've hidden the alt textarea for Fixed background, good catch 👍

I've been trying your idea for cover but couldn't make it fully work, so I think for now we can proceed with this PR as is now, I don't want to delay it even more. Thanks for the reviews!

@sunyatasattva
Copy link
Contributor

Thank you for trying! I don't even know if it was a good idea. ¯_(ツ)_/¯ I've already approved the PR so you can proceed with the merge as far as I'm concerned.

@albarin albarin force-pushed the add/6235-bg-repeated-image branch from 578e665 to b6e4bf2 Compare May 18, 2022 13:18
@albarin albarin merged commit 1baee89 into trunk May 18, 2022
@albarin albarin deleted the add/6235-bg-repeated-image branch May 18, 2022 14:08
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
block: featured product Issues related to the Featured Product block. focus: components Work that introduces new or updates existing components. type: enhancement The issue is a request for an enhancement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants