Editor | Styles.",
- 'woocommerce'
+ description={ createInterpolateElement( label, {
+ EditorLink: (
+ {
+ recordEvent(
+ 'customize_your_store_assembler_hub_editor_link_click',
+ {
+ source: 'typography',
+ }
+ );
+ window.open(
+ `${ ADMIN_URL }site-editor.php`,
+ '_blank'
+ );
+ return false;
+ } }
+ href=""
+ />
),
- {
- EditorLink: (
- {
- recordEvent(
- 'customize_your_store_assembler_hub_editor_link_click',
- {
- source: 'typography',
- }
- );
- window.open(
- `${ ADMIN_URL }site-editor.php`,
- '_blank'
- );
- return false;
- } }
- href=""
- />
- ),
- StyleLink: (
- {
- recordEvent(
- 'customize_your_store_assembler_hub_style_link_click',
- {
- source: 'typography',
- }
- );
- window.open(
- `${ ADMIN_URL }site-editor.php?path=%2Fwp_global_styles&canvas=edit`,
- '_blank'
- );
- return false;
- } }
- href=""
- />
- ),
- }
- ) }
+ StyleLink: (
+ {
+ recordEvent(
+ 'customize_your_store_assembler_hub_style_link_click',
+ {
+ source: 'typography',
+ }
+ );
+ window.open(
+ `${ ADMIN_URL }site-editor.php?path=%2Fwp_global_styles`,
+ '_blank'
+ );
+ return false;
+ } }
+ href=""
+ />
+ ),
+ } ) }
content={
diff --git a/plugins/woocommerce-admin/client/customize-store/design-with-ai/pages/ApiCallLoader.tsx b/plugins/woocommerce-admin/client/customize-store/design-with-ai/pages/ApiCallLoader.tsx
index 5079a204b02..076dc270f45 100644
--- a/plugins/woocommerce-admin/client/customize-store/design-with-ai/pages/ApiCallLoader.tsx
+++ b/plugins/woocommerce-admin/client/customize-store/design-with-ai/pages/ApiCallLoader.tsx
@@ -99,7 +99,10 @@ const loaderSteps = [
];
// Make the loader last longer and provide a smoother progress by duplicating the steps.
-const createAugmentedSteps = ( steps: typeof loaderSteps ) => {
+const createAugmentedSteps = (
+ steps: typeof loaderSteps,
+ numOfDupes: number
+) => {
// Duplicate each step, so we can animate each one
// (e.g. each step will be duplicated 3 times, and each duplicate will
// have different progress)
@@ -112,8 +115,7 @@ const createAugmentedSteps = ( steps: typeof loaderSteps ) => {
if ( ! nextItem ) return [ item ];
// If there is a next item, we're not at the end of the array
- // so return the current item, plus two duplicates
- const numOfDupes = 2;
+ // so return the current item, plus duplicates
const duplicates = [ item ];
const progressIncreaseBy =
( nextItem.progress - item.progress ) / numOfDupes;
@@ -149,7 +151,10 @@ export const ApiCallLoader = () => {
preload( openingTheDoors );
}, [] );
- const augmentedSteps = createAugmentedSteps( loaderSteps.slice( 0, -1 ) );
+ const augmentedSteps = createAugmentedSteps(
+ loaderSteps.slice( 0, -1 ),
+ 10
+ );
return (
@@ -182,7 +187,7 @@ export const ApiCallLoader = () => {
export const AssembleHubLoader = () => {
// Show the last two steps of the loader so that the last frame is the shortest time possible
- const augmentedSteps = createAugmentedSteps( loaderSteps.slice( -2 ) );
+ const augmentedSteps = createAugmentedSteps( loaderSteps.slice( -2 ), 10 );
const [ progress, setProgress ] = useState( augmentedSteps[ 0 ].progress );
diff --git a/plugins/woocommerce-admin/client/customize-store/design-with-ai/services.ts b/plugins/woocommerce-admin/client/customize-store/design-with-ai/services.ts
index b2b2c1d0b22..a069943a4c1 100644
--- a/plugins/woocommerce-admin/client/customize-store/design-with-ai/services.ts
+++ b/plugins/woocommerce-admin/client/customize-store/design-with-ai/services.ts
@@ -473,15 +473,21 @@ const saveAiResponseToOption = ( context: designWithAiStateMachineContext ) => {
} );
};
-const resetPatterns = () => async () => {
+const resetPatternsAndProducts = () => async () => {
await dispatch( OPTIONS_STORE_NAME ).updateOptions( {
woocommerce_blocks_allow_ai_connection: 'yes',
} );
- return await apiFetch( {
- path: '/wc/private/ai/patterns',
- method: 'DELETE',
- } );
+ return Promise.all( [
+ apiFetch( {
+ path: '/wc/private/ai/patterns',
+ method: 'DELETE',
+ } ),
+ apiFetch( {
+ path: '/wc/private/ai/products',
+ method: 'DELETE',
+ } ),
+ ] );
};
export const services = {
@@ -491,5 +497,5 @@ export const services = {
updateStorePatterns,
saveAiResponseToOption,
installAndActivateTheme,
- resetPatterns,
+ resetPatternsAndProducts,
};
diff --git a/plugins/woocommerce-admin/client/customize-store/design-with-ai/state-machine.tsx b/plugins/woocommerce-admin/client/customize-store/design-with-ai/state-machine.tsx
index e79cd41bd58..5391f132886 100644
--- a/plugins/woocommerce-admin/client/customize-store/design-with-ai/state-machine.tsx
+++ b/plugins/woocommerce-admin/client/customize-store/design-with-ai/state-machine.tsx
@@ -355,7 +355,7 @@ export const designWithAiStateMachineDefinition = createMachine(
cond: 'isAiOnline',
},
{
- target: 'resetPatterns',
+ target: 'resetPatternsAndProducts',
},
],
},
@@ -373,9 +373,9 @@ export const designWithAiStateMachineDefinition = createMachine(
},
},
},
- resetPatterns: {
+ resetPatternsAndProducts: {
invoke: {
- src: 'resetPatterns',
+ src: 'resetPatternsAndProducts',
onDone: {
target: 'success',
},
diff --git a/plugins/woocommerce-admin/client/customize-store/design-with-ai/stories/style.scss b/plugins/woocommerce-admin/client/customize-store/design-with-ai/stories/style.scss
index 1ff771c392e..a2de17f0c71 100644
--- a/plugins/woocommerce-admin/client/customize-store/design-with-ai/stories/style.scss
+++ b/plugins/woocommerce-admin/client/customize-store/design-with-ai/stories/style.scss
@@ -12,6 +12,6 @@
.progress-bar.smooth-transition {
.woocommerce-onboarding-progress-bar__filler {
- transition: width linear 1s;
+ transition: width linear 2s;
}
}
diff --git a/plugins/woocommerce-admin/client/customize-store/design-with-ai/style.scss b/plugins/woocommerce-admin/client/customize-store/design-with-ai/style.scss
index 24f436b7bc9..fe602f2fb6e 100644
--- a/plugins/woocommerce-admin/client/customize-store/design-with-ai/style.scss
+++ b/plugins/woocommerce-admin/client/customize-store/design-with-ai/style.scss
@@ -38,6 +38,6 @@
.progress-bar.smooth-transition {
.woocommerce-onboarding-progress-bar__filler {
- transition: width linear 1s;
+ transition: width linear 2s;
}
}
diff --git a/plugins/woocommerce/changelog/41325-fix-41324-empty-orders-cta b/plugins/woocommerce/changelog/41325-fix-41324-empty-orders-cta
new file mode 100644
index 00000000000..12bcded6bd5
--- /dev/null
+++ b/plugins/woocommerce/changelog/41325-fix-41324-empty-orders-cta
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Added missing CSS class on the empty-orders notice CTA in the My Account > Orders page
\ No newline at end of file
diff --git a/plugins/woocommerce/changelog/41900-41620-cys-update-copy-and-make-sure-more-fonts-are-displayed b/plugins/woocommerce/changelog/41900-41620-cys-update-copy-and-make-sure-more-fonts-are-displayed
new file mode 100644
index 00000000000..223e303b97c
--- /dev/null
+++ b/plugins/woocommerce/changelog/41900-41620-cys-update-copy-and-make-sure-more-fonts-are-displayed
@@ -0,0 +1,4 @@
+Significance: minor
+Type: update
+
+CSY: Update copy when AI is offline.
\ No newline at end of file
diff --git a/plugins/woocommerce/changelog/41917-patch-4 b/plugins/woocommerce/changelog/41917-patch-4
new file mode 100644
index 00000000000..17140e3dce7
--- /dev/null
+++ b/plugins/woocommerce/changelog/41917-patch-4
@@ -0,0 +1,4 @@
+Significance: minor
+Type: fix
+
+Format postcode before validation on the shortcode cart shipping calculator
\ No newline at end of file
diff --git a/plugins/woocommerce/changelog/41923-41921-cys-ai-offline-flow-reset-products b/plugins/woocommerce/changelog/41923-41921-cys-ai-offline-flow-reset-products
new file mode 100644
index 00000000000..a7bda9153ac
--- /dev/null
+++ b/plugins/woocommerce/changelog/41923-41921-cys-ai-offline-flow-reset-products
@@ -0,0 +1,4 @@
+Significance: minor
+Type: update
+
+CYS: Reset products when the AI is offline.
\ No newline at end of file
diff --git a/plugins/woocommerce/changelog/fix-41256 b/plugins/woocommerce/changelog/fix-41256
new file mode 100644
index 00000000000..36b36dbe023
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-41256
@@ -0,0 +1,5 @@
+Significance: patch
+Type: dev
+Comment: Simply changes a value in a doc block.
+
+
diff --git a/plugins/woocommerce/changelog/flexslider-fade-css3-transitions b/plugins/woocommerce/changelog/flexslider-fade-css3-transitions
new file mode 100644
index 00000000000..fb5c746acae
--- /dev/null
+++ b/plugins/woocommerce/changelog/flexslider-fade-css3-transitions
@@ -0,0 +1,4 @@
+Significance: major
+Type: update
+
+FlexSlider "fade" animations always use CSS3 transitions.
diff --git a/plugins/woocommerce/changelog/update-cys-loader-smoother b/plugins/woocommerce/changelog/update-cys-loader-smoother
new file mode 100644
index 00000000000..073c9fd65ac
--- /dev/null
+++ b/plugins/woocommerce/changelog/update-cys-loader-smoother
@@ -0,0 +1,4 @@
+Significance: patch
+Type: enhancement
+
+Make CYS loading sequence smoother
diff --git a/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js b/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js
index c1a941bf7ab..2d454c7dbc0 100755
--- a/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js
+++ b/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js
@@ -720,12 +720,16 @@
});
}
} else { // FADE:
+ // if (!touch) calls slider.wrapup() on fade animation end; if (touch) calls slider.wrapup() immediately
if (!touch) {
- slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
- slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
- } else {
- slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
- slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
+ slider.slides.eq(slider.currentSlide).off("transitionend");
+ slider.slides.eq(target).off("transitionend").on("transitionend", slider.wrapup);
+ }
+
+ slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
+ slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
+
+ if (touch) {
slider.wrapup(dimension);
}
}
@@ -896,12 +900,15 @@
}
if (type === "init") {
if (!touch) {
- //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);
+ // Every "opacity" change before outerWidth() does NOT get animated; every "opacity" change after outerWidth() becomes a fadeIn
if (slider.vars.fadeFirstSlide == false) {
slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1});
+ slider.slides.outerWidth();
} else {
- slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);
+ slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).outerWidth();
+ slider.slides.eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1});
}
+ slider.slides.css({ "transition": "opacity " + slider.vars.animationSpeed / 1000 + "s " + easing });
} else {
slider.slides.css({ "opacity": 0, "display": "block", "transition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
}
diff --git a/plugins/woocommerce/includes/shortcodes/class-wc-shortcode-cart.php b/plugins/woocommerce/includes/shortcodes/class-wc-shortcode-cart.php
index 3784fb79b5d..f273e52669e 100644
--- a/plugins/woocommerce/includes/shortcodes/class-wc-shortcode-cart.php
+++ b/plugins/woocommerce/includes/shortcodes/class-wc-shortcode-cart.php
@@ -31,12 +31,14 @@ class WC_Shortcode_Cart {
$address['postcode'] = isset( $_POST['calc_shipping_postcode'] ) ? wc_clean( wp_unslash( $_POST['calc_shipping_postcode'] ) ) : ''; // WPCS: input var ok, CSRF ok, sanitization ok.
$address['city'] = isset( $_POST['calc_shipping_city'] ) ? wc_clean( wp_unslash( $_POST['calc_shipping_city'] ) ) : ''; // WPCS: input var ok, CSRF ok, sanitization ok.
+ if ( $address['postcode'] ) {
+ $address['postcode'] = wc_format_postcode( $address['postcode'], $address['country'] );
+ }
+
$address = apply_filters( 'woocommerce_cart_calculate_shipping_address', $address );
if ( $address['postcode'] && ! WC_Validation::is_postcode( $address['postcode'], $address['country'] ) ) {
throw new Exception( __( 'Please enter a valid postcode / ZIP.', 'woocommerce' ) );
- } elseif ( $address['postcode'] ) {
- $address['postcode'] = wc_format_postcode( $address['postcode'], $address['country'] );
}
if ( $address['country'] ) {
diff --git a/plugins/woocommerce/includes/wc-core-functions.php b/plugins/woocommerce/includes/wc-core-functions.php
index 905014e1cde..de9715d8227 100644
--- a/plugins/woocommerce/includes/wc-core-functions.php
+++ b/plugins/woocommerce/includes/wc-core-functions.php
@@ -2003,9 +2003,7 @@ function wc_remove_number_precision_deep( $value ) {
* - an instance which will be used directly as the logger
* In either case, the class or instance *must* implement WC_Logger_Interface.
*
- * @see WC_Logger_Interface
- *
- * @return WC_Logger
+ * @return WC_Logger_Interface
*/
function wc_get_logger() {
static $logger = null;
diff --git a/plugins/woocommerce/templates/myaccount/orders.php b/plugins/woocommerce/templates/myaccount/orders.php
index fc2049fe162..c91647f228e 100644
--- a/plugins/woocommerce/templates/myaccount/orders.php
+++ b/plugins/woocommerce/templates/myaccount/orders.php
@@ -14,7 +14,7 @@
*
* @see https://woo.com/document/template-structure/
* @package WooCommerce\Templates
- * @version 7.8.0
+ * @version 8.5.0
*/
defined( 'ABSPATH' ) || exit;
@@ -97,7 +97,7 @@ do_action( 'woocommerce_before_account_orders', $has_orders ); ?>
- ' . esc_html__( 'Browse products', 'woocommerce' ) . '', 'notice' ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment ?>
+ ' . esc_html__( 'Browse products', 'woocommerce' ) . '', 'notice' ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment ?>
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3b98d7feb09..5f5fa826010 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26283,7 +26283,6 @@ packages:
/flow-parser@0.223.3:
resolution: {integrity: sha512-9KxxDKSB22ovMpSULbOL/QAQGPN6M0YMS3PubQvB0jVc4W7QP6VhasIVic7MzKcJSh0BAVs4J6SZjoH0lDDNlg==}
engines: {node: '>=0.4.0'}
- dev: true
/flush-write-stream@1.1.1:
resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==}
@@ -31875,7 +31874,7 @@ packages:
'@babel/register': 7.22.15(@babel/core@7.23.5)
babel-core: 7.0.0-bridge.0(@babel/core@7.23.5)
chalk: 4.1.2
- flow-parser: 0.206.0
+ flow-parser: 0.223.3
graceful-fs: 4.2.11
micromatch: 4.0.5
neo-async: 2.6.2