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

Add global style support to Mini Cart (button) #5100

Merged
merged 16 commits into from
Nov 17, 2021

Conversation

dinhtungdu
Copy link
Member

@dinhtungdu dinhtungdu commented Nov 9, 2021

This is a part of #4965.

This PR:

  • Adds text and background color support to the Mini Cart button.
  • Adds option to set the button transparent (default to true).
  • By default, the text color affects total price, cart amount, and the cart icon color. The badge color doesn't change until the background color is set (black text and border, white background, and box-shadow).
  • When the background color is set, the badge background will change and the box-shadow style will be disabled. The color of badge text/border will inherit the text color as well.

Notes: The current limitation of this PR is global style doesn't work for background.

Updates: The global background support was added using __experimentalSelector. It's possible to not use experimental features but in my discovery, it only works for the PHP side. See this.

Screenshots

Screen.Recording.2021-11-09.at.13.05.53.mov

Testing

How to test the changes in this Pull Request:

Follow the screencast above or:

  1. Check out this and build the assets.
  2. Add Mini Cart block to a page.
  3. Set the text color, see it changes in the Editor.
  4. Set the background color, see it changes in the editor.
  5. Toggle transparent background, see it changes in the editor.
  6. Save the page, see the style on the front-end.
  7. Clear all customization for the block.
  8. Set the global style to Mini Cart block using the Site Editor.
  9. Edit the page created in step one, clear all colors. See the global style applies.
  10. Set text color for the Mini cart block, see the text color change, but the background still inherits from the global style.
  11. Toggle the transparent button option, see it works well with the global style.

User Facing Testing

These are steps for user testing (where "user" is someone interacting with this change that is not editing any code).

  • Same as above

@dinhtungdu dinhtungdu added type: enhancement The issue is a request for an enhancement. focus: global styles Issues that involve styles/css/layout structure. focus: FSE Work related to prepare WooCommerce for FSE. block: mini-cart Issues related to the Mini-Cart block. labels Nov 9, 2021
@dinhtungdu dinhtungdu self-assigned this Nov 9, 2021
@rubikuserbot rubikuserbot requested review from a team and tjcafferkey and removed request for a team November 9, 2021 06:17
@github-actions
Copy link
Contributor

github-actions bot commented Nov 9, 2021

Size Change: +565 B (0%)

Total Size: 1.11 MB

Filename Size Change
build/mini-cart-component-frontend.js 44.6 kB +143 B (0%)
build/mini-cart.js 6.11 kB +386 B (+7%) 🔍
build/wc-blocks-style-rtl.css 21.1 kB +18 B (0%)
build/wc-blocks-style.css 21.1 kB +18 B (0%)
ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 8.18 kB
build/active-filters.js 8 kB
build/all-products-frontend.js 23.4 kB
build/all-products.js 38.3 kB
build/all-reviews.js 9.56 kB
build/atomic-block-components/add-to-cart--atomic-block-components/button--atomic-block-components/image---a7e2bb9b.js 3.19 kB
build/atomic-block-components/add-to-cart--atomic-block-components/button.js 1.81 kB
build/atomic-block-components/add-to-cart-frontend.js 8.34 kB
build/atomic-block-components/add-to-cart.js 7.85 kB
build/atomic-block-components/button-frontend.js 1.74 kB
build/atomic-block-components/button.js 873 B
build/atomic-block-components/category-list-frontend.js 466 B
build/atomic-block-components/category-list.js 469 B
build/atomic-block-components/image-frontend.js 1.71 kB
build/atomic-block-components/image.js 1.36 kB
build/atomic-block-components/price-frontend.js 2.13 kB
build/atomic-block-components/price.js 2.1 kB
build/atomic-block-components/rating-frontend.js 562 B
build/atomic-block-components/rating.js 566 B
build/atomic-block-components/sale-badge-frontend.js 861 B
build/atomic-block-components/sale-badge.js 868 B
build/atomic-block-components/sku-frontend.js 390 B
build/atomic-block-components/sku.js 393 B
build/atomic-block-components/stock-indicator-frontend.js 611 B
build/atomic-block-components/stock-indicator.js 610 B
build/atomic-block-components/summary-frontend.js 907 B
build/atomic-block-components/summary.js 912 B
build/atomic-block-components/tag-list-frontend.js 468 B
build/atomic-block-components/tag-list.js 471 B
build/atomic-block-components/title-frontend.js 1.47 kB
build/atomic-block-components/title.js 1.48 kB
build/attribute-filter-frontend.js 18.1 kB
build/attribute-filter.js 12.1 kB
build/blocks-checkout.js 21.3 kB
build/cart-blocks/accepted-payment-methods-frontend.js 1.39 kB
build/cart-blocks/checkout-button-frontend.js 1.21 kB
build/cart-blocks/empty-cart-frontend.js 348 B
build/cart-blocks/express-payment--checkout-blocks/express-payment--checkout-blocks/payment-frontend.js 4.73 kB
build/cart-blocks/express-payment-frontend.js 1.59 kB
build/cart-blocks/filled-cart-frontend.js 805 B
build/cart-blocks/items-frontend.js 302 B
build/cart-blocks/line-items-frontend.js 5.87 kB
build/cart-blocks/order-summary--checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 3.69 kB
build/cart-blocks/order-summary-frontend.js 7.4 kB
build/cart-blocks/totals-frontend.js 324 B
build/cart-frontend.js 52.6 kB
build/cart.js 50.5 kB
build/checkout-blocks/actions-frontend.js 1.48 kB
build/checkout-blocks/billing-address-frontend.js 2.64 kB
build/checkout-blocks/contact-information-frontend.js 3.62 kB
build/checkout-blocks/express-payment-frontend.js 1.93 kB
build/checkout-blocks/fields-frontend.js 348 B
build/checkout-blocks/order-note-frontend.js 1.25 kB
build/checkout-blocks/order-summary-frontend.js 12.9 kB
build/checkout-blocks/payment-frontend.js 4.28 kB
build/checkout-blocks/shipping-address-frontend.js 2.72 kB
build/checkout-blocks/shipping-methods-frontend.js 5.54 kB
build/checkout-blocks/terms-frontend.js 1.29 kB
build/checkout-blocks/totals-frontend.js 329 B
build/checkout-frontend.js 54.8 kB
build/checkout.js 53.8 kB
build/featured-category.js 7.74 kB
build/featured-product.js 9.43 kB
build/handpicked-products.js 6.27 kB
build/legacy-template.js 2.06 kB
build/mini-cart-frontend.js 2.34 kB
build/price-filter-frontend.js 14.2 kB
build/price-filter.js 9.65 kB
build/price-format.js 1.37 kB
build/product-best-sellers.js 6.62 kB
build/product-categories.js 3.38 kB
build/product-category.js 7.49 kB
build/product-new.js 6.77 kB
build/product-on-sale.js 7.11 kB
build/product-search.js 2.71 kB
build/product-tag.js 6.6 kB
build/product-top-rated.js 6.74 kB
build/products-by-attribute.js 7.71 kB
build/reviews-by-category.js 11.5 kB
build/reviews-by-product.js 13 kB
build/reviews-frontend.js 8.97 kB
build/single-product-frontend.js 26.9 kB
build/single-product.js 10 kB
build/stock-filter-frontend.js 8.62 kB
build/stock-filter.js 7.81 kB
build/vendors--atomic-block-components/add-to-cart--cart-blocks/order-summary--checkout-blocks/billing-ad--c5eb4dcd-frontend.js 16.1 kB
build/vendors--atomic-block-components/add-to-cart-frontend.js 4.77 kB
build/vendors--atomic-block-components/price--cart-blocks/line-items--cart-blocks/order-summary--checkout--8a3571de-frontend.js 5.71 kB
build/vendors--cart-blocks/line-items--checkout-blocks/order-summary-frontend.js 3.14 kB
build/vendors--cart-blocks/order-summary--checkout-blocks/billing-address--checkout-blocks/order-summary---eb4d2cec-frontend.js 5.03 kB
build/wc-blocks-data.js 11.3 kB
build/wc-blocks-editor-style-rtl.css 15.7 kB
build/wc-blocks-editor-style.css 15.7 kB
build/wc-blocks-google-analytics.js 1.98 kB
build/wc-blocks-middleware.js 1.19 kB
build/wc-blocks-registry.js 3.71 kB
build/wc-blocks-shared-context.js 1.54 kB
build/wc-blocks-shared-hocs.js 1.92 kB
build/wc-blocks-vendors-style-rtl.css 1.37 kB
build/wc-blocks-vendors-style.css 1.37 kB
build/wc-blocks-vendors.js 255 kB
build/wc-blocks.js 3.49 kB
build/wc-payment-method-bacs.js 806 B
build/wc-payment-method-cheque.js 806 B
build/wc-payment-method-cod.js 898 B
build/wc-payment-method-paypal.js 839 B
build/wc-payment-method-stripe.js 12.2 kB
build/wc-settings.js 2.91 kB

compressed-size-action

@dinhtungdu dinhtungdu added the skip-changelog PRs that you don't want to appear in the changelog. label Nov 9, 2021
@dinhtungdu dinhtungdu marked this pull request as ready for review November 11, 2021 08:32
@Aljullu Aljullu self-requested a review November 11, 2021 09:24
Copy link
Contributor

@Aljullu Aljullu left a comment

Choose a reason for hiding this comment

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

This is testing great. Good job dealing with the complexities of the Mini Cart block, which is rendered first in PHP and then in JS. 👏

I left some comments/questions below.

assets/js/blocks/cart-checkout/mini-cart/style.scss Outdated Show resolved Hide resolved
@@ -31,6 +31,8 @@ const renderMiniCartFrontend = () => {
getProps: ( el: HTMLElement ) => ( {
isDataOutdated: el.dataset.isDataOutdated,
isInitiallyOpen: el.dataset.isInitiallyOpen === 'true',
backgroundColor: el.dataset.backgroundColor,
Copy link
Contributor

Choose a reason for hiding this comment

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

You will need to define textColor here too, right?

Copy link
Contributor

Choose a reason for hiding this comment

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

Taking another look at this... I wonder if we could read the class names from the elements instead of passing the colors in data attributes. I'm thinking something along these lines:

quantityBadgeClassnames: el.querySelector('.wc-block-mini-cart__quantity-badge').classList

Then, we would just pass that array to the React component so it can apply those classes. This way, we wouldn't need to call getColorClassName() from the JS code, which allows us to avoid one dependency: @wordpress/block-editor. 🙂

Copy link
Member Author

Choose a reason for hiding this comment

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

Thanks so much, it's a great idea!

Copy link
Member Author

@dinhtungdu dinhtungdu Nov 12, 2021

Choose a reason for hiding this comment

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

I update the related components to follow this approach.

assets/js/blocks/cart-checkout/mini-cart/edit.tsx Outdated Show resolved Hide resolved
Comment on lines 1 to 3
.editor-styles-wrapper .wp-block-woocommerce-mini-cart.wc-block-mini-cart {
background-color: transparent !important;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Why is this needed?

Copy link
Member Author

Choose a reason for hiding this comment

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

Oh, I'm sorry, this is from the previous implementation. Thanks for pointing this out!

Copy link
Member Author

Choose a reason for hiding this comment

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

Update: We still need it. The preset style classes in the editor come with !important that override our button style.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah, right, I could reproduce the issue. However, I think that might be a sign that there is something else that we are not doing correctly here. I took a look at the Gutenberg Table block as an example: it also has to apply the background to an inner element (<table>) instead to the wrapper (<figure>); but they don't have this issue.

After some investigation, I think the difference is that they use __experimentalSkipSerialization. Do you think we could use it too?

Copy link
Member Author

Choose a reason for hiding this comment

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

@Aljullu I added __experimentalSkipSerialization in 27a2584 (#5100)

Comment on lines +30 to +31
__experimentalSelector:
'.wc-block-mini-cart__button, .wc-block-mini-cart__badge',
Copy link
Contributor

Choose a reason for hiding this comment

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

Everything seemed to work fine for me when I removed these lines. Why was it needed? 🤔

Copy link
Member Author

Choose a reason for hiding this comment

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

If you remove this, the global style doesn't work correctly. Without this, Gutenberg will add global style to .wp-block-woocommerce-mini-cart instead of the above selectors. This is fine for text color (by inheriting the parent element) but doesn't work for background color.

Copy link
Contributor

Choose a reason for hiding this comment

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

Is the GB team aware that we're using this experimental supports property and why we need to use it? If not, it might be handy to make sure they know somehow so there's awareness of it's usefulness for other projects when it comes time to evaluate graduating it.

Copy link
Member Author

@dinhtungdu dinhtungdu Nov 16, 2021

Choose a reason for hiding this comment

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

@nerrad I'm not sure if they know about it or not. I will add comments explaining why we need them.

Edit: added comments for __experimentalSelector and __experimentalSkipSerialization.

Copy link
Contributor

Choose a reason for hiding this comment

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

Given the discussion in p1637141712378200-slack-C02FL3X7KR6, I think we can go ahead using those __experimental features for now, given that the Mini Cart block is gated to the Feature Plugin.

In the future, while we research global styles in a bigger scale for all blocks, we can get a list of all experimental features we need to use and get in contact with Gutenberg devs to know their plans with them.

src/BlockTypes/MiniCart.php Show resolved Hide resolved
assets/js/blocks/cart-checkout/mini-cart/style.scss Outdated Show resolved Hide resolved
src/BlockTypes/MiniCart.php Show resolved Hide resolved
@dinhtungdu dinhtungdu requested a review from Aljullu November 12, 2021 03:49
Copy link
Contributor

@Aljullu Aljullu 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 updating the PR @dinhtungdu. This is working great, I just left some more comments below, but overall this should be ready to merge. I'm not approving yet because I would like to double-test it once more after the changes are done.

assets/js/blocks/cart-checkout/mini-cart/edit.tsx Outdated Show resolved Hide resolved
assets/js/blocks/cart-checkout/mini-cart/edit.tsx Outdated Show resolved Hide resolved
Comment on lines 1 to 3
.editor-styles-wrapper .wp-block-woocommerce-mini-cart.wc-block-mini-cart {
background-color: transparent !important;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Ah, right, I could reproduce the issue. However, I think that might be a sign that there is something else that we are not doing correctly here. I took a look at the Gutenberg Table block as an example: it also has to apply the background to an inner element (<table>) instead to the wrapper (<figure>); but they don't have this issue.

After some investigation, I think the difference is that they use __experimentalSkipSerialization. Do you think we could use it too?

assets/js/blocks/cart-checkout/mini-cart/style.scss Outdated Show resolved Hide resolved
@github-actions
Copy link
Contributor

Replace `getColorClassName` and manual style manipulation...

Replace `getColorClassName` and manual style manipulation with `useColorProps` once the hook is no longer experimental.


https://github.com/woocommerce/woocommerce-gutenberg-products-block/blob/cd853d4f080a42799f272e72c48d514a3d7d01e0/assets/js/blocks/cart-checkout/mini-cart/edit.tsx#L46-L58

🚀 This comment was generated by the automations bot based on a todo comment in cd853d4 in #5100. cc @dinhtungdu

@github-actions
Copy link
Contributor

Replace `getColorClassName` and manual style manipulation...

Replace `getColorClassName` and manual style manipulation with `useColorProps` once the hook is no longer experimental.


https://github.com/woocommerce/woocommerce-gutenberg-products-block/blob/27a2584e1ba0b2a88581cd13453b65ee12694dc2/assets/js/blocks/cart-checkout/mini-cart/edit.tsx#L46-L58

🚀 This comment was generated by the automations bot based on a todo comment in 27a2584 in #5100. cc @dinhtungdu

Copy link
Contributor

@Aljullu Aljullu left a comment

Choose a reason for hiding this comment

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

Good job in this PR @dinhtungdu! Thanks for investigating and dealing with all the challenges of adding global styles to a block such as the Mini Cart.

I'm pre-approving but left some comments below.

Comment on lines +30 to +31
__experimentalSelector:
'.wc-block-mini-cart__button, .wc-block-mini-cart__badge',
Copy link
Contributor

Choose a reason for hiding this comment

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

Given the discussion in p1637141712378200-slack-C02FL3X7KR6, I think we can go ahead using those __experimental features for now, given that the Mini Cart block is gated to the Feature Plugin.

In the future, while we research global styles in a bigger scale for all blocks, we can get a list of all experimental features we need to use and get in contact with Gutenberg devs to know their plans with them.

assets/js/blocks/cart-checkout/mini-cart/block.tsx Outdated Show resolved Hide resolved
assets/js/blocks/cart-checkout/mini-cart/edit.tsx Outdated Show resolved Hide resolved
assets/js/blocks/cart-checkout/mini-cart/edit.tsx Outdated Show resolved Hide resolved
src/BlockTypes/MiniCart.php Show resolved Hide resolved
@Aljullu Aljullu added this to the 6.4.0 milestone Nov 17, 2021
@github-actions
Copy link
Contributor

Replace `getColorClassName` and manual style manipulation...

Replace `getColorClassName` and manual style manipulation with `useColorProps` once the hook is no longer experimental.


https://github.com/woocommerce/woocommerce-gutenberg-products-block/blob/c323f214b1ca5800ad8c43abd914b35dc9050da6/assets/js/blocks/cart-checkout/mini-cart/edit.tsx#L46-L58

🚀 This comment was generated by the automations bot based on a todo comment in c323f21 in #5100. cc @dinhtungdu

@github-actions
Copy link
Contributor

refactor the logic of color class and style using StyleAt...

refactor the logic of color class and style using StyleAttributesUtils.


https://github.com/woocommerce/woocommerce-gutenberg-products-block/blob/c323f214b1ca5800ad8c43abd914b35dc9050da6/src/BlockTypes/MiniCart.php#L238-L249

🚀 This comment was generated by the automations bot based on a todo comment in c323f21 in #5100. cc @dinhtungdu

@@ -222,6 +224,39 @@ protected function get_markup() {
$cart_contents_total += $cart->get_subtotal_tax();
}

$wrapper_classes = 'wc-block-mini-cart wp-block-woocommerce-mini-cart';
Copy link
Member Author

Choose a reason for hiding this comment

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

Because we use __experimentalSelector, we don't need wp-block-woocommerce-mini-cart here anymore.

@github-actions
Copy link
Contributor

Replace `getColorClassName` and manual style manipulation...

Replace `getColorClassName` and manual style manipulation with `useColorProps` once the hook is no longer experimental.


https://github.com/woocommerce/woocommerce-gutenberg-products-block/blob/a6c5b348a8ce1b62f69bae2f45d659c564122099/assets/js/blocks/cart-checkout/mini-cart/edit.tsx#L46-L58

🚀 This comment was generated by the automations bot based on a todo comment in a6c5b34 in #5100. cc @dinhtungdu

@github-actions
Copy link
Contributor

Replace `getColorClassName` and manual style manipulation...

Replace `getColorClassName` and manual style manipulation with `useColorProps` once the hook is no longer experimental.


https://github.com/woocommerce/woocommerce-gutenberg-products-block/blob/04cca3c28e33903d000375bf3b334cba41aae46f/assets/js/blocks/cart-checkout/mini-cart/edit.tsx#L46-L58

🚀 This comment was generated by the automations bot based on a todo comment in 04cca3c in #5100. cc @dinhtungdu

@dinhtungdu dinhtungdu merged commit c47f461 into trunk Nov 17, 2021
@dinhtungdu dinhtungdu deleted the add/4965-mini-cart-global-style branch November 17, 2021 15:39
jonny-bull pushed a commit to jonny-bull/woocommerce-gutenberg-products-block that referenced this pull request Dec 14, 2021
jonny-bull pushed a commit to jonny-bull/woocommerce-gutenberg-products-block that referenced this pull request Dec 16, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
block: mini-cart Issues related to the Mini-Cart block. focus: FSE Work related to prepare WooCommerce for FSE. focus: global styles Issues that involve styles/css/layout structure. skip-changelog PRs that you don't want to appear in the changelog. type: enhancement The issue is a request for an enhancement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants